تحقيق staging — باركود B2B وتحليل ABO
الخلاصة المختصرة: البيانات سليمة سبب 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
ملف 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.
المريض
| id | mrn | name | external_lab_id | created_at |
|---|---|---|---|---|
| 11891 | MRN-011876 | test | 8 | 2026-07-06 16:54:53 |
العينة
| id | lab_request_id | sample_number | barcode | status | specimen_type_id | lab_section_id |
|---|---|---|---|---|---|---|
| 261 | 85 | SMP-2026-07-00067 | 26070700105 | collected | 26 | 35 |
الطلب المرتبط
| id | request_number | patient_id | external_lab_id | status | total |
|---|---|---|---|---|---|
| 85 | LR-2026-00094 | 11891 | 8 | pending | 13.000 |
تحليل الطلب
| request_investigation_id | investigation_id | code | name | specimen_type_id | lab_section_id |
|---|---|---|---|---|---|
| 1255 | 1840 | ABO | ABO blood typing | 26 | 35 |
ربط العينة بالتحليل
| sample_investigation_id | lab_sample_id | lab_request_investigation_id | lab_investigation_id | status | code | name |
|---|---|---|---|---|---|---|
| 1202 | 261 | 1255 | 1840 | collected | ABO | ABO 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() تحمل:
- المريض.
- العينات مع نوع العينة والقسم.
- تحاليل الطلب.
- وتبني
tests[]لكل عينة بمطابقةspecimen_type_id+lab_section_id. - وترجع
label_configمنLisBarcodeLabelConfig::resolveForPortal().
في الحالة الحالية، 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.
السبب المباشر:
- قاعدة البيانات صحيحة وتربط الباركود
26070700105بتحليلABO. - API الخاص بـ B2B barcodes كان يرجع
tests[]بدونid. - الـ unified builder يرفض أي test بدون
id، فكان يسقطABOمن الملصق. - مسار B2B كان يمرر
sectionNameبدونsectionCode، لذلك ظهرHematologyبدلHEM. - الإعداد الحالي يطبع كود التحليل، ولذلك بعد التصحيح المتوقع أن يظهر
ABO.
الالتباس الأساسي أن ملف LI-2026-00059.pdf ليس ملصق باركود للطلب محل الفحص،
بل فاتورة لمريض آخر MRN-011873 وبنود CRP/ESR.
6. التعديل الذي تم
- تعديل backend staging في
ExternalLabPortalRequestController::barcodes()لإرجاعidوباقي حقول التحقيق داخلtests[]. - إرجاع
idللعينة داخل نفس endpoint حتى طباعة عينة واحدة بعد collect تستهدف العينة الصحيحة. - تعديل frontend source في
portal-barcode-builder.tsلتمريرsectionCode. - تم تشغيل
npm run buildونشر build جديد على/home/selmadina/public_html/public/app. - تم تنظيف chunks القديمة حتى لا يستمر المتصفح في تحميل الكود القديم من ملفات hashed قديمة.
7. ماذا نفعل لو ظهرت المشكلة مرة أخرى؟
- اعمل hard refresh للمتصفح أو افتح نافذة private، لأن المشكلة كانت في JS/payload الخاص بمسار B2B.
- أعد طباعة B2B لنفس الطلب؛ المتوقع أن يظهر
Whole Blood EDTA · HEMثمABO. - لو استمرت المشكلة، أرسل PDF جديد بعد التصحيح مع وقت الطباعة الظاهر عليه.
- لو المطلوب طباعة اسم التحليل الكامل بدلاً من الكود، غيّر إعداد Lab Settings → Barcode → Tests on label من
CodeإلىTest name. السلوك الحالي مضبوط علىCode. - لأي إعادة فحص، قارن 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;