ليه eAG مش باين في البنل HBA1C602 — تحليل جذري

الطلب LR-2026-00302: البنل فيه عنصرين (HbA1c + eAG)، بس eAG مش ظاهر خالص في الورك ليست والفاليديشن. ده تحليل لـ«إيه اللي وصل، ليه مظهرش، إيه السبب الجذري، وإزاي نحلّها بشكل نهائي علشان متتكررش».

🗓️ 2026-06-08🧬 LIS — Worklist / Validation🔬 HBA1C602 · eAG · LR-2026-00302

1 الداتا اللي وصلت — سليمة 100% ✅

أول حاجة طمأنينة: مفيش داتا ضايعة. النتيجتين موجودين في قاعدة البيانات وصح:

العنصرنوعهالقيمةالحالةالعينة
HBA1C0 (HbA1c)
inv 9
رقمي (مقاس)9.0released231
eAG
inv 3924
معادلة (formula)211.6released231

المعادلة اشتغلت صح

eAG = (28.7 × {HBA1C0}) − 46.7 = (28.7 × 9.0) − 46.7 = 211.6 ✓. يعني العنصر اتحسب اتخزّن اترِليز — المشكلة في العرض بس، مش في الداتا.

2 السبب الجذري — «نَسب البنل» غلط

الورك ليست/الفاليديشن بيجمّعوا عناصر البنل تحت رأس البنل بناءً على «نَسب» (panel ancestry) بييجي من الـAPI (/lis/sample-investigations). دي القيم اللي رجعت فعلياً للطلب ده:

العنصرالـAPI رجّع إنه تابع لبنل…صح؟
HBA1C0 (9)HBA1C602 (2764) — is_panel=1صح
eAG (3924)HBA1C0 (9) — is_panel=0غلط

المشكلة بالظبط

الـeAG اتحطّ تحت «بنل HBA1C0» — وHBA1C0 أصلاً مش بنل (is_panel=0)، يعني مفيش رأس بنل بيترسم ليه. فالـeAG بيقع تحت رأس وهمي مش بيظهر → العنصر بيختفي تماماً. (في الفاليديشن فيه فلتر isPanelMemberVisible بيخفي أي عنصر مالقاش رأس بنله؛ وفي الـdept-worklist العنصر أصلاً مابيتضافش للعرض غير جوّه لوب رأس البنل.)

3 ليه eAG بالذات؟ — العيب في البيانات

eAG عضو في بنلين في قاعدة البيانات، مش بنل واحد:

eAG (3924) ├── عضو في HBA1C0 (inv 9) ← is_panel = 0 ✗ (ده مش بنل أصلاً!) └── عضو في HBA1C602 (inv 2764) ← is_panel = 1 ✓ (ده البنل الحقيقي) HBA1C0 (9) └── عضو في HBA1C602 (inv 2764) ← is_panel = 1 ✓ (نَسب واحد سليم)

الـeAG هو «الرفيق المحسوب» للـHbA1c، فاتسجّل زمان كـ«عضو» جوّه HBA1C0 (علشان يتحسب منه). بعدها اتعمل بنل HBA1C602 الحقيقي اللي بيلفّ الاتنين — بس العضوية القديمة (eAG داخل HBA1C0) فضلت موجودة.

ليه الـBE اختار الغلط؟

دالة loadPanelMap بتاخد العضو، تلاقيه في بنلين الاتنين «مربوطين» بالطلب (HBA1C0 و HBA1C602 الاتنين متطلبين)، وبتختار أول واحد في ترتيب الصفوف = HBA1C0 (9) — من غير ما تتأكد إنه بنل حقيقي (is_panel=1). فاختارت بنل وهمي.

4 حجم المشكلة (مش حالة واحدة)

فحصت القاعدة كلها — ده نمط متكرر مش استثناء:

