03. Lab Rejection Workflows - การปฏิเสธและแก้ไข
📋 ภาพรวม
Rejection Workflow เป็นกลไกสำคัญในการควบคุมคุณภาพผลแล็บ ช่วยให้สามารถตรวจจับและแก้ไขข้อผิดพลาดได้ทันท่วงที ระบบรองรับการปฏิเสธ 2 ประเภท:
- Specimen Rejection - ปฏิเสธสิ่งส่งตรวจที่ไม่ผ่านมาตรฐาน (QC Failed)
- 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 (เก็บใหม่)
เมื่อคลิกปุ่ม "เก็บใหม่":
- เปิด Collection Modal อัตโนมัติ
- Auto-select รายการที่ถูก reject
- แสดงเหตุผลเดิมด้านบน (เพื่อ 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 | rejected → preliminary |
sent_to_lis |
ลงผลใหม่ | Technician |
| Reject → Recollect | rejected → pending |
confirmed |
เก็บใหม่ | Phlebotomist |
| Re-entry Success | preliminary → (Approval) |
result_ready |
อนุมัติอีกรอบ | Supervisor |
| Recollection Success | pending → preliminary |
specimen_collected → result_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:
- ตรวจสอบ Specimen ก่อนส่ง
- ดู Hemolysis (สีแดง)
- ตรวจ Clot (เขย่าดู)
-
วัด Volume (ใช้ Syringe)
-
เทคนิคการเจาะที่ดี
- ใช้ Butterfly needle สำหรับเส้นยาก
- เขย่าหลอด EDTA/Citrate ทันที 8-10 ครั้ง
-
ไม่เจาะจากเส้นที่มี IV running
-
Documentation
- บันทึก Difficult draw
- ถ่ายรูป Specimen ถ้าสงสัย
- ติดต่อ Lab ถ้าไม่แน่ใจ
สำหรับ Technician:
- ตรวจสอบ Specimen Quality ก่อนรัน
- ถ้าเห็นปัญหา → โทรแจ้ง Phlebotomist ทันที
-
อย่ารันถ้า Quality ไม่ผ่าน → ผลจะผิดพลาด
-
Document ทุกอย่าง
- Note ใน LIMS/HIS
- เก็บภาพถ่าย
-
บันทึก Corrective action
-
Double-check ก่อน Submit
- ดู Delta Check
- เปรียบเทียบกับ Clinical Note
- ถ้าสงสัย → ปรึกษา Supervisor
สำหรับ Supervisor:
- Review อย่างละเอียด
- อย่า Auto-approve
- ตรวจ Critical results ทุกรายการ
-
ดู Trend ย้อนหลัง
-
Clear Communication
- ระบุเหตุผลปฏิเสธชัดเจน
- บอก Action ที่ต้องทำ
-
ให้ Guideline
-
Follow-up
- Track Rejection rate
- หาสาเหตุที่เกิดบ่อย
- Training staff
🚨 Error Prevention
System Safeguards
- Mandatory Fields
- Rejection reason (Required)
- Quality issues (Required)
-
Notes (Required for Rejected)
-
Alerts & Warnings
- ⚠️ Warning เมื่อ Rejection > 2 ครั้ง
- 🔴 Alert หัวหน้าแผนกเมื่อ > 3 ครั้ง
-
📊 Daily report: Rejection statistics
-
Audit Trail
- บันทึกทุก Action
- Track ผู้ทำ, เวลา, เหตุผล
- 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:
- Rejection Modal ต้องชัดเจน
- Checkbox "ต้องเก็บ Specimen ใหม่" ต้องเด่น
-
อธิบายผลกระทบของแต่ละทางเลือก
-
Visual Feedback
- Rejected items ต้องเห็นชัดมาก (สีแดง, ไอคอน)
- Animation เบาๆ เพื่อดึงความสนใจ
-
Progress indicator สำหรับ Recollection
-
Guideline & Help Text
- แสดง Reference จากผลเก่า
- แนะนำวิธีแก้ปัญหา
-
Link ไป SOP ถ้ามี
-
Mobile Friendly
- ปุ่ม "เก็บใหม่" ต้องใหญ่พอ (Touch target 48x48px)
- Form validation real-time
-
Offline support (ในกรณีไม่มีเน็ต)
-
Accessibility
- Screen reader ต้องอ่าน Alert ออกเสียง
- Keyboard navigation สมบูรณ์
- High contrast mode สำหรับ Rejection status