🔗 خطة: كود جهاز واحد ← أكثر من تحليل (Multi-Mapping)

مثال: السكر — الصايم (FBS) والفاطر (PPBS) لهم نفس كود الجهاز، بس تحليلين مختلفين في النظام

Moon ERP · LIS · machine-test-mappings + orders + result-ingest · تحليل قبل التنفيذ

📅 13 يونيو 2026 ⛔ خطة فقط — للقرار

المطلوب (بكلامك)

«الكود يتربط بأكتر من investigation — مثلاً السكر الصايم والفاطر نفس كود التحليل على الجهاز، بس هما اتنين تحليل مختلف. فلازم الاتنين على نفس الكود، ولما يطلب اللي فيهم في العينة هو اللي يرجع.»

الجوهر: الجهاز بيقيس «جلوكوز» بكود واحد (مثلاً GLU). لكن في النظام ده ممكن يكون FBS (صايم) أو PPBS (فاطر) أو RBS (عشوائي) — تحاليل منفصلة بأسعار/رنجات مختلفة. لازم:

١ ليه ده مش شغّال دلوقتي — عائقين

العائقالمكانالأثر
قيد تفرّد الكود machine_test_code_unique على (machine_id, machine_test_code)migrationمينفعش كود GLU يتكرر مرتين على نفس الجهاز → مينفعش نربطه لـFBS و PPBS.
الإدخال بياخد أول mapping عشوائيLabMachineResultController::storewhere(machine,code)->first()لو الكود متكرر، النتيجة تروح لتحليل عشوائي (FBS أو PPBS) بغضّ النظر عن العينة → نتيجة في التحليل الغلط.
ملاحظة: قيد machine_investigation_unique (machine, investigation) يفضل زي ما هو — كل investigation يتربط مرة واحدة، بس ممكن أكتر من investigation يشتركوا في نفس الكود.

٢ الخبر الكويس — نموذج «لكل عينة» بيحلّ نص المشكلة

إحنا أصلاً صلّحنا orders() تبقى per-sample (ترجّع تحاليل العينة/الباركود نفسه، مش الطلب كله). والسكر الصايم والفاطر بيتسحبوا في عينتين/باركودين مختلفين (سحبة صايم وسحبة بعد الأكل).

باركود FBS → العينة عليها FBS → الاستعلام يرجّع GLU → الجهاز يبعت GLU → يروح لـ FBS ✅ باركود PPBS → العينة عليها PPBS → الاستعلام يرجّع GLU → الجهاز يبعت GLU → يروح لـ PPBS ✅
يعني: العينة نفسها هي اللي بتحدّد التحليل الصح. كل اللي محتاجينه: (أ) نسمح بنفس الكود لتحاليل مختلفة، (ب) الإدخال يختار التحليل اللي على عينة النتيجة بدل العشوائي.

٣ الحل المقترح

أ) قاعدة البيانات

ب) الإدخال (النتيجة) — request-aware

في store(): بدل ->first()، لما الكود يطابق أكتر من mapping:

mappings = كل الـ(machine, code) النشطة لو واحد بس → استخدمه (زي دلوقتي) لو أكتر من واحد → اختار اللي investigation بتاعه موجود على طلب/عينة النتيجة (lab_sample_investigations) لو لسه أكتر من واحد على نفس العينة → اختار اللي لسه مالوش نتيجة (أو علّمه للمراجعة) لو مفيش تطابق → unmatched/pending

ج) الاستعلام (orders)

د) حفظ الـmapping + التحقّق

هـ) الواجهة (machine-setup) — ده اللي إنت طالبه بالظبط

كل كود جهاز يبقى قصاده اختيار متعدد (multi-select) للتحاليل بدل اختيار واحد:

كود الجهاز التحاليل المربوطة (multi-select) ───────── ────────────────────────────── GLU → [ FBS ✓ ] [ PPBS ✓ ] [ RBS ✓ ] ← تختار أكتر من تحليل TSH II → [ TSH ✓ ] ALT → [ ALT ✓ ]
النتيجة العملية: في machine-setup تكتب الكود مرة واحدة وتعلّم على كل التحاليل اللي بتطلع منه (FBS/PPBS/RBS) — والباقي (إن النتيجة تروح للتحليل الصح حسب العينة) بيتظبط تلقائياً بالـrequest-aware ingest.

٤ الحالات الحرجة — محتاجة قرارك

الحالةالسؤالالمقترح
FBS و PPBS على نفس العينة/الباركودلو الاتنين اتطلبوا على نفس السحبة (غير شائع)، الجهاز يبعت GLU واحد → يروح لمين؟غالباً مش بيحصل (سحبتين مختلفتين). لو حصل: نطبّق على اللي لسه فاضي، أو نطبّق على الاتنين بنفس القيمة، أو نعلّمه «غامض» للمراجعة. قرار
تحاليل مكرّرة فعلاً (زي Vitamin D 151/2567)نفس الحل بيخدمها؟أيوة — نفس الآلية بتغطّي التحاليل المكرّرة بأسماء مختلفة كمان.
دمج مع «الفاضي فقط»التوافق مع خطة «الاستعلام يرجّع الفاضي بس»متوافقين — الاتنين بيشتغلوا على مستوى العينة. ننفّذهم مع بعض أو ورا بعض.

المخاطر + ترتيب التنفيذ

الأهم: لازم نعمل الإدخال request-aware قبل أو مع إزالة قيد تفرّد الكود. لو شِلنا القيد والإدخال لسه ->first() → النتيجة هتروح لتحليل عشوائي (FBS أو PPBS) = نتيجة في التحليل الغلط (خطر إكلينيكي).

ترتيب التنفيذ المقترح

قرارات محتاجها منك