واجهة Moon ERP مبنية على Angular 21 بمكوّنات مستقلة (Standalone Components) مع إدارة حالة NgRx 21 ومكتبة PrimeNG 21، وبدعم كامل للغة العربية (RTL) كلغة أولى. وحدة المختبر LIS تعمل إنتاجياً داخل هذه الواجهة بنمطين: مدمج داخل النظام (/core/lis/*) ومستقل بشاشة كاملة للمختبر (/lab/*)، وهو ما يشكّل المخطط المرجعي الجاهز لبناء واجهة HIS/OBGY.
src/app/features/core/services/lis-*.service.tscore/store/en.json / ar.jsonيتبع المشروع في /home/moonui/public_html/moon-erp/src/app فصلاً صارماً بين الطبقات:
core/ — خدمات الـ API (services/)، شرائح NgRx (store/)، نماذج TypeScript (models/)، الحراس (guards/auth.guard.ts)، ومعترض المصادقة (interceptors/auth.interceptor.ts) الذي يضيف ترويسة X-Authorization: Bearer.features/ — كل ميزة في مجلد مستقل يُحمَّل كسولاً (lazy-loaded) عبر loadComponent في app.routes.ts؛ لا توجد NgModules إطلاقاً.layout/ — الهيكل العام: main-layout وsidebar وtopbar.shared/ — لبنات إعادة الاستخدام: data-table وform-dialog وpage-header وmodule-nav ومحرّك الطباعة shared/print/ والتوجيه الهيكلي للصلاحيات can.directive.ts.نمط تدفق البيانات موحّد في كل شاشات CRUD: Component → Action → Effect → Service → API → Reducer → Selector مع شكل حالة ثابت لكل شريحة (loading / saving / error / loaded / meta) باستخدام @ngrx/entity.
وحدة LIS تضم أكثر من 60 شاشة في features/lis/ وتعمل بثلاثة سياقات توجيه: مدمج، ومستقل عبر lis-standalone.routes.ts بتخطيط خاص LisLayoutComponent، وبوابة عامة للمرضى برابط رمزي (/p/:token) دون تسجيل دخول. أهم الشاشات التشغيلية:
| الشاشة | الملف | الحجم (سطر) | الدور التشغيلي |
|---|---|---|---|
| قائمة عمل الأقسام | dept-worklist/dept-worklist.component.ts | 2,848 | إدخال النتائج لكل قسم (رقمي/نصي/اختياري/معادلة) مع أعلام LL/HH/L/H/N |
| قائمة عمل الاعتماد | validation-worklist/validation-worklist.component.ts | 3,727 | مراجعة واعتماد وإطلاق النتائج (validate / approve / release / print) |
| قائمة عمل السحب | collection-worklist/collection-worklist.component.ts | 1,646 | سحب العينات بالباركود وتجميع الأنابيب — تحلّ محل شاشة العينات القديمة على مسار /lab/samples |
| الاستقبال | reception/reception.component.ts | 574 | استلام العينات في المعمل (specimen receiving) |
| لوحة المتابعة | board/lis-board.component.ts | 315 | لوحة مراحل (6 مراحل) لكل طلب/قسم مع زمن الانتظار |
| كانبان (متقاعد) | kanban/lis-kanban.component.ts | 1,490 | أُحيل للتقاعد في النمط المستقل — المسار /lab/kanban يعيد التوجيه إلى worklist |
| معالج الطلبات v2 | request-wizard-v2/ | — | معالج من 4 خطوات: المريض ← الفحوصات ← الفوترة (فرد/تأمين/معمل خارجي) ← الدفع |
درس معماري مهم: المختبر تحوّل من نموذج الكانبان إلى نموذج Worklist مدفوع من الخادم عبر core/services/lis-worklist.service.ts (عقد WorklistCard / WorklistRow مع علم تشغيل USE_SERVER_WORKLIST) — أي أن منطق ترتيب العمل انتقل للباك-إند وبقيت الواجهة عارضاً ومنفّذاً للإجراءات.
authGuard — يتحقق من الجلسة ويعيد تحميل الملف الشخصي من /auth/me قبل السماح بأي مسار (مع معالجة الجلسات الملغاة).permissionGuard — يقرأ بادئات الصلاحيات من بيانات المسار مثل data: { permissions: ['lis.results'] } بمطابقة على حدود النقطة، مع تجاوز كامل لدور super-admin.moduleGuard — يمنع الوصول لمسارات الوحدات المعطّلة من شاشة module-activation.*appCan في shared/directives/can.directive.ts يخفي أي زر لا يملك المستخدم صلاحيته — حماية دفاعية والباك-إند يظل الحكم النهائي.ngx-translate v17 بملفين src/assets/i18n/en.json وar.json (7,494 مفتاحاً، 85 نطاقاً علوياً) مع fallbackLang: 'en' — المفاتيح إنجليزية بنمط LIS.RESULTS.APPROVE ووحدة LIS لها نطاق LIS بـ 48 نطاقاً فرعياً. LanguageService يضبط dir=rtl على مستوى المستند تلقائياً.shared/print/: عقد GenericPrintData (يحمل dir/lang ودالة ترجمة t)، قوالب جاهزة في print-templates.ts (GENERIC_TEMPLATES بقالب افتراضي classic)، وقالب مخصص قابل للضبط CustomTemplateConfig (ألوان/خط/إظهار الشعار) من شاشة /core/print-settings.lis-report-pdf.service.ts (1,620 سطراً، jsPDF + jspdf-autotable مع طباعة عبر iframe) وlis-html-report.service.ts (1,311 سطراً، تقارير HTML بقوالب ترويسة قابلة للضبط من lab-info)، إضافة لخدمة ملصقات الباركود lis-barcode-label.service.ts وشاشة طباعة دفعية print-queue.features/his/ (أو features/obgy/) على غرار features/lis/، بمكوّنات Standalone وإشارات signal() لحالة الواجهة وخدمات his-*.service.ts في core/services/ بنمط providedIn: 'root' ودالة listAll() للتقسيم التلقائي للصفحات./core/his/* ومستقل بشاشة كاملة (مثل /clinic/* على غرار /lab/*) بتخطيط خاص يحاكي LisLayoutComponent — هذا النمط مجرَّب إنتاجياً.his. في بيانات المسارات و*appCan على الأزرار، ونطاق ترجمة HIS جديد في ملفي i18n بمفاتيح إنجليزية أولاً.data-table (تصدير Excel/PDF وتخصيص الأعمدة)، page-header، form-dialog، محرّك الطباعة العام، ونمط الـ Worklist المدفوع من الخادم لقوائم عمل العيادات (مواعيد اليوم، الكشوفات المعلّقة، السونار).lis-patient.model.ts الخاص بالمختبر (mrn، تأمين)، وبناء HIS يستلزم شاشة سجل مرضى موحّد تستهلكه LIS وOBGY معاً بدل تكرار شاشات المرضى في كل وحدة.