تحليل عميق — نظام الأجهزة (Analyzers) المتكامل

صورة شاملة للنظام كله: الميدل وير (البرنامج على جهاز المعمل) + الكلود (Moon ERP) + الواجهة + تدفق البيانات من الجهاز للمريض. إيه الموجود، إيه الناقص، وإزاي نحسّن الصورة.

🗓️ 2026-06-07 (محدّث بعد تنفيذ P0+P1)🧬 LIS / Analyzer Integration⚙️ Middleware · BE lis/maintenance-completion · FE fix/doctor-revamp

اتنفّذ — P0 (الحرج) + P1 (المهم) خلصوا

P0 — الأساسيات الحرجة تم

  • الأمان الإكلينيكي: نتيجة الجهاز بتشغّل flag + critical alert + audit (مُختبر: HGB=2.5 → alert)
  • التشغيل التلقائي: Scheduled Task (logon + restart-on-fail) — مُثبت عملياً
  • فورم السيريال: COM/baud/parity في إضافة/تعديل الجهاز

P1 — المهم تم

  • مراقبة الأجهزة: online/offline + المحطة + آخر ظهور
  • Auto-verification على نتائج الأجهزة (validate تلقائي/annotate)
  • أرشيف الرسالة الكاملة + عرض في الواجهة (toggle)
  • أمان الميدل وير (Basic Auth اختياري)

باقي (يعتمد على جهاز حقيقي / تشغيلي — مش كود)

التقاط QC من الأجهزة · اختبار ASTM حقيقي (Maglumi/Mispa) · قرار port UDI النهائي · دعم 5-part · تحويل الوحدات · driver عام config-driven.

1 الصورة الكاملة (Architecture)

┌─────────────┐ HL7/TCP أو ASTM/Serial ┌──────────────────────────┐ HTTPS ┌────────────────────────┐ │ الأجهزة │ ─────────────────────────► │ الميدل وير (on-prem) │ ────────► │ Moon ERP (الكلود) │ │ DH36 / CBC │ ◄───── (ASTM ثنائي) ─────── │ per workstation │ ◄──────── │ BE + DB │ │ Maglumi │ │ • drivers (hl7/astm) │ orders │ │ │ Mispa │ │ • outbox (SQLite) │ │ • catalog + machines │ └─────────────┘ │ • relay → UDI (اختياري) │ │ • machine-results │ │ • admin UI (web) │ │ • mappings + auto-apply│ └──────────────────────────┘ └───────────┬────────────┘ │ match (code→تحليل، باركود→عينة) ▼ ┌────────────────────────────────────────────┐ │ نتيجة المريض → الورك ليست → فاليديشن → ريليز │ └────────────────────────────────────────────┘

الفكرة: الميدل وير هو الجسر اللي بيقعد على جهاز المعمل، بيسمع الأجهزة (شبكة أو سيريال)، يحلّل الرسالة، ويرفعها للكلود. الكلود بيطابق الكود بالتحليل والباركود بالعينة ويحط القيمة على المريض. الكاتالوج بيعرّف أنواع الأجهزة، والنُسخ هي أجهزة المعمل الفعلية.

2 المكوّنات الموجودة (What exists)

أ. الميدل وير (Python — على جهاز المعمل)

المكوّنالوظيفةالحالة
transport TCP + mllp.py/hl7.pyاستقبال HL7 من أجهزة الشبكة (DH36)شغّال ومُختبر
transport Serial + astm.pyاستقبال ASTM من أجهزة COM (Maglumi/Mispa) — framing ثنائي الاتجاهمبني + مُختبر بمحاكي
drivers (dymind_hl7 / maglumi_astm / mispa_astm)تحليل الرسالة → باركود + نتائج3 درايفرات
buffer.py (outbox SQLite)تخزين + إعادة محاولة الرفع لو النت قطعشغّال
relay (forward → UDI)تمرير شفّاف للبرنامج الموجود بحيث ميتفصلششغّال
admin.py (واجهة ويب)إعدادات + الأجهزة + البيانات الواردة + اللوج + مزامنةشغّال (عربي)
sync + heartbeat + workstationسحب الأجهزة من الكلود + إبقاء الجهاز «online»شغّال