الفئةالعددأمثلة
عضويات «شاردة» لأب مش بنل (is_panel=0)7 صفوفHBA1C0←eAG · COAG←(6,28,29) · IRON←(47,48,49)
عناصر في أكتر من بنل (نَسب ملتبس)13 عنصرUREA/CREAT (RFT+KFT) · TSH/FT4/FT3 (THYROID+THYROI) · NA/K (RFT+ELEC) · eAG…

يعني

أي عنصر عنده عضوية لأب is_panel=0 (أو بيتلخبط بين بنلين)، معرّض إنه يختفي بنفس الطريقة. لازم الحل يكون جذري على مستوى المنطق، مش تصليح يدوي لكل حالة.

5 الحل الجذري المقترح — 3 طبقات

علشان نحلّها نهائياً ومتتكررش، مقترح 3 طبقات تكمّل بعض (الأولى تكفي للإصلاح، والباقي حماية وتنظيف):

جذري الطبقة 1 — إصلاح المنطق في الـBE (سطر واحد)

في loadPanelMap نخلّي النَسب يتاخد من البنلات الحقيقية بس (is_panel=1). كده HBA1C0 (is_panel=0) يتشال من الحسبة خالص، والـeAG ميبقاش ليه غير بنل واحد = HBA1C602 ✓.

// SampleInvestigationController::loadPanelMap() DB::table('lab_investigation_panel_members as pm') ->join('lab_investigations as p', 'p.id', '=', 'pm.panel_id') + ->where('p.is_panel', 1) // نَسب من بنل حقيقي بس ->whereIn('pm.member_id', $invIds)

الأثر: بيصلّح eAG + كل الـ7 حالات الشاردة دفعة واحدة. مفيش أي عنصر هيتنسب لأب مش بنل تاني.

حماية الطبقة 2 — شبكة أمان في الواجهة (مايختفيش أبداً)

قاعدة ذهبية: أي نتيجة ليها قيمة مينفعش تختفي خالص. لو عنصر بنل ملقاش رأس بنله في العرض → يترسم كـعنصر مستقل (standalone) بدل ما يتلغي بصمت. ده بيقفل كل فئة «الاختفاء الصامت» حتى لو فيه عيب بيانات تاني في المستقبل. (يتطبّق في validation-worklist و dept-worklist.)

تنظيف الطبقة 3 — تنظيف البيانات (هايجيني)

نشيل/نصلّح الـ7 عضويات الشاردة (العنصر اللي أبوه is_panel=0). للـeAG: العلاقة دي «رفيق محسوب» مش بنل — مكانها مش panel_members. ولو COAG/IRON المفروض بنلات فعلاً → نظبّط is_panel=1 عليهم. (مع الطبقة 1+2 دي بقت اختيارية للنظافة بس.)

توصيتي

الطبقة 1 + 2 مع بعض (إصلاح جذري + حماية دائمة). الطبقة 3 تنظيف نعمله بعدها على راحتنا. مفيش أي تغيير في شكل الشاشات — بس العناصر هتبان صح.

6 بعد الإصلاح — المتوقّع

HBA1C602 (رأس البنل) ├── HBA1C0 = 9.0 ✓ (كان باين) └── eAG = 211.6 ✓ (هيبان دلوقتي)

الاتنين تحت رأس HBA1C602 الصح، والـeAG يظهر بقيمته 211.6.

✅ اتنفّذ بالكامل (التلت طبقات) واتأكدنا

  • الطبقة 1 (BE): ->where('p.is_panel', 1) اتطبّقت واترفعت — الـAPI بيرجّع دلوقتي eAG ← HBA1C602
  • الطبقة 2 (FE): شبكة الأمان اتزادت في validation-worklist و dept-worklist، اتعمل build و deploy ✓
  • الطبقة 3 (بيانات): اتشال 7 صفوف شاردة (مع backup) — مفيش أي صف لأب is_panel=0 فاضل (0) ✓

دلوقتي eAG (211.6) هيظهر تحت HBA1C602 جنب HbA1c في الورك ليست والفاليديشن. (اعمل refresh للصفحة.)