دراسة فنية · للمراجعة والموافقة قبل التنفيذ

توحيد طباعة الباركود (Barcode Label) في Moon LIS

مصدر واحد · إعدادات لما يظهر ويختفي · إنجليزي بالكامل · البانل باسمه فقط · موحّد في كل المراحل (B2B / الطلبات / التجميع / الاستلام)

1) الهدف من الدراسة

الباركود (ملصق العينة 50×25مم) يُطبع حاليًا من أكثر من مكان وكل مكان يبني الملصق بطريقته، فتظهر اختلافات بين الطلبات والتجميع والـ B2B. المطلوب:

1 مصدر واحد لبناء الملصق وطباعته 2 صفحة إعدادات: ماذا يظهر وماذا يختفي 3 الباركود إنجليزي بالكامل 4 البانل يظهر باسمه فقط (لا تفاصيله) 5 توحيد الطباعة في كل المراحل

2) الوضع الحالي (تدقيق فعلي للكود)

✓ المُحرِّك (الرسم) موحّد بالفعل: يوجد خدمة واحدة LisBarcodeLabeService ترسم الملصق 50×25مم عبر drawLabelV2() (jsPDF + JsBarcode). إذًا طبقة الرسم ليست المشكلة.
✗ المشكلة في «بناء» الملصق — مكرر في 6 أماكن: كل شاشة تبني بيانات الملصق (LabelDataV2) بنفسها وبمنطق مختلف، وصفحة الطلبات ما زالت تستخدم الصيغة القديمة الأقل اكتمالًا.

أماكن الطباعة الحالية

المكانالطريقة المستخدمةكيف يبني الملصقالحالة
صفحة الطلبات lis-requestsprintLabels (قديمة)inline — بدون MRN ولا اسم EN/AR ولا العمر ولا الطبيبناقص / قديم
ويزارد الطلب request-wizard-v2printLabelsV2inline — منطق بانل خاص بهمكرر
التجميع samplesprintLabelsV2inline — توسعة بانل محليةمكرر
قائمة التجميع collection-worklistprintLabelsV2inline — من tubesمكرر
الاستلام specimen-receivingprintLabelsV2inline — ملصق لكل عينة فرعيةمكرر
بوابة B2B client-request-detail / requestsprintLabelsV2builder منفصل buildPortalBarcodeLabels — شكل بيانات مختلفمصدر منفصل
كارت المريض lis-patient-card.serviceخدمة منفصلةكارت تعريف المريض (ليس ملصق عينة)خارج النطاق

الملاحظات الفنية

اللغة 🌐

  • اسم المريض إنجليزي أولًا بالفعل (EN ثم AR fallback).
  • لكن المُحرِّك ما زال يستخدم الخط العربي لبعض الحقول (نوع العينة / القسم / الطبيب).
  • «إنجليزي بالكامل» غير مُلزَم من المصدر.

البانل (Panel) 🧪

  • المُحرِّك يفترض «اسم البانل فقط، بدون الأعضاء» — لكنه يعتمد على ما تُرسله كل شاشة.
  • لا يوجد ضمان موحّد أن أعضاء البانل لن تظهر؛ يختلف حسب الشاشة.

الإعدادات ⚙️

  • لا توجد أي إعدادات للملصق حاليًا — لا «يظهر/يختفي»، ولا حجم، ولا عدد نسخ.
  • الموجود فقط core.barcode_auto_generate وlis.require_sample_barcode — لا علاقة لهما بمحتوى الملصق.

المقاس 📐

  • ثابت 50×25مم في الكود.
  • عدد النسخ يُمرَّر يدويًا من كل شاشة (غير موحّد).

2-ب) صيغة الباركود: رئيسي (Main) وفرعي (Sectional)

عند التجميع، الطلب يُقسَّم إلى عينة أم (Main) + عينات فرعية حسب القسم/نوع العينة. الفرعي = نفس رقم الأم + لاحقة للقسم/العينة:

النوعمثال (من LR-2026-00172)قسمالأبالطباعة المطلوبة
رئيسي (Main)260529XEAZBEلا يُطبع — لا قيمة له
فرعي (Sectional)260529XEAZBE-URI-S4Urinalysisالأميُطبع
فرعي (Sectional)260529XEAZBE-URI-SUrinalysisالأميُطبع
القاعدة: اللاحقة (-URI / -HEM / -BIO…) اختصار القسم/العينة. نطبع الفرعي فقط لأن كل تيوب فعلي موجَّه لقسم، أما الرئيسي فلا قيمة له. وعند تعدّد عينات فرعية يكون لكل واحدة مسلسل مختلف.
🔎 مشكلة LR-2026-00172 (تحليل URINE واحد لكنه يُخرج عدة ملصقات): المعالجة في المصدر الموحّد: نطبع الأبناء (الفرعية) ذات القسم فقط، نُخفي العينة الأم، ونُزيل التكرار (de-dup) فيخرج ملصق واحد لكل تيوب فعلي. أما تكرار الطفلين (S4 مقابل S) فهو غالبًا خلل في منطق القسمة بالـ Backend ويُراجَع كبند مرتبط (سؤال 6 أدناه).

