این پروژه یک سیستم نوبت دهی هوشمند برای کلینیک دندانپزشکی آتیه است که از الگوریتم AI برای محاسبه اولویت نوبتها بر اساس سه پارامتر اصلی استفاده میکند:
- نوع پرداخت (نقدی یا 20 نوع بیمه)
- نوع درمان (20 نوع درمان)
- طول عمر مشتری (مدت زمان عضویت در کلینیک)
- Backend: FastAPI (Python)
- Database: SQLite با SQLAlchemy ORM
- Frontend: HTML5, CSS3, JavaScript (Vanilla)
- الگوریتم AI: الگوریتم امتیازدهی سفارشی
atieh/
├── app.py # API اصلی FastAPI
├── models.py # مدلهای دیتابیس
├── database.py # تنظیمات دیتابیس
├── scoring_algorithm.py # الگوریتم محاسبه امتیاز اولویت
├── appointment_scheduler.py # سیستم پیشنهاد خودکار نوبت
├── treatment_duration.py # مدت زمان هر نوع درمان
├── add_sample_data.py # اسکریپت افزودن داده نمونه
├── migrate_database.py # اسکریپت مایگریشن دیتابیس
├── static/
│ ├── index.html # رابط کاربری اصلی
│ ├── script.js # منطق فرانتاند
│ └── style.css # استایلها
└── atieh_clinic.db # دیتابیس SQLite
id: شناسه یکتاname: نام و نام خانوادگیphone: شماره تلفن (یکتا)national_id: کد ملی (یکتا، اختیاری)payment_type: نوع پرداخت پیشفرض (Enum: CASH یا INSURANCE_1 تا INSURANCE_20)first_visit_date: تاریخ اولین مراجعهcreated_at,updated_at: زمانهای ایجاد و بهروزرسانی
id: شناسه یکتاpatient_id: شناسه بیمار (Foreign Key)appointment_date: تاریخ و زمان نوبتduration_minutes: مدت زمان نوبت به دقیقه (پیشفرض: 30)payment_type: نوع پرداخت این نوبتtreatment_type: نوع درمان (Enum: TREATMENT_1 تا TREATMENT_20)priority_score: امتیاز اولویت محاسبه شده توسط AIstatus: وضعیت نوبت (pending, confirmed, completed, cancelled)notes: یادداشتهای اختیاری
id: شناسه یکتاday_of_week: روز هفته (0=دوشنبه، 6=یکشنبه)start_time: ساعت شروع کار (مثلاً "09:00")end_time: ساعت پایان کار (مثلاً "18:00")is_active: فعال/غیرفعال بودن
- نقدی (CASH): 100 امتیاز - عالی
- بیمه 1-7: 90-60 امتیاز - خیلی خوب
- بیمه 8-14: 50-20 امتیاز - متوسط
- بیمه 15-20: 15-3 امتیاز - بد
- درمان 1-5: 100-80 امتیاز - عالی
- درمان 6-10: 75-50 امتیاز - خیلی خوب
- درمان 11-15: 45-25 امتیاز - متوسط
- درمان 16-20: 20-5 امتیاز - بد
- کمتر از 6 ماه: 50 امتیاز - متوسط
- 6 ماه تا 1 سال: 70 امتیاز - خوب
- 1 سال تا 2 سال: 85 امتیاز - خیلی خوب
- بیش از 2 سال: 100 امتیاز - عالی
امتیاز کل = (امتیاز پرداخت × 0.4) + (امتیاز درمان × 0.35) + (امتیاز طول عمر × 0.25)
ایجاد بیمار جدید
- Body:
{name, phone, national_id?, payment_type?, first_visit_date?} - Response: اطلاعات بیمار ایجاد شده
لیست تمام بیماران با امکان جستجو
- Query Parameters:
search: جستجو بر اساس نام، تلفن یا کد ملیskip,limit: صفحهبندی
- Response: لیست بیماران با اطلاعات کامل (payment_category, lifetime_category)
دریافت اطلاعات یک بیمار خاص
- Response: اطلاعات کامل بیمار شامل:
- payment_type, payment_category
- lifetime_months, lifetime_category
- first_visit_date
ایجاد نوبت جدید
- Body:
{patient_id, treatment_type, appointment_date?, notes?} - ویژگیهای هوشمند:
- اگر
appointment_dateمشخص نشود، AI به صورت خودکار بهترین زمان را پیشنهاد میدهد payment_typeبه صورت خودکار از اطلاعات بیمار استخراج میشودduration_minutesبر اساسtreatment_typeمحاسبه میشودpriority_scoreبه صورت خودکار محاسبه میشود
- اگر
- Response: اطلاعات نوبت ایجاد شده
لیست نوبتها
- Query Parameters:
skip,limit: صفحهبندیstatus: فیلتر بر اساس وضعیتsort_by_priority: مرتبسازی بر اساس اولویت (پیشفرض: true)future_only: فقط نوبتهای آینده (پیشفرض: true)
- Response: لیست نوبتها با اطلاعات کامل
دریافت اطلاعات یک نوبت خاص
دریافت 5 زمان پیشنهادی برای یک نوبت
- Query Parameters:
treatment_type: نوع درمانpatient_id: شناسه بیمار (اختیاری - برای اولویتبندی)days_ahead: تعداد روزهای آینده برای بررسی (پیشفرض: 7)max_suggestions: حداکثر تعداد پیشنهادات (پیشفرض: 5)
- Response: لیست زمانهای پیشنهادی با اولویتبندی
دریافت نوبتهای پیشنهادی بر اساس اولویت
- Query Parameters:
limit(پیشفرض: 10) - Response: لیست نوبتهای در انتظار مرتب شده بر اساس امتیاز اولویت
دریافت لیست زمانهای خالی
- Query Parameters:
start_date,end_date: بازه زمانیdays_ahead: تعداد روزهای آیندهduration_minutes: مدت زمان نوبت
- Response: لیست زمانهای خالی
لیست انواع پرداخت (نقدی + 20 نوع بیمه)
لیست انواع درمان (20 نوع)
- نمایش لیست تمام بیماران
- جستجوی زنده بر اساس نام، تلفن یا کد ملی
- دکمه "بیمار جدید" برای افزودن بیمار
- نمایش اطلاعات:
- نام، تلفن، کد ملی
- نوع پرداخت و دستهبندی
- طول عمر مشتری (ماه و دستهبندی)
- تاریخ اولین مراجعه
ویژگیهای هوشمند:
-
جستجوی بیمار با Autocomplete:
- امکان تایپ نام یا شماره تلفن
- نمایش نتایج به صورت dropdown
- نمایش اطلاعات کامل بیمار در نتایج جستجو
- Debounce برای کاهش درخواستهای API
-
انتخاب نوع درمان:
- Dropdown با 20 نوع درمان
- نمایش دستهبندی هر درمان (عالی، خیلی خوب، متوسط، بد)
-
پیشنهادات هوشمند AI:
- پس از انتخاب بیمار و نوع درمان، AI به صورت خودکار 5 زمان پیشنهادی ارائه میدهد
- زمانها بر اساس اولویت مرتب میشوند
- اولین پیشنهاد به عنوان "بهترین پیشنهاد" علامتگذاری میشود
- هر پیشنهاد به صورت یک دکمه نمایش داده میشود
-
انتخاب زمان:
- کاربر میتواند یکی از 5 زمان پیشنهادی را انتخاب کند
- زمان انتخاب شده highlight میشود
- یک checkmark (✓) در کنار زمان انتخاب شده نمایش داده میشود
- اطلاعات زمان انتخاب شده در یک باکس نمایش داده میشود
-
دکمه "ثبت نهایی":
- در ابتدا غیرفعال است
- پس از انتخاب یک زمان پیشنهادی، فعال میشود
- پس از ثبت موفق، فرم پاک میشود و کاربر به تب "نوبتهای ثبت شده" منتقل میشود
-
پیشنمایش امتیاز اولویت:
- نمایش دستهبندی نوع پرداخت
- نمایش دستهبندی نوع درمان
- نمایش دستهبندی طول عمر مشتری
- نمایش امتیاز کل اولویت
- فقط نوبتهای جدید: فقط نوبتهایی که از تب "نوبت جدید" ثبت شدهاند نمایش داده میشوند
- نمایش ساده: فقط نام بیمار و تاریخ/زمان نوبت نمایش داده میشود
- مرتبسازی: نوبتها بر اساس زمان (زودترین اول) مرتب میشوند
- فیلتر آینده: فقط نوبتهای آینده نمایش داده میشوند
- نمایش نوبتهای در انتظار بر اساس امتیاز اولویت
- هر نوبت با رتبهبندی نمایش داده میشود
- نمایش اطلاعات کامل هر نوبت
- طراحی Responsive و مدرن
- استفاده از فونت فارسی Vazir
- رنگبندی بر اساس اولویت (سبز برای اولویت بالا)
- انیمیشنهای نرم برای تعاملات
- پیامهای خطای واضح و کاربرپسند
- Loading states برای عملیاتهای async
-
یافتن زمانهای خالی:
- بررسی ساعات کاری کلینیک (9 صبح تا 6 عصر)
- حذف زمان ناهار (1 تا 2 بعدازظهر)
- بررسی روزهای کاری (دوشنبه تا جمعه)
- بررسی تداخل با نوبتهای موجود
-
اولویتبندی زمانها:
- اگر
patient_idمشخص باشد:- اولویت با امتیاز اولویت بیمار
- نزدیکی به زمان فعلی
- زمان روز (صبح بهتر از عصر)
- اگر
patient_idمشخص نباشد:- فقط بر اساس نزدیکی به زمان فعلی
- اگر
-
انتخاب 5 زمان برتر:
- حذف زمانهای تکراری
- انتخاب بهترین زمانها بر اساس اولویت
- بازگشت لیست مرتب شده
هر نوع درمان مدت زمان مشخصی دارد:
- درمان 1-5: 20-90 دقیقه
- درمان 6-10: 30-90 دقیقه
- درمان 11-15: 60-120 دقیقه
- درمان 16-20: 90-240 دقیقه
- افزودن 20 بیمار نمونه به دیتابیس
- افزودن نوبتهای نمونه
- پشتیبانی از encoding UTF-8 برای Windows
- افزودن ستون
payment_typeبه جدولpatients - افزودن ستون
duration_minutesبه جدولappointments - پشتیبانی از encoding UTF-8 برای Windows
-
خطای Encoding در Windows:
- افزودن
sys.stdoutوsys.stderrبا encoding UTF-8
- افزودن
-
خطای دیتابیس:
- افزودن ستونهای جدید با migration script
- مدیریت timezone-aware datetimes
-
خطای API 500:
- مدیریت خطا برای
payment_typeکه ممکن است None باشد - مدیریت خطا در محاسبه
lifetime_category - Try-except blocks جامع در تمام endpoints
- مدیریت خطا برای
-
خطای Frontend:
- بهبود نمایش پیامهای خطا
- مدیریت خطا در autocomplete
- مدیریت خطا در پیشنهادات AI
-
مشکل Routing در FastAPI:
- تغییر ترتیب routes برای جلوگیری از تفسیر اشتباه path parameters
-
مشکل Timezone:
- استفاده از
datetime.now(timezone.utc)به جایdatetime.utcnow() - تبدیل timezone-naive به timezone-aware
- استفاده از
-
مدیریت بیماران:
- ✅ افزودن بیمار جدید
- ✅ جستجوی بیماران
- ✅ نمایش لیست بیماران
- ✅ ذخیره نوع پرداخت پیشفرض برای هر بیمار
-
سیستم نوبت دهی:
- ✅ ثبت نوبت جدید
- ✅ پیشنهاد خودکار زمان توسط AI
- ✅ محاسبه خودکار امتیاز اولویت
- ✅ استخراج خودکار نوع پرداخت از اطلاعات بیمار
- ✅ محاسبه خودکار مدت زمان بر اساس نوع درمان
-
الگوریتم AI:
- ✅ محاسبه امتیاز بر اساس 3 پارامتر
- ✅ اولویتبندی نوبتها
- ✅ پیشنهاد 5 زمان برتر
-
رابط کاربری:
- ✅ طراحی مدرن و Responsive
- ✅ Autocomplete برای جستجوی بیمار
- ✅ نمایش پیشنهادات AI به صورت دکمههای قابل انتخاب
- ✅ Highlight زمان انتخاب شده
- ✅ نمایش لیست نوبتهای ثبت شده
-
مدیریت خطا:
- ✅ Try-except blocks جامع
- ✅ پیامهای خطای واضح
- ✅ مدیریت timezone
- ✅ مدیریت مقادیر None
-
نصب وابستگیها:
pip install -r requirements.txt
-
راهاندازی دیتابیس:
python migrate_database.py
-
افزودن داده نمونه (اختیاری):
python add_sample_data.py
-
اجرای سرور:
python run.py
یا
uvicorn app:app --reload
-
دسترسی به سیستم:
- باز کردن مرورگر و رفتن به:
http://localhost:8000
- باز کردن مرورگر و رفتن به:
-
دیتابیس: سیستم از SQLite استفاده میکند که فایل
atieh_clinic.dbرا ایجاد میکند. -
Timezone: تمام زمانها در UTC ذخیره میشوند و در frontend به timezone محلی تبدیل میشوند.
-
اولویتبندی: نوبتها بر اساس امتیاز اولویت (priority_score) مرتب میشوند که توسط الگوریتم AI محاسبه میشود.
-
پیشنهادات AI: سیستم به صورت خودکار 5 زمان برتر را پیشنهاد میدهد که کاربر میتواند یکی را انتخاب کند.
-
نوبتهای ثبت شده: فقط نوبتهایی که از تب "نوبت جدید" ثبت شدهاند در تب "نوبتهای ثبت شده" نمایش داده میشوند.
این سیستم یک راهحل کامل و هوشمند برای مدیریت نوبتهای کلینیک دندانپزشکی است که:
- از الگوریتم AI برای اولویتبندی استفاده میکند
- رابط کاربری ساده و کاربرپسند دارد
- به صورت خودکار زمانهای مناسب را پیشنهاد میدهد
- مدیریت خطاهای جامعی دارد
- قابلیت جستجو و فیلتر دارد
سیستم آماده استفاده است و میتواند به راحتی گسترش یابد.
تاریخ گزارش: 2024 نسخه سیستم: 1.0.0 وضعیت: ✅ آماده استفاده