بناءً على تقييم الأداء: كمية المنطق (تجميع البنلات، النَسب، الصفوف المقفولة، رولأب الحالة، إزالة التكرار، ملخّص الطلبات) جوّه المتصفح أكبر من اللازم، ومتكررة في صفحتين. الخطة دي بتنقل ده كله للباك إند كـ«مصدر حقيقة واحد»، بدون كسر أي وظيفة، وبخطوات آمنة قابلة للتراجع.
| validation-worklist.ts | 3,143 سطر |
| dept-worklist.ts | 2,324 سطر |
| الإجمالي | 5,467 سطر |
٥–٦ نداءات قبل أول رسم: results + sample-investigations + samples + sections + referrals + investigations (رنجات + أعضاء بنل).
أي إصلاح لازم يتعمل مرتين → ومع الوقت بيختلف السلوك (زي ما حصل في باگ التكرار اللي لسه مصلّحينه):
| الدالة | المسؤولية | مكررة؟ |
|---|---|---|
deduplicateResults | إزالة تكرار النتيجة لكل (طلب+تحليل)، إبقاء أعلى حالة، تجاهل أصل الـretest | في الصفحتين |
processResults | تحويل النتائج الخام لصفوف + تحديد العضو/البنل + حالة العينة | في الصفحتين |
| تركيب أب البنل (synthesis) | تصنيع صف رأس بنل وهمي من الـpivots | في الصفحتين |
| الصفوف المقفولة (locked rows) | أحدث pivot لكل تحليل؛ لو مرفوض/ملغي/مؤجّل/خارجي → الصف يعكس ده | في الصفحتين |
| صفوف «مش وصلت المعمل» (pre-receivable) | تصنيع صفوف مقفولة + ليبل حسب حالة العينة | في الصفحتين |
displayRows grouping | مستقل/بنل/sub-section + ترتيب + dedup | في الصفحتين |
requestCards | ملخّص حالة كل طلب (pending/entered/validated/approved/released) + progress | في الصفحتين |
rollupPanelStatus | حالة البنل = أضعف عضو | في الصفحتين |
calcFlag · localDateOf | الـflag الشاذ + فلترة التاريخ بتوقيت الشركة | في الصفحتين |
المتصفح بيعمل شغل «خادم»: ٥–٦ نداءات ثم تجميع/فرز/فلترة لكل النتائج في الذاكرة، مكرر مرتين. ده بطيء في الأيام المزدحمة، صعب الصيانة، ومعرّض لاختلاف السلوك بين الصفحتين.
القاعدة: الباك بيرجّع البيانات «جاهزة للعرض» (cards + rows مجمّعة ومرتّبة وبحالة محسوبة)، والفرونت يبقى راسم رفيع بس (templates + inputs + dialogs + UI state). أي منطق تجميع/حالة/نَسب → الباك.
WorklistContextServiceكلاس PHP جديد يجمع كل منطق التجميع المنقول من الـTS (نسخة واحدة، الصفحتين بتستهلكوها). يعتمد على الخدمات الموجودة (LabResultService, SampleInvestigationService, LabWorkflowService) ومنطق النَسب الموجود فعلاً في SampleInvestigationController::loadPanelMap (اللي صلّحناه بـis_panel=1).
| Endpoint | بيرجّع | يحل محل |
|---|---|---|
GET /lis/worklist/cards | كروت الطلبات + ملخّص الحالة + progress لمدى تاريخ/قسم/فلتر | requestCards() + جزء من results/samples |
GET /lis/worklist/requests/{id}/rows | صفوف العرض الجاهزة لطلب واحد: بنلات + أعضاء + sub-sections + locked + pre-receivable + رنجات + flag + رولأب + المصدر | displayRows() + processResults() + synthesis + locked + dedup |
GET /lis/worklist/search?q= | بحث التحليل عبر الطلبات (server-side، مش فلترة client) | بحث الـValidation الحالي client-side |
WorklistDataService (FE) رفيع: ينده الـendpoints ويـmap للـrows جاهزة. الصفحتان تستخدموه → التكرار يختفي. الكتابة (enter/validate/approve/release) تفضل زي ما هي (endpoints موجودة).
نثبّت شكل الرد أول حاجة (عشان الفرونت يتبنى عليه بثقة):
الباك بيضمن: صف واحد لكل (طلب+تحليل) · النَسب صح (is_panel=1) · الترتيب جاهز · الحالة محسوبة · الـlocked/not-receivable محدّدة. الفرونت يرسم بدون أي تجميع.
WorklistContextService Backend/lis/worklist/cards · /lis/worklist/requests/{id}/rows · /lis/worklist/search.WorklistDataService (FE) ينده الـendpoints الجديدة ويرجّع rows جاهزة.مانحذفش أي منطق فرونت قبل ما الباك يطلّع نفس الـrows/cards على طلبات حقيقية (سكربت مقارنة آلي).
الجديد خلف فلاج. لو فيه فرق → نرجّع للقديم فوراً بدون deploy.
validation الأول، نتأكد أسبوع، بعدها dept. مش الاتنين مرة واحدة.
شكل الـpayload متفق عليه ومُوثّق — الفرونت يتبنى عليه بثقة، وأي تغيير versioned.
نوع نتيجة غير معروف ميكسرش الصفحة (يتعامل نصّي) — مشكلة نبّه عليها التقييم.
كل مرحلة منفصلة وقابلة للـrollback؛ الكتابة (enter/validate/...) ما تتغيّرش خالص.
| المقياس | الآن | الهدف |
|---|---|---|
| نداءات الشبكة عند الفتح | ٥–٦ | ١–٢ |
| منطق التجميع في المتصفح | مكرر × صفحتين | صفر (السيرفر) |
| حجم كود الصفحتين | 5,467 سطر | −٥٠٪+ |
| زمن أول رسم (يوم مزدحم) | — | مقيس + أسرع |
| سهولة الصيانة | 5/10 (التقييم) | ٨+/10 |
دي خطة معمارية كبيرة بتتنفّذ على مراحل آمنة — كل مرحلة لوحدها بتدّي قيمة وقابلة للتراجع. مش محتاجين نعمل كله مرة واحدة. أنا جاهز أبدأ بمرحلة ٠+١ أول ما توافق على المسار.