3) الحل المقترح — مصدر واحد + إعدادات

نفس فكرة توحيد التقارير التي نفّذناها: مُحرِّك واحد + طبقة بناء واحدة + إعدادات واحدة، وكل الشاشات تستدعيها.

A
طبقة بناء واحدة (Single Builder). دالة موحّدة buildSampleLabels(samples, settings) تأخذ عينات الطلب + الإعدادات وتُنتج LabelDataV2[] بقاعدة واحدة للبانل واللغة والحقول. كل الشاشات (الطلبات، الويزارد، التجميع، الاستلام، B2B) تستدعيها بدل البناء المحلي.
B
مُحرِّك واحد (موجود). drawLabelV2 يُعاد ضبطه ليقرأ الإعدادات (ماذا يظهر/يختفي، الحجم، الخط الإنجليزي الإلزامي).
C
إعدادات واحدة. تُحفظ كإعداد lis.barcode_config (JSON) وتُقرأ/تُحفظ عبر مسار /lis/lab-info (نفس صلاحية lis.settings التي يملكها موظفو المعمل) — مصدر واحد متاح للجميع بلا صلاحيات إضافية.
D
حذف الصيغة القديمة. صفحة الطلبات تتحوّل من printLabels القديمة إلى المصدر الموحّد فتتطابق مع باقي الشاشات.
قواعد مُلزَمة من المصدر (ليست خيارًا للمستخدم): (1) الباركود إنجليزي بالكامل · (2) البانل يظهر باسمه فقط ولا تُطبع أعضاؤه · (3) يُطبع الباركود الفرعي (Sectional) فقط — تُخفى العينة الأم (Main) ويُزال التكرار، فيخرج ملصق واحد لكل تيوب فعلي.

4) صفحة الإعدادات — ماذا يظهر وماذا يختفي

صفحة «إعدادات ملصق الباركود» (ضمن إعدادات المعمل) فيها مفاتيح تشغيل/إيقاف لكل حقل، مع الافتراضي المقترح:

الحقل على الملصقالمفتاحافتراضيملاحظة
اسم المريض (إنجليزي)show_patient_nameظاهرإنجليزي أولًا
رقم الملف MRNshow_mrnظاهر
النوع + العمرshow_gender_ageظاهرM/F + 42Y 3M
التاريخ/الوقتshow_datetimeظاهر
شارة الأولوية (STAT/URG)show_priorityظاهر
أكواد التحاليل (البانل باسمه)show_testsظاهراسم البانل فقط
نوع العينة + القسمshow_specimen_sectionظاهر
رقم الطلبshow_request_noظاهر
اسم الطبيبshow_doctorمخفياختياري
الرقم القابل للقراءة أسفل الباركودshow_barcode_textظاهر

إعدادات عامة

الإعدادالمفتاحالقيمة / الخيارات
مقاس الملصقlabel_size50×25مم (موصى به / افتراضي) · 40×20مم · 38×25مم · مخصّص (عرض×ارتفاع)
نوع الباركود (Symbology)symbologyCODE128 (افتراضي) · CODE39 · EAN-13 · ITF — خطّي فقط، بدون QR
عدد النسخ الافتراضيdefault_copies1
إنجليزي بالكاملenglish_onlyمُفعّل دائمًا (مُلزَم)
اسم البانل فقطpanel_name_onlyمُفعّل دائمًا (مُلزَم)
الباركود الفرعي فقطsectional_onlyمُفعّل دائمًا (مُلزَم)
القرار: نضيف مقاسات بديلة مع 50×25مم كمقترح افتراضي · لا QR — لكن نوع الباركود الخطّي قابل للتغيير · شعار/اسم المعمل لا يُعرض (المساحة ضيقة) فحُذف من الخيارات.

أماكن الطباعة (تفعيل/إيقاف لكل مكان)

بحثت في كل الكود عن كل زر/حدث يطبع باركود فعلًا. القائمة الكاملة (8 مواضع في 6 شاشات):

