- 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.
4.9 KiB
4.9 KiB
تسک ۰۶ — موتور جستجوی وقت چندمنبعی
فاز: ۱ (هسته) · وابستگی: ۰۳، ۰۵ · زمان: ۲۰-۲۴ ساعت
هدف
مستند بند ۱۰: برنامهٔ نوبت (تسک ۰۵) را روی تقویم منابع (تسک ۰۳) بلغزان و بگو چه ساعتهایی واقعاً ممکناند — با پیشنهاد اینکه کدام منبع استفاده شود. هدف کارایی: جستجوی یک ماهه زیر نیم ثانیه.
وضعیت فعلی
// SlotCalculatorService::getServiceStartTimes() — تکمنبعی، یک بلوک پیوسته
$busy = $this->appointmentRepo->findBusyIntervals($doctor, $dayStart, $dayStart + 86400);
while ($t + $durSec <= $winEnd) {
$conflict = $this->firstOverlap($t, $t + $needSec, $busy);
…
}
فقط تداخل پزشک بررسی میشود. اتاق، دستگاه و اپراتور اصلاً وجود ندارند.
دامنه
هست:
AvailabilityEngine— ورودی: برنامهٔ نوبت + بازهٔ تاریخ + شعبه؛ خروجی: وقتهای معتبر همراه با تخصیص منبع پیشنهادی- تولید نقطههای شروع کاندید (پیشفرض هر ۱۵ دقیقه، قابل تنظیم per محیط)
- هرس زودهنگام کاندیدهای قطعاً ناممکن
- تخصیص منبع: تطبیق نیازمندیهای هر بخش به منابع آزاد
- استراتژی انتخاب منبع:
least_gap(پیشفرض) ·balanced·preserve_specialists·same_as_previous - کش روزانهٔ پنجرهٔ آزاد هر منبع
- endpoint عمومی و پنلی
- حالت
booking_mode = resourceرویWeeklyScheduleو مسیر ارتقای داوطلبانه
نیست: ثبت اشغال و رزرو موقت (تسک ۰۷)، قوانین فاصلهٔ زمانی (تسک ۰۹ — قلاب اینجا گذاشته میشود).
Endpoint ها
| متد | مسیر | توضیح |
|---|---|---|
| POST | /api/v1/appointment-availability |
جستجوی وقت با برنامه (بدنه: سرویس، آیتمها، شعبه، بازهٔ تاریخ) |
| GET | /api/v1/appointment-availability/month |
روزهای دارای ظرفیت در یک ماه (سبک — فقط بولین per روز) |
معیار پذیرش
- ✅ موفق: سناریوی مستند — سرویس لیزر با چهار بخش، شعبه با ۳ اتاق / ۲ اپراتور / ۳ دستگاه.
جستجوی یک روز → لیست زمانهای شروع، و برای هر زمان
assignmentشامل اتاق، اپراتور و دستگاه انتخابی. - ✅ موفق (آزادسازی ظرفیت — قلب کل پروژه): بیمار الف نوبت ۱۰:۰۰-۱۱:۰۰ دارد (اپراتور فقط ۱۰:۰۰-۱۰:۰۵ و ۱۰:۳۵-۱۱:۰۰ درگیر است). جستجو برای بیمار ب باید زمانی در بازهٔ ۱۰:۰۵-۱۰:۳۵ پیدا کند اگر اتاق دومی آزاد باشد. تست بدون این سناریو، تسک را تأیید نمیکند.
- ✅ موفق: کارایی — جستجوی ۳۰ روزه با ۲۰ منبع و ۵۰۰ نوبت ثبتشده، زیر ۵۰۰ms. تست کارایی بخشی از تسک است، نه اختیاری.
- ✅ موفق: پزشکی که در حالت
slotیاserviceاست → این endpoint422باERR_WRONG_BOOKING_MODEمیدهد و مسیر قدیمی دستنخورده کار میکند. - ❌ خطا: بازهٔ بزرگتر از ۹۰ روز →
422. - ❌ خطا: شعبهٔ محیط دیگر →
404. - ❌ خطا: نیازمندی بدون منبع واجد شرایط →
422با پیام انسانی (از تسک ۰۵). - ⚠️ مرزی: منبع با
capacity=3و دو نوبت همزمان → سومی هنوز جا دارد، چهارمی نه. - ⚠️ مرزی:
setup/cleanupمنبع → بازهٔ اشغال گستردهتر از بازهٔ بخش است و باید در بررسی تداخل لحاظ شود. - ⚠️ مرزی: بخش با
occupancy=passive→ منبع را میگیرد ولی در گزارش بهرهوری «کار» نیست. - ⚠️ مرزی: نقطهٔ شروع در گذشته → حذف.
- ⚠️ مرزی: هیچ روزی ظرفیت ندارد → آرایهٔ خالی +
reasonقابل فهم، نه ۴۰۴. - ⚠️ مرزی: منبع مشترک بین دو بخش غیرمجاور یک نوبت → همان منبع باید انتخاب شود (اپراتور بخش ۱ و بخش ۳ یکی است، نه دو نفر).
خروجی
src/Appointment/Availability/docs/api/appointment-availability.md- تست کارایی با داده مصنوعی:
tests/Appointment/AvailabilityPerformanceTest.php - توسعهٔ
AppointmentSettingsPage.tsxبرای انتخاب حالتresourceو استراتژی