صورة شاملة للنظام كله: الميدل وير (البرنامج على جهاز المعمل) + الكلود (Moon ERP) + الواجهة + تدفق البيانات من الجهاز للمريض. إيه الموجود، إيه الناقص، وإزاي نحسّن الصورة.
التقاط QC من الأجهزة · اختبار ASTM حقيقي (Maglumi/Mispa) · قرار port UDI النهائي · دعم 5-part · تحويل الوحدات · driver عام config-driven.
الفكرة: الميدل وير هو الجسر اللي بيقعد على جهاز المعمل، بيسمع الأجهزة (شبكة أو سيريال)، يحلّل الرسالة، ويرفعها للكلود. الكلود بيطابق الكود بالتحليل والباركود بالعينة ويحط القيمة على المريض. الكاتالوج بيعرّف أنواع الأجهزة، والنُسخ هي أجهزة المعمل الفعلية.
| المكوّن | الوظيفة | الحالة |
|---|---|---|
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» | شغّال |
| المكوّن | الوظيفة | الحالة |
|---|---|---|
كاتالوج الأجهزة (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 (ثنائي الاتجاه) | الجهاز يستعلم بالباركود → التحاليل المطلوبة | مبني — مش مُختبر بجهاز |
| الشاشة | الوظيفة | الحالة |
|---|---|---|
| كاتالوج الأجهزة | أنواع + درايفر + تحاليل + رنجات + فيو الدرايفر | اتعمل النهاردة |
| الأجهزة (machines) | إضافة من الكاتالوج + تعديل + أرشيف الرسائل الخام لكل جهاز | اتعمل النهاردة |
| إعداد الجهاز (machine-setup) | ربط الأكواد بالتحاليل + رنجات + البيانات الواردة | شغّال |
| الورك ليست + الفاليديشن | عمود المصدر (أيقونة + tooltip) + إصلاح فلتر التاريخ | اتعمل النهاردة |
طلب LR-2026-00293: الجهاز بعت 11 تحليل CBC → اتطابقوا ودخلوا على المريض تلقائياً، وبيظهروا بمصدر «من جهاز: Dymind DH36».
كان بيطلب «بورت شبكة» بس. اتعمل: الفورم دلوقتي بيعرض COM/baud/data/stop/parity لما النوع ASTM/سيريال، والـinstantiate بيبني إعداد سيريال.
الـASTM + استعلام الأوردرات مبني ومُختبر بمحاكي بس — لسه مفيش جهاز Maglumi/Mispa حقيقي اتجرّب عليه.
DH36 بيطلّع 3-part؛ بنل CBC فيه 5-part (Neu/Lymph/Mono/Eosino/Baso) — الـ5 دول مش متطابقين، محتاجين جهاز 5-part أو إدخال يدوي.
كان run.bat يدوي. اتعمل: Scheduled Task MoonLisMiddleware (عند تسجيل الدخول + يعيد التشغيل لو وقع). مُثبت عملياً — أعدنا تشغيله عبر الـtask ونجح.
الجهاز عنيد على 5600 (UDI). يا إما نوقف UDI وناخد 5600، يا إما الجهاز يتغيّر لـ5601 ونعمل relay. محتاج قرار نهائي ثابت.
اتعمل: عمود «الاتصال» في شاشة الأجهزة — 🟢 متصل/🔴 غير متصل + اسم المحطة (workstation اتخزّن من الheartbeat) + tooltip بآخر اتصال/آخر نتيجة. is_online = آخر 5 دقايق.
اتعمل: الميدل وير بيأرشف كل رسالة كاملة (MSH…OBX) عبر الـoutbox لـcommunication-logs، وفي الواجهة toggle «بارامترات / رسائل كاملة». مُختبر ✓.
النتائج اللي بتوصل قبل الأوردر/الـmapping بتفضل «pending/غير مطابقة» — محتاجين شاشة مراجعة (match يدوي / تجاهل) أوضح.
كانت بتعدّي صامتة. اتعمل: نتيجة الجهاز بتشغّل حساب الـflag + critical alert + audit + LabResultEntered + auto-verification. مُختبر: HGB=2.5 → critical_low → Critical Alert اتعمل ✓.
الأجهزة بتبعت نتائج QC كمان — مفيش التقاط تلقائي لنتائج الـQC (Levey-Jennings / Westgard) من رسائل الجهاز.
بننسخ وحدة الجهاز زي ما هي (مفيش تحويل وحدات لو مختلفة)، وبنعيد حساب الـflag بدل ما ناخد flag الجهاز (OBX-8). تحويل/مطابقة الوحدات تمنع أخطاء.
اتعمل: واجهة الـadmin بقى ليها Basic Auth اختياري (تحط admin.password في config → تطلب كلمة سر). باقي: توكن منفصل لكل محطة (لو حبيت).
كل بروتوكول جديد = driver Python جديد. مواضع حقول الـOBX قابلة للإعداد جزئياً (barcode_fields) بس منطق الـparse ثابت — driver عام config-driven يسهّل التوسّع.
القلب كان شغّال؛ دلوقتي اتغطّت الحواف الحرجة: أمان إكلينيكي (critical alerts/auto-verify/audit)، تشغيل تلقائي، إعداد سيريال، مراقبة (online/offline + محطة)، أرشيف رسائل كامل، أمان واجهة الميدل وير.
التقاط QC + اختبار ASTM حقيقي محتاجين Maglumi/Mispa متوصّل. قرار port UDI تشغيلي. وتحسينات P2 (وحدات، driver عام، 5-part) لما نحتاجها.
لما يتوصّل جهاز Maglumi/Mispa حقيقي: نختبر الـASTM/الثنائي الحي + نلتقط الـQC. ولحد ساعتها النظام جاهز ومتكامل لأجهزة الـHL7 (DH36) بالكامل.