ข้ามไปที่เนื้อหา

03. Lab Rejection Workflows - การปฏิเสธและแก้ไข

📋 ภาพรวม

Rejection Workflow เป็นกลไกสำคัญในการควบคุมคุณภาพผลแล็บ ช่วยให้สามารถตรวจจับและแก้ไขข้อผิดพลาดได้ทันท่วงที ระบบรองรับการปฏิเสธ 2 ประเภท:

  1. Specimen Rejection - ปฏิเสธสิ่งส่งตรวจที่ไม่ผ่านมาตรฐาน (QC Failed)
  2. Result Rejection - ปฏิเสธผลแล็บที่สงสัยความถูกต้อง (Supervisor Review)

🔄 ภาพรวม Rejection Flow

graph TD
    A[Order Created] --> B{Specimen Collection}
    B -->|Quality OK| C[Collected]
    B -->|Quality Bad| D[Specimen Rejected]
    D --> B

    C --> E[Result Entry]
    E --> F{Result Approval}
    F -->|Approve| G[Final Report]
    F -->|Reject - Fix| E
    F -->|Reject - Recollect| B

    style D fill:#ffebee,stroke:#c62828
    style F fill:#fff3e0,stroke:#f57c00
    style G fill:#e8f5e9,stroke:#388e3c

🧪 Type 1: Specimen Rejection (ปฏิเสธสิ่งส่งตรวจ)

จุดเกิด: หน้า specimen-collection.html
ผู้ทำ: Phlebotomist / Nurse
เหตุผล: สิ่งส่งตรวจมีปัญหาด้านคุณภาพ ไม่สามารถนำไปตรวจได้


📊 สาเหตุการปฏิเสธ Specimen (Quality Issues)

Issue ภาษาไทย สาเหตุที่พบบ่อย ผลกระทบ
Hemolysis เม็ดเลือดแดงแตก เขย่าแรง, เจาะผิดวิธี, ความดันสูง ผล K, LDH สูงเกิน
Clotted เลือดแข็งตัว ไม่เขย่า EDTA/Citrate ทันที CBC, PT/PTT ตรวจไม่ได้
Insufficient Volume ปริมาณไม่พอ เจาะได้น้อย, หลอดเล็ก ตรวจไม่ครบรายการ
Lipemic ไขมันสูง ผู้ป่วยไม่งดอาหาร แทรกสัญญาณเครื่อง
Icteric ตัวเหลือง ผู้ป่วยตับไม่ดี แทรกสัญญาณเครื่อง
Label Error ฉลากผิด ติดผิดหลอด, ชื่อไม่ตรง เสี่ยงผลผิดคน
Contamination ปนเปื้อน เทคนิคไม่ถูกต้อง Bacterial growth ผิด

🔍 Workflow: Specimen Rejection

Step 1: Specimen Collection & QC

เมื่อเก็บสิ่งส่งตรวจเสร็จ → ประเมินคุณภาพ:

┌─────────────────────────────────────────┐
│ Specimen Collection Modal               │
├─────────────────────────────────────────┤
│ รายการ: CBC, HbA1C                      │
│ Container: EDTA (Purple top)            │
│ Volume: 3 ml                            │
│                                         │
│ Quality Assessment: *                   │
│  ○ Good (ดีมาก)                         │
│  ○ Acceptable (พอใช้)                   │
│  ● Rejected (ไม่ผ่าน) ⚠️                │
│                                         │
│ Quality Issues: *                       │
│  ☑️ Hemolysis                           │
│  ☐ Clotted                              │
│  ☑️ Insufficient Volume                 │
│                                         │
│ Notes: * (Required)                     │
│  ┌───────────────────────────────────┐  │
│  │ พบ Hemolysis รุนแรง เลือดแดกแตก   │  │
│  │ มาก และปริมาณได้เพียง 1.5 ml     │  │
│  │ ซึ่งไม่เพียงพอสำหรับ CBC+HbA1C   │  │
│  │ ต้องเจาะใหม่                     │  │
│  └───────────────────────────────────┘  │
│                                         │
│ [บันทึก]  [ยกเลิก]                     │
└─────────────────────────────────────────┘

