ระบบสารสนเทศโรงพยาบาล (Hospital HIS)
เอกสารชุดนี้สำหรับคุยกับผู้ว่าจ้าง / คนร่าง TOR — ระบบ digital-first ที่พิมพ์เอกสารได้ และทุกโมดูลทำงานร่วมกันบนฐานข้อมูลผู้ป่วยเดียว
01 Product Requirements (PRD)
บทสรุปผู้บริหาร
ระบบนี้คือ HIS แบบ modular monolith ที่รวม 5 งานหลักของโรงพยาบาลบนฐานข้อมูลผู้ป่วยเดียว (single patient master) ผู้ป่วยมี HN เดียว ที่ทุกโมดูลใช้ร่วมกัน ทำให้ข้อมูลไหลต่อเนื่องไม่ต้องคีย์ซ้ำ และพิมพ์เอกสารราชการได้ทุกจุด
- ลดการคีย์ซ้ำ + ลดข้อผิดพลาด
- Compliance ครบ (43 แฟ้ม → HDC, e-Claim → สปสช. ในตัว)
- Lean — รันบนเครื่อง ~4–8 GB RAM, ทีมดูแล 1–2 คน
- โตได้ — greenfield ได้ + เชื่อม HIS/LIS เดิมผ่าน Mirth
- IPD/ward, ห้องผ่าตัด, เภสัชเต็มรูปแบบ
- PACS / ภาพรังสี (เก็บแค่ผลอ่าน)
- Telemedicine / patient app (roadmap)
- เขียน HL7/ASTM parser เอง (ใช้ Mirth)
ผู้ใช้งานและบทบาท (RBAC)
| Role | หน้าที่หลัก | โมดูลที่เข้าถึง |
|---|---|---|
| เวชระเบียน (Registrar) | ลงทะเบียน, ออก HN, ตรวจสอบสิทธิ | Registration |
| พยาบาล (Nurse) | vital signs, ซักประวัติ, จัดคิว | Registration, Checkup |
| แพทย์ (Doctor) | ตรวจ, สั่ง Lab, อ่านผล, ลงนาม | Checkup, Result, Lab |
| นักเทคนิคการแพทย์ (Lab Tech) | รับ specimen, run, validate ผล | Lab |
| การเงิน (Cashier) | คิดเงิน, รับชำระ, ออกใบเสร็จ | Billing |
| ผู้ดูแลระบบ (Admin) | ตั้งค่า master, จัดการ user, export สปสช. | ทั้งหมด |
| DPO / Auditor | ตรวจ audit log, จัดการ consent | Audit (read) |
RBAC = role → permission ต่อ (module × action). ทุก access ถูก log. ข้อมูล sensitive (HIV/จิตเวช) มี field-level access เพิ่ม
ภาพรวมการไหลของข้อมูล (End-to-End)
[ลงทะเบียน] → ออก HN/VN + ตรวจสอบสิทธิ
│ (patient_id, visit_id, สิทธิ)
▼
[ตรวจสุขภาพ] → vital signs + เลือก package + ตรวจร่างกาย
│ (สั่งตรวจ)
▼
[ส่ง Lab] → order (ORM) → specimen+barcode → run → result (ORU) → validate
│ (lab_result)
▼
[ออกผลตรวจ] → รวมผลทุกสถานี → แพทย์ลงนาม → เล่มผล/ใบรับรองแพทย์
│ (charges สะสมจากทุกจุด)
▼
[Billing] → คิดเงินตามสิทธิ → ใบเสร็จ/ใบแจ้งหนี้ → e-Claim/สปส.
│
▼
[Export] → 43 แฟ้ม → HDC | e-Claim → สปสช. | audit log
ทุกลูกศร = event ภายในระบบ (in-process event / outbox) ไม่ต้องคีย์ซ้ำ
โมดูล 1 — ลงทะเบียนตรวจผู้ป่วย
จุดเริ่มของทุก visit: ระบุตัวผู้ป่วย, ออก/ค้น HN, สร้าง visit (VN), ตรวจสอบสิทธิ, ออกบัตร/sticker
| # | Requirement | Priority |
|---|---|---|
| R1.1 | ค้นผู้ป่วยด้วยเลข ปชช. 13 หลัก / HN / ชื่อ / คิว | P0 |
| R1.2 | ผู้ป่วยใหม่ → ออก HN อัตโนมัติ + บันทึก demographic | P0 |
| R1.3 | อ่านบัตร ปชช. ผ่าน smart card reader | P0 |
| R1.4 | ตรวจสอบสิทธิ real-time กับ NHSO (UC/สปส./ข้าราชการ/เงินสด) | P0 |
| R1.5 | รองรับ multiple coverage + confirm สิทธิทุก visit | P0 |
| R1.6 | สร้าง VN + ส่งเข้าคิวจุดตรวจ | P0 |
| R1.7 | บันทึกแพ้ยา/โรคประจำตัว/เสียชีวิต + แจ้งเตือน | P0 |
| R1.8 | พิมพ์ OPD card + sticker/label (barcode) | P0 |
| R1.9 | รองรับ "บัตรประชาชนใบเดียว / 30 บาทรักษาทุกที่" | P1 |
| R1.10 | บันทึก consent (PDPA) ครั้งแรกที่ลงทะเบียน | P0 |
เอกสารพิมพ์: OPD card · Sticker/label (HN/VN + ชื่อ + barcode)
โมดูล 2 — ตรวจสุขภาพ (Package-driven)
จัดการ "ตรวจสุขภาพ" แบบ package (ต่างจาก OPD ที่เป็น chief-complaint): ตรวจประจำปี, ก่อนเข้างาน, เพื่อใบรับรอง, ทำประกัน, วีซ่า
| # | Requirement | Priority |
|---|---|---|
| R2.1 | Package builder — กำหนดชุดรายการตรวจ + ราคา + เงื่อนไข (อายุ/เพศ) | P0 |
| R2.2 | เลือก package → สร้าง worklist อัตโนมัติ | P0 |
| R2.3 | บันทึก vital signs (นน./สส./BMI/BP/ชีพจร) | P0 |
| R2.4 | บันทึกตรวจร่างกายโดยแพทย์ (PE, impression) | P0 |
| R2.5 | Station worklist — ติดตามทำครบทุกสถานีหรือยัง | P0 |
| R2.6 | สั่ง Lab/X-ray/EKG จาก package อัตโนมัติ | P0 |
| R2.7 | แจ้งเงื่อนไขเตรียมตัว (งดอาหาร 8–10 ชม.) | P1 |
| R2.8 | ใช้ patient master + HN เดียวกับ OPD | P0 |
โมดูล 3 — ออกผลการตรวจสุขภาพ + ใบรับรองแพทย์
| # | Requirement | Priority |
|---|---|---|
| R3.1 | รวมผล vital + Lab (reference range + flag H/L) + CXR/EKG | P0 |
| R3.2 | บันทึก impression + recommendation | P0 |
| R3.3 | Doctor sign-off (digital signature / Provider ID Cert) | P0 |
| R3.4 | ออกเล่มรายงานผลตรวจสุขภาพ (PDF) | P0 |
| R3.5 | ออกใบรับรองแพทย์ฟอร์ม TMC (เลขที่ running, เลข ว., ลายเซ็น) | P0 |
| R3.6 | รองรับฉบับ ไทย/อังกฤษ (วีซ่า/work permit) | P1 |
| R3.7 | ใบรับรองแพทย์ 5 โรค (สมัครงาน/ใบขับขี่) | P1 |
| R3.8 | ผลล็อกหลังลงนาม (immutable) + เก็บประวัติแก้ไข | P0 |
เอกสารพิมพ์: เล่มผลตรวจสุขภาพ · ใบรับรองแพทย์ (ฟอร์มแพทยสภา)
โมดูล 4 — ส่งผลให้ห้อง Labs (Lab Order / LIS)
| # | Requirement | Priority |
|---|---|---|
| R4.1 | CPOE — แพทย์สั่ง Lab → สร้าง order | P0 |
| R4.2 | สร้าง barcode/label ต่อ specimen (sample tracking) | P0 |
| R4.3 | รับผลจาก analyzer/LIS ผ่าน HL7 v2 ORU (ผ่าน Mirth) | P0 |
| R4.4 | รองรับ analyzer เก่าผ่าน ASTM E1381/E1394 (ผ่าน Mirth) | P1 |
| R4.5 | นักเทคนิคการแพทย์ validate/approve ก่อนส่งกลับ | P0 |
| R4.6 | Auto-flag H/L + critical value alert | P0 |
| R4.7 | Map ผลโรคเรื้อรัง → LABFU (43 แฟ้ม) + TMLT | P1 |
| R4.8 | ผล route กลับเข้าโมดูลออกผล + แสดงให้แพทย์ | P0 |
โมดูล 5 — Billing ค่ารักษา
| # | Requirement | Priority |
|---|---|---|
| R5.1 | Charge capture — ทุก service/drug/procedure/lab สร้าง charge อัตโนมัติ | P0 |
| R5.2 | Coverage rules engine — price/coverage ตามสิทธิ | P0 |
| R5.3 | คำนวณ copay / ส่วนเกินที่ผู้ป่วยจ่าย | P0 |
| R5.4 | ออกใบเสร็จ + ใบแจ้งหนี้ + ใบรายละเอียดค่ายา | P0 |
| R5.5 | e-Receipt (e-signature + e-Timestamp ตาม ETDA/สรรพากร) | P1 |
| R5.6 | Export e-Claim ไป สปสช. (≤30 วันหลัง discharge) | P0 |
| R5.7 | เบิกประกันสังคม / เบิกตรงกรมบัญชีกลาง (CSMBS) | P1 |
| R5.8 | รองรับชำระหลายช่องทาง (เคาน์เตอร์/Kiosk/mobile) | P2 |
Non-Functional + Compliance Checklist
| ด้าน | ข้อกำหนด |
|---|---|
| Compliance | 43 แฟ้ม → HDC, e-Claim → สปสช., ICD-10-TM + TMT, ใบรับรองแพทย์ฟอร์ม TMC |
| PDPA | consent management, audit log ทุก access, DPO, retention 5 ปี (10 ปี กรณีเสียชีวิต/คดี) |
| Security | RBAC, field-level access, encryption at rest/in transit, e-signature |
| HA / TMI | data governance, availability, BCP, medical record audit |
| Performance | ~500–1,000 visit/วัน บนเครื่องเดียว, response < 1s |
| Resource | ~4–8 GB RAM / 2 vCPU (on-prem) |
| Localization | UI ภาษาไทย, เอกสาร ไทย/อังกฤษ, ปฏิทิน พ.ศ. |
| Data residency | on-prem หรือ Thai-region cloud (PDPA cross-border) |
02 สถาปัตยกรรมระบบ (Architecture)
สรุป 1 บรรทัด: Modular monolith เป็น Go (Fiber v3 หรือ Echo) + Svelte/React + PostgreSQL เดียว multi-schema, PDF ด้วย Gotenberg (ฟอนต์ Sarabun), label ด้วย ZPL raw, LIS ผ่าน Mirth Connect, deploy on-prem Docker Compose บนเครื่อง ~4–8 GB RAM
Recommended Stack
| Layer | เลือก | เหตุผลสั้น |
|---|---|---|
| Backend | Go + Echo (หรือ Fiber v3) | net/http ecosystem ครบ, RAM idle ~25 MB |
| Frontend | React (default) / Svelte | React = hiring pool + data-grid; Svelte = bundle เล็ก |
| Database | PostgreSQL เดียว, multi-schema | modular แต่ JOIN ได้, pgAudit + partitioning |
| PDF (A4) | Gotenberg + Sarabun | จัดการ shaping ภาษาไทยดีสุด (Chromium) |
| Label | ZPL raw → TCP 9100 | reliable ใน hospital LAN |
| LIS / HL7 | Mirth Connect (แยก) | อย่าเขียน HL7/ASTM parser เอง |
| Architecture | Modular Monolith, REST, RBAC | ทีมเล็ก, ops 1–2 คน |
| Deploy | On-prem Docker Compose + nginx | PDPA data residency + footprint เล็ก |
- ถ้าเลือก Fiber ต้องเป็น v3 เท่านั้น — v1/v2 สร้างบน fasthttp → ไม่มี HTTP/2 native, middleware Go ใช้ตรง ๆ ไม่ได้, adaptor เดิมไม่ flush ทันที (กระทบ SSE/live update ของ order→result loop). ทางปลอดภัยกว่าคือ Echo
- อย่าเขียน HL7/ASTM เอง — ใช้ Mirth — vendor variation ของ analyzer เยอะ Mirth จัดการ parse/map/queue/retry ให้
- Gotenberg + Sarabun = คำตอบเอกสารไทย — wkhtmltopdf ตายแล้ว, gofpdf จัดการสระลอย/วรรณยุกต์ซ้อนได้แย่กว่า engine เบราว์เซอร์
System Context
Modular Monolith — โครงสร้างภายใน
Data Model
Schema layout (1 PostgreSQL, หลาย schema)
core → patient (MPI), user, role, permission, audit_log, consent, event_outbox registration → visit, eligibility_check, coverage checkup → checkup_package, checkup_order, vital_sign, physical_exam lab → lab_order, specimen, lab_result result → checkup_report, medical_certificate, signature billing → charge, invoice, receipt, payment, claim_export
- Patient Master (MPI):
core.patientเป็น single source of truth — ทุก module อ้างpatient_idกลาง ไม่ duplicate. Matching: deterministic (เลข ปชช. + DOB) สำหรับ greenfield - Partitioning:
lab_result+chargeใช้ range partition by month (pg_partman) — query prune ตามวันที่, ลบเก่าด้วย DETACH+DROP - Audit (PDPA) 2 ชั้น: pgAudit (statement log) + trigger-based row audit เก็บ before/after บนตารางวิกฤต
ER Diagram (ย่อ)
Deployment + Phasing
Deployment footprint
docker-compose: nginx → reverse proxy, TLS, HTTP/2 api → Go binary (idle ~25 MB) db → PostgreSQL (ตัวกิน RAM หลัก) pdf → Gotenberg (Chromium) mirth → Mirth Connect (เปิดเมื่อมี LIS)
Minimal spec: เครื่องเดียว ~4 GB RAM / 2 vCPU (greenfield, 1 รพ.); ขยับเป็น 8 GB ถ้ารัน Mirth + traffic จริง. On-prem หรือ Thai-region cloud = default สำหรับ PDPA data residency. Backup: pg_dump + WAL/PITR + off-site
แนวทางเฟสการพัฒนา
| เฟส | ขอบเขต | ผลลัพธ์ |
|---|---|---|
| Phase 1 (MVP) | core + Registration + Billing พื้นฐาน + พิมพ์ OPD card/ใบเสร็จ | ลงทะเบียน + คิดเงิน end-to-end |
| Phase 2 | Checkup + Lab order (greenfield) + พิมพ์ใบสั่ง Lab/sticker | flow ตรวจสุขภาพครบ |
| Phase 3 | Result + เล่มผล + ใบรับรองแพทย์ + e-signature | ออกผล/ใบรับรองได้ |
| Phase 4 | 43 แฟ้ม + e-Claim export + validation | compliance สปสช. ครบ |
| Phase 5 | Mirth + เชื่อม analyzer จริง + critical alert + e-Receipt | LIS integration เต็ม |
| Roadmap | FHIR profile, Health Link, MOPH/Provider ID, Kiosk/mobile | interoperability |
03 Sequence Diagrams
Flow คร่าว ๆ ของแต่ละโมดูล — แก้ได้ง่ายตอนคุยกับผู้ว่าจ้าง
End-to-End — ภาพรวมทั้งระบบ
M1 — ลงทะเบียน + ตรวจสอบสิทธิ
M2 — ตรวจสุขภาพ (Package-driven)
M4 — Lab Order → Result Loop (หัวใจของระบบ)
ถ้า greenfield (ยังไม่มี analyzer) — ข้าม Mirth/Analyzer, นักเทคนิคคีย์ผลเข้าตรงแล้ว validate. เปิด Mirth เมื่อต่อ analyzer จริง
M3 — ออกผลตรวจ + ใบรับรองแพทย์
M5 — Billing + e-Claim
Compliance Export — 43 แฟ้ม → HDC
04 Frontend / Backend Design
Backend — โครงสร้างโปรเจกต์ (Go, Modular Monolith)
his/ ├── cmd/server/main.go # entrypoint, wire modules ├── internal/ │ ├── core/ # patient master, auth, audit, events │ ├── registration/ # handler → service → repo (schema "registration") │ ├── checkup/ │ ├── lab/ │ ├── result/ │ └── billing/ ├── pkg/ │ ├── pdf/ # Gotenberg client │ ├── label/ # ZPL generator │ ├── hl7/ # Mirth REST client (ไม่ parse เอง) │ └── export/ # 43 แฟ้ม / e-Claim ├── migrations/ # SQL per schema └── docker-compose.yml
แต่ละ module = handler → service → repo. repo แตะเฉพาะ schema ตัวเอง. cross-module ผ่าน core/events
REST API — ตัวอย่าง endpoints
# Registration
POST /api/v1/patients สร้างผู้ป่วยใหม่ (ออก HN)
GET /api/v1/patients?nid=... ค้นผู้ป่วย
POST /api/v1/visits สร้าง visit (VN)
POST /api/v1/visits/{id}/eligibility ตรวจสอบสิทธิ NHSO
POST /api/v1/print/opd-card พิมพ์ OPD card/sticker
# Checkup
GET /api/v1/checkup/packages รายการ package
POST /api/v1/checkup/orders สร้าง order จาก package
POST /api/v1/checkup/{id}/vitals บันทึก vital signs
# Lab
POST /api/v1/lab/orders สั่ง lab (CPOE)
POST /api/v1/lab/specimens/{id}/label พิมพ์ barcode
POST /api/v1/lab/results รับผล (จาก Mirth)
PATCH /api/v1/lab/results/{id}/validate validate ผล
# Result
GET /api/v1/results/{visitId} รวมผลทุกสถานี
POST /api/v1/results/{id}/sign แพทย์ลงนาม
POST /api/v1/results/{id}/report gen เล่มผล PDF
POST /api/v1/certificates ออกใบรับรองแพทย์
# Billing
POST /api/v1/billing/invoices รวมบิล + คิดสิทธิ
POST /api/v1/billing/payments รับชำระ
POST /api/v1/billing/receipts ออกใบเสร็จ
POST /api/v1/export/eclaim export e-Claim
# Admin / Compliance
POST /api/v1/export/43files export 43 แฟ้ม
GET /api/v1/audit/logs ดู audit (DPO)
ทุก endpoint ผ่าน RBAC middleware + audit log middleware
UI/UX หลักการสำหรับงาน รพ.
- Keyboard-first — ใช้ tab/enter/shortcut ได้ทั้ง flow
- ค้นผู้ป่วยเด่นสุด — search bar ใหญ่ (ปชช./HN/ชื่อ/คิว)
- แจ้งเตือนสำคัญเด่น — แพ้ยา (สีแดง), เสียชีวิต, critical lab value
- Worklist/คิว real-time — เห็นสถานะผู้ป่วยทุกจุด
- Print ทุกจุด — ปุ่มชัดเจน, preview ก่อนพิมพ์
- ปฏิทิน พ.ศ. + ฟอนต์ Sarabun; เน้น desktop (workstation)
เอกสาร/Template ที่ต้อง build
| Template | ชนิด | ฟอร์มอ้างอิง |
|---|---|---|
| OPD card / sticker / specimen label | ZPL | NCCLS AUTO2 (specimen) |
| ใบสั่งตรวจ Lab | PDF/ZPL | LIS standard |
| เล่มผลตรวจสุขภาพ | HA.OS / รพ.เอกชน | |
| ใบรับรองแพทย์ (TH/EN) + แบบ 5 โรค | แบบฟอร์มแพทยสภา (TMC) | |
| ใบเสร็จ / e-Receipt | dmsic MoPH + ETDA (e-sign + e-Timestamp) | |
| ใบแจ้งหนี้ / statement | รพ. format |
ทุก A4 template = HTML/CSS + charset=UTF-8 + embed ฟอนต์ Sarabun
ตัวอย่าง Coverage Rules (Billing)
สิทธิ UC (บัตรทอง): - ในชุดสิทธิ → เบิก สปสช. (e-Claim), ผู้ป่วยจ่าย 0 หรือ 30 บาท - นอกชุดสิทธิ → copay ผู้ป่วยจ่ายเอง สิทธิประกันสังคม: - รพ.ตามสิทธิ → เบิก สปส. (ผู้ป่วยอาจสำรอง+ขอใบเสร็จ) ข้าราชการ (CSMBS): - เบิกตรงกรมบัญชีกลาง เงินสด / ประกันเอกชน: - ผู้ป่วยจ่ายเต็ม → ออกเอกสารให้เคลม
rules engine แยกเป็น config table (เพิ่ม/แก้สิทธิได้โดยไม่แก้โค้ด)
⚠️ ก่อน implement จริง — ต้องดึง spec ตัวจริง
- Layout 43 แฟ้ม + e-Claim เวอร์ชันล่าสุด → hdata.moph.go.th / eclaim.nhso.go.th (verify field-level ไม่ได้ในชั้น draft นี้)
- ข้อกำหนด IM ใน HA ฉบับ 5/6 + TMI Hospital IT Quality Framework
- HL7/ASTM interfacing เฉพาะรุ่น ของ analyzer ที่ รพ. มีจริง
Roadmap (ไม่บังคับวันนี้): FHIR profile (SIL-TH), SNOMED CT, Health Link / หมอพร้อม PHR, MOPH ID / Provider ID Digital Cert — ออกแบบ data model ให้ map ได้ในอนาคต