تحقيق staging — باركود B2B وتحليل ABO

التاريخ: 2026-07-06 UTC · البيئة: s-elmadina.elbaset.com · الطلب محل الفحص: MRN-011876 / barcode 26070700105

الخلاصة المختصرة: البيانات سليمة سبب B2B مؤكد تم التصحيح على staging ملف LI المرفق ليس باركوداً لنفس الحالة

سبب اختفاء ABO من طباعة B2B لم يكن في بيانات الطلب؛ البيانات تربط العينة 26070700105 بتحليل ABO بشكل صحيح. السبب كان في payload مسار external-lab-portal: عناصر sample.tests[] كانت ترجع بدون id، والـ unified barcode builder يرفض أي test بدون id حتى لا يطبع panel members أو تحاليل مخفية. لذلك خرجت testCodes=[] ولم يظهر ABO.

1. الأدلة المرفقة

ملف B2B قديم محفوظ

/home/moonui/38650887-da7e-454f-b8dc-5c0555bdd913.pdf

هذا الملف القديم الموجود على السيرفر كان يحتوي ABO، لكنه لا يغير سبب المشكلة التي ظهرت لاحقاً من شاشة B2B عند المستخدم:

TEST                                   MRN-011876

F-30Y                        00:33         07/07/26
Whole Blood EDTA · HEM

                         26070700105
ABO
TESTMRN-011876
F-30Y · 00:33 · 07/07/26
Whole Blood EDTA · HEM
26070700105
ABO

ملف LI

/home/moonui/LI-2026-00059.pdf

هذا الملف ليس ملصق باركود لنفس الحالة. هو فاتورة مبسطة لمريض آخر:

LI-2026-00059
Patient: علياء حاسن حزاب العوفي
MRN: MRN-011873
Items:
- C-Reactive Protein
- Erythrocyte Sedimentation Rate

لذلك لا يصلح هذا الملف للمقارنة مع MRN-011876 أو باركود 26070700105.

2. حالة البيانات في staging

تم الفحص مباشرة على قاعدة selmadina_stg.

المريض

idmrnnameexternal_lab_idcreated_at
11891MRN-011876test82026-07-06 16:54:53

العينة

idlab_request_idsample_numberbarcodestatusspecimen_type_idlab_section_id
26185SMP-2026-07-0006726070700105collected2635

الطلب المرتبط

idrequest_numberpatient_idexternal_lab_idstatustotal
85LR-2026-00094118918pending13.000

تحليل الطلب

request_investigation_idinvestigation_idcodenamespecimen_type_idlab_section_id
12551840ABOABO blood typing2635

ربط العينة بالتحليل

sample_investigation_idlab_sample_idlab_request_investigation_idlab_investigation_idstatuscodename
120226112551840collectedABOABO blood typing

3. إعدادات الباركود

إعدادات staging الحالية تجعل الملصق يطبع كود التحليل وليس الاسم الكامل: "test_label_mode":"code". لذلك ظهور ABO فقط، وليس ABO blood typing، هو السلوك المتوقع.

{
  "show_tests": true,
  "show_section": true,
  "section_label_mode": "code",
  "test_label_mode": "code",
  "test_name_max_chars": 16,
  "label_size": "60x28",
  "print_at_b2b_portal": true
}

4. تتبع الكود

Backend — endpoint الباركود في B2B

الملف المنشور على staging: /home/selmadina/public_html/Modules/LIS/app/Http/Controllers/ExternalLabPortalRequestController.php

الدالة barcodes() تحمل:

في الحالة الحالية، ABO يطابق العينة تماماً: specimen 26 وsection 35.

الخطأ كان أن عناصر tests[] في هذا endpoint كانت ترجع code/name/is_panel فقط، بدون id. الـ builder الموحد يستدعي isLabelVisibleInvestigation() وهي ترجع false عند غياب id، فتم إسقاط ABO من الملصق. تم تعديل الـ endpoint ليعيد id وspecimen_type_id وlab_section_id وis_searchable وpanel_members لكل test، وكذلك id للعينة.

Frontend — B2B barcode builder

المصدر الحالي: moon-erp/src/app/features/lis/external-lab-portal/client/portal-barcode-builder.ts

هذا المسار أصبح يستخدم LisBarcodeBuilderService.build()، وهو نفس الـ builder الموحد لمسارات الباركود. كما أن build المنشور في staging يحتوي آثار هذا الإصلاح في ملفات JS، منها LisBarcodeBuilderService وحقول testNames/testCodes.

كان يوجد فرق آخر يفسر ظهور Hematology بدلاً من HEM: مسار B2B كان يمرر sectionName فقط ولا يمرر sectionCode. ومع إعداد section_label_mode="code" كان renderer يضطر للـ fallback إلى الاسم الكامل. تم تعديل portal-barcode-builder.ts ليمرر sectionCode.

5. الاستنتاج

Root cause مؤكد ومصحح على staging.

السبب المباشر:

الالتباس الأساسي أن ملف LI-2026-00059.pdf ليس ملصق باركود للطلب محل الفحص، بل فاتورة لمريض آخر MRN-011873 وبنود CRP/ESR.

6. التعديل الذي تم

7. ماذا نفعل لو ظهرت المشكلة مرة أخرى؟

  1. اعمل hard refresh للمتصفح أو افتح نافذة private، لأن المشكلة كانت في JS/payload الخاص بمسار B2B.
  2. أعد طباعة B2B لنفس الطلب؛ المتوقع أن يظهر Whole Blood EDTA · HEM ثم ABO.
  3. لو استمرت المشكلة، أرسل PDF جديد بعد التصحيح مع وقت الطباعة الظاهر عليه.
  4. لو المطلوب طباعة اسم التحليل الكامل بدلاً من الكود، غيّر إعداد Lab Settings → Barcode → Tests on label من Code إلى Test name. السلوك الحالي مضبوط على Code.
  5. لأي إعادة فحص، قارن endpoint GET /api/lis/external-lab-portal/requests/{id}/barcodes مع جدول lab_sample_investigations.

8. أوامر الفحص المستخدمة

pdftotext -layout /home/moonui/38650887-da7e-454f-b8dc-5c0555bdd913.pdf -
pdftotext -layout /home/moonui/LI-2026-00059.pdf -

SELECT id,mrn,name,external_lab_id,created_at
FROM lab_patients
WHERE mrn='MRN-011876';

SELECT id,lab_request_id,sample_number,barcode,status,specimen_type_id,lab_section_id
FROM lab_samples
WHERE barcode='26070700105';

SELECT si.id,si.lab_sample_id,si.lab_request_investigation_id,si.lab_investigation_id,
       si.status,i.code,i.name,i.name_en,i.specimen_type_id,i.lab_section_id
FROM lab_sample_investigations si
LEFT JOIN lab_investigations i ON i.id=si.lab_investigation_id
WHERE si.lab_sample_id=261;