Validation: - ถ้าเลือก Quality = Rejected → ต้องกรอก Notes (บังคับ) - ต้องเลือก Quality Issues อย่างน้อย 1 ข้อ


Step 2: Save & Status Update

เมื่อบันทึก Rejected Specimen:

async function saveRejectedSpecimen() {
  // 1. สร้าง Specimen record
  const specimen = {
    id: generateId(),
    orderNumber: order.orderNumber,
    status: 'rejected', // ⚠️ Status
    quality: 'rejected',
    qualityIssues: ['hemolysis', 'insufficient_volume'],
    notes: 'พบ Hemolysis รุนแรง...',
    rejectedBy: currentUser.name,
    rejectedAt: new Date()
  };

  // 2. บันทึก Specimen
  specimenService.createSpecimen(specimen);

  // 3. Order Status ไม่เปลี่ยน!
  // ยังคงเป็น 'confirmed' (รอเก็บใหม่)
  order.status = 'confirmed';
  order.hasRejectedSpecimen = true; // Flag

  // 4. แสดง Warning
  showWarningToast('⚠️ ปฏิเสธสิ่งส่งตรวจ - กรุณาเก็บใหม่');

  // 5. ไม่พิมพ์ Label (เพราะยังไม่ผ่าน QC)
}

Key Point: Order Status ไม่เปลี่ยน → ยังเป็น confirmed เพื่อให้รู้ว่ายังต้องเก็บต่อ


Step 3: Display Rejected Order

Order Card แสดงสถานะ Rejected:

┌────────────────────────────────────────────┐
│ 🔴 มีสิ่งส่งตรวจถูกปฏิเสธ                 │
├────────────────────────────────────────────┤
│ Order#: LAB202512-0005                     │
│ HN: HN000005 - นายสมบัติ รวยทรัพย์         │
│ Priority: Urgent                           │
│                                            │
│ รายการตรวจ: 2 รายการ                       │
│  • PT, PTT (Citrate tube)                  │
│                                            │
│ ⚠️ Rejected Specimens:                     │
│ ┌────────────────────────────────────────┐ │
│ │ SPEC20251206 - Blood (Citrate)         │ │
│ │ Issues: Clotted, Insufficient Volume   │ │
│ │ เหตุผล: เลือดแข็งตัวในหลอด Citrate     │ │
│ │         และปริมาณไม่ถึง 2.7 ml         │ │
│ │ ปฏิเสธโดย: พญ.สมหญิง                   │ │
│ │ เวลา: 26/12/2568 10:45                 │ │
│ └────────────────────────────────────────┘ │
│                                            │
│ [🔄 เก็บใหม่]  [ดูรายละเอียด]             │
└────────────────────────────────────────────┘

UI Features: - 🔴 สีแดง Badge "มีสิ่งส่งตรวจถูกปฏิเสธ" - ⚠️ กล่องเหลือง แสดงรายละเอียด Rejection - 🔄 ปุ่ม "เก็บใหม่" เด่นชัด


Step 4: Recollection (เก็บใหม่)

เมื่อคลิกปุ่ม "เก็บใหม่":

  1. เปิด Collection Modal อัตโนมัติ
  2. Auto-select รายการที่ถูก reject
  3. แสดงเหตุผลเดิมด้านบน (เพื่อ reference)
