แผนภาพการทำงานของระบบเปิด Visit (VN - Visit Number)
1. ความเข้าใจเบื้องต้นและกรณีการใช้งาน (Use Cases)
1.1 คำจำกัดความ
VN (Visit Number)
- หมายเลขการมาพบแพทย์ในแต่ละวัน
- ผู้ป่วย 1 คน ใน 1 วัน = 1 VN เท่านั้น
- VN เดียวกันสามารถมีหลาย Episode/Encounter ได้
Episode/Encounter
- การรักษาแต่ละครั้งภายใน 1 วัน
- ผู้ป่วยมา 1 วัน สามารถมีหลาย Episode ได้
- แต่ละ Episode อาจมีอาการ/สาเหตุแตกต่างกัน
Visit
- การเข้ามารับบริการแต่ละครั้ง
- 1 Visit = 1 VN + 1 หรือหลาย Episodes
1.2 กรณีการใช้งานที่ต้องรองรับ (Use Cases)
กรณีที่ 1: ผู้ป่วยมาครั้งแรกในวันนั้น
- สร้าง VN ใหม่
- สร้าง Episode แรก
- เลือกสิทธิ์การรักษา
- ส่งตรวจไปแผนกต่างๆ (สามารถส่งหลายแผนกพร้อมกันได้)
กรณีที่ 2: ผู้ป่วยมาครั้งที่สอง ในวันเดียวกัน - อาการเดิม
- ใช้ VN เดิม
- ใช้ Episode เดิม (ต่อเนื่อง)
- อาจเลือกสิทธิ์เดิมหรือสิทธิ์ใหม่ได้
- สามารถส่งตรวจเพิ่มได้
กรณีที่ 3: ผู้ป่วยมาครั้งที่สอง ในวันเดียวกัน - อาการใหม่
- ใช้ VN เดิม (เพราะเป็นวันเดียวกัน)
- สร้าง Episode ใหม่ (เพราะเป็นอาการใหม่/สาเหตุใหม่)
- เลือกสิทธิ์ (อาจเป็นสิทธิ์เดิมหรือใหม่)
- ส่งตรวจไปแผนกต่างๆ
กรณีที่ 4: การส่งตรวจหลายแผนกพร้อมกัน
- จากห้องซักประวัติ/ห้องตรวจ สามารถส่งตรวจไป:
- แผนก LAB (ห้องปฏิบัติการ)
- แผนก X-RAY (รังสีวินิจฉัย)
- แผนก Pharmacy (เภสัชกรรม)
- แผนกอื่นๆ พร้อมกันในคำสั่งเดียว
กรณีที่ 5: การส่งต่อจากแผนกหนึ่งไปอีกแผนกหนึ่ง
- ขณะอยู่ที่แผนก LAB → ต้องการส่งต่อไป X-RAY
- ขณะอยู่ที่แผนก X-RAY → พบความผิดปกติ → ส่งต่อไป Specialist
- การส่งต่อนี้ยังคงอยู่ภายใน Episode เดิม
กรณีที่ 6: การใช้หลายสิทธิ์ในวันเดียวกัน
- Episode แรก: ใช้สิทธิ์ UC (บัตรทอง)
- Episode ที่สอง: ใช้สิทธิ์ Self-pay (จ่ายเอง)
- ใช้ VN เดียวกัน แต่แยก Episode และสิทธิ์
2. Business Rules (กฎการทำงาน)
2.1 กฎเกี่ยวกับ VN (Visit Number)
กฎที่ 1: VN ต่อผู้ป่วย 1 คน 1 วัน
- HN (Hospital Number) + วันที่ = VN เดียว
- ไม่ว่าจะมากี่ครั้งในวันนั้น VN ต้องเป็นเลขเดียวกัน
กฎที่ 2: การสร้าง VN ใหม่
- เช็คว่าผู้ป่วยคนนี้ (HN) มี VN ในวันนี้หรือยัง
- ถ้าไม่มี → สร้าง VN ใหม่
- ถ้ามีแล้ว → ใช้ VN เดิม
2.2 กฎเกี่ยวกับ Episode/Encounter
กฎที่ 3: การสร้าง Episode ใหม่
- Episode ใหม่ถูกสร้างเมื่อ:
a) ผู้ป่วยมาครั้งแรกในวันนั้น (Episode แรก)
b) ผู้ป่วยมาอีกครั้ง แต่เป็นอาการ/สาเหตุใหม่
c) ผู้ป่วยต้องการใช้สิทธิ์ใหม่ที่แตกต่างจาก Episode ก่อนหน้า
กฎที่ 4: การใช้ Episode เดิม
- ใช้ Episode เดิมเมื่อ:
a) เป็นการมาต่อเนื่องจากการรักษาเดิม (Follow-up)
b) เป็นการเพิ่มการส่งตรวจในอาการเดียวกัน
c) ใช้สิทธิ์เดียวกัน
2.3 กฎเกี่ยวกับการส่งตรวจ (Referral/Order)
กฎที่ 5: การส่งตรวจหลายแผนกพร้อมกัน
- ระบบต้องรองรับการสั่ง Order ไปหลายแผนกในคราวเดียว
- แต่ละ Order จะมี Order Number แยกกัน
- แต่จะอ้างอิงถึง VN และ Episode เดียวกัน
กฎที่ 6: การส่งต่อระหว่างแผนก
- แผนกที่รับ Order สามารถสร้าง Order ใหม่ส่งต่อได้
- Order ใหม่จะยังคงอยู่ภายใน Episode เดิม
- ต้องมีการบันทึก Referral Chain (ลำดับการส่งต่อ)
2.4 กฎเกี่ยวกับสิทธิ์การรักษา
กฎที่ 7: การใช้หลายสิทธิ์
- 1 VN สามารถมีหลายสิทธิ์ได้
- แต่ละ Episode ต้องผูกกับสิทธิ์เฉพาะ
- การเปลี่ยนสิทธิ์ = สร้าง Episode ใหม่
กฎที่ 8: การตรวจสอบสิทธิ์
- ต้องตรวจสอบสิทธิ์ทุกครั้งก่อนสร้าง Episode
- สิทธิ์ต้องถูกต้องและยังไม่หมดอายุ
- บันทึกผลการตรวจสอบสิทธิ์ทุกครั้ง
2.5 กฎเกี่ยวกับการส่งตรวจหลายสิทธิ์
กฎที่ 9: การใช้หลายสิทธิ์ใน Visit เดียวกัน
- ผู้ป่วยสามารถใช้หลายสิทธิ์ในวันเดียวกันได้
- แต่ละ Episode ผูกกับสิทธิ์หนึ่งเท่านั้น
- Order ภายใน Episode เดียวกันต้องใช้สิทธิ์เดียวกัน
- ถ้าต้องการใช้สิทธิ์ต่างกัน = ต้องสร้าง Episode ใหม่
กฎที่ 10: การแบ่งค่าใช้จ่ายตามสิทธิ์
- แต่ละ Order บันทึกสิทธิ์ที่ใช้
- ระบบคำนวณค่าใช้จ่ายแยกตามสิทธิ์
- สรุปค่าใช้จ่าย:
* ส่วนที่สิทธิ์คุ้มครอง
* ส่วนที่ผู้ป่วยต้องจ่ายเอง
* แยกตาม Episode/สิทธิ์
ตัวอย่างการใช้หลายสิทธิ์:
VN: VN20250126-001 (นาย ทดสอบ ระบบ)
Episode 1 (เช้า 09:00):
- สิทธิ์: UC (บัตรทอง)
- อาการ: ปวดท้อง
- Orders:
* LAB: Complete Blood Count
* X-RAY: Abdomen
Episode 2 (บ่าย 14:00):
- สิทธิ์: Self-pay (จ่ายเอง)
- อาการ: ตรวจสุขภาพประจำปี
- Orders:
* LAB: Lipid Profile, Blood Sugar
* X-RAY: Chest PA
2.6 กฎเกี่ยวกับการคัดกรองและจัดสรรแผนก (Triage-based Assignment)
กฎที่ 11: การลงทะเบียนโดยไม่ระบุแผนก
- เวชระเบียนสร้าง VN และ Episode โดยไม่ระบุแผนกปลายทาง
- Episode สถานะ: "Pending Triage" (รอคัดกรอง)
- ผู้ป่วยได้รับเลขคิว (Queue Number) และรอที่จุดคัดกรอง
กฎที่ 12: จุดคัดกรอง (Triage Point) - บทบาทหลัก
- จุดคัดกรองเป็น "ผู้จัดสรรแผนก" (Department Allocator)
- หน้าที่:
1. ค้นหาผู้ป่วยที่เวชระเบียนลงทะเบียนไว้
2. ซักประวัติเบื้องต้น และวัดสัญญาณชีพ
3. ประเมินอาการและระดับความเร่งด่วน
4. **จัดสรรห้องตรวจ/แผนกที่เหมาะสม**
5. ส่งผู้ป่วยไปยังห้องตรวจ/แผนกนั้น
กฎที่ 13: การจัดสรรแผนกที่จุดคัดกรอง
- พยาบาลคัดกรองเลือกห้องตรวจ/แผนกตามอาการ
- Episode จะถูกอัปเดต department_id
- สถานะเปลี่ยนจาก "Pending Triage" → "Assigned to [Department]"
- ผู้ป่วยเข้าคิวของห้องตรวจ/แผนกนั้นทันที
กฎที่ 14: การทำงานของห้องตรวจ/แพทย์
- แพทย์เห็นผู้ป่วยในคิวของห้องตรวจตน
- ค้นหาผู้ป่วยด้วยเลขบัตรประชาชน/HN/ชื่อ
- ระบบโหลดข้อมูลที่จุดคัดกรองบันทึกไว้:
* อาการเบื้องต้น
* สัญญาณชีพ
* ประวัติการแพ้ยา
- แพทย์บันทึกเพิ่มเติม: วินิจฉัย, แผนการรักษา, สั่ง Order
กฎที่ 13: สถานะของ Unassigned Order
- Unassigned: ยังไม่ได้จัดสรรแผนก
- Pending Assignment: รอผู้มีสิทธิ์จัดสรร
- Assigned: จัดสรรแผนกเรียบร้อย (เข้าคิวแผนกปลายทาง)
- Expired: หมดเวลา/ยกเลิก
ตัวอย่างการทำงาน:
กรณี: Order ระบุแผนกชัดเจน
Order #001: ตรวจ CBC
- แผนกปลายทาง: LAB ✓
- สถานะ: ส่งเข้าคิว LAB ทันที
กรณี: Order ไม่ระบุแผนก - ใช้ Auto-routing
Order #002: ตรวจเลือด (ไม่ระบุแผนก)
- ระบบตรวจสอบ: "ตรวจเลือด" → LAB
- สถานะ: ส่งเข้าคิว LAB อัตโนมัติ
กรณี: Order ไม่ระบุแผนก - ต้อง Manual Assignment
Order #003: ตรวจพิเศษ (ไม่ระบุแผนก)
- ระบบ: ไม่มีกฎจัดสรรอัตโนมัติ
- สถานะ: Unassigned
- แจ้งเตือน: Coordinator
- Coordinator: จัดสรรให้ Special Unit
- สถานะ: ส่งเข้าคิว Special Unit
2.7 กฎเกี่ยวกับการดู Episode/Order (View Permissions)
กฎที่ 15: Central View (จุดรวมดู Episode/Order ทั้งหมด)
- เวชระเบียน: เห็น Episode ทั้งหมดของ VN
- จุดคัดกรอง: เห็น Episode ที่รอคัดกรอง และที่ตนคัดกรองแล้ว
- Coordinator/Admin: เห็น Episode/Order ทั้งหมด
- แพทย์เจ้าของไข้: เห็น Episode/Order ทั้งหมดของผู้ป่วยตน
กฎที่ 16: Department View (แผนก/ห้องตรวจเห็นเฉพาะของตัวเอง)
- แต่ละห้องตรวจ/แผนกเห็นเฉพาะ Episode ที่จัดสรรมาให้
- แสดงในรูปแบบคิว (Queue)
- เรียงตาม:
* Priority (Emergency > Urgent > Normal)
* เวลาที่จัดสรร (FIFO)
* Appointment Time (ถ้ามีนัด)
กฎที่ 17: Triage Queue View
- จุดคัดกรองเห็น Episode ที่สถานะ "Pending Triage"
- แสดงเป็นคิวรอคัดกรอง
- เรียงตามเลขคิวหรือเวลาลงทะเบียน
ตัวอย่าง Workflow: ผู้ป่วยมาตรวจ
1. เวชระเบียน (08:30):
- ลงทะเบียนผู้ป่วย (HN: 12345)
- สร้าง VN: VN20250126-001
- สร้าง Episode แต่ไม่ระบุแผนก
- สถานะ: "Pending Triage"
- ออกเลขคิว: Q001
2. จุดคัดกรอง (08:45):
- พยาบาลเรียกคิว Q001
- ค้นหาด้วยบัตรประชาชน → เจอ HN 12345
- กรอกข้อมูล:
* Chief Complaint: ปวดท้อง
* Vital Signs: BP 120/80, Temp 37.0°C
* Allergy: ไม่มี
- ประเมินอาการ → จัดสรรไป "ห้องตรวจทั่วไป 1"
- สถานะ: "Assigned to ห้องตรวจทั่วไป 1"
3. ห้องตรวจทั่วไป 1 (09:00):
- แพทย์เห็นคิวมีผู้ป่วย HN 12345
- เรียกผู้ป่วย
- ค้นหาด้วยบัตรประชาชน/HN
- เห็นข้อมูลจากจุดคัดกรอง
- บันทึกเพิ่มเติม:
* History: ปวดท้องมา 2 วัน
* Diagnosis: Gastritis
* Orders: LAB (CBC), Pharmacy (Antacid)
3. แผนภาพการทำงาน (Flow Diagrams)
3.1 Main Flow: กระบวนการเปิด Visit
flowchart TD
Start([เริ่มต้น: ผู้ป่วยมาถึงโรงพยาบาล]) --> SearchPatient[ค้นหาข้อมูลผู้ป่วย<br/>โดยใช้ HN/บัตรประชาชน/ชื่อ]
SearchPatient --> CheckPatientExists{มีข้อมูล<br/>ผู้ป่วยหรือไม่?}
CheckPatientExists -->|ไม่มี| RegisterNewPatient[ลงทะเบียนผู้ป่วยใหม่<br/>สร้าง HN ใหม่]
CheckPatientExists -->|มีแล้ว| CheckVNToday
RegisterNewPatient --> CheckVNToday{มี VN<br/>ในวันนี้หรือไม่?}
CheckVNToday -->|ไม่มี| CreateNewVN[สร้าง VN ใหม่<br/>VN = HN + วันที่]
CheckVNToday -->|มีแล้ว| LoadExistingVN[โหลด VN เดิม<br/>แสดงประวัติการมาในวันนี้]
CreateNewVN --> ShowVisitSummary[แสดงสรุป Visit ปัจจุบัน<br/>- VN<br/>- วันที่<br/>- จำนวน Episodes]
LoadExistingVN --> ShowVisitSummary
ShowVisitSummary --> DecideAction{เลือกการดำเนินการ}
DecideAction -->|สร้าง Episode ใหม่| CreateEpisodeFlow[ไปยัง Episode Flow<br/>ดูรายละเอียดในส่วน 3.2]
DecideAction -->|ดู Episode เดิม| ViewExistingEpisode[แสดงรายละเอียด Episode เดิม<br/>- อาการ<br/>- การรักษา<br/>- Orders]
DecideAction -->|ปิด Visit| CloseVisit[ปิด Visit<br/>สรุปค่าใช้จ่ายทั้งหมด]
ViewExistingEpisode --> DecideEpisodeAction{เลือกการดำเนินการ}
DecideEpisodeAction -->|เพิ่ม Order| AddOrderFlow[ไปยัง Order Flow<br/>ดูรายละเอียดในส่วน 3.3]
DecideEpisodeAction -->|กลับ| ShowVisitSummary
CloseVisit --> End([จบการทำงาน])
CreateEpisodeFlow --> ShowVisitSummary
AddOrderFlow --> ViewExistingEpisode
style Start fill:#d4edda
style End fill:#f8d7da
style CreateNewVN fill:#fff3cd
style CreateEpisodeFlow fill:#cfe2ff
style AddOrderFlow fill:#cfe2ff
3.2 Episode Flow: การสร้างและจัดการ Episode
flowchart TD
Start([เริ่มต้น: สร้าง Episode]) --> AskReason[ถามเหตุผลการมา<br/>- อาการใหม่?<br/>- Follow-up?<br/>- ต่อเนื่องจากเดิม?]
AskReason --> DecideEpisodeType{ประเภท<br/>Episode?}
DecideEpisodeType -->|อาการใหม่| NewEpisode[สร้าง Episode ใหม่]
DecideEpisodeType -->|Follow-up/ต่อเนื่อง| AskContinue{ต้องการใช้<br/>Episode เดิมหรือไม่?}
AskContinue -->|ใช่| LoadExistingEpisode[โหลด Episode เดิม<br/>แสดงประวัติการรักษา]
AskContinue -->|ไม่ใช่<br/>เปลี่ยนแปลงมาก| NewEpisode
NewEpisode --> SelectInsurance[เลือกสิทธิ์การรักษา<br/>- UC บัตรทอง<br/>- ประกันสังคม<br/>- Self-pay<br/>- ประกันอื่นๆ]
LoadExistingEpisode --> CheckInsurance{ใช้สิทธิ์เดิม<br/>หรือเปลี่ยน?}
CheckInsurance -->|ใช้เดิม| LoadInsurance[โหลดสิทธิ์เดิม]
CheckInsurance -->|เปลี่ยน| ConfirmChangeInsurance{ยืนยันการ<br/>เปลี่ยนสิทธิ์?}
ConfirmChangeInsurance -->|ยืนยัน| MustCreateNew[บังคับสร้าง Episode ใหม่<br/>เพราะเปลี่ยนสิทธิ์]
ConfirmChangeInsurance -->|ยกเลิก| LoadInsurance
MustCreateNew --> SelectInsurance
SelectInsurance --> VerifyInsurance[ตรวจสอบสิทธิ์<br/>- ตรวจสอบความถูกต้อง<br/>- วันหมดอายุ<br/>- ขอบเขตความคุ้มครอง]
VerifyInsurance --> InsuranceValid{สิทธิ์<br/>ถูกต้อง?}
InsuranceValid -->|ไม่ถูกต้อง| ShowError[แสดงข้อผิดพลาด<br/>ระบุสาเหตุ]
ShowError --> SelectInsurance
InsuranceValid -->|ถูกต้อง| SaveEpisode[บันทึก Episode<br/>- Episode Number<br/>- สิทธิ์<br/>- วันที่/เวลา]
LoadInsurance --> SaveEpisode
SaveEpisode --> InputChiefComplaint[บันทึกอาการสำคัญ<br/>Chief Complaint]
InputChiefComplaint --> TakeVitalSigns[วัดสัญญาณชีพ<br/>- ความดันโลหิต<br/>- ชีพจร<br/>- อุณหภูมิ<br/>- น้ำหนัก/ส่วนสูง]
TakeVitalSigns --> RecordHistory[บันทึกประวัติ<br/>- ประวัติการเจ็บป่วย<br/>- ประวัติการแพ้ยา<br/>- ประวัติครอบครัว]
RecordHistory --> DecideOrder{ต้องการ<br/>สั่ง Order?}
DecideOrder -->|ใช่| OrderFlow[ไปยัง Order Flow<br/>ดูรายละเอียดในส่วน 3.3]
DecideOrder -->|ไม่| EpisodeComplete[Episode พร้อมใช้งาน]
OrderFlow --> EpisodeComplete
EpisodeComplete --> End([จบการทำงาน])
style Start fill:#d4edda
style End fill:#f8d7da
style NewEpisode fill:#fff3cd
style SaveEpisode fill:#d1ecf1
style OrderFlow fill:#cfe2ff
3.3 Order Flow: การสั่ง Order และส่งตรวจ
flowchart TD
Start([เริ่มต้น: สั่ง Order]) --> CheckEpisode{มี Episode<br/>ที่ Active หรือไม่?}
CheckEpisode -->|ไม่มี| Error1[แสดงข้อผิดพลาด<br/>ต้องสร้าง Episode ก่อน]
CheckEpisode -->|มี| SelectOrderType[เลือกประเภท Order]
Error1 --> End([จบการทำงาน])
SelectOrderType --> OrderTypeDecision{ประเภท<br/>Order?}
OrderTypeDecision -->|LAB| LABOrder[สั่งตรวจแล็บ<br/>เลือกรายการตรวจ]
OrderTypeDecision -->|X-RAY/Imaging| ImagingOrder[สั่งเอกซเรย์/รังสี<br/>เลือกส่วนที่ตรวจ]
OrderTypeDecision -->|Pharmacy| PharmacyOrder[สั่งจ่ายยา<br/>เลือกรายการยา]
OrderTypeDecision -->|Other Department| OtherOrder[ส่งตรวจแผนกอื่น<br/>เลือกแผนกปลายทาง]
LABOrder --> AddToCart[เพิ่มเข้ารถเข็น Order]
ImagingOrder --> AddToCart
PharmacyOrder --> AddToCart
OtherOrder --> AddToCart
AddToCart --> AskMore{ต้องการเพิ่ม<br/>Order อื่นหรือไม่?}
AskMore -->|ใช่| SelectOrderType
AskMore -->|ไม่| ShowOrderSummary[แสดงสรุป Orders<br/>ทั้งหมดในรถเข็น]
ShowOrderSummary --> ReviewOrders[รีวิว Orders:<br/>- จำนวนรายการ<br/>- แผนกปลายทาง<br/>- ราคาโดยประมาณ]
ReviewOrders --> ConfirmOrder{ยืนยัน<br/>Orders?}
ConfirmOrder -->|ไม่| EditOrders[แก้ไข/ลบ Order]
EditOrders --> ShowOrderSummary
ConfirmOrder -->|ใช่| VerifyInsuranceCoverage[ตรวจสอบความคุ้มครอง<br/>ตามสิทธิ์]
VerifyInsuranceCoverage --> CheckCoverage{สิทธิ์<br/>คุ้มครอง?}
CheckCoverage -->|ไม่ครบ/เกินสิทธิ์| ShowWarning[แสดงคำเตือน<br/>รายการที่ไม่คุ้มครอง]
ShowWarning --> AskProceed{ต้องการ<br/>ดำเนินการต่อ?}
AskProceed -->|ไม่| ShowOrderSummary
AskProceed -->|ใช่| CreateOrders
CheckCoverage -->|ครอบคลุม| CreateOrders[สร้าง Orders<br/>สร้าง Order Number ทั้งหมด]
CreateOrders --> LinkToEpisode[เชื่อมโยง Orders<br/>กับ Episode และ VN]
LinkToEpisode --> SendToDepartments[ส่ง Orders ไปยังแผนกต่างๆ<br/>- LAB Queue<br/>- X-RAY Queue<br/>- Pharmacy Queue<br/>- Other Departments]
SendToDepartments --> PrintDocuments{ต้องการพิมพ์<br/>เอกสารหรือไม่?}
PrintDocuments -->|ใช่| PrintForms[พิมพ์เอกสาร:<br/>- ใบส่งตรวจแล็บ<br/>- ใบเอกซเรย์<br/>- ใบสั่งยา<br/>- ใบส่งตรวจ]
PrintDocuments -->|ไม่| OrderComplete
PrintForms --> OrderComplete[Orders สร้างสำเร็จ<br/>รอผลตรวจ/การรักษา]
OrderComplete --> End
style Start fill:#d4edda
style End fill:#f8d7da
style CreateOrders fill:#d1ecf1
style SendToDepartments fill:#fff3cd
style Error1 fill:#f8d7da
3.4 Department Referral Flow: การส่งต่อระหว่างแผนก (เพิ่ม Order ใหม่ลงคิว)
flowchart TD
Start([เริ่มต้น: แผนกต้องการส่งต่อ]) --> CheckCurrentOrder{มี Order<br/>ปัจจุบันหรือไม่?}
CheckCurrentOrder -->|ไม่มี| Error1[แสดงข้อผิดพลาด<br/>ไม่สามารถส่งต่อได้]
CheckCurrentOrder -->|มี| LoadOrderInfo[โหลดข้อมูล Order:<br/>- Order Number<br/>- Episode Number<br/>- VN<br/>- ประวัติที่แผนกนี้]
Error1 --> End([จบการทำงาน])
LoadOrderInfo --> ShowPatientInfo[แสดงข้อมูลผู้ป่วย:<br/>- ข้อมูลพื้นฐาน<br/>- อาการสำคัญ<br/>- ผลตรวจที่ได้]
ShowPatientInfo --> EnterResult[บันทึกผลการตรวจ/บริการ<br/>ที่แผนกนี้]
EnterResult --> DecideReferral{ต้องการ<br/>ส่งต่อหรือไม่?}
DecideReferral -->|ไม่| CompleteOrder[ปิด Order นี้<br/>สถานะ: Completed]
CompleteOrder --> End
DecideReferral -->|ใช่| SelectReferralDept[เลือกแผนกที่จะส่งต่อ:<br/>- Specialist<br/>- LAB<br/>- X-RAY<br/>- Pharmacy<br/>- อื่นๆ]
SelectReferralDept --> CanMultiReferral{ส่งต่อ<br/>หลายแผนก?}
CanMultiReferral -->|ใช่| SelectMultipleDepts[เลือกหลายแผนก<br/>เพิ่มเข้ารายการ]
CanMultiReferral -->|ไม่| SingleDept[เลือกแผนกเดียว]
SelectMultipleDepts --> EnterReferralReason
SingleDept --> EnterReferralReason[ระบุเหตุผลการส่งต่อ<br/>และคำแนะนำสำหรับแผนกปลายทาง]
EnterReferralReason --> SelectPriority[เลือกระดับความเร่งด่วน:<br/>- Normal<br/>- Urgent<br/>- Emergency]
SelectPriority --> ReviewReferral[รีวิวรายการส่งต่อ:<br/>- แผนกปลายทาง<br/>- เหตุผล<br/>- ระดับความเร่งด่วน]
ReviewReferral --> ConfirmReferral{ยืนยัน<br/>การส่งต่อ?}
ConfirmReferral -->|ไม่| SelectReferralDept
ConfirmReferral -->|ใช่| CreateNewOrders["สร้าง Order ใหม่ทันที<br/>(แยกตามแผนกปลายทาง)<br/>- Order Number ใหม่<br/>- Episode เดิม<br/>- VN เดิม"]
CreateNewOrders --> SetReferralInfo["กำหนดข้อมูล Referral:<br/>- referred_from_order_id<br/>- referred_from_dept<br/>- referral_reason<br/>- referral_note"]
SetReferralInfo --> SetOrderStatus["กำหนดสถานะ Order ใหม่:<br/>- Status: Pending/Waiting<br/>- Queue Position: ตามลำดับ<br/>- Priority: ตามที่เลือก<br/>- Service History: แสดงว่าผ่านแผนกไหนมา"]
SetOrderStatus --> AddToQueue["เพิ่ม Order ใหม่<br/>เข้าคิวของแผนกปลายทาง<br/>(แสดงในระบบคิวทันที)"]
AddToQueue --> UpdateCurrentOrder["อัปเดต Order ปัจจุบัน:<br/>สถานะ: Completed<br/>บันทึก referred_to_orders"]
UpdateCurrentOrder --> NotifyDepartments["แจ้งเตือนแผนกปลายทาง:<br/>📱 มี Order ใหม่ในคิว<br/>- ชื่อผู้ป่วย<br/>- ส่งต่อจากแผนก<br/>- ระดับความเร่งด่วน"]
NotifyDepartments --> UpdateQueueDisplay["อัปเดตหน้าจอคิว:<br/>- แผนกปลายทางเห็น Order ใหม่<br/>- แสดงว่าเป็น Referral<br/>- แสดงประวัติการผ่านแผนก"]
UpdateQueueDisplay --> PrintReferralForm{ต้องการพิมพ์<br/>ใบส่งต่อ?}
PrintReferralForm -->|ใช่| PrintForms["พิมพ์เอกสาร:<br/>- ใบส่งต่อ (Referral Form)<br/>- สรุปผลการตรวจ<br/>- คำแนะนำสำหรับแผนกปลายทาง"]
PrintReferralForm -->|ไม่| ReferralComplete
PrintForms --> ReferralComplete["✅ การส่งต่อสำเร็จ<br/>Order ใหม่อยู่ในคิวแล้ว<br/>แผนกปลายทางสามารถเรียกคิวได้"]
ReferralComplete --> End
style Start fill:#d4edda
style End fill:#f8d7da
style CreateNewOrders fill:#d1ecf1
style AddToQueue fill:#fff3cd
style UpdateQueueDisplay fill:#cfe2ff
style Error1 fill:#f8d7da
คำอธิบาย: ระบบคิวและการส่งต่อ
การทำงานของ Order ที่ส่งต่อ:
- Order ใหม่ = Order แยกต่างหาก
- สร้าง Order Number ใหม่ทันที
- แต่อ้างอิง Episode และ VN เดิม
-
มีข้อมูล
referred_from_order_idระบุว่ามาจาก Order ไหน -
เข้าสู่ระบบคิว
- Order ใหม่แสดงในคิวของแผนกปลายทางทันที
- มีตำแหน่งคิว (Queue Position) ตามลำดับหรือระดับความเร่งด่วน
-
แผนกปลายทางเรียกคิวเหมือนผู้ป่วยทั่วไป
-
ข้อมูลที่แสดงในคิว
🔄 Order #12345 (Referral) 👤 นาย ทดสอบ ระบบ (HN: 12345) 📋 VN: VN20250126-001 🏥 จาก: LAB → ไป: X-RAY ⚠️ Priority: Urgent 📝 หมายเหตุ: พบความผิดปกติ ขอ X-Ray Chest PA 📜 ผ่านแผนก: OPD → LAB → [X-RAY] ← กำลังอยู่ที่นี่ -
สถานะ Order
- Pending/Waiting: รอในคิว (แผนกปลายทางยังไม่เรียก)
- In Progress: กำลังให้บริการ
- Completed: เสร็จสิ้น (อาจส่งต่อต่อได้)
-
Cancelled: ยกเลิก
-
Referral Chain (ลำดับการส่งต่อ)
- ระบบเก็บประวัติว่า Order ผ่านแผนกอะไรมาบ้าง
- ตัวอย่าง:
OPD → LAB → X-RAY → Specialist - แต่ละแผนกเห็นประวัติทั้งหมด
3.5 Triage-based Workflow: การคัดกรองและจัดสรรห้องตรวจ
flowchart TD
Start([เริ่มต้น: ผู้ป่วยมาถึงโรงพยาบาล]) --> Registration[เวชระเบียน: ลงทะเบียน<br/>- สร้าง/ค้นหา HN<br/>- สร้าง VN<br/>- สร้าง Episode แต่ไม่ระบุแผนก]
Registration --> IssueQueue[ออกเลขคิว<br/>Queue Number: Q001<br/>สถานะ: Pending Triage]
IssueQueue --> PatientWait[👤 ผู้ป่วยรอที่จุดคัดกรอง<br/>ถือบัตรประจำตัว + เลขคิว]
PatientWait --> TriageCall[🏥 จุดคัดกรอง<br/>พยาบาลเรียกคิว Q001]
TriageCall --> SearchPatient[ค้นหาผู้ป่วย:<br/>- สแกนบัตรประชาชน<br/>- กรอก HN/ชื่อ<br/>- สแกน QR Code จากเลขคิว]
SearchPatient --> PatientFound{พบข้อมูล<br/>ผู้ป่วย?}
PatientFound -->|ไม่พบ| ErrorNotFound[แสดงข้อผิดพลาด<br/>ยังไม่ได้ลงทะเบียน]
ErrorNotFound --> Registration
PatientFound -->|พบแล้ว| LoadEpisode[โหลด Episode<br/>- VN<br/>- ข้อมูลผู้ป่วย<br/>- สิทธิ์การรักษา]
LoadEpisode --> TriageAssessment[พยาบาลคัดกรอง:<br/>1. ซักประวัติเบื้องต้น<br/>2. วัดสัญญาณชีพ<br/>3. บันทึกอาการสำคัญ<br/>4. ประเมินความเร่งด่วน]
TriageAssessment --> RecordChiefComplaint[บันทึก Chief Complaint<br/>อาการสำคัญที่ผู้ป่วยบอก]
RecordChiefComplaint --> MeasureVitalSigns[วัดสัญญาณชีพ:<br/>- ความดันโลหิต<br/>- ชีพจร<br/>- อุณหภูมิ<br/>- น้ำหนัก/ส่วนสูง<br/>- O2 Saturation]
MeasureVitalSigns --> RecordHistory[บันทึกประวัติ:<br/>- ประวัติการแพ้ยา<br/>- โรคประจำตัว<br/>- ยาที่กินอยู่]
RecordHistory --> AssessPriority[ประเมินระดับความเร่งด่วน:<br/>🔴 Emergency<br/>🟠 Urgent<br/>🟢 Normal]
AssessPriority --> SelectDepartment[จัดสรรห้องตรวจ/แผนก<br/>ตามอาการและความพร้อม:<br/>- ห้องตรวจทั่วไป 1-5<br/>- ห้องตรวจเฉพาะทาง<br/>- ห้องฉุกเฉิน]
SelectDepartment --> CheckDeptAvailable{ห้องตรวจ<br/>ว่างหรือไม่?}
CheckDeptAvailable -->|เต็ม/ไม่ว่าง| ShowAlternative[แสดงห้องอื่นที่ว่าง<br/>หรือรอคิวห้องนั้น]
ShowAlternative --> SelectDepartment
CheckDeptAvailable -->|ว่าง| ConfirmAssignment{ยืนยัน<br/>การจัดสรร?}
ConfirmAssignment -->|ไม่| SelectDepartment
ConfirmAssignment -->|ใช่| AssignDepartment[จัดสรรห้องตรวจ<br/>อัปเดต Episode:<br/>- department_id<br/>- triage_by<br/>- priority<br/>สถานะ: Assigned]
AssignDepartment --> AddToClinicQueue[เพิ่มเข้าคิวห้องตรวจ<br/>ผู้ป่วยปรากฏในคิว<br/>ของห้องตรวจนั้น]
AddToClinicQueue --> NotifyPatient[แจ้งผู้ป่วย:<br/>กรุณาไปห้องตรวจที่กำหนด<br/>พิมพ์ใบนัด/QR Code]
NotifyPatient --> PatientGoClinic[👤 ผู้ป่วยไปห้องตรวจ<br/>รอหน้าห้อง]
PatientGoClinic --> DoctorView[👨⚕️ แพทย์เห็นคิวในห้องตรวจ<br/>- รายชื่อผู้ป่วย<br/>- Priority<br/>- อาการเบื้องต้น]
DoctorView --> DoctorCall[แพทย์เรียกผู้ป่วย]
DoctorCall --> DoctorSearch[ค้นหาผู้ป่วย:<br/>- บัตรประชาชน<br/>- HN<br/>- ชื่อ]
DoctorSearch --> LoadTriageData[โหลดข้อมูลจากจุดคัดกรอง:<br/>✓ อาการสำคัญ<br/>✓ สัญญาณชีพ<br/>✓ ประวัติการแพ้ยา<br/>✓ โรคประจำตัว<br/>✓ Priority]
LoadTriageData --> DoctorExamine[แพทย์ตรวจ:<br/>- ซักประวัติเพิ่มเติม<br/>- ตรวจร่างกาย<br/>- วินิจฉัย]
DoctorExamine --> RecordDiagnosis[บันทึกการวินิจฉัย:<br/>- ICD-10<br/>- การรักษา<br/>- คำแนะนำ]
RecordDiagnosis --> NeedOrder{ต้องการ<br/>สั่ง Order?}
NeedOrder -->|ใช่| CreateOrders[สั่ง Orders:<br/>- LAB<br/>- X-RAY<br/>- Pharmacy<br/>- Refer แผนกอื่น]
CreateOrders --> CompleteVisit
NeedOrder -->|ไม่| CompleteVisit[ปิด Episode<br/>สถานะ: Completed]
CompleteVisit --> End([จบการทำงาน])
style Start fill:#d4edda
style Registration fill:#e7f3ff
style TriageCall fill:#fff3cd
style AssignDepartment fill:#d1ecf1
style DoctorView fill:#f8d7da
style End fill:#f8d7da
คำอธิบาย: Triage-based Workflow
ขั้นตอนหลัก 3 จุด:
1. เวชระเบียน (Registration) - ลงทะเบียนผู้ป่วย - สร้าง VN และ Episode - ไม่ระบุห้องตรวจ (ให้จุดคัดกรองจัดสรร) - ออกเลขคิว - ผู้ป่วยรอที่จุดคัดกรอง
2. จุดคัดกรอง (Triage Point) - จุดสำคัญ - พยาบาลค้นหาผู้ป่วยด้วยบัตรประชาชน - ซักประวัติ + วัดสัญญาณชีพ - จัดสรรห้องตรวจ/แผนกที่เหมาะสม - ผู้ป่วยเข้าคิวห้องตรวจทันที
3. ห้องตรวจ/แพทย์ (Clinic/Doctor) - แพทย์เห็นคิวผู้ป่วยของห้องตรวจตน - ค้นหาผู้ป่วย - โหลดข้อมูลจากจุดคัดกรอง - ตรวจ, วินิจฉัย, สั่ง Order
ข้อดีของระบบนี้: - ✅ ลดภาระเวชระเบียน (ไม่ต้องตัดสินใจว่าส่งห้องไหน) - ✅ พยาบาลมืออาชีพคัดกรองได้แม่นยำ - ✅ กระจายผู้ป่วยเข้าห้องตรวจที่ว่าง - ✅ มีข้อมูลเบื้องต้นก่อนพบแพทย์ - ✅ จัดลำดับความเร่งด่วนได้
3.6 Order Management Flow: การจัดการ Order ที่อาจไม่ระบุแผนก
หมายเหตุ: นี่คือ Flow สำหรับกรณีที่แพทย์สั่ง Order โดยอาจระบุหรือไม่ระบุแผนก
flowchart TD
Start([แพทย์สั่ง Order]) --> CheckDepartment{Order มีการระบุ<br/>แผนกหรือไม่?}
CheckDepartment -->|ระบุแผนกชัดเจน| DirectAssign[ส่งเข้าคิวแผนกนั้นทันที<br/>ตัวอย่าง:<br/>- LAB: CBC<br/>- X-RAY: Chest PA<br/>- Pharmacy: Medication]
DirectAssign --> ToQueue[เข้าคิวแผนกปลายทาง]
ToQueue --> End([จบการทำงาน])
CheckDepartment -->|ไม่ระบุแผนก| CreateUnassigned[สร้าง Order<br/>สถานะ: Unassigned<br/>เช่น ตรวจพิเศษ ส่งปรึกษา]
CreateUnassigned --> CheckAutoRouting{มีกฎ<br/>Auto-routing?}
CheckAutoRouting -->|ใช่| ApplyRules[ประมวลผลกฎอัตโนมัติ:<br/>ตรวจสอบ Keywords<br/>- เลือด ไป LAB<br/>- เอกซเรย์ ไป Radiology<br/>- ยา ไป Pharmacy]
ApplyRules --> MatchFound{พบแผนก<br/>ที่ตรงกฎ?}
MatchFound -->|ใช่| AutoAssign[จัดสรรอัตโนมัติ<br/>แจ้งเตือนแผนกปลายทาง]
AutoAssign --> ToQueue
MatchFound -->|ไม่| ToUnassignedPool
CheckAutoRouting -->|ไม่ใช้| ToUnassignedPool[ส่งเข้า Unassigned Pool<br/>รอ Coordinator จัดสรร]
ToUnassignedPool --> NotifyCoordinator[แจ้งเตือน:<br/>Coordinator<br/>Supervisor]
NotifyCoordinator --> CoordinatorReview[Coordinator รีวิว Order:<br/>- ข้อมูลผู้ป่วย<br/>- รายละเอียด Order<br/>- Priority]
CoordinatorReview --> CoordinatorSelect[Coordinator เลือกแผนก<br/>ที่เหมาะสม]
CoordinatorSelect --> ManualAssign[จัดสรรแผนก<br/>อัปเดต department_id]
ManualAssign --> ToQueue
style Start fill:#d4edda
style End fill:#f8d7da
style DirectAssign fill:#d1ecf1
style AutoAssign fill:#cfe2ff
style ManualAssign fill:#fff3cd
สรุประบบการจัดสรร:
| จุด | วิธีจัดสรร | จัดสรรอะไร |
|---|---|---|
| เวชระเบียน | ไม่จัดสรร | ไม่ระบุห้องตรวจ |
| จุดคัดกรอง | Manual (พยาบาล) | จัดสรรห้องตรวจ/แผนก |
| แพทย์ (Order) | Auto + Manual | จัดสรร Order ไปแผนกปลายทาง |
4. รายการหน้าจอที่ต้องมี (Screen List & UI Flow)
4.1 หน้าจอเวชระเบียน (Registration Module)
4.1.1 หน้าค้นหา/ลงทะเบียนผู้ป่วย (Patient Search & Registration)
วัตถุประสงค์: ค้นหาผู้ป่วยเดิม หรือลงทะเบียนผู้ป่วยใหม่
ฟีเจอร์หลัก: - 🔍 ค้นหาผู้ป่วย (HN, บัตรประชาชน, ชื่อ-นามสกุล, เบอร์โทร) - ➕ ลงทะเบียนผู้ป่วยใหม่ - 📋 แสดงประวัติการมาพบแพทย์ย้อนหลัง - 🎫 ออกเลขคิว
ฟิลด์ที่ต้องมี:
ค้นหา:
- เลข HN
- เลขบัตรประชาชน (13 หลัก)
- ชื่อ-นามสกุล
- เบอร์โทรศัพท์
- วันเดือนปีเกิด
ลงทะเบียนใหม่:
- ข้อมูลส่วนตัว (ชื่อ-นามสกุล, เพศ, วันเกิด)
- ที่อยู่ปัจจุบัน
- เบอร์ติดต่อ
- ข้อมูลผู้ติดต่อฉุกเฉิน
- รูปถ่าย (ถ้ามี)
Actions: - [เปิด Visit ใหม่] → ไปหน้า 4.1.2 - [ดูประวัติ] → ไปหน้า 4.1.3 - [แก้ไขข้อมูล] → แก้ไขข้อมูลส่วนตัว
4.1.2 หน้าเปิด Visit (Create Visit/Episode)
วัตถุประสงค์: สร้าง VN และ Episode สำหรับการมาในวันนี้
ฟีเจอร์หลัก: - ตรวจสอบ VN ในวันนี้ (ถ้ามีแล้ว ใช้เดิม) - เลือกสิทธิ์การรักษา - ตรวจสอบสิทธิ์ออนไลน์ - ออกเลขคิว - พิมพ์บัตรคิว/QR Code
ฟิลด์ที่ต้องมี:
ข้อมูล Visit:
- VN (Auto-generate)
- วันที่
- ข้อมูลผู้ป่วย (แสดงอย่างเดียว)
สิทธิ์การรักษา:
□ UC (บัตรทอง)
□ ประกันสังคม
□ ข้าราชการ/รัฐวิสาหกิจ
□ ประกันสุขภาพ
□ Self-pay (จ่ายเอง)
สถานะสิทธิ์:
- ✓ ตรวจสอบแล้ว (สีเขียว)
- ⚠ ใกล้หมดอายุ (สีเหลือง)
- ✗ หมดอายุ/ไม่ถูกต้อง (สีแดง)
เลขคิว:
- Queue Number: Q001
- เวลาลงทะเบียน: 08:30
Actions: - [ยืนยันเปิด Visit] → สร้าง VN + Episode + ออกเลขคิว - [พิมพ์บัตรคิู] → พิมพ์บัตรคิว/QR Code - [ยกเลิก] → กลับหน้าค้นหา
4.1.3 หน้าประวัติการมา (Visit History)
วัตถุประสงค์: ดูประวัติการมาพบแพทย์ทั้งหมด
ฟีเจอร์หลัก: - แสดงรายการ Visit ย้อนหลัง - กรองตามวันที่/ช่วงเวลา - ดูรายละเอียด Episode แต่ละครั้ง - ดู Orders และผลตรวจ
ข้อมูลที่แสดง:
รายการ Visit (ล่าสุดก่อน):
┌─────────────────────────────────────────────┐
│ 📅 26/01/2025 VN: VN20250126-001 │
│ 🏥 ห้องตรวจทั่วไป 1 │
│ 👨⚕️ นพ.สมชาย ใจดี │
│ 💊 วินิจฉัย: Gastritis │
│ 💳 สิทธิ์: UC │
│ [ดูรายละเอียด] │
├─────────────────────────────────────────────┤
│ 📅 15/01/2025 VN: VN20250115-001 │
│ 🏥 ห้องตรวจเด็ก │
│ ... │
└─────────────────────────────────────────────┘
4.2 หน้าจอจุดคัดกรอง (Triage Module)
4.2.1 หน้าคิวรอคัดกรอง (Triage Queue)
วัตถุประสงค์: แสดงรายการผู้ป่วยที่รอคัดกรอง
ฟีเจอร์หลัก: - แสดงคิวทั้งหมดที่สถานะ "Pending Triage" - เรียงตามเลขคิว/เวลาลงทะเบียน - กรองตามสิทธิ์/ประเภทผู้ป่วย - เรียกคิว/ข้ามคิว (Skip) - แสดงเวลารอคอย
ข้อมูลที่แสดง:
คิวรอคัดกรอง:
┌─────────────────────────────────────────────┐
│ Q001 │ 🟢 Normal │
│ HN: 12345 │ นาย ทดสอบ ระบบ │
│ อายุ: 35 ปี │ 💳 UC │
│ ลงทะเบียน: 08:30 │ รอ: 15 นาที │
│ [เรียก] │
├─────────────────────────────────────────────┤
│ Q002 │ 🟠 Urgent │
│ HN: 67890 │ นางสาว ทดสอบ ระบบ │
│ ... │
└─────────────────────────────────────────────┘
Actions: - [เรียกคิว] → ไปหน้า 4.2.2 - [ข้ามคิว] → คิวถัดไป - [ค้นหา] → ค้นหาผู้ป่วยเฉพาะ
4.2.2 หน้าคัดกรองผู้ป่วย (Triage Assessment)
วัตถุประสงค์: ซักประวัติ วัดสัญญาณชีพ และจัดสรรห้องตรวจ
ฟีเจอร์หลัก: - ค้นหาผู้ป่วยด้วยบัตรประชาชน/HN - บันทึกอาการสำคัญ (Chief Complaint) - วัดและบันทึกสัญญาณชีพ - บันทึกประวัติการแพ้ยา/โรคประจำตัว - ประเมินระดับความเร่งด่วน - จัดสรรห้องตรวจ/แผนก
ฟิลด์ที่ต้องมี:
ข้อมูลผู้ป่วย (แสดงอย่างเดียว):
- HN, ชื่อ-นามสกุล, อายุ, สิทธิ์
- VN, เวลาลงทะเบียน
1. อาการสำคัญ (Chief Complaint):
[Text Area ขนาดใหญ่]
เช่น: "ปวดท้อง มา 2 วัน ท้องเสีย"
2. สัญญาณชีพ (Vital Signs):
- ความดันโลหิต: [___/___] mmHg
- ชีพจร: [___] bpm
- อุณหภูมิ: [___] °C
- อัตราการหายใจ: [___] /min
- O2 Saturation: [___] %
- น้ำหนัก: [___] kg
- ส่วนสูง: [___] cm
- BMI: [___] (Auto-calculate)
3. ประวัติ (History):
□ ประวัติการแพ้ยา: [_________________]
□ โรคประจำตัว: [_________________]
□ ยาที่กินอยู่: [_________________]
□ ประวัติการผ่าตัด: [_________________]
4. ระดับความเร่งด่วน (Priority):
○ 🔴 Emergency (ฉุกเฉิน)
○ 🟠 Urgent (เร่งด่วน)
○ 🟢 Normal (ปกติ)
5. จัดสรรห้องตรวจ:
[Dropdown: เลือกห้องตรวจ]
- ห้องตรวจทั่วไป 1 (ว่าง, คิว: 3 คน)
- ห้องตรวจทั่วไป 2 (ว่าง, คิว: 5 คน)
- ห้องตรวจเด็ก (ไม่ว่าง)
- ห้องตรวจเฉพาะทาง (ว่าง, คิว: 1 คน)
- ห้องฉุกเฉิน (ว่าง)
Actions: - [บันทึกและจัดสรร] → จัดสรรห้องตรวจ + แจ้งผู้ป่วย - [บันทึกร่าง] → บันทึกแต่ยังไม่จัดสรร - [ยกเลิก] → กลับหน้าคิว
4.2.3 หน้าภาพรวมจุดคัดกรอง (Triage Dashboard)
วัตถุประสงค์: ภาพรวมสถานะจุดคัดกรอง
ข้อมูลที่แสดง:
📊 สถิติวันนี้:
- รอคัดกรอง: 12 คน
- คัดกรองแล้ว: 45 คน
- เวลารอเฉลี่ย: 8 นาที
🏥 สถานะห้องตรวจ:
- ห้องตรวจทั่วไป 1: คิว 3 คน ⚪
- ห้องตรวจทั่วไป 2: คิว 5 คน ⚪
- ห้องตรวจเด็ก: ไม่ว่าง 🔴
- ห้องฉุกเฉิน: ว่าง 🟢
4.3 หน้าจอห้องตรวจ/แพทย์ (Clinic/Doctor Module)
4.3.1 หน้าคิวผู้ป่วยห้องตรวจ (Clinic Queue)
วัตถุประสงค์: แสดงคิวผู้ป่วยของห้องตรวจนี้
ฟีเจอร์หลัก: - แสดงคิวผู้ป่วยที่จัดสรรมาให้ห้องนี้ - เรียงตาม Priority + เวลา - แสดงข้อมูลเบื้องต้นจากจุดคัดกรอง - เรียกคิว - ดูประวัติย้อนหลัง
ข้อมูลที่แสดง:
คิวห้องตรวจทั่วไป 1:
┌─────────────────────────────────────────────┐
│ 🟠 Urgent │ HN: 12345 │
│ นาย ทดสอบ ระบบ │ 35 ปี │ 💳 UC │
│ 📝 อาการ: ปวดท้อง มา 2 วัน │
│ 🩺 BP: 120/80 Temp: 37.0°C │
│ ⏰ รอ: 10 นาที │
│ [เรียก] [ดูประวัติ] │
├─────────────────────────────────────────────┤
│ 🟢 Normal │ HN: 67890 │
│ ... │
└─────────────────────────────────────────────┘
Actions: - [เรียก] → ไปหน้า 4.3.2 - [ดูประวัติ] → แสดง popup ประวัติ - [Refresh] → รีเฟรชคิว
4.3.2 หน้าตรวจผู้ป่วย (Patient Examination)
วัตถุประสงค์: ตรวจผู้ป่วย บันทึกการวินิจฉัย และสั่ง Order
ฟีเจอร์หลัก: - ค้นหาผู้ป่วย (บัตรประชาชน/HN) - แสดงข้อมูลจากจุดคัดกรอง - บันทึก History & Physical Examination - บันทึกการวินิจฉัย (ICD-10) - สั่ง Orders (LAB, X-RAY, Pharmacy, Referral) - พิมพ์เอกสาร
Layout หน้าจอ:
┌─────────────────────────────────────────────────────────┐
│ [ค้นหา: HN/บัตรประชาชน] [🔍] │
├─────────────────────────────────────────────────────────┤
│ 👤 ข้อมูลผู้ป่วย │
│ HN: 12345 │ นาย ทดสอบ ระบบ │ 35 ปี │
│ VN: VN20250126-001 │ 💳 UC │
│ 🩺 BP: 120/80 Pulse: 78 Temp: 37.0°C │
│ 📝 CC: ปวดท้อง มา 2 วัน │
│ ⚠️ แพ้ยา: Penicillin │ โรคประจำตัว: - │
├─────────────────────────────────────────────────────────┤
│ [Tab: History] [Tab: Diagnosis] [Tab: Orders] [Tab: Rx]│
├─────────────────────────────────────────────────────────┤
│ History & Physical Examination: │
│ [Text Area ขนาดใหญ่] │
│ │
│ Diagnosis (ICD-10): │
│ [ค้นหา ICD-10] [เพิ่ม] │
│ - K29.7 Gastritis, unspecified [ลบ] │
│ │
│ Orders: │
│ [LAB] [X-RAY] [Pharmacy] [Referral] [อื่นๆ] │
│ │
│ คำแนะนำ/Advice: │
│ [Text Area] │
│ │
│ นัดครั้งต่อไป: [___] [เลือกวันที่] │
├─────────────────────────────────────────────────────────┤
│ [บันทึก] [บันทึกและปิด] [พิมพ์] [ยกเลิก] │
└─────────────────────────────────────────────────────────┘
Tab Orders - สั่ง Orders:
┌─────────────────────────────────────────────┐
│ Orders (รถเข็น): │
│ │
│ LAB: │
│ ✓ CBC (Complete Blood Count) │
│ ✓ Blood Sugar │
│ │
│ X-RAY: │
│ ✓ Chest PA │
│ │
│ Pharmacy: │
│ ✓ Antacid Syrup 30ml #1 │
│ ✓ Paracetamol 500mg #10 │
│ │
│ 📋 จำนวน: 5 รายการ │
│ 💰 ประมาณการ: 850 บาท │
│ 💳 สิทธิ์คุ้มครอง: 100% │
│ │
│ [สั่ง Orders ทั้งหมด] │
└─────────────────────────────────────────────┘
Actions: - [บันทึก] → บันทึกข้อมูล - [บันทึกและปิด] → บันทึก + ปิด Episode + กลับหน้าคิว - [สั่ง Orders] → สร้าง Orders ส่งไปแผนกต่างๆ - [พิมพ์] → พิมพ์ใบนัด/ใบรับรองแพทย์
4.4 หน้าจอแผนกต่างๆ (Department Module)
4.4.1 หน้าคิว Orders แผนก LAB/X-RAY/Pharmacy
วัตถุประสงค์: แสดง Orders ที่ส่งมาให้แผนก
ฟีเจอร์หลัก: - แสดงคิว Orders ของแผนก - กรองตาม Priority/Status - เรียก Order - บันทึกผลตรวจ - ส่งต่อแผนกอื่น (ถ้าจำเป็น)
ข้อมูลที่แสดง:
คิว LAB:
┌─────────────────────────────────────────────┐
│ 🟠 Urgent │ Order: LAB-001 │
│ HN: 12345 │ นาย ทดสอบ ระบบ │
│ VN: VN20250126-001 │
│ รายการ: │
│ - CBC (Complete Blood Count) │
│ - Blood Sugar │
│ 👨⚕️ สั่งโดย: นพ.สมชาย ใจดี │
│ ⏰ สั่งเมื่อ: 09:15 │ รอ: 5 นาที │
│ [รับงาน] [ดูรายละเอียด] │
├─────────────────────────────────────────────┤
│ 🟢 Normal │ Order: LAB-002 │
│ ... │
└─────────────────────────────────────────────┘
Actions: - [รับงาน] → เปลี่ยนสถานะเป็น "In Progress" - [บันทึกผล] → บันทึกผลตรวจ - [ส่งต่อ] → ส่งต่อแผนกอื่น - [เสร็จสิ้น] → ปิด Order
4.4.2 หน้าบันทึกผลตรวจ (Result Entry)
วัตถุประสงค์: บันทึกผลการตรวจ/การให้บริการ
ฟิลด์ตามประเภทแผนก:
LAB:
CBC Results:
- WBC: [_____] cells/μL
- RBC: [_____] cells/μL
- Hb: [_____] g/dL
- Hct: [_____] %
- MCV: [_____] fL
- Platelet: [_____] /μL
[แนบไฟล์ผล] [บันทึก]
X-RAY:
Imaging Results:
ประเภท: Chest PA
พบ/สรุปผล:
[Text Area]
รูปภาพ:
[Upload Images]
[บันทึก]
Pharmacy:
Dispensing:
✓ Antacid Syrup 30ml #1 (จ่ายแล้ว)
✓ Paracetamol 500mg #10 (จ่ายแล้ว)
คำแนะนำการใช้ยา:
[Text Area]
[จ่ายยาและปิด]
4.5 หน้าจอ Central/Admin
4.5.1 Dashboard ภาพรวม (Main Dashboard)
วัตถุประสงค์: ภาพรวมระบบทั้งหมด
ข้อมูลที่แสดง:
📊 สถิติวันนี้ (26/01/2025):
┌─────────────────────────────────────────────┐
│ 👥 ผู้ป่วยทั้งหมด: 156 คน │
│ 📋 VN ทั้งหมด: 156 VN │
│ 📑 Episodes ทั้งหมด: 168 Episodes │
│ (ผู้ป่วยบางคนมามากกว่า 1 ครั้ง) │
├─────────────────────────────────────────────┤
│ 🏥 สถานะห้องตรวจ: │
│ ห้องตรวจทั่วไป 1: ว่าง (คิว 3) │
│ ห้องตรวจทั่วไป 2: ไม่ว่าง (คิว 8) │
│ ห้องตรวจเด็ก: ว่าง (คิว 2) │
│ ห้องฉุกเฉิน: ว่าง (คิว 0) │
├─────────────────────────────────────────────┤
│ 📦 Orders: │
│ LAB: รอ 5, กำลังทำ 3, เสร็จแล้ว 45 │
│ X-RAY: รอ 2, กำลังทำ 1, เสร็จแล้ว 23 │
│ Pharmacy: รอ 8, กำลังทำ 5, เสร็จแล้ว 67 │
├─────────────────────────────────────────────┤
│ ⚠️ แจ้งเตือน: │
│ - มี Order 2 รายการรอจัดสรรแผนก │
│ - ห้องตรวจทั่วไป 2 คิวยาวเกิน 30 นาที │
└─────────────────────────────────────────────┘
4.5.2 หน้า Visit Monitoring (ติดตามสถานะ Visit)
วัตถุประสงค์: ติดตามสถานะ Visit/Episode แบบ Real-time
ฟีเจอร์หลัก: - แสดงทุก Visit ในวันนี้ - กรองตามสถานะ/แผนก/สิทธิ์ - ค้นหา Visit เฉพาะ - Timeline ของแต่ละ Visit
ข้อมูลที่แสดง:
┌─────────────────────────────────────────────────────────┐
│ VN: VN20250126-001 │ HN: 12345 │ นาย ทดสอบ ระบบ │
├─────────────────────────────────────────────────────────┤
│ Timeline: │
│ 08:30 ✓ ลงทะเบียน (เวชระเบียน) │
│ 08:45 ✓ คัดกรอง (พยาบาล สมหญิง) │
│ → จัดสรร: ห้องตรวจทั่วไป 1 │
│ 09:00 ✓ พบแพทย์ (นพ.สมชาย ใจดี) │
│ 📋 Diagnosis: Gastritis │
│ 09:15 ⏳ รอผล LAB (Order: LAB-001) │
│ 09:20 ⏳ รอจ่ายยา (Order: PHR-001) │
│ │
│ สถานะปัจจุบัน: รอผลตรวจและรอจ่ายยา │
└─────────────────────────────────────────────────────────┘
4.5.3 หน้าจัดการ Unassigned Orders (ถ้าใช้ Manual Assignment)
วัตถุประสงค์: จัดสรรแผนกให้ Order ที่ยังไม่ได้ระบุแผนก
ฟีเจอร์หลัก: - แสดง Orders ที่ status "Unassigned" - รีวิวรายละเอียด Order - เลือกแผนกที่เหมาะสม - จัดสรร
ข้อมูลที่แสดง:
Unassigned Orders:
┌─────────────────────────────────────────────┐
│ Order: ORD-001 │ รอจัดสรร 15 นาที │
│ HN: 12345 │ นาย ทดสอบ ระบบ │
│ รายละเอียด: "ตรวจพิเศษ ตรวจสมรรถภาพปอด" │
│ สั่งโดย: นพ.สมชาย ใจดี │
│ │
│ จัดสรรไปแผนก: │
│ [Dropdown: เลือกแผนก] │
│ [จัดสรร] │
└─────────────────────────────────────────────┘
4.6 สรุปหน้าจอทั้งหมด
| โมดูล | หน้าจอ | ผู้ใช้ | วัตถุประสงค์ |
|---|---|---|---|
| Registration | Patient Search & Registration | เวชระเบียน | ค้นหา/ลงทะเบียนผู้ป่วย |
| Create Visit/Episode | เวชระเบียน | เปิด Visit + ออกเลขคิว | |
| Visit History | เวชระเบียน | ดูประวัติการมา | |
| Triage | Triage Queue | พยาบาลคัดกรอง | คิวรอคัดกรอง |
| Triage Assessment | พยาบาลคัดกรอง | คัดกรอง + จัดสรรห้องตรวจ | |
| Triage Dashboard | หัวหน้าพยาบาล | ภาพรวมจุดคัดกรอง | |
| Clinic/Doctor | Clinic Queue | แพทย์/พยาบาล | คิวผู้ป่วยห้องตรวจ |
| Patient Examination | แพทย์ | ตรวจผู้ป่วย + สั่ง Orders | |
| Department | Department Queue | เจ้าหน้าที่แผนก | คิู Orders ของแผนก |
| Result Entry | เจ้าหน้าที่แผนก | บันทึกผลตรวจ | |
| Admin/Central | Main Dashboard | Admin/ผู้บริหาร | ภาพรวมระบบ |
| Visit Monitoring | Coordinator | ติดตามสถานะ Visit | |
| Unassigned Orders | Coordinator | จัดสรรแผนกให้ Order |
4.7 การเชื่อมโยงระหว่างหน้าจอ (Screen Flow)
เวชระเบียน:
Patient Search → Create Visit → [พิมพ์บัตรคิว]
↓
จุดคัดกรอง:
Triage Queue → Triage Assessment → [จัดสรรห้องตรวจ]
↓
ห้องตรวจ:
Clinic Queue → Patient Examination → [สั่ง Orders]
↓
┌──────────┴──────────┐
↓ ↓
แผนก LAB: แผนก Pharmacy:
LAB Queue Pharmacy Queue
↓ ↓
Result Entry Dispensing
↓ ↓
[เสร็จสิ้น] [เสร็จสิ้น]
5. Sequence Diagrams (แผนภาพลำดับการทำงาน)
5.1 Sequence: ผู้ป่วยมาครั้งแรก (First Visit - Full Flow)
sequenceDiagram
participant P as 👤 ผู้ป่วย
participant R as 💼 เวชระเบียน
participant DB as 🗄️ Database
participant T as 🩺 จุดคัดกรอง
participant D as 👨⚕️ แพทย์
participant L as 🔬 LAB
participant PH as 💊 Pharmacy
Note over P,PH: กรณี: ผู้ป่วยมาครั้งแรกในวันนี้
P->>R: มาถึงโรงพยาบาล + ยื่นบัตรประชาชน
R->>DB: ค้นหาผู้ป่วย (เลขบัตรประชาชน)
alt ผู้ป่วยใหม่ (ไม่มี HN)
R->>DB: สร้าง HN ใหม่
DB-->>R: HN: 12345
else ผู้ป่วยเดิม
DB-->>R: HN: 12345 (มีแล้ว)
end
R->>DB: ตรวจสอบ VN วันนี้ (HN + Date)
DB-->>R: ไม่มี VN วันนี้
R->>R: เลือกสิทธิ์ (UC/ประกันสังคม/Self-pay)
R->>DB: ตรวจสอบสิทธิ์ออนไลน์
DB-->>R: ✓ สิทธิ์ถูกต้อง
R->>DB: สร้าง VN ใหม่<br/>VN = HN + Date<br/>Status: Active
DB-->>R: VN20250126-001
R->>DB: สร้าง Episode<br/>Episode #1<br/>Status: Pending Triage<br/>Department: null
DB-->>R: Episode ID: EP-001
R->>R: สร้างเลขคิว Q001
R->>P: ออกบัตรคิู Q001 + QR Code
Note over P: ผู้ป่วยรอที่จุดคัดกรอง
T->>T: เรียกคิว Q001
P->>T: มายื่นบัตรประชาชน
T->>DB: ค้นหาด้วยบัตรประชาชน/QR Code
DB-->>T: โหลดข้อมูล:<br/>HN, VN, Episode, สิทธิ์
T->>T: ซักประวัติเบื้องต้น
P-->>T: อาการ: "ปวดท้อง มา 2 วัน"
T->>T: วัดสัญญาณชีพ
T->>DB: บันทึก:<br/>- Chief Complaint<br/>- Vital Signs<br/>- Allergy: Penicillin<br/>- Priority: Normal
T->>T: ประเมินและเลือกห้องตรวจ<br/>"ห้องตรวจทั่วไป 1"
T->>DB: อัปเดต Episode:<br/>department_id = "Clinic-001"<br/>status = "Assigned"<br/>triage_by = "Nurse-001"
DB-->>T: ✓ อัปเดตสำเร็จ
T->>P: "กรุณาไปห้องตรวจทั่วไป 1"
Note over P: ผู้ป่วยไปรอหน้าห้องตรวจ
D->>DB: เปิดดูคิวห้องตรวจทั่วไป 1
DB-->>D: แสดงรายการผู้ป่วย:<br/>HN 12345, Q001, Priority: Normal
D->>D: เรียกผู้ป่วย
P->>D: เข้าห้องตรวจ
D->>DB: ค้นหาผู้ป่วย (HN/บัตรประชาชน)
DB-->>D: โหลดข้อมูล:<br/>- ข้อมูลพื้นฐาน<br/>- CC: ปวดท้อง<br/>- Vital Signs<br/>- Allergy: Penicillin
D->>D: ซักประวัติเพิ่มเติม + ตรวจร่างกาย
D->>DB: บันทึก:<br/>- History<br/>- Physical Exam<br/>- Diagnosis: K29.7 Gastritis
D->>D: สั่ง Orders
D->>DB: สร้าง Order #1:<br/>Type: LAB<br/>Items: CBC, Blood Sugar<br/>Status: Pending
DB-->>D: Order: LAB-001
D->>DB: สร้าง Order #2:<br/>Type: Pharmacy<br/>Items: Antacid, Paracetamol<br/>Status: Pending
DB-->>D: Order: PHR-001
DB->>L: แจ้งเตือน: มี Order ใหม่ LAB-001
DB->>PH: แจ้งเตือน: มี Order ใหม่ PHR-001
D->>P: "ไปตรวจเลือดที่ LAB แล้วรับยาที่ร้านยา"
Note over P: ผู้ป่วยไป LAB
L->>DB: ดูคิว LAB
DB-->>L: แสดง Order LAB-001
L->>L: เรียกผู้ป่วย HN 12345
P->>L: เข้ามาเจาะเลือด
L->>DB: อัปเดต Order LAB-001:<br/>Status = In Progress
L->>L: เจาะเลือด + ตรวจ
L->>DB: บันทึกผลตรวจ + อัปเดต:<br/>Status = Completed
L->>P: "เสร็จแล้ว ไปรับยาได้"
Note over P: ผู้ป่วยไป Pharmacy
PH->>DB: ดูคิว Pharmacy
DB-->>PH: แสดง Order PHR-001
PH->>PH: เรียกผู้ป่วย HN 12345
P->>PH: มารับยา
PH->>DB: อัปเดต Order PHR-001:<br/>Status = In Progress
PH->>PH: จ่ายยา + แนะนำวิธีใช้
PH->>DB: อัปเดต Order PHR-001:<br/>Status = Completed
PH->>P: ส่งยา + ใบนัด
Note over P,PH: ✅ Visit เสร็จสมบูรณ์
5.2 Sequence: ผู้ป่วยมาครั้งที่สอง ในวันเดียวกัน - อาการใหม่
sequenceDiagram
participant P as 👤 ผู้ป่วย
participant R as 💼 เวชระเบียน
participant DB as 🗄️ Database
participant T as 🩺 จุดคัดกรอง
participant D as 👨⚕️ แพทย์
Note over P,D: กรณี: ผู้ป่วยมาอีกครั้ง ตอนบ่าย อาการใหม่
P->>R: มาถึงโรงพยาบาลอีกครั้ง (14:00)
R->>DB: ค้นหาผู้ป่วย (HN: 12345)
DB-->>R: พบ HN: 12345
R->>DB: ตรวจสอบ VN วันนี้
DB-->>R: ✓ มี VN20250126-001 แล้ว<br/>Episode #1: Completed (เช้า)
R->>R: แจ้งเตือน: "ผู้ป่วยมี VN วันนี้แล้ว"
R->>R: ถาม: "อาการเดิมหรืออาการใหม่?"
Note over R: เจ้าหน้าที่ถามผู้ป่วย
P-->>R: "อาการใหม่ - ปวดหัว"
R->>R: ตัดสินใจ: สร้าง Episode ใหม่
alt ใช้สิทธิ์เดิม
R->>R: ใช้สิทธิ์ UC เดิม
else เปลี่ยนสิทธิ์
R->>R: เลือกสิทธิ์ใหม่: Self-pay
R->>DB: ตรวจสอบสิทธิ์
end
R->>DB: สร้าง Episode #2<br/>VN: VN20250126-001 (เดิม)<br/>Insurance: Self-pay<br/>Status: Pending Triage
DB-->>R: Episode ID: EP-002
R->>R: สร้างเลขคิู Q025
R->>P: ออกบัตรคิว Q025
Note over P: ผู้ป่วยรอที่จุดคัดกรอง
T->>T: เรียกคิว Q025
P->>T: มายื่นบัตร
T->>DB: ค้นหา HN 12345
DB-->>T: โหลดข้อมูล:<br/>VN: VN20250126-001<br/>Episode #2 (ใหม่)<br/>Episode #1 (เช้า - เสร็จแล้ว)
Note over T: พยาบาลเห็นประวัติเช้า
T->>T: "คุณมาเช้าด้วยใช่ไหม?"
P-->>T: "ใช่ แต่ตอนนี้ปวดหัวมาก"
T->>T: ซักประวัติ + วัดสัญญาณชีพ
T->>DB: บันทึก Episode #2:<br/>CC: ปวดหัวรุนแรง<br/>Vital Signs<br/>Priority: Urgent
T->>T: จัดสรรห้องตรวจเฉพาะทาง
T->>DB: อัปเดต Episode #2:<br/>department_id = "Specialist-001"<br/>status = "Assigned"
T->>P: "ไปห้องตรวจเฉพาะทาง"
Note over P,D: ดำเนินการตรวจรักษาต่อ...
Note over P,D: ✅ ผลลัพธ์:<br/>VN เดียวกัน แต่ 2 Episodes<br/>แยกสิทธิ์ และค่าใช้จ่าย
5.3 Sequence: การส่งต่อระหว่างแผนก (Department Referral)
sequenceDiagram
participant P as 👤 ผู้ป่วย
participant L as 🔬 LAB
participant DB as 🗄️ Database
participant X as 📷 X-RAY
participant D as 👨⚕️ แพทย์
Note over P,D: กรณี: LAB พบความผิดปกติ ต้องส่งต่อ X-RAY
P->>L: มาตรวจ LAB (Order: LAB-001)
L->>DB: ดู Order LAB-001
DB-->>L: โหลดข้อมูล Order
L->>L: ตรวจเลือด
L->>DB: บันทึกผลตรวจ:<br/>CBC: พบความผิดปกติ
L->>L: ตัดสินใจ: ต้องการส่งต่อ X-RAY
L->>L: เลือก: ส่งต่อไป "X-RAY"
L->>L: ระบุเหตุผล: "พบความผิดปกติ<br/>ขอ X-Ray Chest PA"
L->>L: เลือก Priority: Urgent
L->>DB: สร้าง Order ใหม่:<br/>Order: XRAY-005<br/>Type: X-RAY<br/>VN: VN20250126-001<br/>Episode: EP-001 (เดิม)<br/>referred_from_order: LAB-001<br/>referred_from_dept: LAB<br/>referral_reason: "พบความผิดปกติ"<br/>Priority: Urgent<br/>Status: Pending
DB-->>L: ✓ Order XRAY-005 สร้างสำเร็จ
L->>DB: อัปเดต Order LAB-001:<br/>Status = Completed<br/>referred_to_orders = [XRAY-005]
DB->>X: 📱 แจ้งเตือน:<br/>มี Order ใหม่ XRAY-005 (Referral)<br/>Priority: Urgent
L->>P: "พบความผิดปกติ<br/>กรุณาไปตรวจเอกซเรย์ที่แผนก X-RAY"
L->>P: พิมพ์ใบส่งต่อ
Note over P: ผู้ป่วยไป X-RAY
X->>DB: ดูคิู X-RAY
DB-->>X: แสดง Order XRAY-005:<br/>🔄 Referral from LAB<br/>Priority: Urgent<br/>📜 History: LAB → [X-RAY]
X->>X: เห็นว่าเป็น Referral<br/>เรียกคิวก่อน (Priority: Urgent)
X->>P: เรียกผู้ป่วย HN 12345
P->>X: มาตรวจเอกซเรย์
X->>DB: อัปเดต Order XRAY-005:<br/>Status = In Progress
X->>X: ถ่ายเอกซเรย์ + อ่านผล
X->>DB: บันทึกผล + รูปภาพ
X->>DB: อัปเดต Order XRAY-005:<br/>Status = Completed
X->>X: ตัดสินใจ: พบปัญหา<br/>ต้องส่งกลับแพทย์
X->>DB: อัปเดต Referral Chain:<br/>LAB → X-RAY → [กลับแพทย์]<br/>แจ้งแพทย์ให้ดูผล
DB->>D: 📱 แจ้งเตือน:<br/>ผลตรวจ X-RAY พร้อมแล้ว<br/>HN 12345
X->>P: "เสร็จแล้ว<br/>กรุณากลับไปพบแพทย์"
Note over P,D: ✅ การส่งต่อสำเร็จ<br/>Order ใหม่ + เข้าคิว + มี Referral Chain
5.4 Sequence: การใช้หลายสิทธิ์ในวันเดียวกัน
sequenceDiagram
participant P as 👤 ผู้ป่วย
participant R as 💼 เวชระเบียน
participant DB as 🗄️ Database
participant D as 👨⚕️ แพทย์
participant Billing as 💰 การเงิน
Note over P,Billing: กรณี: ใช้ 2 สิทธิ์ใน 1 วัน
rect rgb(220, 240, 255)
Note over P,DB: Episode #1 - เช้า (สิทธิ์ UC)
P->>R: มาตอนเช้า (09:00)
R->>DB: สร้าง VN20250126-001<br/>Episode #1<br/>Insurance: UC
R->>P: เลขคิว Q001
Note over P,D: ดำเนินการตรวจรักษา...
D->>DB: สั่ง Orders (Episode #1):<br/>- LAB: CBC<br/>- Pharmacy: Antacid<br/>Insurance: UC
DB->>Billing: คำนวณค่าใช้จ่าย:<br/>Episode #1<br/>สิทธิ์ UC คุ้มครอง 100%<br/>ผู้ป่วยจ่าย: 0 บาท
Note over P: Episode #1 เสร็จสมบูรณ์
end
rect rgb(255, 240, 220)
Note over P,DB: Episode #2 - บ่าย (สิทธิ์ Self-pay)
P->>R: มาอีกครั้ง (14:00)<br/>ต้องการตรวจสุขภาพประจำปี
R->>DB: ค้นหา VN วันนี้
DB-->>R: มี VN20250126-001 แล้ว
R->>R: ถามผู้ป่วย
P-->>R: "ต้องการตรวจสุขภาพประจำปี<br/>ไม่ใช้สิทธิ์ UC (ไม่คุ้มครอง)<br/>จะจ่ายเงินเอง"
R->>DB: สร้าง Episode #2<br/>VN: VN20250126-001 (เดิม)<br/>Insurance: Self-pay<br/>Reason: Health Check-up
DB-->>R: Episode ID: EP-002
R->>P: เลขคิว Q030
Note over P,D: ดำเนินการตรวจสุขภาพ...
D->>DB: สั่ง Orders (Episode #2):<br/>- LAB: Lipid Profile, Blood Sugar<br/>- X-RAY: Chest PA<br/>Insurance: Self-pay
DB->>Billing: คำนวณค่าใช้จ่าย:<br/>Episode #2<br/>สิทธิ์ Self-pay<br/>ผู้ป่วยจ่าย: 1,500 บาท
Note over P: Episode #2 เสร็จสมบูรณ์
end
Note over P,Billing: สรุปค่าใช้จ่าย VN20250126-001
Billing->>DB: คำนวณค่าใช้จ่ายรวม
DB-->>Billing: Episode #1 (UC): 0 บาท<br/>Episode #2 (Self-pay): 1,500 บาท<br/>รวมทั้งสิ้น: 1,500 บาท
Billing->>P: แจ้งยอดชำระ: 1,500 บาท<br/>(เฉพาะ Episode #2)
P->>Billing: ชำระเงิน
Note over P,Billing: ✅ Visit เสร็จสมบูรณ์<br/>1 VN, 2 Episodes, 2 สิทธิ์
6. สรุปและข้อแนะนำ
6.1 Key Points (จุดสำคัญ)
📌 VN (Visit Number)
- 1 คน 1 วัน = 1 VN
- VN = HN + วันที่
- ไม่ว่าจะมากี่ครั้งในวันนั้น VN ต้องเป็นเลขเดียวกัน
📌 Episode/Encounter
- 1 Visit สามารถมีหลาย Episodes ได้
- Episode ใหม่เมื่อ:
- อาการใหม่/สาเหตุใหม่
- เปลี่ยนสิทธิ์การรักษา
- Episode เดิมเมื่อ:
- Follow-up อาการเดิม
- เพิ่ม Order ในการรักษาเดียวกัน
📌 Triage-based Assignment
- เวชระเบียน: ลงทะเบียน ไม่ระบุห้องตรวจ
- จุดคัดกรอง: ซักประวัติ + วัดสัญญาณชีพ + จัดสรรห้องตรวจ
- แพทย์: ค้นหาผู้ป่วย → โหลดข้อมูลจากคัดกรอง → ตรวจ
📌 Order Management
- Order ที่ระบุแผนก → ส่งเข้าคิวทันที
- Order ที่ไม่ระบุแผนก → Auto-routing หรือ Manual assignment
- การส่งต่อ = สร้าง Order ใหม่ + เข้าคิว + บันทึก Referral Chain
📌 Multiple Insurance
- 1 Episode = 1 สิทธิ์
- ต้องการใช้สิทธิ์ต่างกัน = สร้าง Episode ใหม่
- แยกคำนวณค่าใช้จ่ายตาม Episode/สิทธิ์
6.2 ข้อแนะนำการพัฒนา
🔧 Phase 1: Core System
- ระบบ VN และ Episode Management
- สร้าง/ค้นหา VN
- สร้าง Episode (รองรับหลาย Episodes)
-
จัดการสิทธิ์
-
ระบบจุดคัดกรอง (Triage)
- คิวรอคัดกรอง
- บันทึกข้อมูลคัดกรอง
-
จัดสรรห้องตรวจ (ฟีเจอร์หลัก)
-
ระบบห้องตรวจ/แพทย์
- คิวผู้ป่วย
- บันทึกการตรวจ
- สั่ง Orders
🔧 Phase 2: Order System
- ระบบ Order Management
- สร้าง Order
- Auto-routing (ถ้าใช้)
-
Queue Management ตามแผนก
-
ระบบแผนกต่างๆ
- LAB, X-RAY, Pharmacy
- บันทึกผลตรวจ
- การส่งต่อระหว่างแผนก
🔧 Phase 3: Advanced Features
- Dashboard และ Monitoring
- Real-time monitoring
- สถิติและรายงาน
-
แจ้งเตือน
-
Integration
- ระบบตรวจสอบสิทธิ์ออนไลน์
- ระบบการเงิน
- ระบบ Billing
6.3 Database Schema (ตัวอย่างโครงสร้างหลัก)
-- Visit Number
CREATE TABLE visits (
vn VARCHAR(50) PRIMARY KEY,
hn VARCHAR(20) NOT NULL,
visit_date DATE NOT NULL,
created_at TIMESTAMP,
status VARCHAR(20), -- 'active', 'closed'
UNIQUE(hn, visit_date)
);
-- Episode/Encounter
CREATE TABLE episodes (
episode_id VARCHAR(50) PRIMARY KEY,
vn VARCHAR(50) NOT NULL,
episode_number INT,
insurance_type VARCHAR(50),
insurance_id VARCHAR(100),
department_id VARCHAR(50),
status VARCHAR(20), -- 'pending_triage', 'assigned', 'in_progress', 'completed'
chief_complaint TEXT,
triage_by VARCHAR(50),
triage_at TIMESTAMP,
created_at TIMESTAMP,
FOREIGN KEY (vn) REFERENCES visits(vn)
);
-- Orders
CREATE TABLE orders (
order_id VARCHAR(50) PRIMARY KEY,
vn VARCHAR(50) NOT NULL,
episode_id VARCHAR(50) NOT NULL,
order_type VARCHAR(50), -- 'LAB', 'XRAY', 'PHARMACY', etc.
department_id VARCHAR(50),
status VARCHAR(20), -- 'pending', 'in_progress', 'completed'
priority VARCHAR(20), -- 'normal', 'urgent', 'emergency'
referred_from_order VARCHAR(50), -- for referrals
referred_from_dept VARCHAR(50),
referral_reason TEXT,
created_by VARCHAR(50),
created_at TIMESTAMP,
FOREIGN KEY (vn) REFERENCES visits(vn),
FOREIGN KEY (episode_id) REFERENCES episodes(episode_id)
);
-- Vital Signs (from Triage)
CREATE TABLE vital_signs (
id INT PRIMARY KEY AUTO_INCREMENT,
episode_id VARCHAR(50),
blood_pressure VARCHAR(20),
pulse INT,
temperature DECIMAL(4,1),
respiratory_rate INT,
o2_saturation INT,
weight DECIMAL(5,2),
height DECIMAL(5,2),
bmi DECIMAL(4,2),
recorded_by VARCHAR(50),
recorded_at TIMESTAMP,
FOREIGN KEY (episode_id) REFERENCES episodes(episode_id)
);
6.4 Technology Stack แนะนำ
Backend
- API: Node.js + Express / Python + FastAPI / .NET Core
- Database: PostgreSQL / MySQL
- Cache: Redis (สำหรับ real-time queue)
- Message Queue: RabbitMQ / Kafka (สำหรับ notifications)
Frontend
- Web: React / Vue.js / Angular
- Mobile: React Native / Flutter
- UI Components: Material-UI / Ant Design
Infrastructure
- Container: Docker
- Orchestration: Kubernetes (ถ้าขนาดใหญ่)
- Monitoring: Prometheus + Grafana
6.5 Security Considerations
- Authentication & Authorization
- Multi-factor Authentication
- Role-based Access Control (RBAC)
-
Session Management
-
Data Privacy
- Encryption at rest และ in transit
- Audit Log ทุกการเข้าถึงข้อมูลผู้ป่วย
-
PDPA Compliance
-
API Security
- JWT Tokens
- Rate Limiting
- Input Validation
7. สรุปท้ายเอกสาร
เอกสารนี้ครอบคลุม:
✅ 6 กรณีการใช้งานหลัก - ครอบคลุมทุกสถานการณ์ ✅ 16 Business Rules - กฎการทำงานที่ชัดเจน ✅ 6 Flow Diagrams - แสดงการทำงานแบบภาพรวม ✅ 13 หน้าจอ - ครอบคลุมทุกโมดูล ✅ 4 Sequence Diagrams - แสดงการทำงานแบบละเอียด
จุดเด่นของระบบ: - 🎯 Triage-based: จัดสรรห้องตรวจอัจฉริยะ - 🔄 Flexible: รองรับหลาย Episodes และหลายสิทธิ์ - 📊 Queue System: การจัดการคิวที่มีประสิทธิภาพ - 🔗 Referral Chain: ติดตามการส่งต่อได้ครบถ้วน - 💰 Billing Ready: แยกค่าใช้จ่ายตามสิทธิ์
แนะนำสำหรับการพัฒนาต่อ: 1. ทำ Prototype ระบบจุดคัดกรองก่อน (จุดสำคัญ) 2. ทำระบบ VN และ Episode Management 3. ทำระบบห้องตรวจและ Order 4. ทำระบบแผนกต่างๆ 5. ทำ Dashboard และ Monitoring
เอกสารนี้สร้างเมื่อ: 26 ธันวาคม 2568
Version: 1.0
สถานะ: ✅ เสร็จสมบูรณ์
flowchart TD
Start([เริ่มต้น: สร้าง Order]) --> CheckDepartment{มีการระบุ<br/>แผนกหรือไม่?}
CheckDepartment -->|ระบุแผนกชัดเจน| DirectAssign[ส่งเข้าคิวแผนกนั้นทันที<br/>สถานะ: Assigned]
DirectAssign --> ToQueue[เข้าคิวแผนกปลายทาง]
ToQueue --> End([จบการทำงาน])
CheckDepartment -->|ไม่ระบุแผนก| CreateUnassigned[สร้าง Order<br/>สถานะ: Unassigned]
CreateUnassigned --> CheckAutoRouting{มีกฎ<br/>Auto-routing?}
CheckAutoRouting -->|ใช่| ApplyRules[ประมวลผลกฎ:<br/>ตรวจสอบประเภท Order<br/>Keywords, Order Type]
ApplyRules --> MatchFound{พบแผนก<br/>ที่ตรงกฎ?}
MatchFound -->|ใช่| AutoAssign[จัดสรรอัตโนมัติ<br/>สถานะ: Auto-assigned]
AutoAssign --> NotifyAutoAssign[แจ้งเตือน:<br/>- แผนกปลายทาง<br/>- เวชระเบียน]
NotifyAutoAssign --> ToQueue
MatchFound -->|ไม่| ToUnassignedPool
CheckAutoRouting -->|ไม่ใช้| ToUnassignedPool[ส่งเข้า Unassigned Pool<br/>สถานะ: Pending Assignment]
ToUnassignedPool --> NotifyCoordinator[แจ้งเตือน Coordinator<br/>มี Order รอจัดสรร]
NotifyCoordinator --> SelectAssignmentMethod{เลือกวิธี<br/>จัดสรร}
SelectAssignmentMethod -->|Manual| ManualFlow[Coordinator จัดสรรเอง]
SelectAssignmentMethod -->|Department Claim| ClaimFlow[แผนกเลือกรับงานเอง]
SelectAssignmentMethod -->|Wait & Reassign| WaitFlow[รอจนกว่าจะมีผู้จัดสรร]
ManualFlow --> CoordinatorView[Coordinator เปิดดู<br/>Unassigned Pool]
CoordinatorView --> ReviewOrder[รีวิว Order:<br/>- ข้อมูลผู้ป่วย<br/>- รายละเอียด Order<br/>- Priority]
ReviewOrder --> SelectDept[เลือกแผนกที่เหมาะสม<br/>จากรายการแผนก]
SelectDept --> ConfirmAssign{ยืนยัน<br/>การจัดสรร?}
ConfirmAssign -->|ไม่| ReviewOrder
ConfirmAssign -->|ใช่| ManualAssign[จัดสรรแผนก<br/>สถานะ: Assigned]
ManualAssign --> NotifyAssignment[แจ้งเตือน:<br/>- แผนกปลายทาง<br/>- เวชระเบียน]
NotifyAssignment --> UpdateOrderDept[อัปเดต department_id<br/>ของ Order]
UpdateOrderDept --> ToQueue
ClaimFlow --> ShowClaimPool[แสดง Claimable Orders<br/>ในหน้าจอแผนกต่างๆ]
ShowClaimPool --> DeptReview[แผนกรีวิว Order:<br/>- ข้อมูลผู้ป่วย<br/>- รายละเอียด Order]
DeptReview --> DeptClaim{แผนกต้องการ<br/>รับงาน?}
DeptClaim -->|ไม่| ShowClaimPool
DeptClaim -->|ใช่| CheckAlreadyClaimed{Order ถูก<br/>Claim แล้ว?}
CheckAlreadyClaimed -->|ใช่| ShowError[แสดงข้อผิดพลาด:<br/>Order ถูกรับไปแล้ว]
ShowError --> ShowClaimPool
CheckAlreadyClaimed -->|ไม่| ClaimOrder[Claim Order<br/>สถานะ: Assigned<br/>จัดสรรให้แผนกนี้]
ClaimOrder --> NotifyClaimSuccess[แจ้งเตือน:<br/>- แผนกที่ Claim<br/>- เวชระเบียน<br/>- Coordinator]
NotifyClaimSuccess --> ToQueue
WaitFlow --> SetReminder[ตั้งเตือน:<br/>ถ้าไม่มีผู้จัดสรร<br/>ภายใน X นาที]
SetReminder --> WaitOrEscalate{มีการ<br/>จัดสรรหรือไม่?}
WaitOrEscalate -->|มี| ManualAssign
WaitOrEscalate -->|ไม่มี<br/>หมดเวลา| EscalateNotify[Escalate:<br/>แจ้งเตือนผู้บริหาร<br/>แจ้งเตือนพยาบาลหัวหน้า]
EscalateNotify --> SelectAssignmentMethod
style Start fill:#d4edda
style End fill:#f8d7da
style ToQueue fill:#d1ecf1
style AutoAssign fill:#cfe2ff
style ManualAssign fill:#fff3cd
style ClaimOrder fill:#e7f3ff
style ShowError fill:#f8d7da
คำอธิบาย: ระบบจัดการ Order ที่ไม่ระบุแผนก
3 วิธีจัดการ Order ที่ไม่ระบุแผนก:
1. Auto-routing (แนะนำ - ประสิทธิภาพสูงสุด)
// ตัวอย่างกฎ Auto-routing
const routingRules = [
{
keywords: ["เลือด", "CBC", "Hematology"],
department: "LAB",
priority: "normal"
},
{
keywords: ["เอกซเรย์", "X-Ray", "CT", "MRI"],
department: "Radiology",
priority: "normal"
},
{
keywords: ["ยา", "จ่ายยา", "Prescription"],
department: "Pharmacy",
priority: "normal"
}
];
// ถ้าไม่ตรงกฎใดๆ → ไป Unassigned Pool
2. Manual Assignment by Coordinator - เหมาะกับ Order พิเศษ/ซับซ้อน - Coordinator ดูและจัดสรรด้วยตนเอง - ใช้เวลา แต่แม่นยำ
3. Department Claim System - เหมาะกับงานที่หลายแผนกทำได้ - แผนกที่ว่างสามารถรับงานก่อนได้ - ช่วยกระจายภาระงาน
ข้อมูลที่ Order ต้องเก็บ:
{
"order_id": "ORD-20250126-001",
"vn": "VN20250126-001",
"episode_id": "EP-001",
"department_id": null, // null = ยังไม่ระบุ
"status": "unassigned",
"assignment_method": null, // "auto", "manual", "claim"
"assigned_by": null,
"assigned_at": null,
"routing_log": [
{
"timestamp": "2025-01-26T09:00:00",
"status": "created",
"note": "Order created without department"
},
{
"timestamp": "2025-01-26T09:05:00",
"status": "auto_routing_failed",
"note": "No matching routing rule"
},
{
"timestamp": "2025-01-26T09:10:00",
"status": "assigned",
"method": "manual",
"assigned_by": "coordinator_001",
"department": "LAB"
}
]
}