الشاشة / الموضعالملف:السطرالمفتاحافتراضي
صفحة الطلبات — زر الطباعةlis-requests:783print_at_requestsنعم
صفحة الطلبات — طباعة المؤجّل/الجزئيlis-requests:723print_at_requests_deferredنعم
ويزارد إنشاء الطلب — بعد الإنشاءrequest-wizard-v2:1254print_at_wizardنعم
التجميع (Samples) — مفرد + دفعةlis-samples:844/864print_at_collectionنعم
قائمة التجميع — طباعة تلقائية عند التجميعcollection-worklist:1497auto_print_on_collectنعم
قائمة التجميع — إعادة طباعة يدويةcollection-worklist:1217/1306print_at_collection_worklistنعم
استلام العينات (Reception)specimen-receiving:600/603print_at_receptionنعم
بوابة B2B — قائمة الطلباتclient-requests:76print_at_b2b_portalنعم
بوابة B2B — تفاصيل الطلبclient-request-detail:96
ملاحظة: لا توجد طباعة باركود في الكانبان حاليًا (تأكدت) — نتركها كخيار مستقبلي (print_at_kanban = لا). أبرز خيار هو «الطباعة التلقائية عند التجميع» — كثير من المعامل تفضّل إيقافها لتفادي ملصقات زائدة. عند الإيقاف يختفي/يتعطّل الزر، وكلها تقرأ نفس الإعداد من المصدر الموحّد.

5) شكل الملصق المقترح (بعد التوحيد)

Ahmed Mohamed
MRN-000015  M
Age: 38Y
29/05/26 14:22  STAT
CBC, LIPID, TSH
Serum • Chemistry
‖‖|‖||‖|‖‖|‖|‖‖
LR-2026-00100-1
LR-2026-00100

كل حقل قابل للإظهار/الإخفاء من الإعدادات الباركود إنجليزي بالكامل «CBC, LIPID» = أسماء بانل فقط (بدون WBC/HGB…)

6) أين يُطبَّق المصدر الموحّد

✓ صفحة الطلبات ✓ ويزارد إنشاء الطلب ✓ التجميع (Collection) ✓ قائمة التجميع ✓ استلام العينات ✓ بوابة B2B (المعمل الخارجي) ✓ إعادة السحب من الكانبان (recollect)

كلها تمرّ على نفس buildSampleLabels() + نفس الإعدادات → ملصق متطابق في كل مرحلة.

7) مراحل التنفيذ المقترحة

1
Backend: إعداد lis.barcode_config (JSON) + قراءته/حفظه عبر /lis/lab-info (صلاحية lis.settings).
2
طبقة البناء الموحّدة buildSampleLabels(samples, settings) — قاعدة واحدة للبانل/اللغة/الحقول.
3
تعديل المُحرِّك drawLabelV2 ليحترم الإعدادات (إظهار/إخفاء + الحجم + إنجليزي إلزامي).
4
تحويل كل الشاشات للمصدر الموحّد وحذف الصيغة القديمة في صفحة الطلبات.
5
صفحة الإعدادات (واجهة المفاتيح) + ربطها.
6
تحقق بصري برسم نموذج لكل مرحلة قبل الاعتماد، ثم النشر.

8) أسئلة قبل البدء

1. هل صفحة الإعدادات على مستوى المعمل (الشركة) فقط، أم نسمح لكل فرع/مستخدم بإعداد خاص؟ (المقترح: مستوى المعمل.)
2. مقاس الملصق: نثبّت 50×25مم أم نضيف مقاسات بديلة (مثل 40×20 / 38×25)؟
3. اسم/شعار المعمل على الملصق: مطلوب كخيار أم نتركه مخفيًا (المساحة ضيقة جدًا)؟
4. كارت تعريف المريض (patient-card) خارج هذا النطاق — نتركه كما هو الآن؟
5. هل نضيف QR إلى جانب الباركود الخطّي كخيار، أم Code128 فقط؟
6. في LR-2026-00172 ظهر طفلان لنفس القسم (-URI-S4 بنوع عينة و-URI-S بدون) — هل المطلوب تيوب واحد فقط لكل قسم (نُزيل التكرار ونراجع منطق القسمة في الـ Backend)، أم فعلًا تيوبان مقصودان؟
7. أماكن الطباعة أعلاه — هل الافتراضيات مناسبة (الكانبان «لا» والباقي «نعم»)؟ وهل تريد مرحلة أخرى غير المذكورة؟
مستند للمراجعة — لا يوجد أي تعديل على الكود بعد. بانتظار موافقتك على النطاق ثم نبدأ التنفيذ بالمراحل أعلاه.
Moon LIS · Barcode Unification Study · 2026-05-29