┌──────────────────────────────────────────────┐
│ 🔄 เก็บสิ่งส่งตรวจใหม่                       │
├──────────────────────────────────────────────┤
│ 📋 Reference: Specimen ก่อนหน้า              │
│ ┌──────────────────────────────────────────┐ │
│ │ SPEC20251206 (ถูกปฏิเสธ)                 │ │
│ │ เหตุผล: เลือดแข็งตัว, ปริมาณไม่พอ        │ │
│ │ ⚠️ กรุณาเขย่าหลอดทันทีหลังเจาะ           │ │
│ │ ⚠️ ตรวจสอบ ratio 9:1 (0.3ml citrate)     │ │
│ └──────────────────────────────────────────┘ │
│                                              │
│ ✓ รายการที่เลือก: (Auto-selected)           │
│  ☑️ PT (Prothrombin Time)                   │
│  ☑️ PTT (Partial Thromboplastin Time)       │
│                                              │
│ Container: Citrate (Blue top) 🔵             │
│ Required Volume: 2.7 ml (ต้องพอดี!)          │
│                                              │
│ Collected By: นางสาววรรณา                   │
│ Collection Date/Time: 26/12/2568 11:00       │
│ Barcode: SPEC20251206-R1 (Recollection #1)  │
│                                              │
│ Volume Collected: [____] ml                  │
│                                              │
│ Quality: ● Good ○ Acceptable ○ Rejected      │
│                                              │
│ [บันทึกและพิมพ์ฉลาก]  [ยกเลิก]              │
└──────────────────────────────────────────────┘

Key Features: - Reference box แสดงปัญหาเดิม - Barcode ใหม่ มี suffix -R1 (Recollection #1) - Guideline แสดงวิธีแก้ปัญหา - Volume validation เข้มงวดขึ้น


Step 5: Success Recollection

เมื่อเก็บใหม่สำเร็จ:

async function saveRecollection() {
  // 1. สร้าง Specimen ใหม่
  const newSpecimen = {
    id: generateId(),
    orderNumber: order.orderNumber,
    barcode: 'SPEC20251206-R1', // ระบุว่าเป็น Recollection
    status: 'collected', // ✅ Status ใหม่
    quality: 'good',
    isRecollection: true,
    previousSpecimenId: rejectedSpecimen.id, // Link ไปผลเก่า
    collectedBy: currentUser.name,
    collectedAt: new Date()
  };

  // 2. Update Order Status
  const allCollected = checkAllSpecimensCollected(order);
  if (allCollected) {
    order.status = 'specimen_collected'; // ✅ เก็บครบแล้ว
    order.hasRejectedSpecimen = false;
  }

  // 3. แสดง Success
  showSuccessModal('✅ เก็บสิ่งส่งตรวจใหม่สำเร็จ');
  printBarcodeLabel(newSpecimen);
}

Rejected Specimen เดิม: - ❌ ไม่ถูกลบ → เก็บเป็นประวัติ - 📊 Track ได้ว่ามี Specimen กี่ version - 📈 Audit trail สมบูรณ์


📊 Status Summary: Specimen Rejection

Scenario Specimen Status (Old) Specimen Status (New) Order Status Next Action
เก็บครั้งแรก (Rejected) - rejected confirmed 🔄 เก็บใหม่
เก็บใหม่ (Success) rejected collected specimen_collected ➡️ Result Entry
เก็บใหม่ (Rejected อีก) rejected rejected confirmed 🔄 เก็บใหม่ (R2)

✅ Type 2: Result Rejection (ปฏิเสธผลแล็บ)

จุดเกิด: หน้า result-approval.html
ผู้ทำ: Lab Supervisor / ผู้เชี่ยวชาญ
เหตุผล: ผลแล็บสงสัยความถูกต้อง ต้องการตรวจสอบ/แก้ไข


📊 สาเหตุการปฏิเสธผล (Result Issues)

เหตุผล ตัวอย่าง Action
Delta Check Warning Glucose เปลี่ยนแปลง 40% ตรวจซ้ำ
ไม่สอดคล้องภาวะผู้ป่วย K=6.8 แต่ผู้ป่วยไม่มีอาการ ตรวจซ้ำด้วยเครื่องอื่น
Specimen Quality สงสัย ผล Hemolyzed แต่ไม่ได้แจ้งตอนเก็บ เก็บใหม่
Technical Error Reagent หมดกลางทาง Run ใหม่
Contamination Culture ขึ้นเชื้อ 5 ชนิด เก็บใหม่

🔍 Workflow: Result Rejection

Step 1: Review Results (หน้า Approval)

Supervisor เปิด Approval Modal → เห็นผลที่สงสัย:

┌────────────────────────────────────────────────┐
│ Result Approval - LAB202512-0001               │
├────────────────────────────────────────────────┤
│ Patient: HN000123 - นายสมชาย ใจดี              │
│ Order Date: 26/12/2568 10:30                   │
│                                                │
│ Results Review:                                │
│ ┌──────────────────────────────────────────┐   │
│ │☑│ Test      │ Previous│ Current │ Flag  │   │
│ ├─┼───────────┼─────────┼─────────┼───────┤   │
│ │☑│ WBC       │ 7.2     │ 7.8     │ Normal│   │
│ │☑│ Glucose   │ 145     │ 210 H   │ High  │   │
│ │☑│ Creatinine│ 1.2     │ 3.5 H   │ High  │   │
│ │ │           │         │ ⚠️ △52% │       │   │
│ └──────────────────────────────────────────┘   │
│                                                │
│ ⚠️ Delta Check Warning:                        │
│ Creatinine เปลี่ยนแปลง 52% (1.2→3.5)          │
│ ผิดปกติมาก ควรตรวจสอบ                         │
│                                                │
│ [อนุมัติทั้งหมด]  [อนุมัติที่เลือก]           │
│ [ปฏิเสธที่เลือก]                               │
└────────────────────────────────────────────────┘

เมื่อคลิก "ปฏิเสธที่เลือก" → เปิด Rejection Modal


Step 2: Rejection Modal

╔═══════════════════════════════════════════════╗
║  ⚠️  ปฏิเสธผลแล็บ                              ║
╠═══════════════════════════════════════════════╣
║                                               ║
║  รายการที่เลือก:                              ║
║  • Creatinine (3.5 mg/dL)                     ║
║                                               ║
║  เหตุผลการปฏิเสธ: * (Required)               ║
║  ┌───────────────────────────────────────┐    ║
║  │ Delta Check เปลี่ยนแปลง 52%          │    ║
║  │ ผลไม่สอดคล้องกับภาวะผู้ป่วย          │    ║
║  │ (ผู้ป่วยไม่มีอาการไตวาย)             │    ║
║  │ ขอให้ตรวจซ้ำด้วยเครื่องอื่น          │    ║
║  └───────────────────────────────────────┘    ║
║                                               ║
║  ☐ ต้องการเก็บ Specimen ใหม่                 ║
║                                               ║
║  📝 Note:                                     ║
║  ถ้าไม่ tick → ผลกลับไป Result Entry         ║
║                (เทคนิคตรวจซ้ำ)               ║
║  ถ้า tick   → Order กลับไป Specimen Collection║
║                (เก็บสิ่งส่งตรวจใหม่)          ║
║                                               ║
║  [ยืนยันปฏิเสธ]   [ยกเลิก]                   ║
╚═══════════════════════════════════════════════╝

Key Decision: Checkbox "ต้องการเก็บ Specimen ใหม่"


Step 3A: Reject → Re-entry (ไม่ต้องเก็บใหม่)

เมื่อ Supervisor ไม่ tick checkbox → ผลกลับไป Result Entry:

async function rejectForReEntry() {
  // 1. Update Result Status
  result.status = 'rejected';
  result.rejectionReason = 'Delta Check เปลี่ยนแปลง 52%...';
  result.rejectedBy = supervisor.name;
  result.rejectedAt = new Date();
  result.requireNewSpecimen = false; // ❌ ไม่ต้องเก็บใหม่

  // 2. Order Status
  order.status = 'sent_to_lis'; // กลับไปขั้นตอน Result Entry

  // 3. Notification
  notify(technician, 'ผลถูกปฏิเสธ - กรุณาลงผลใหม่');
}

หน้า Result Entry แสดง:

┌──────────────────────────────────────────────┐
│ ⚠️ รายการถูกปฏิเสธ - กรุณาลงผลใหม่           │
├──────────────────────────────────────────────┤
│ รายการ: Creatinine                           │
│ ผลเดิม: 3.5 mg/dL                            │
│ ผลใหม่: [______] mg/dL 🔴                    │
│                                              │
│ เหตุผลการปฏิเสธ:                             │
│ "Delta Check เปลี่ยนแปลง 52%                 │
│  ผลไม่สอดคล้องกับภาวะผู้ป่วย                 │
│  ขอให้ตรวจซ้ำด้วยเครื่องอื่น"                │
│                                              │
│ ปฏิเสธโดย: ผศ.ดร.สมหมาย                      │
│ เวลา: 26/12/2568 16:45                       │
│                                              │
│ 💡 Guideline:                                │
│  - ใช้เครื่อง Backup (Mindray BC-5390)       │
│  - ตรวจสอบ Specimen ว่ายังใช้ได้ไหม          │
│  - ถ้าสงสัย Hemolysis ให้เก็บใหม่             │
└──────────────────────────────────────────────┘

Features: - 🔴 ไฮไลท์แถวสีแดง - แสดงผลเดิม + เหตุผล + ผู้ปฏิเสธ - Input field ว่าง → กรอกผลใหม่ - Guideline ช่วยแนะนำ

เมื่อลงผลใหม่:

async function reEnterResult() {
  // Result Status: rejected → preliminary
  result.reEnterResult(newValue, userId, userName);
  result.status = 'preliminary'; // ส่ง Approval อีกรอบ
  result.reEntryCount++; // นับจำนวนครั้งที่แก้
}


Step 3B: Reject → Recollection (ต้องเก็บใหม่)

เมื่อ Supervisor tick checkbox ✅ → Order กลับไป Specimen Collection:

async function rejectForRecollection() {
  // 1. Update Result Status
  result.status = 'rejected';
  result.rejectionReason = 'Specimen Quality สงสัย...';
  result.rejectedBy = supervisor.name;
  result.rejectedAt = new Date();
  result.requireNewSpecimen = true; // ✅ ต้องเก็บใหม่

  // 2. Order Status
  order.status = 'confirmed'; // กลับไปขั้นตอน Collection
  order.hasRejectedResults = true;

  // 3. Notification
  notify(phlebotomist, 'มีผลถูกปฏิเสธ - ต้องเก็บสิ่งส่งตรวจใหม่');
}

หน้า Specimen Collection แสดง:

┌────────────────────────────────────────────────┐
│ 🔴 มีผลแล็บถูกปฏิเสธ - ต้องเก็บใหม่           │
├────────────────────────────────────────────────┤
│ Order#: LAB202512-0001                         │
│ Patient: HN000123 - นายสมชาย                  │
│                                                │
│ ⚠️ Rejected Results:                           │
│ ┌────────────────────────────────────────────┐ │
│ │ Creatinine (3.5 mg/dL)                     │ │
│ │ เหตุผล: สงสัย Specimen Hemolysis          │ │
│ │         ผลสูงผิดปกติ ต้องเก็บใหม่         │ │
│ │ ปฏิเสธโดย: ผศ.ดร.สมหมาย (16:45)           │ │
│ └────────────────────────────────────────────┘ │
│                                                │
│ รายการที่ต้องเก็บใหม่:                         │
│  • Creatinine → ต้องการ Plain tube 3 ml       │
│                                                │
│ [🔄 เก็บใหม่]  [ดูรายละเอียด]                 │
└────────────────────────────────────────────────┘

Flow หลังเก็บใหม่:

เก็บ Specimen ใหม่ → Result Entry (ลงผลจาก Specimen ใหม่)
                   → Result Approval อีกครั้ง


📊 Status Summary: Result Rejection

Scenario Result Status Order Status Next Action Role
Reject → Re-entry rejectedpreliminary sent_to_lis ลงผลใหม่ Technician
Reject → Recollect rejectedpending confirmed เก็บใหม่ Phlebotomist
Re-entry Success preliminary → (Approval) result_ready อนุมัติอีกรอบ Supervisor
Recollection Success pendingpreliminary specimen_collectedresult_ready ลงผล → อนุมัติ Tech + Supervisor

🔄 Complete Rejection Scenarios

Scenario 1: Specimen Rejected → Recollection Success

1. Doctor Order (confirmed)
2. Specimen Collection → Quality = Rejected ❌
   - Hemolysis detected
   - Status: rejected
   - Order: ยังเป็น confirmed
3. Recollection → Quality = Good ✅
   - New barcode: SPEC-R1
   - Status: collected
   - Order: specimen_collected
4. Result Entry → preliminary
5. Result Approval → final
6. Report ✅

Timeline: +30-60 นาที (ขึ้นอยู่กับความพร้อมของผู้ป่วย)


Scenario 2: Result Rejected → Re-entry Success

1. Result Entry → preliminary (ผลเบื้องต้น)
2. Result Approval → Reject (requireNew = false) ❌
   - เหตุผล: Delta Check warning
   - Status: rejected
   - Order: sent_to_lis
3. Result Entry (Re-entry) → ลงผลใหม่
   - ใช้เครื่องอื่น
   - Status: preliminary
4. Result Approval อีกครั้ง → final ✅
5. Report ✅

Timeline: +15-30 นาที (ตรวจซ้ำเท่านั้น)


Scenario 3: Result Rejected → Recollection Required

1. Result Entry → preliminary
2. Result Approval → Reject (requireNew = true) ❌
   - เหตุผล: สงสัย Specimen Quality
   - Status: rejected
   - Order: confirmed (กลับไป Collection)
3. Specimen Recollection → collected
4. Result Entry (จาก Specimen ใหม่) → preliminary
5. Result Approval → final ✅
6. Report ✅

Timeline: +45-90 นาที (เก็บใหม่ + ตรวจใหม่)


Scenario 4: Multiple Rejections (Worst Case)

1. Specimen Rejected #1 → Recollect
2. Specimen Rejected #2 → Recollect again
3. Specimen Collected (R2) → OK ✅
4. Result Entry → preliminary
5. Result Rejected #1 → Re-entry
6. Result Entry (Re-entry) → preliminary
7. Result Rejected #2 → Recollect (Specimen R3 needed)
...
[System should alert after 3 rejections]

Prevention: ระบบควร Alert เมื่อมี Rejection เกิน 3 ครั้ง → Escalate หัวหน้าแผนก


📊 Rejection Statistics & Tracking

Key Metrics to Track

Metric Formula Target
Specimen Rejection Rate Rejected Specimens / Total Specimens < 2%
Result Rejection Rate Rejected Results / Total Results < 1%
Recollection Success Rate Successful R1 / Total Rejections > 95%
Re-entry Success Rate Approved after Re-entry / Total Re-entry > 90%
Average Rejection Time Time from Reject to Final < 60 min

Common Causes Analysis

Top 5 Specimen Rejection Causes (Mock Data): 1. Hemolysis (35%) 2. Clotted (25%) 3. Insufficient Volume (20%) 4. Label Error (15%) 5. Contamination (5%)

Top 5 Result Rejection Causes: 1. Delta Check Warning (40%) 2. ไม่สอดคล้องภาวะผู้ป่วย (30%) 3. Technical Error (15%) 4. Specimen Quality (10%) 5. Contamination (5%)


🎯 Best Practices

สำหรับ Phlebotomist:

  1. ตรวจสอบ Specimen ก่อนส่ง
  2. ดู Hemolysis (สีแดง)
  3. ตรวจ Clot (เขย่าดู)
  4. วัด Volume (ใช้ Syringe)

  5. เทคนิคการเจาะที่ดี

  6. ใช้ Butterfly needle สำหรับเส้นยาก
  7. เขย่าหลอด EDTA/Citrate ทันที 8-10 ครั้ง
  8. ไม่เจาะจากเส้นที่มี IV running

  9. Documentation

  10. บันทึก Difficult draw
  11. ถ่ายรูป Specimen ถ้าสงสัย
  12. ติดต่อ Lab ถ้าไม่แน่ใจ

สำหรับ Technician:

  1. ตรวจสอบ Specimen Quality ก่อนรัน
  2. ถ้าเห็นปัญหา → โทรแจ้ง Phlebotomist ทันที
  3. อย่ารันถ้า Quality ไม่ผ่าน → ผลจะผิดพลาด

  4. Document ทุกอย่าง

  5. Note ใน LIMS/HIS
  6. เก็บภาพถ่าย
  7. บันทึก Corrective action

  8. Double-check ก่อน Submit

  9. ดู Delta Check
  10. เปรียบเทียบกับ Clinical Note
  11. ถ้าสงสัย → ปรึกษา Supervisor

สำหรับ Supervisor:

  1. Review อย่างละเอียด
  2. อย่า Auto-approve
  3. ตรวจ Critical results ทุกรายการ
  4. ดู Trend ย้อนหลัง

  5. Clear Communication

  6. ระบุเหตุผลปฏิเสธชัดเจน
  7. บอก Action ที่ต้องทำ
  8. ให้ Guideline

  9. Follow-up

  10. Track Rejection rate
  11. หาสาเหตุที่เกิดบ่อย
  12. Training staff

🚨 Error Prevention

System Safeguards

  1. Mandatory Fields
  2. Rejection reason (Required)
  3. Quality issues (Required)
  4. Notes (Required for Rejected)

  5. Alerts & Warnings

  6. ⚠️ Warning เมื่อ Rejection > 2 ครั้ง
  7. 🔴 Alert หัวหน้าแผนกเมื่อ > 3 ครั้ง
  8. 📊 Daily report: Rejection statistics

  9. Audit Trail

  10. บันทึกทุก Action
  11. Track ผู้ทำ, เวลา, เหตุผล
  12. Review ได้ย้อนหลัง

📱 User Interface Guidelines

Color Coding

Status Color Use Case
Rejected 🔴 Red Alert, ต้องดำเนินการ
Re-entry 🟡 Yellow รอลงผลใหม่
Recollection 🟠 Orange รอเก็บใหม่
Resolved 🟢 Green แก้ไขเสร็จแล้ว

Icons

  • ⚠️ Warning / Alert
  • 🔄 Recollection / Re-entry
  • ❌ Rejected
  • ✅ Success / Resolved
  • 📋 Notes / Details
  • 👤 User / Staff

Button States

/* Recollection Button */
.btn-recollect {
  background: #ffc107; /* Yellow */
  color: #000;
  font-weight: 600;
  animation: pulse 2s infinite; /* เด้งเตือน */
}

/* Re-entry Input */
.input-rejected {
  border: 2px solid #dc3545; /* Red */
  background: #ffebee; /* Light red */
}

Last Updated: December 26, 2025
Version: 1.0
Status: ✅ Complete


📝 Notes for UX/UI Team

Critical Design Requirements:

  1. Rejection Modal ต้องชัดเจน
  2. Checkbox "ต้องเก็บ Specimen ใหม่" ต้องเด่น
  3. อธิบายผลกระทบของแต่ละทางเลือก

  4. Visual Feedback

  5. Rejected items ต้องเห็นชัดมาก (สีแดง, ไอคอน)
  6. Animation เบาๆ เพื่อดึงความสนใจ
  7. Progress indicator สำหรับ Recollection

  8. Guideline & Help Text

  9. แสดง Reference จากผลเก่า
  10. แนะนำวิธีแก้ปัญหา
  11. Link ไป SOP ถ้ามี

  12. Mobile Friendly

  13. ปุ่ม "เก็บใหม่" ต้องใหญ่พอ (Touch target 48x48px)
  14. Form validation real-time
  15. Offline support (ในกรณีไม่มีเน็ต)

  16. Accessibility

  17. Screen reader ต้องอ่าน Alert ออกเสียง
  18. Keyboard navigation สมบูรณ์
  19. High contrast mode สำหรับ Rejection status