دراسة وتحليل مشروع HIS
← العودة للعرض التجريبي1. الرؤية والقرارات الأساسية
AleppoAppointmentBookingSystem)
بمساحة Clinical/ داخل Core، مع واجهة كادر طبي منفصلة (Web.HIS).
| الطبقة | القرار |
|---|---|
| قاعدة البيانات | قاعدة واحدة SQL Server — نفس ApplicationDbContext |
| المنطق المشترك | AleppoAppointmentBookingSystem.Core — مساحة Clinical/ |
| واجهة الكادر الطبي | Web.HIS (هذا المشروع) |
| واجهة المريض | Web.Citizen + تطبيق موبايل لاحقاً |
| لوحة الإدارة | Web.Full — توسيع تدريجي |
| المعايير | ICD-10، INN/ATC، FHIR (تبادل)، LOINC/SNOMED (لاحقاً) |
| الجداول الديناميكية | EAV + JSON Schema — كفلسفة RequestField الحالية |
المرجع: 812_Technologies_Official_quotation - HIS.docx —
الدراسة الكاملة: docs/HIS-Architecture-Study.md —
آخر مراجعة:
2. ثلاثة منتجات — لا نخلط بينها
📋 دراسة وتحليل
قرارات معمارية، مراحل، معايير، مخاطر. هذه الصفحة + ملف Markdown.
🎬 عرض تفاعلي (Demo)
صفحات HTML + localStorage لعرض سريع على الإدارة أثناء الاجتماعات.
🏥 نظام HIS فعلي
Auth + DB + APIs في Core. الواجهة الحقيقية تُبنى تدريجياً وتستبدل Demo.
3. تحليل الوحدات — العرض مقابل الواقع
| الوحدة | المتطلب الجوهري | الوضع | الفجوة |
|---|---|---|---|
| حجز موعد | حجز سريع، طبيب/قسم/وقت | جاهز | تحسين UX، ربط EHR |
| دور ذكي (Queue) | طوابير عيادات + أقسام، شاشات، تابلت ممرض | تصميم معتمد | استقبال مركزي + شاشات — انظر القسم 7أ |
| ملف طبي (EHR) | تاريخ زيارات، تشخيصات، وصفات | بداية | Encounter + واجهة طبيب حقيقية |
| عيادات وأقسام | تخصصات، مواعيد لكل طبيب | جاهز | ربط Service بنوع عيادة |
| مختبر / أشعة | طلب، نتيجة، مرفقات | Demo فقط | وحدة جديدة + استمارات |
| صيدلية | وصفة إلكترونية، مخزون | جزئي | جدول Medicines + وصفات + صرف |
| فوترة وتأمين | فواتير، تقارير مالية | غير موجود | Billing module |
| إحالات | طبيب → مختبر → أشعة → صيدلية | نموذج DB | ClinicalReferral + workflow |
| تقارير لحظية | Dashboards، أمراض، أرباح | جزئي | Analytics layer |
| استمارات إلكترونية | Form Builder، قوالب لكل تخصص | APIs | Clinical Form Engine + UI |
| تطبيق موبايل | ملف طبي، نتائج، حجز | Citizen web | Flutter لاحقاً |
4. البنية المقترحة
AleppoAppointmentBookingSystem.sln ├── Core │ ├── Models/ │ ├── Clinical/ ← EHR, Forms, Prescriptions, Referrals │ ├── Services/ │ └── Data/ ├── Web.Full ← Admin + API عام ├── Web.Citizen ← مريض └── Web.HIS ← أطباء، تمريض، استقبال (هذا المشروع)
لماذا Web.HIS منفصل؟
- واجهة مختلفة (RTL، شاشات سريعة، لوحة طبيب، Form Builder)
- صلاحيات: Doctor, Nurse, Reception, Pharmacist, LabTech
- نشر على subdomain:
his.example.comمع نفس JWT و Core - Citizen يبقى خفيفاً للمريض فقط
ما أُنجز في الكود حتى الآن
| البند | الحالة |
|---|---|
| مشروع Web.HIS | موجود |
| scripts/HIS_Clinical_Schema.sql | موجود |
| كيانات Clinical/* في Core | موجود |
| APIs encounters / form-templates / coding | موجود |
| واجهة Demo (HTML + localStorage) | موجود |
| Form Builder + واجهة طبيب حقيقية | قيد البناء |
| ربط Demo بالـ API | لم يبدأ |
5. استراتيجية البيانات — بدون ALTER TABLE
طبقة الترميز
ثابتة، معيارية: MedicalDiagnoses (ICD-10)، Medicines (INN/ATC)، CodingSystems
طبقة التعريف (Metadata)
ديناميكية عبر واجهة: ClinicalFormTemplates، ClinicalFormFields، FieldRules
طبقة القيم (Instance)
EAV + JSON: ClinicalFormInstances، ClinicalFormFieldValues
جداول نواة الزيارة (تُنشأ مرة واحدة)
| الجدول | الغرض |
|---|---|
| ClinicalEncounters | زيارة طبية مرتبطة بموعد (AppointmentId) |
| ClinicalObservations | علامات حيوية وملاحظات |
| ClinicalDiagnoses | تشخيص مسجّل — FK إلى MedicalDiagnoses |
| ClinicalPrescriptions / Lines | وصفة وسطور دواء — FK إلى Medicines |
| ClinicalReferrals | إحالة بين أقسام |
| ClinicalAttachments | صور، PDF، DICOM ref |
ClinicalFormTemplates + ClinicalFormFields) — وليس ALTER TABLE.
نمط موجود مسبقاً في RequestField / AppointmentBookingData.
6. المعايير الطبية والعلمية
| المعيار | الاستخدام | المرحلة |
|---|---|---|
| ICD-10 (WHO) | التشخيص، إحصاء الأمراض | المرحلة 1 |
| INN + ATC (WHO) | الأدوية والوصفات | المرحلة 1 |
| SNOMED CT | مفاهيم سريرية إضافية | المرحلة 2 |
| LOINC | طلبات ونتائج مختبر | المرحلة 3 |
| HL7 FHIR R4 | نموذج تبادل — Mapping عند التصدير | تدريجي |
ربط FHIR (تبادل فقط — ليس تخزيناً أولياً)
| كياننا | FHIR Resource |
|---|---|
| User (مواطن) | Patient |
| Appointment + ClinicalEncounter | Encounter |
| ClinicalDiagnosis | Condition |
| ClinicalPrescriptionLine | MedicationRequest |
| ClinicalObservation | Observation |
| ClinicalReferral | ServiceRequest |
| ClinicalFormInstance | QuestionnaireResponse |
7. رحلة المريض (مبسّطة)
MVP المعتمد (قابل للتعديل)
7أ. دور الانتظار — التصميم المعتمد
AppointmentBookingData المرتبط بالموعد.
أدوار الواجهات
| الواجهة | المستخدم | الوظيفة |
|---|---|---|
| استقبال مركزي | موظف الاستقبال | بحث موعد اليوم → تأكيد الدفع → قطع وصل → إدراج المريض في طابور عيادته |
| شاشة غرفة الانتظار (TV) | المرضى | أسماء العيادات، وتحت كل عيادة: رقم الدور + الاسم لمن قطع وصلاً ولم يدخل بعد (بالتسلسل) |
| تابلت الممرض | ممرض العيادة | قائمة رقم + اسم → زر «التالي» → يظهر الرقم والاسم على شاشة العيادة ويُنادى |
| شاشة العيادة (TV) | غرفة الانتظار الفرعية / الممرض | يعرض رقم الدور + الاسم للمريض المُستدعى حالياً (بخط كبير) |
| شاشة الطبيب | طبيب / ممرض | تشخيص، وصفة، إحالة لمخبر / صيدلية / أشعة / قسم آخر |
| طابور القسم | مخبر / صيدلية / أشعة … | قائمة محالين (رقم + اسم) → عند الوصول: تم التنفيذ أو تعذّر التنفيذ |
تسلسل العمليات
┌─────────────────────────────────────────────────────────────────────────┐
│ 1. حجز عن بُعد (Citizen) — المريض أو ذويه — الاسم في AppointmentBookingData │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 2. وصول المركز — لا يُقبل قطع الوصل قبل أكثر من 10 دقائق من الموعد │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 3. استقبال مركزي (موظف واحد لكل العيادات): دفع → قطع وصل → طابور العيادة │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 4. شاشة غرفة الانتظار العامة │
│ عيادة الباطنية: 12 أحمد — 13 فاطمة — 14 خالد │
│ عيادة الأطفال: 7 سارة — 8 عمر │
│ (رقم الدور + الاسم — من قطع وصلاً ولم يُستدعَ بعد) │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 5. تابلت الممرض: «التالي» → شاشة العيادة: «14 — خالد» → يدخل الطبيب │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 6. الطبيب: ClinicalEncounter + تشخيص + إحالات │
└─────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────┐
│ 7. كل قسم محال إليه له طابور مستقل: وصول → تنفيذ ✓ / تعذر ✗ │
└─────────────────────────────────────────────────────────────────────────┘
ما يراه المريض (بساطة التتبع)
- قبل الوصول: موعده وعيادته فقط (من رسالة الحجز أو Citizen).
- بعد قطع الوصل: ينظر الشاشة — يرى رقم دوره واسمه ومن أمامه في عيادته.
- عند الاستدعاء: رقم الدور + الاسم على شاشة العيادة — يدخل.
- بعد الإحالة: يذهب للقسم وينتظر دوره هناك (رقم + اسم على شاشة القسم).
- لا تطبيق تتبع، لا QR إلزامي للمريض.
عرض الشاشات: رقم الدور + الاسم
غرفة الانتظار العامة
12 — أحمد علي
13 — فاطمة حسن
14 — خالد محمود
رقم صغير + اسم — قائمة أفقية أو عمودية تحت اسم العيادة
شاشة العيادة (نداء)
14
خالد محمود
الرقم بارز كبيراً، الاسم تحته — للنداء الصوتي أيضاً
طابور القسم (مخبر/صيدلية)
3 — سارة أحمد
4 — عمر يوسف
رقم مستقل لكل قسم (ليس نفس رقم العيادة)
| القاعدة | التفصيل |
|---|---|
| مصدر الاسم | AppointmentBookingData |
| رقم دور العيادة | يُمنح عند قطع الوصل — تسلسل يومي لكل عيادة (Service) |
| رقم دور القسم | تسلسل يومي لكل قسم عند وصول المحال |
| صيغة العرض | {رقم} — {الاسم} في كل الشاشات والطباعة |
| وصل الاستقبال | يطبع أو يعرض: رقم الدور + الاسم + العيادة + وقت الموعد |
ربط بالبيانات الحالية
| الحاجة | المصدر / الإجراء |
|---|---|
| اسم المريض | AppointmentBookingData (FieldKey لاسم المريض في كل خدمة) |
| الموعد والعيادة | Appointments + Service (العيادة = الخدمة/التخصص) |
| وقت قطع الوصل + رقم الدور | AppointmentExecution.QueueNumber (لكل عيادة) أو ClinicQueueTicket |
| طابور العيادة | ترتيب حسب وقت الوصل — عرض QueueNumber + اسم من الحجز |
| حالة «دخل العيادة» | عند ضغط الممرض «التالي» / ActualStartTime |
| الزيارة الطبية | ClinicalEncounter عند دخول الطبيب |
| إحالة لقسم | ClinicalReferral → طابور القسم |
| تنفيذ / تعذر | حالة الإحالة: Completed / Cancelled + سبب التعذر |
| تحديث الشاشات | SignalR (جديد) — polling كبديل مؤقت |
حالات الطابور (مقترحة)
| الحالة | المعنى | تظهر في |
|---|---|---|
Booked | حجز عن بُعد — لم يصل بعد | — |
TicketIssued | دفع + قطع وصل + رقم دور | شاشة الانتظار: 12 — أحمد |
Called | الممرض استدعى «التالي» | شاشة العيادة: رقم كبير + اسم |
InClinic | دخل غرفة الطبيب | يُزال من شاشة الانتظار العامة |
WithDoctor | الطبيب يفحص | واجهة الطبيب |
Referred | أُحيل لقسم | طابور ذلك القسم |
DeptDone / DeptFailed | نُفّذ / تعذّر | سجل الإحالة |
ما نستبعده (تعقيد غير مطلوب)
- QR إلزامي للمريض عند الوصول
- تطبيق موبايل لتتبع الدور لحظياً
- طابور واحد لكل المركز دون تفصيل عيادات (الوضع الحالي في الكود)
- موظف استقبال منفصل لكل عيادة
8. الأمان والصلاحيات
| الدور | الصلاحيات |
|---|---|
| Citizen | حجز، ملفه، نتائجه |
| Reception | استقبال مركزي: دفع، قطع وصل، إدراج طابور العيادة |
| Doctor | encounter، تشخيص، وصفة، إحالة |
| Nurse | تابلت العيادة: استدعاء «التالي»، شاشة العيادة |
| LabTech | نتائج مختبر |
| Radiologist | تقارير أشعة |
| Pharmacist | صرف، مخزون |
| HospitalAdmin | Form Builder، تقارير، إعدادات |
| SystemAdmin | كل شيء |
- تشفير at-rest للمرفقات (AES-256)
- Audit log: ClinicalAuditLog
- QR اختياري لاحقاً — ليس جزءاً من سير الاستقبال المعتمد
- Field-level masking حسب الدور
9. التقنيات
| المجال | القرار | السبب |
|---|---|---|
| Backend | .NET 9 | Core جاهز، EF، JWT |
| قاعدة البيانات | SQL Server | لا migration مزدوج |
| Frontend HIS | HTML/React تدريجياً | Demo الآن، React للإنتاج |
| Mobile | Flutter — مرحلة 5 | REST من نفس API |
| API | REST + OpenAPI | Swagger موجود |
| SQL vs Migrations | Script للـ Clinical + seed للبيانات المرجعية | كما اتفقنا للتشخيصات والأدوية |
10. خطة المراحل — قابلة للتعديل
عدّل الخطوات مباشرة (انقر على النص)، أضف أو احذف مهاماً، غيّر حالة كل مرحلة. التعديلات تُحفظ تلقائياً في المتصفح. استخدم التصدير لمشاركة الخطة مع الفريق.
11. المخاطر وقرارات التخفيف
| المخاطرة | التخفيف |
|---|---|
| تضخم EAV — بطء استعلامات | فهارس، JSON indexed columns، snapshots للتقارير |
| تعقيد Form Builder | البدء بـ 5 أنواع حقول + توسيع |
| Scope creep — كل الوحدات دفعة واحدة | مراحل واضحة — MVP محدود |
| FHIR كامل مبكراً | Mapping عند التصدير فقط |
| ازدواجية Citizen/HIS | Core واحد، واجهات منفصلة |
12. المراجع والملفات
| الملف | الغرض |
|---|---|
docs/HIS-Architecture-Study.md | الدراسة الكاملة (Markdown) |
scripts/HIS_Clinical_Schema.sql | جداول Clinical Core + Form Engine |
scripts/MedicalDiagnoses_icd10_ar.sql | بيانات ICD-10 (~12,130 تشخيص) |
scripts/Medicines_who_eml_ar.sql | بيانات INN/ATC |
Core/Models/ServiceBookingField.cs | نمط EAV مرجعي |
Core/Clinical/* | كيانات وخدمات HIS |
Web.HIS/Controllers/Clinical/* | APIs السريرية |
wwwroot/study.html | هذه الصفحة المرجعية |