🧪 خطة: الاستعلام يرجّع التحاليل الفاضية فقط

Host Query (orders) — لا يُرجِّع تحليلاً له نتيجة بالفعل، فقط اللي لسه مالوش نتيجة + التعامل مع إعادة الفحص (re-test)

Moon ERP · LIS · LabMachineController::orders() · تحليل قبل التنفيذ

📅 13 يونيو 2026 ⛔ خطة فقط — لم يُنفَّذ شيء

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

«لو التحليل ده ليه نتيجة، لما الجهاز يعمل query ميرجعش بالتحاليل اللي فيها نتايج أصلاً — يرجع بس باللي فاضية. ولو عمل re-test هنعمل إيه؟»

يعني الـorders لازم تفلتر: ترجّع فقط التحاليل اللي لسه مستنية نتيجة على العينة دي + المربوطة بالجهاز ده. أي تحليل اتعمل وله نتيجة → يتشال من الرد (عشان الجهاز ميعيدش تشغيله ويهدر ريجنت أو يدوس على نتيجة موجودة).

١ الوضع الحالي

orders(barcode) دلوقتي (بعد إصلاح اليوم — صارت per-sample):

barcode → العينة (lab_samples) → تحاليل العينة (lab_sample_investigations: كل اللي مش cancelled/rejected) → المربوط منها بالجهاز ده (lab_machine_test_mappings active) → يرجّع كل الأكواد ❗ (من غير ما يبص على النتيجة)
المشكلة: بيرجّع التحليل حتى لو له نتيجة بالفعل. فلو الجهاز عمل query تاني لنفس العينة (أو عينة فيها تحاليل بعضها اتعمل) → بيرجّعله المعمول والفاضي مع بعض → الجهاز يعيد تشغيل المعمول.

٢ تحليل الموديل — فين «له نتيجة»؟

النتيجة في جدول lab_results (صف لكل تحليل لكل طلب)، فيه sample_id + investigation_id + lab_request_investigation_id + status + result_value.

حالات النتيجة (ResultStatus) — نصنّفها

الحالةالمعنىالقرار في الاستعلام
pendingمستنية نتيجةيرجّعها ✅ (فاضية)
(مفيش صف نتيجة)لسه ماتعملش result أصلاًيرجّعها ✅
retracted / invalidated / entered_in_errorالنتيجة اتسحبت/أُلغيت → محتاجة تتعمل تانييرجّعها ✅ (إعادة)
entered / validated / approved / releasedليها نتيجة فعلاًميرجّعهاش ⛔
القاعدة المقترحة: يرجّع التحليل لو result_value فاضي أو الحالة ∈ {pending, retracted, invalidated, entered_in_error} أو مفيش صف نتيجة. ويستثني لو الحالة ∈ {entered, validated, approved, released} وفيها قيمة.

٣ إعادة الفحص (Re-test) — أهم نقطة

في الـLIS، إعادة الفحص بتعمل باركود/عينة جديدة (الكانبان: «Re-test → new barcode → back to collection»، والنتيجة القديمة تتحفظ كـprevious_result). فيه retest_of وretest_count على lab_sample_investigations.

الخبر الكويس: لأن الـre-test بياخد باركود جديد وعليه نتيجة pending جديدة → الفلتر بتاعنا بيرجّعها تلقائياً (باركود جديد = فاضي). والباركود القديم نتيجته موجودة → يتشال. فالـre-test يشتغل من غير منطق خاص — بشرط إن إعادة الفحص فعلاً بتنشئ نتيجة pending على الباركود الجديد.
لازم نتأكد (خطوة تحقّق قبل التنفيذ): هل الـre-test بيعمل صف lab_result جديد بحالة pending على العينة الجديدة؟ ولا بيعيد استخدام نفس الصف ويبوّظ retest_count من غير ما يرجّع الحالة pending؟
  • لو بينشئ pending جديد → تمام، مفيش شغل إضافي.
  • لو بيسيب الحالة validated ويزوّد retest_count → محتاجين نضيف شرط: «يرجّع كمان لو فيه طلب re-test مفتوح (retest pending)».

٤ الحالات الحرجة اللي لازم الخطة تحسمها

الحالةالسؤالالمقترح (للنقاش)
تحت التشغيل (in_progress)تحليل لسه بيتشغّل على الجهاز — يرجّع تاني لو الجهاز سأل؟يرجّع (الحالة لسه pending، مفيش value) — التشغيل المتوازي مش مشكلة لأن النتيجة لسه فاضية.
بانل (CBC وغيره)الباركود فيه بانل بعض أعضاؤه اتعملوا — نرجّع الباقي؟نرجّع أعضاء البانل اللي لسه فاضية فقط. ملاحظة: توسيع البانل في الاستعلام لسه فجوة منفصلة — نتعامل معاها سوا.
عينة فيها كذا تحليل، بعضهم اتعملالسيناريو الأساسي بتاعكيرجّع الفاضي فقط (دي جوهر الخطة).
نتيجة متطابقة من الجهاز بس لسه pending مطابقةالجهاز بعت نتيجة (machine_result) بس لسه ماتطبّقتش على lab_resultالمصدر = lab_results (النتيجة المعتمدة). لو الـlab_result لسه pending → يرجّع. (نقطة نقاش: هل machine_result pending يكفي إنه «اتعمل»؟ الأنضف: لأ، نعتمد lab_result.)
نطاق الجهازتحليل اتعمل على جهاز تانيالفلتر يشوف النتيجة بغضّ النظر عن الجهاز اللي عملها — لو ليه نتيجة، ميرجّعش لأي جهاز.

٥ الحل المقترح (تقني)

تعديل واحد في LabMachineController::orders(): بعد ما نجيب تحاليل العينة المربوطة بالجهاز، نعمل LEFT JOIN على lab_results (بـ sample_id + investigation_id) ونستثني اللي ليها نتيجة معتمدة.

barcode → العينة → تحاليل العينة (مش cancelled/rejected) → المربوط بالجهاز (mappings active) → LEFT JOIN lab_results ON (sample_id, investigation_id) → استثني لو: status ∈ {entered,validated,approved,released} و result_value موجود → يرجّع باقي الأكواد (الفاضية + الملغية + اللي مفيهاش صف)

إعداد تحكّم مقترح (Lab Setting)

التغيير صغير ومحصور في دالة واحدة، وبيطبّق على كل الأجهزة (Maglumi 800/X3 وأي جهاز bidirectional). مفيش تغيير في الميدل وير.

المخاطر (الاتجاهين)

الخطرالأثرالتخفيف
نرجّع تحليل له نتيجةالجهاز يعيد تشغيله → هدر ريجنت + دوس على نتيجةهو ده اللي بنصلّحه — الفلتر يمنعه.
نفلتر أكتر من اللازمتحليل محتاج يتعمل ميرجّعش → عمره ما يتعمل (خطر إكلينيكي)تعريف الحالات بدقة (نرجّع pending + الملغي + مفيش صف). نختبر قبل الإطلاق على عينات حقيقية.
re-test بيعيد استخدام الصفإعادة الفحص ميرجّعشخطوة التحقّق في القسم ٣ — لو كده نضيف شرط retest pending.
بانل نصّه متعملالأعضاء الفاضية ميرجّعوش (لو البانل مش متوسّع)نربطه بشغل توسيع البانل المنفصل.

خطوات التنفيذ (بعد موافقتك)

قبل أي تنفيذ: محتاج قرارك في نقطتين — (أ) الـin_progress يرجّع ولا لأ؟ (ب) نعتمد lab_result كمصدر «اتعمل» (مش machine_result pending)؟ — وأنا أكمّل.