ب. الكلود (Backend)

المكوّنالوظيفةالحالة
كاتالوج الأجهزة (lab_device_models)أنواع + درايفر + تحاليل + رنجات + instantiateشغّال (DH36/Maglumi/Mispa)
الأجهزة (lab_machines)نُسخ فعلية + connection_settings + فرعشغّال
ingest + auto-matchاستقبال النتائج + مطابقة الكود بالتحليل (mappings) والباركود بالعينةشغّال ومُختبر
auto-apply → نتيجة المريضكتابة القيمة على lab_result (status=entered)شغّال
تتبّع المصدر (result_source + machine_id)منول / جهاز (+ اسمه) / لاب خارجياتعمل النهاردة
orders endpoint (ثنائي الاتجاه)الجهاز يستعلم بالباركود → التحاليل المطلوبةمبني — مش مُختبر بجهاز

ج. الواجهة (Frontend)

الشاشةالوظيفةالحالة
كاتالوج الأجهزةأنواع + درايفر + تحاليل + رنجات + فيو الدرايفراتعمل النهاردة
الأجهزة (machines)إضافة من الكاتالوج + تعديل + أرشيف الرسائل الخام لكل جهازاتعمل النهاردة
إعداد الجهاز (machine-setup)ربط الأكواد بالتحاليل + رنجات + البيانات الواردةشغّال
الورك ليست + الفاليديشنعمود المصدر (أيقونة + tooltip) + إصلاح فلتر التاريخاتعمل النهاردة

3 تدفق البيانات end-to-end (مُثبت بالتجربة)

1) الجهاز يبعت نتيجة CBC (HL7) ──► الميدل وير (بورت 5600) 2) الميدل وير: parse → باركود 260607000641 + نتائج (718-7=HGB…) ──► outbox 3) رفع HTTPS ──► POST /lis/machine-results (لكل بارامتر) 4) الكلود: 718-7 ──(mapping)──► تحليل HGB | الباركود ──► عينة 213 ──► طلب 106 5) auto-apply ──► نتيجة المريض = 14.2 (status=entered, source=machine, machine=Dymind DH36) 6) تظهر في الورك ليست/الفاليديشن بأيقونة 🖥 ──► validate ──► approve ──► release

✅ مُثبت

طلب LR-2026-00293: الجهاز بعت 11 تحليل CBC → اتطابقوا ودخلوا على المريض تلقائياً، وبيظهروا بمصدر «من جهاز: Dymind DH36».

4 الناقص والفجوات (Gaps)

P0 حرج P1 مهم P2 تحسين

🔌 التغطية والإعداد

✓ تم

فورم الإعداد للأجهزة الـSerial

كان بيطلب «بورت شبكة» بس. اتعمل: الفورم دلوقتي بيعرض COM/baud/data/stop/parity لما النوع ASTM/سيريال، والـinstantiate بيبني إعداد سيريال.

P1

اختبار حقيقي للـASTM/الثنائي الاتجاه

الـASTM + استعلام الأوردرات مبني ومُختبر بمحاكي بس — لسه مفيش جهاز Maglumi/Mispa حقيقي اتجرّب عليه.

P2

الـDifferential 5-part

DH36 بيطلّع 3-part؛ بنل CBC فيه 5-part (Neu/Lymph/Mono/Eosino/Baso) — الـ5 دول مش متطابقين، محتاجين جهاز 5-part أو إدخال يدوي.

🛡️ الموثوقية (Reliability)

✓ تم

التشغيل التلقائي للميدل وير

كان run.bat يدوي. اتعمل: Scheduled Task MoonLisMiddleware (عند تسجيل الدخول + يعيد التشغيل لو وقع). مُثبت عملياً — أعدنا تشغيله عبر الـtask ونجح.

