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

แผนภาพการทำงานของระบบเปิด 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 ที่ส่งต่อ:

  1. Order ใหม่ = Order แยกต่างหาก
  2. สร้าง Order Number ใหม่ทันที
  3. แต่อ้างอิง Episode และ VN เดิม
  4. มีข้อมูล referred_from_order_id ระบุว่ามาจาก Order ไหน

  5. เข้าสู่ระบบคิว

  6. Order ใหม่แสดงในคิวของแผนกปลายทางทันที
  7. มีตำแหน่งคิว (Queue Position) ตามลำดับหรือระดับความเร่งด่วน
  8. แผนกปลายทางเรียกคิวเหมือนผู้ป่วยทั่วไป

  9. ข้อมูลที่แสดงในคิว

    🔄 Order #12345 (Referral)
    👤 นาย ทดสอบ ระบบ (HN: 12345)
    📋 VN: VN20250126-001
    🏥 จาก: LAB → ไป: X-RAY
    ⚠️  Priority: Urgent
    📝 หมายเหตุ: พบความผิดปกติ ขอ X-Ray Chest PA
    📜 ผ่านแผนก: OPD → LAB → [X-RAY] ← กำลังอยู่ที่นี่
    

  10. สถานะ Order

  11. Pending/Waiting: รอในคิว (แผนกปลายทางยังไม่เรียก)
  12. In Progress: กำลังให้บริการ
  13. Completed: เสร็จสิ้น (อาจส่งต่อต่อได้)
  14. Cancelled: ยกเลิก

  15. Referral Chain (ลำดับการส่งต่อ)

  16. ระบบเก็บประวัติว่า Order ผ่านแผนกอะไรมาบ้าง
  17. ตัวอย่าง: OPD → LAB → X-RAY → Specialist
  18. แต่ละแผนกเห็นประวัติทั้งหมด

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

  1. ระบบ VN และ Episode Management
  2. สร้าง/ค้นหา VN
  3. สร้าง Episode (รองรับหลาย Episodes)
  4. จัดการสิทธิ์

  5. ระบบจุดคัดกรอง (Triage)

  6. คิวรอคัดกรอง
  7. บันทึกข้อมูลคัดกรอง
  8. จัดสรรห้องตรวจ (ฟีเจอร์หลัก)

  9. ระบบห้องตรวจ/แพทย์

  10. คิวผู้ป่วย
  11. บันทึกการตรวจ
  12. สั่ง Orders

🔧 Phase 2: Order System

  1. ระบบ Order Management
  2. สร้าง Order
  3. Auto-routing (ถ้าใช้)
  4. Queue Management ตามแผนก

  5. ระบบแผนกต่างๆ

  6. LAB, X-RAY, Pharmacy
  7. บันทึกผลตรวจ
  8. การส่งต่อระหว่างแผนก

🔧 Phase 3: Advanced Features

  1. Dashboard และ Monitoring
  2. Real-time monitoring
  3. สถิติและรายงาน
  4. แจ้งเตือน

  5. Integration

  6. ระบบตรวจสอบสิทธิ์ออนไลน์
  7. ระบบการเงิน
  8. ระบบ 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

  1. Authentication & Authorization
  2. Multi-factor Authentication
  3. Role-based Access Control (RBAC)
  4. Session Management

  5. Data Privacy

  6. Encryption at rest และ in transit
  7. Audit Log ทุกการเข้าถึงข้อมูลผู้ป่วย
  8. PDPA Compliance

  9. API Security

  10. JWT Tokens
  11. Rate Limiting
  12. 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"
    }
  ]
}