Blueprint · مخطط بناء موديول جديد
مخطط بناء موديول HIS — نظام معلومات المستشفى على Moon ERP
تصميم شامل لموديول HIS عام وكامل، مبني على تحليل نظامك القديم (OB-GYN) ودراسة GNU Health وأعراف Moon ERP — مكوناته بالتفصيل، تكامله مع موديولاتك الحالية، رؤية الـ UI/UX، وبنية الفولدرات.
2026-06-15 · مبني على: obgy-erp-analysis · GNU Health study · LIS/Production audits · يتكامل مع: LIS · NPHIES · Accounting · Inventory · HRM
27مكوّن HIS كامل
5موديولات نتكامل معاها (مش نبنيها)
12كومبوننت UI أساسي يتبني أول
4مراحل بناء (MVP→مستشفى)
الهدف: نبني Modules/HIS يغطّي كل ما يمكن في نظام معلومات مستشفى، بس بذكاء — الموديول بيملك الطبقة الإكلينيكية بس، والفلوس/المخزون/الموظفين/المعمل/التأمين بتفضل في موديولاتك الموجودة ويتكامل معاها بالـ reference.
المبدأ الحاكم (من دراسة GNU Health): هوية واحدة party/patient (MPI) ← الـ Encounter (الزيارة الإكلينيكية) هو الجذر ← كل ورقة إكلينيكية بتتعلّق بـ encounter_id. ده بيحل أكبر دَيْن في نظامك القديم (جدول visits اللي بيخلط الحجز والإكلينيكي والفلوس → نفصلهم).
| # | المكوّن | النطاق |
| 1 | تسجيل المرضى / MPI | فهرس مريض رئيسي — هوية party/patient واحدة، ديموغرافيا، منع تكرار |
| 2 | ADT (دخول/خروج/تحويل) | دورة حياة التنويم، حالة الـ encounter، التحويل بين الأجنحة/الأسرّة |
| 3 | المواعيد والجدولة | فترات، طوابير، تقويم الأطباء، حالات الموعد |
| 4 | العيادات الخارجية (OPD) | زيارة خارجية، طابور انتظار، سير الاستشارة |
| 5 | التنويم (IPD) | سجل الدخول، ملاحظات يومية، جولات |
| 6 | السجل الطبي الإلكتروني (EMR) | SOAP، علامات حيوية، قائمة مشاكل، حساسية، تشخيصات، قفل بالتوقيع |
| 7 | إدارة الطلبات (CPOE) | إدخال موحّد للطلبات ← معمل/أشعة/أدوية/إجراءات |
| 8 | التمريض | خطط رعاية، علامات حيوية، إدخال/إخراج، سجل إعطاء الدواء (MAR) |
| 9 | العمليات والمسرح الجراحي | جدولة المسرح، حجز جراحي، ملاحظات العملية، التخدير |
| 10 | الطوارئ (ER) | فرز (triage)، تسجيل سريع، لوحة الطوارئ |
| 11 | الصيدلية وإعطاء الدواء | كتالوج أدوية، وصفة، صرف، MAR، تحذيرات تفاعل/حمل |
| 12 | الأشعة (RIS/PACS) | طلبات تصوير، worklist الأجهزة، تقرير، ربط DICOM |
| 13 | المعمل | كتالوج، طلب، عيّنة، نتيجة، تحقّق |
| 14-16 | بنك الدم · إدارة الأسرّة · التغذية | وحدات الدم/التوافق · خريطة الأسرّة · طلبات الحمية |
| 17-18 | الفوترة والكاشير · التأمين والمطالبات | التقاط الخدمات، فاتورة، إيصالات · أهلية، موافقة مسبقة، مطالبة |
| 19-20 | السجلات الطبية والترميز (ICD) · التقارير والتحليلات | ترميز ICD-10، إكمال الملف · لوحات إكلينيكية، سجلات، KPIs |
| 21-23 | بوابة المريض · الإحالات · الموافقات والطب الشرعي | حجز/نتائج أونلاين · إحالة/تتبّع · موافقات إلكترونية، توقيعات، خزنة وثائق |
| 24-27 | مكافحة العدوى · التدقيق والصلاحيات · خزنة الوثائق · البيانات الأساسية | أمراض معدية، عزل · سجل غير قابل للتعديل، RBAC · مرفقات · ICD/formulary/كتالوجات |
| المكوّن | القرار | الموديول الموجود اللي نتكامل معاه |
| المعمل | نتكامل | LIS — HIS يبعت طلب، يستقبل نتيجة. منبنيهوش |
| التأمين والمطالبات | نتكامل | NPHIES — HIS يوفّر encounter + تشخيص + خدمات |
| الفوترة / دفتر الأستاذ | نتكامل | Accounting + POS + EInvoicing — HIS يطلّع charge → فاتورة، بدون دفتر موازٍ |
| مخزون الأدوية/الصرف | نتكامل | Inventory — الصرف = stock move، مش تعديل رصيد |
| الموظفين/الأطباء | نتكامل | HRM — practitioner.hrm_employee_id FK |
| التسجيل/MPI · ADT · EMR · CPOE · OB-GYN · OR · IPD · الصيدلية الإكلينيكية · الأشعة (RIS) | نبني (HIS) | جديد — دي الطبقة الإكلينيكية اللي HIS بيملكها |
القاعدة: الموظفين = HRM · المخزون = Inventory · الفلوس = Accounting/POS · المعمل = LIS · المطالبات = NPHIES. الـ HIS مبيكرّرش — بيشاور عليهم بـ FK ويتكامل بالـ Events والـ Services.
his_parties (أي شخص أو منشأة؛ الديموغرافيا هنا مرة واحدة)
puid, party_type, is_patient/is_practitioner/is_institution (أعلام دور)
│
├─ his_party_relationships (زوج/وصي/أم — الزوج علاقة مش عمود)
├─ his_patients ── party_id, mrn (MPI) ← هوية المريض
└─ his_practitioners ── party_id, hrm_employee_id (FK→HRM)
his_appointments (حجز: scheduled→checked_in→done)
│ check-in
▼
┌──────────── his_encounters ────────────┐ الجذر الإكلينيكي
│ patient, practitioner, department,
│ class[opd|ipd|er], appointment_id?, admission_id?,
│ status: in_progress → done → SIGNED (يقفل → للقراءة فقط)
└──────────────────┬────────────────────────┘
┌──────────┬────────────┼────────────┬──────────────┐
his_vitals his_orders his_diagnoses his_observations his_clinical_notes
(CPOE→معمل/ (ICD-10) (SOAP/فحص)
أشعة/دواء)
قوائم طولية معلّقة على المريض، مرجوعة من الـ encounter:
his_problems · his_allergies · his_medications (قائمة مشاكل/حساسية/أدوية نشطة)
ليه ده مهم: الحجز (appointment) والإكلينيكي (encounter) والفلوس (charge) منفصلين — يحل خلط جدول visits القديم. وعند التوقيع (sign) الـ encounter يتقفل = نمط التدقيق اللي نظامك القديم مكنش عنده. متعدد المستأجرين بـ company_id + FK حقيقية.
| النطاق | الكيانات الأساسية |
| التسجيل / ADT | patients, admissions, transfers, discharges |
| المواعيد | appointments, schedule_slots, waitlist |
| EMR/Encounters | encounters, observations, vitals, clinical_notes, diagnoses |
| CPOE/Orders | orders, order_items, order_sets (نوع الطلب بيوجّهه لـ LIS/RIS/صيدلية) |
| التمريض | care_plans, nursing_assessments, intake_output, vitals_rounds |
| العمليات (OR) | surgery_cases, or_schedules, surgery_team, anesthesia_records, op_notes |
| IPD/أسرّة | wards, beds, bed_assignments (حالة السرير enum) |
| الصيدلية/MAR | prescriptions, prescription_lines, medication_administrations (الصرف → Inventory move) |
| النطاق | المحتوى | بيوحّد إيه من القديم |
| الحمل / المتابعة | pregnancy (gravida، LMP→EDD، fetuses) + prenatal_visit[] (أسابيع محسوبة، ضغط، fundal height، FHR، EFW، BPD/AC/HC/FL، مخاطر) | يوحّد ancsheet/mainantenental/followup (3 stacks → 1) |
| الولادة / Perinatal | perinatal (نوع الولادة، عرض، شق، مشيمة) + monitoring[] partograph + puerperium_monitor[] (lochia) + pregnancy_result[] → المولود يبقى party/patient | operations + registeration + بيانات النفاس |
| أمراض النساء | تاريخ الطمث، Pap (Bethesda)، ماموجرام، منظار؛ قائمة المشاكل؛ منظار بطن/رحم | gynecology, phmenstrual, endoscopy |
| العقم / IVF-ART | موديول ART من الدرجة الأولى: art_cycle + stimulation_day[] (folliculometry) + art_procedure (OPU/ET). دورة ناجحة → تولّد pregnancy | ivfsheet/mointoringsheet/folliculom → aggregate؛ السائل المنوي/الهرمونات → LIS |
| السونار التوليدي | biometry منظّم على prenatal_visit + imaging_study للصور | *us/ultrasoundobst → biometry منظّم |
الخط المتصل: عقم → دورة ART → حمل → ولادة → مولود (كمريض جديد). ده اللي تصميمك القديم بالجداول المتوازية مكنش يقدر يعبّر عنه.
| التدفّق | الآلية |
| CPOE → معمل | HIS Action بيستدعي LIS\CreateLabRequest (موجود أصلاً للغرض ده)، ويسمع LabResultReleased → يكتب observation مربوط (بـ ref مش نسخة) |
| الفوترة → Accounting | عند توقيع الـ encounter/إتمام الطلب، PostChargeItem بينده service الفوترة (نفس مسار LIS) — idempotent، بدون كتابة GL مباشرة |
| الصيدلية → Inventory | DispenseMedication بينده stock-move service (يخصم من موقع الصيدلية ذرّياً) |
| المطالبات → NPHIES | HIS يطلّع EncounterFinalized → listener يبني المطالبة من التشخيصات + الخدمات |
| الأطباء ← HRM | practitioner.hrm_employee_id FK → موظف HRM (مصدر الحقيقة للموظفين) |
القاعدة: أوامر الكتابة عبر-الموديول تمشي بالـ Action/Service (متزامن، transactional)؛ الإشعارات تمشي بالـ Events (async، queued).
المبدأ: نورِّث اللي الـ LIS عمله صح (استقبال barcode بصوت، إدخال نتائج keyboard inline، worklist-first) ونمنع اللي عمله غلط هيكلياً (9K سطر ميت، 2471 لون يدوي، god components، 3/97 OnPush، صفر ARIA) — عبر CI gates وبنية فولدرات ضد التكرار.
١. مبادئ التصميم
- Workspaces حسب الدور، مش قائمة مسطّحة: كل دور (استقبال/طبيب/ممرض/كاشير/صيدلي) له مساحة عمل وطابور خاص — مش نفس الـ 60 عنصر مخفيين بالصلاحيات.
- Worklist/طابور أولاً: صفحة الهبوط لأي دور = قائمة المرضى/المهام المنتظرة عليّ، مش dashboard.
- إدخال keyboard موحّد: نفس الـ contract في كل الشاشات (مش زي الـ LIS اللي كان ممتاز في النتائج وكليك-لكل-تحليل في الـ wizard).
- كثافة وقابلية مسح بصري · أمان كـ primitives (بانر حساسية، flags حرجة) مش مجرد نصوص · تأكيد على غير-القابل-للتراجع بس.
- ثنائي اللغة RTL من الموديل · إتاحة (a11y) من اليوم الأول (gate مش مرحلة لاحقة) · "الخطوة التالية" بدل التنقّل · Signals + OnPush في كل مكان · ركّب لا تنسخ.
٢. عقد الـ keyboard الموحّد
| المفتاح | الإجراء | المفتاح | الإجراء |
| / · Ctrl+K | بحث المريض العام (command palette) | Enter | فتح/حفظ خلية + انتقال لأسفل |
| ↑ ↓ | تحريك الصف في أي worklist | Tab / Shift+Tab | الحقل/الخلية التالية |
| Ctrl+S | حفظ مسودة | Ctrl+Enter | توقيع/إنهاء (الإجراء المؤكَّد) |
| Alt+N | إجراء "الخطوة التالية" | Scan | دايماً يروح للـ ScanInput النشط |
٣. الـ Design System (يتبني أول — Sprint 0)
السبب الجذري لمشاكل الـ LIS كان غياب الطبقة دي. هنا نعكس الترتيب: التوكنز + مكتبة الكومبوننتس تيجي الأول، ومفيش شاشة يُسمح لها تـ merge لون hex خام أو جدول مخصّص.
- توكنز (ملف واحد مصدر الحقيقة): ألوان دلالية (
--his-color-*, --his-status-*, --his-clinical-critical/allergy/abnormal)، مسافات (4px scale)، خطوط (أرقام جدولية للقيم)، كثافة. مربوطة بتوكنز PrimeNG. أي hex خام = فشل lint.
- ١٢ كومبوننت أساسي يتبني الأول (standalone، OnPush، signals، RTL، ARIA، <400 سطر):
| الكومبوننت | الغرض |
| PatientBanner | شريط سياق المريض ملصوق فوق — صورة/اسم/MRN + صف حساسية أحمر + flags (Rh−، حامل + أسابيع، عزل). الكومبوننت اللي بيمنع أخطاء "المريض الغلط" |
| WorklistGrid / QueueGrid | الشغّالة — قائمة virtual-scrolled بالكيبورد، أعمدة بالـ config، فلاتر محفوظة |
| EncounterShell | إطار الطبيب: PatientBanner + stepper (شكوى→فحص→تشخيص→طلبات→وصفة→توقيع) + timeline rail. بيمنع الـ god-component |
| OrderCart / CPOE | كتالوج طلبات بحث + سلّة + تحذيرات تفاعل/تكرار inline + STAT — بديل كليك-لكل-تحليل |
| ResultViewer · VitalsInput · StatusBadge · KPICard | عرض نتائج (↑↓ + مدى) · إدخال علامات حيوية سريع · شارة الحالة الوحيدة المعتمدة · بطاقة مؤشر |
| PageHeader · ScanInput · FormDialog · TimelineRail | ترويسة · إدخال باركود بصوت · modal بـ focus-trap · شريط تاريخ المريض |
٤. مساحات العمل حسب الدور
| المساحة | الوصف والـ UX |
| الاستقبال / MPI | طابور وصول اليوم · بحث-أولاً يمنع تكرار الـ MRN (لازم ترفض "لا يوجد تطابق" قبل إنشاء جديد) · تسجيل بـ FormDialog + طباعة سوار |
| الجدولة | لوحة يوم/أسبوع، أعمدة = أطباء/غرف، سحب-للحجز · تعارضات inline · check-in يحوّل للطابور |
| طابور العيادات (OPD) | طابور انتظار حي + عدّادات + ScanInput للسوار (بصوت) |
| كوكبيت الطبيب (EMR) ⭐ | المركز: EncounterShell بالـ spine (شكوى→فحص→تشخيص→طلبات→وصفة→توقيع)، كل خطوة بزر "التالي"، timeline على اليمين، الزيارة كلها تتعمل بدون ماوس |
| مساحة النساء والتوليد ⭐ | chart الحمل/ANC (LMP/EDD، trend grid للزيارات)، partograph (اتساع/FHR/تقلصات مقابل خطوط الإنذار)، سونار منظّم (biometry → GA/EFW) |
| IPD / لوحة الأسرّة | شبكة أسرّة ملوّنة بالحالة، admit/transfer/discharge + checklist |
| OR · التمريض/MAR · الصيدلية · الكاشير · بوابة المريض | جدول المسرح + WHO checklist · مهام مستحقة + scan سوار+دواء (5 rights) · طابور وصفات + verify · طابور غير مدفوع · بوابة مبسّطة عالية التباين |
٥. بنية فولدرات الـ Frontend (ضد التكرار)
features/his/
├── his.routes.ts # جدول مسارات lazy واحد — نسخة وحيدة لكل شاشة (لا -v2)
├── his-layout/ # shell: شريط علوي + sidebar حسب الدور + command palette
│ └── nav.config.ts # دور→قائمة (data مش كود مكرّر)
│
├── shared/ # ★ الـ DESIGN SYSTEM — يتبني أول، يُستورد في كل مكان
│ ├── index.ts # البارّل الوحيد — الشاشات تستورد منه فقط
│ ├── styles/_tokens.scss # توكنز اللون/المسافة/الخط (مصدر الحقيقة)
│ ├── components/ # الـ12 primitive: patient-banner, worklist-grid,
│ │ # encounter-shell, order-cart, result-viewer, vitals-input,
│ │ # status-badge, kpi-card, page-header, scan-input, form-dialog, timeline-rail
│ ├── directives/ · pipes/ · models/
│
├── core/ # خدمات HIS (بيانات + cross-cutting)، بدون UI
│ ├── services/ · guards/ · config/
│
├── registration/ components/ # فولدر لكل WORKSPACE (دور/مجال)
├── scheduling/ · opd-reception/ · emr/ (steps/) · obgyn/ (anc-chart, partograph, ultrasound)
├── ipd/ · or/ · nursing/ · pharmacy/ · billing/ · portal/ · setup/
قواعد ضد التكرار مدمجة في البنية: نسخة وحيدة لكل route (مفيش -v2 يتعمله merge أبداً) · sub-components محلية في components/ الشاشة، والمشترك يترقّى لـ shared/ · shared/index.ts هو سطح الاستيراد الوحيد · knip/ts-prune في CI يفشّل الكود الميت.
٦. ضوابط الجودة (merge gates — مش أماني)
OnPush على كل كومبوننت (lint) Signals-first <400 سطر/كومبوننت صفر hex خام (stylelint) صفر كود ميت (knip) a11y checklist + axe كل النصوص translate PatientBanner إجباري على شاشات المريض تغطية ≥80%
Modules/HIS/app/
├── Models/ Party, Patient, Practitioner, Department, Ward, Bed,
│ Appointment, Encounter, Vital, Observation, Order, OrderItem,
│ Admission, Transfer, Diagnosis, Problem, Allergy, Medication,
│ Prescription, PrescriptionLine, MedicationAdministration,
│ SurgeryCase, Pregnancy, PrenatalVisit, Perinatal, PerinatalMonitor,
│ PregnancyResult, MenstrualHistory, ArtCycle, StimulationDay
├── Http/ Controllers/ · Requests/ · Resources/
├── Actions/ RegisterPatient, OpenEncounter, SignEncounter (tx+lock),
│ PlaceLabOrder, ImportLabResult, AdmitPatient, AssignBed,
│ DispenseMedication, PostChargeItem, FinalizeEncounter,
│ StartPregnancy, RecordPrenatalVisit, RecordDelivery, StartArtCycle
├── Services/ MpiService, EncounterService, BedBoardService,
│ GpaCalculatorService, GestationalAgeService, HisBillingBridge
├── Events/ · Listeners/ # PatientRegistered, EncounterSigned, LabOrderPlaced…
│ # CreateLabRequestOnOrderPlaced, PostChargesOnEncounterSigned…
├── Enums/ · Jobs/ (heavy/async) · Support/ (HisTenantScope) · Providers/
└── routes/ · database/migrations/
معايير هندسية (من دروس تدقيق LIS/Production): transactions + قفل على كل تغيير حالة (سرير/encounter/مخزون) · Global Tenant Scope حقيقي (الموديولات الحالية ناقصها) · تدقيق عبر model observers (encounter موقّع = غير قابل للتعديل) · شغل تقيل في queue · listeners idempotent.
| المرحلة | نبني | ليه الترتيب ده |
| MVP | التسجيل/MPI · المواعيد · OPD encounter (EMR/SOAP + توقيع) · aggregate الحمل + متابعة · أمراض النساء · سونار · وصفات · موافقات · تدقيق/RBAC. + تكامل LIS/Accounting/NPHIES/Inventory/HRM | ده اللي عيادة النساء بتعمله يومياً. الـ MPI + encounter هما الأساس، و aggregate الحمل أكبر إصلاح لدَيْنك القديم |
| Phase 2 | ART/IVF (folliculometry، OPU/ET → ربط بالحمل) · الولادة/Perinatal + المولود كمريض · RIS (أشعة) · CPOE موحّد · إحالات · ترميز ICD · بوابة المريض | الـ ART قيمتك المميّزة وإيرادك العالي — بس بيعتمد على spine الـ MVP. الولادة بتقفل الحلقة التوليدية |
| Phase 3 | ADT · IPD · التمريض + MAR · OR/المسرح · الطوارئ · إدارة الأسرّة · التغذية · بنك الدم · مكافحة عدوى · تحليلات متقدمة | قدرات التنويم محتاجة بس لما تكبر من عيادة لمستشفى — بتعيد استخدام نفس الـ spine، فتأجيلها مخاطرته قليلة |
| المتطلب | التطبيق |
| مسار تدقيق غير قابل للتعديل | سجل append-only لكل PHI، والـ encounter الموقّع يتقفل للقراءة فقط (CBAHI/JCI وطب شرعي) |
| الموافقات والطب الشرعي | موافقات إلكترونية منظّمة + توقيع + خزنة وثائق — MVP، مش قابلة للتأجيل لإجراءات ART/الجراحة |
| ترميز ICD-10 · NPHIES | كل تشخيص مرمّز؛ بنية الـ encounter تغذّي NPHIES من البداية (متعملش retrofit) |
| سلامة المريض | تحذيرات حساسية + فئة حمل الدواء (A–X) عند الوصف (حرج لمرضى التوليد) + فحص تفاعلات + قاعدة حمل نشط واحد |
| سلامة البيانات | FK حقيقية، UTF-8، استعلامات parameterized (يقتل فئة SQL injection القديمة)، RBAC + least privilege |