- Add implementation notes for cancellation and waitlist features. - Create task documentation outlining goals, current status, and acceptance criteria for cancellation policy and resource utilization reporting. - Establish architecture for domain events and outbox pattern to ensure reliable event publishing. - Define database schema for domain events and necessary queries for resource utilization and plan accuracy reports. - Implement detailed implementation notes covering edge cases, testing strategies, and documentation requirements.
5.6 KiB
5.6 KiB
تسک ۰۵ — بخشهای نوبت و سازندهٔ برنامه
فاز: ۱ (هسته) · وابستگی: ۰۲، ۰۴ · زمان: ۱۶-۲۰ ساعت
هدف
مهمترین بخش مستند (بند ۷). یک نوبت یک تکه زمان پیوسته نیست:
| بخش | مدت | اتاق | اپراتور | دستگاه |
|---|---|---|---|---|
| مالیدن کرم بیحسی | ۵ | اشغال | اشغال | آزاد |
| انتظار اثر کرم | ۳۰ | اشغال | آزاد | آزاد |
| خود لیزر | ۲۰ | اشغال | اشغال | اشغال |
| مراقبت بعد | ۵ | اشغال | اشغال | آزاد |
با مدل امروز اپراتور ۶۰ دقیقه قفل میشود در حالی که ۳۰ دقیقه کار میکند. نصف ظرفیت هدر میرود.
وضعیت فعلی
// src/Appointment/Entity/Appointment.php
private int $slotStart; // یک بازهٔ پیوسته
private int $slotEnd;
هیچ مفهومی از بخش، و هیچ نیازمندی منبعی وجود ندارد. تنها منبعی که تداخلش بررسی میشود
پزشک است (AppointmentRepository::isSlotTaken).
دامنه
هست:
SegmentTemplate— الگوی بخشهای یک سرویس (و بخشهای اضافهٔ هرServiceOption)SegmentRequirement— نیازمندی منبع هر بخش: نقش، تعداد، شرط مهارت، قید، نوع اشغالAppointmentPlanBuilder— از (سرویس، آیتمها، بیمار، شعبه) یک برنامهٔ نوبت میسازد- ادغام بخشهای همنوع، محاسبهٔ مدت هر بخش، چیدمان ترتیبی
GET /api/v1/appointment-plan/previewبرای دیدن برنامه پیش از جستجوی وقت
نیست: پیدا کردن منابع آزاد و زمان (تسک ۰۶)، ثبت اشغال (تسک ۰۷)، اعمال قوانین روی برنامه (تسک ۰۹ — نقطهٔ اتصالش اینجا آماده میشود).
Endpoint ها
| متد | مسیر | توضیح |
|---|---|---|
| GET/PUT | /api/v1/service-item/{uuid}/segments |
الگوی بخشهای سرویس |
| PUT | /api/v1/segment-template/{uuid}/requirements |
نیازمندیهای منبع یک بخش |
| POST | /api/v1/appointment-plan/preview |
ساخت و برگرداندن برنامهٔ نوبت (بدون ثبت) |
خروجی POST /appointment-plan/preview
{
"success": true,
"data": {
"total_minutes": 60,
"segments": [
{ "sequence": 1, "name": "بیحسی موضعی", "offset_minutes": 0, "duration_minutes": 5,
"patient_present": true,
"requirements": [
{ "role": "room", "count": 1, "occupancy": "exclusive", "candidates": 3 },
{ "role": "operator", "count": 1, "occupancy": "exclusive", "candidates": 2 }
] },
{ "sequence": 2, "name": "انتظار", "offset_minutes": 5, "duration_minutes": 30,
"patient_present": true, "mergeable": true,
"requirements": [ { "role": "room", "count": 1, "occupancy": "exclusive", "candidates": 3 } ] }
]
}
}
candidates تعداد منابع واجد شرایط است — اگر صفر باشد، برنامه ساخته نمیشود و خطای
انسانی برمیگردد: «هیچ اپراتور خانمی با مهارت لیزر در این شعبه نیست» (مستند بند ۱۰).
معیار پذیرش
- ✅ موفق: سرویس «لیزر» با چهار بخش بالا تعریف میشود؛
previewبرنامهای باtotal_minutes = 60و چهار بخش باoffset_minutesصحیح (۰، ۵، ۳۵، ۵۵) برمیگرداند. - ✅ موفق: انتخاب دو ناحیه (صورت + بیکینی) → بخش «آمادهسازی» یک بار میآید
(
mergeable=trueهمنوعها ادغام میشوند) ولی بخش «لیزر» مدتش باDurationCalculatorتسک ۰۴ محاسبه شده است. - ✅ موفق: سرویسی که هیچ
SegmentTemplateندارد → برنامهای با یک بخش برابر کل مدت و نیازمندی پیشفرض (منبعtype=doctor). این همان رفتار امروز است. - ❌ خطا: نیازمندی با مهارتی که هیچ منبعی در آن شعبه ندارد →
422باERR_NO_ELIGIBLE_RESOURCEو پیام فارسی شامل نقش و مهارت. - ❌ خطا: بخش با
duration_minutes <= 0و بدون منبع مدت پویا →422. - ⚠️ مرزی: بخش با
requirements = [](مثلاً «انتظار در خانه») → معتبر؛ زمان میگیرد، هیچ منبعی نمیگیرد. - ⚠️ مرزی: قید
same_gender_as_patientوقتی جنسیت بیمار نامشخص است → نیازمندی نادیده گرفته نمیشود؛422با پیام «برای این سرویس ثبت جنسیت بیمار الزامی است». - ⚠️ مرزی:
setup/cleanupمنبع درpreviewنمایش داده نمیشود ولی درoccupancy_offsetهر نیازمندی میآید تا تسک ۰۶ همان را استفاده کند. - ⚠️ مرزی: مجموع مدت بخشها بیشتر از ۸ ساعت →
422(حفاظت از جستجوی وقت).
خروجی
src/Appointment/Plan/— entity ها،AppointmentPlanBuilder، DTO هاassets/admin/pages/ServiceSegmentsPage.tsx+ پیشنمایش برنامهdocs/api/appointment-plan.md- الگوهای آماده:
app:segment:seed-templates --preset=beauty|dental|physio(مستند بند ۱۷)