P1

معضلة الـport مع UDI

الجهاز عنيد على 5600 (UDI). يا إما نوقف UDI وناخد 5600، يا إما الجهاز يتغيّر لـ5601 ونعمل relay. محتاج قرار نهائي ثابت.

📊 المراقبة (Monitoring)

✓ تم

لوحة حالة الأجهزة

اتعمل: عمود «الاتصال» في شاشة الأجهزة — 🟢 متصل/🔴 غير متصل + اسم المحطة (workstation اتخزّن من الheartbeat) + tooltip بآخر اتصال/آخر نتيجة. is_online = آخر 5 دقايق.

✓ تم

أرشيف الرسالة الكاملة

اتعمل: الميدل وير بيأرشف كل رسالة كاملة (MSH…OBX) عبر الـoutbox لـcommunication-logs، وفي الواجهة toggle «بارامترات / رسائل كاملة». مُختبر ✓.

P2

نتائج غير مطابقة بدون UI واضح

النتائج اللي بتوصل قبل الأوردر/الـmapping بتفضل «pending/غير مطابقة» — محتاجين شاشة مراجعة (match يدوي / تجاهل) أوضح.

🧪 الجودة والإكلينيكي (Clinical safety)

✓ تم

الأمان الإكلينيكي على نتائج الأجهزة

كانت بتعدّي صامتة. اتعمل: نتيجة الجهاز بتشغّل حساب الـflag + critical alert + audit + LabResultEntered + auto-verification. مُختبر: HGB=2.5 → critical_low → Critical Alert اتعمل ✓.

P1

QC من الأجهزة مش متقاط

الأجهزة بتبعت نتائج QC كمان — مفيش التقاط تلقائي لنتائج الـQC (Levey-Jennings / Westgard) من رسائل الجهاز.

P2

الوحدات والـflags بتاعة الجهاز

بننسخ وحدة الجهاز زي ما هي (مفيش تحويل وحدات لو مختلفة)، وبنعيد حساب الـflag بدل ما ناخد flag الجهاز (OBX-8). تحويل/مطابقة الوحدات تمنع أخطاء.

🔐 الأمان والقابلية للتوسّع

✓ تم (جزئي)

أمان الميدل وير

اتعمل: واجهة الـadmin بقى ليها Basic Auth اختياري (تحط admin.password في config → تطلب كلمة سر). باقي: توكن منفصل لكل محطة (لو حبيت).

P2

إضافة جهاز جديد بتتطلب كود

كل بروتوكول جديد = driver Python جديد. مواضع حقول الـOBX قابلة للإعداد جزئياً (barcode_fields) بس منطق الـparse ثابت — driver عام config-driven يسهّل التوسّع.

5 خريطة التحسين المقترحة (Roadmap)

المرحلة 1 — الأساسيات الحرجة (P0) تمّت

المرحلة 2 — المراقبة والموثوقية (P1) تمّت (الكود)

المرحلة 3 — تحسينات (P2) لسه

6 الحالة بعد التنفيذ

اللي اتعمل P0 + P1

القلب كان شغّال؛ دلوقتي اتغطّت الحواف الحرجة: أمان إكلينيكي (critical alerts/auto-verify/audit)، تشغيل تلقائي، إعداد سيريال، مراقبة (online/offline + محطة)، أرشيف رسائل كامل، أمان واجهة الميدل وير.

الباقي يعتمد على جهاز/تشغيل

التقاط QC + اختبار ASTM حقيقي محتاجين Maglumi/Mispa متوصّل. قرار port UDI تشغيلي. وتحسينات P2 (وحدات، driver عام، 5-part) لما نحتاجها.

الخطوة الجاية المقترحة

لما يتوصّل جهاز Maglumi/Mispa حقيقي: نختبر الـASTM/الثنائي الحي + نلتقط الـQC. ولحد ساعتها النظام جاهز ومتكامل لأجهزة الـHL7 (DH36) بالكامل.