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

Entity Relationship Diagram (ERD)

ระบบรังสีวิทยา (Radiology System)

โรงพยาบาลค่ายธนรัชน์


เอกสารเลขที่: SRS-1.2.8-ERD
เวอร์ชัน: 1.0
วันที่: 23 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์


ภาพรวม Entity Relationship Diagram

เอกสารนี้แสดง ERD สำหรับระบบรังสีวิทยาที่ออกแบบให้ทำงานร่วมกับระบบอื่นๆ ผ่าน API Integration โดยเน้นการจัดการงานรังสีวิทยาครบวงจร ตั้งแต่การรับคำสั่งตรวจ การลงทะเบียน การถ่ายภาพ การรายงานผล การจัดการฟิล์ม และการเชื่อมต่อกับระบบ PACS สำหรับการจัดเก็บภาพดิจิทัล ตามมาตรฐาน DICOM

การจัดกลุ่มตาราง (Table Categories)

🎨 คำอธิบายสีในแผนภาพ:

  • 🟢 สีเขียว (Core Tables): ตารางหลักเฉพาะระบบรังสีวิทยา
  • XRAY_ORDER - คำสั่งตรวจรังสี
  • XRAY_REGISTRATION - การลงทะเบียนและออก XN
  • XRAY_EXAMINATION - ข้อมูลการตรวจและถ่ายภาพ
  • XRAY_REPORT - รายงานผลโดยรังสีแพทย์
  • XRAY_IMAGE - ข้อมูลภาพรังสี

  • 🔵 สีน้ำเงิน (Support Tables): ตารางสนับสนุนการทำงาน

  • XRAY_FILM_USAGE - การบันทึกฟิล์มใช้
  • XRAY_FILM_DAMAGED - การบันทึกฟิล์มเสีย
  • XRAY_FILM_BORROWING - การยืม-คืนฟิล์ม
  • XRAY_ORDER_DETAIL - รายละเอียดคำสั่งตรวจ (ท่า/ด้าน)
  • XRAY_APPOINTMENT - การนัดหมายฟังผล
  • XRAY_QUEUE - คิวการตรวจ

  • 🟠 สีส้ม (System Tables): ตารางจัดการระบบและการตรวจสอบ

  • XRAY_AUDIT_LOG - บันทึกการเปลี่ยนแปลง
  • XRAY_REPORT_TEMPLATE - Template รายงานผล
  • XRAY_NOTIFICATION - การแจ้งเตือน
  • XRAY_INTEGRATION_LOG - บันทึกการเชื่อมโยงระบบ
  • PACS_TRANSFER_LOG - บันทึกการส่งภาพไป PACS

  • 🟡 สีเหลือง (Master Data - Radiology): ข้อมูลพื้นฐานทางรังสีวิทยา

  • XRAY_ITEM - รายการตรวจรังสี
  • XRAY_ITEM_PRICE - ค่าบริการตามสิทธิ
  • XRAY_VIEW_TYPE - ประเภทท่าถ่าย
  • XRAY_SIDE_TYPE - ประเภทด้าน
  • XRAY_URGENCY - ความเร่งด่วน
  • FILM_SIZE - ขนาดฟิล์ม
  • FILM_DAMAGE_REASON - สาเหตุฟิล์มเสีย

  • 🟣 สีม่วง (Master Data - Equipment): ข้อมูลเครื่องมือและห้อง

  • RADIOLOGY_ROOM - ห้องตรวจรังสี
  • MODALITY - เครื่องมือถ่ายภาพ
  • MODALITY_TYPE - ประเภทเครื่อง (CR/DR/CT/MRI/US)
  • PACS_SERVER - ข้อมูลเซิร์ฟเวอร์ PACS

  • 🔴 สีแดง (Integration Points): จุดเชื่อมโยงกับระบบอื่น

  • การเชื่อมโยงกับระบบเวชระเบียน (1.2.1)
  • การเชื่อมโยงกับระบบซักประวัติ (1.2.2)
  • การเชื่อมโยงกับระบบห้องตรวจแพทย์ (1.2.3)
  • การเชื่อมโยงกับระบบห้องฉุกเฉิน (1.2.4)
  • การเชื่อมโยงกับระบบผู้ป่วยใน (1.2.17)
  • การเชื่อมโยงกับระบบการเงิน (1.2.14)
  • การเชื่อมโยงกับระบบตรวจสอบสิทธิ (1.2.15)
  • การเชื่อมโยงกับระบบ PACS (External)

🔑 คุณสมบัติเด่นของระบบ

  1. การจัดการคำสั่งตรวจ: รับคำสั่งจากหลายระบบ รองรับ STAT/Urgent/Routine
  2. การลงทะเบียน: ออก XN อัตโนมัติ จัดการคิวตามความเร่งด่วน
  3. การถ่ายภาพ: เชื่อมต่อ Modality ผ่าน DICOM รองรับหลายประเภทเครื่อง
  4. การรายงานผล: Template-based reporting โดยรังสีแพทย์ พร้อม Lock ผล
  5. การจัดการฟิล์ม: ติดตามฟิล์มใช้ ฟิล์มเสีย และการยืม-คืน
  6. PACS Integration: ส่งภาพ DICOM อัตโนมัติ พร้อมการตรวจสอบสถานะ
  7. Real-time Results: ผู้สั่งดูผลได้ทันทีผ่าน Online System

📝 กลไกการอ้างอิงข้อมูล

ระบบใช้ Foreign Key หลัก: - HN: รหัสผู้ป่วยจากระบบเวชระเบียน (1.2.1) - VisitID: รหัสการเข้ารับบริการ - XN: X-Ray Number - รหัสการตรวจรังสี (ออกโดยระบบนี้) - OrderID: รหัสคำสั่งตรวจ - DoctorID: รหัสแพทย์ผู้สั่งและรังสีแพทย์ - ModalityID: รหัสเครื่องมือถ่ายภาพ - RoomCode: รหัสห้องตรวจรังสี


1. แผนภาพแบบง่าย (Simplified Diagram)

แผนภาพนี้แสดงความสัมพันธ์ระหว่างกลุ่มตารางหลักๆ และการเชื่อมโยงกับระบบอื่น

graph TB
    subgraph "🔴 External Systems"
        PATIENT_EXT[PATIENT<br/>ระบบเวชระเบียน 1.2.1]
        VISIT_EXT[VISIT<br/>ระบบเวชระเบียน 1.2.1]
        HISTORY_SYS[ระบบซักประวัติ<br/>1.2.2]
        EXAM_SYS[ระบบห้องตรวจแพทย์<br/>1.2.3]
        ER_SYS[ระบบห้องฉุกเฉิน<br/>1.2.4]
        IPD_SYS[ระบบผู้ป่วยใน<br/>1.2.17]
        FINANCE_SYS[ระบบการเงิน<br/>1.2.14]
        RIGHTS_SYS[ระบบตรวจสอบสิทธิ<br/>1.2.15]
        PACS_SYS[PACS<br/>External System]
    end

    subgraph "🟢 Core Tables"
        XRAY_ORDER[XRAY_ORDER<br/>คำสั่งตรวจรังสี]
        XRAY_REG[XRAY_REGISTRATION<br/>ลงทะเบียน/XN]
        XRAY_EXAM[XRAY_EXAMINATION<br/>การตรวจ/ถ่ายภาพ]
        XRAY_REPORT[XRAY_REPORT<br/>รายงานผล]
        XRAY_IMAGE[XRAY_IMAGE<br/>ข้อมูลภาพรังสี]
    end

    subgraph "🔵 Support Tables"
        ORDER_DETAIL[XRAY_ORDER_DETAIL<br/>รายละเอียดคำสั่ง]
        FILM_USAGE[XRAY_FILM_USAGE<br/>ฟิล์มใช้]
        FILM_DAMAGED[XRAY_FILM_DAMAGED<br/>ฟิล์มเสีย]
        FILM_BORROW[XRAY_FILM_BORROWING<br/>ยืม-คืนฟิล์ม]
        XRAY_QUEUE[XRAY_QUEUE<br/>คิวการตรวจ]
        XRAY_APPT[XRAY_APPOINTMENT<br/>นัดหมายฟังผล]
    end

    subgraph "🟠 System Tables"
        AUDIT_LOG[XRAY_AUDIT_LOG<br/>Audit Log]
        TEMPLATE[XRAY_REPORT_TEMPLATE<br/>Template รายงาน]
        NOTIFICATION[XRAY_NOTIFICATION<br/>การแจ้งเตือน]
        INTEGRATION[XRAY_INTEGRATION_LOG<br/>Integration Log]
        PACS_LOG[PACS_TRANSFER_LOG<br/>PACS Transfer]
    end

    subgraph "🟡 Master Data - Radiology"
        XRAY_ITEM[XRAY_ITEM<br/>รายการตรวจ]
        XRAY_PRICE[XRAY_ITEM_PRICE<br/>ค่าบริการ]
        VIEW_TYPE[XRAY_VIEW_TYPE<br/>ท่าถ่าย]
        SIDE_TYPE[XRAY_SIDE_TYPE<br/>ด้าน]
        URGENCY[XRAY_URGENCY<br/>ความเร่งด่วน]
        FILM_SIZE[FILM_SIZE<br/>ขนาดฟิล์ม]
        DAMAGE_REASON[FILM_DAMAGE_REASON<br/>สาเหตุฟิล์มเสีย]
    end

    subgraph "🟣 Master Data - Equipment"
        ROOM[RADIOLOGY_ROOM<br/>ห้องตรวจรังสี]
        MODALITY[MODALITY<br/>เครื่องมือถ่ายภาพ]
        MODALITY_TYPE[MODALITY_TYPE<br/>ประเภทเครื่อง]
        PACS_SERVER[PACS_SERVER<br/>PACS Server]
    end

    %% External Integration
    PATIENT_EXT -.->|HN| XRAY_ORDER
    VISIT_EXT -.->|VisitID| XRAY_ORDER
    HISTORY_SYS -.->|สั่งตรวจ| XRAY_ORDER
    EXAM_SYS -.->|สั่งตรวจ| XRAY_ORDER
    ER_SYS -.->|สั่งตรวจ STAT| XRAY_ORDER
    IPD_SYS -.->|สั่งตรวจ IPD| XRAY_ORDER
    RIGHTS_SYS -.->|ข้อมูลสิทธิ| XRAY_ORDER

    XRAY_REPORT -.->|ผลการตรวจ| HISTORY_SYS
    XRAY_REPORT -.->|ผลการตรวจ| EXAM_SYS
    XRAY_REPORT -.->|ผลการตรวจ| ER_SYS
    XRAY_REPORT -.->|ผลการตรวจ| IPD_SYS
    XRAY_ORDER -.->|ค่าบริการ| FINANCE_SYS

    XRAY_IMAGE -.->|ส่งภาพ DICOM| PACS_SYS
    PACS_SYS -.->|ภาพเก่า| XRAY_IMAGE

    %% Core Flow
    XRAY_ORDER -->|1:N| ORDER_DETAIL
    XRAY_ORDER -->|1:1| XRAY_REG
    XRAY_REG -->|1:1| XRAY_EXAM
    XRAY_EXAM -->|1:1| XRAY_REPORT
    XRAY_EXAM -->|1:N| XRAY_IMAGE

    %% Support Tables
    XRAY_REG -->|1:1| XRAY_QUEUE
    XRAY_EXAM -->|1:N| FILM_USAGE
    XRAY_EXAM -->|1:N| FILM_DAMAGED
    XRAY_EXAM -->|1:N| FILM_BORROW
    XRAY_REPORT -->|1:N| XRAY_APPT

    %% System Tables
    XRAY_REPORT -->|uses| TEMPLATE
    XRAY_ORDER -->|logs| INTEGRATION
    XRAY_IMAGE -->|logs| PACS_LOG
    XRAY_REPORT -->|notifies| NOTIFICATION
    XRAY_REPORT -->|audits| AUDIT_LOG

    %% Master Data
    XRAY_ORDER -->|references| XRAY_ITEM
    ORDER_DETAIL -->|references| VIEW_TYPE
    ORDER_DETAIL -->|references| SIDE_TYPE
    XRAY_ORDER -->|references| URGENCY
    XRAY_ITEM -->|has| XRAY_PRICE
    FILM_USAGE -->|references| FILM_SIZE
    FILM_DAMAGED -->|references| DAMAGE_REASON
    XRAY_EXAM -->|uses| ROOM
    XRAY_EXAM -->|uses| MODALITY
    MODALITY -->|type| MODALITY_TYPE
    XRAY_IMAGE -->|stored in| PACS_SERVER

    %% Styling
    classDef coreTable fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
    classDef supportTable fill:#bbdefb,stroke:#1565c0,stroke-width:2px
    classDef systemTable fill:#ffe0b2,stroke:#e65100,stroke-width:2px
    classDef masterRadiology fill:#fff9c4,stroke:#f57f17,stroke-width:2px
    classDef masterEquipment fill:#e1bee7,stroke:#6a1b9a,stroke-width:2px
    classDef externalSystem fill:#ffcdd2,stroke:#c62828,stroke-width:2px,stroke-dasharray: 5 5

    class XRAY_ORDER,XRAY_REG,XRAY_EXAM,XRAY_REPORT,XRAY_IMAGE coreTable
    class ORDER_DETAIL,FILM_USAGE,FILM_DAMAGED,FILM_BORROW,XRAY_QUEUE,XRAY_APPT supportTable
    class AUDIT_LOG,TEMPLATE,NOTIFICATION,INTEGRATION,PACS_LOG systemTable
    class XRAY_ITEM,XRAY_PRICE,VIEW_TYPE,SIDE_TYPE,URGENCY,FILM_SIZE,DAMAGE_REASON masterRadiology
    class ROOM,MODALITY,MODALITY_TYPE,PACS_SERVER masterEquipment
    class PATIENT_EXT,VISIT_EXT,HISTORY_SYS,EXAM_SYS,ER_SYS,IPD_SYS,FINANCE_SYS,RIGHTS_SYS,PACS_SYS externalSystem

2. แผนภาพรายละเอียด (Detailed ERD)

2.1 ตารางหลัก (Core Tables)

erDiagram
    XRAY_ORDER {
        VARCHAR(20) OrderID PK "รหัสคำสั่งตรวจ AUTO"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(20) VisitID FK "รหัสการเข้ารับบริการ"
        VARCHAR(20) SourceSystem "ระบบที่สั่ง HISTORY_TAKING/EXAMINATION/EMERGENCY/IPD"
        VARCHAR(20) SourceID "รหัสอ้างอิงจากระบบต้นทาง"
        VARCHAR(10) DoctorID FK "รหัสแพทย์ผู้สั่ง"
        VARCHAR(10) DepartmentCode FK "รหัสแผนก"
        VARCHAR(10) ClinicCode FK "รหัสคลินิก"
        DATE OrderDate "วันที่สั่งตรวจ"
        TIME OrderTime "เวลาที่สั่งตรวจ"
        VARCHAR(10) XRayItemCode FK "รหัสรายการตรวจหลัก"
        VARCHAR(20) UrgencyCode FK "ความเร่งด่วน STAT/URGENT/ROUTINE"
        VARCHAR(10) RoomCode FK "รหัสห้องที่ต้องการ"
        TEXT ClinicalInfo "ข้อมูลทางคลินิก/Indication"
        TEXT SpecialInstruction "คำแนะนำพิเศษ"
        ENUM PatientCondition "สภาพผู้ป่วย WALK/CARRY/WHEELCHAIR/STRETCHER"
        BOOLEAN RequireContrast "ต้องการสารทึบรังสี"
        TEXT ContrastInfo "ข้อมูลสารทึบรังสี"
        VARCHAR(20) RightsVerificationID FK "รหัสการตรวจสอบสิทธิ"
        ENUM OrderStatus "สถานะคำสั่ง PENDING/REGISTERED/IN_PROGRESS/COMPLETED/CANCELLED"
        VARCHAR(10) OrderedBy FK "ผู้บันทึกคำสั่ง"
        VARCHAR(10) CancelledBy FK "ผู้ยกเลิก"
        TIMESTAMP CancelledAt "วันเวลาที่ยกเลิก"
        TEXT CancelReason "เหตุผลยกเลิก"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_REGISTRATION {
        VARCHAR(20) RegistrationID PK "รหัสการลงทะเบียน AUTO"
        VARCHAR(20) XN UK "X-Ray Number"
        VARCHAR(20) OrderID FK "รหัสคำสั่งตรวจ"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(20) VisitID FK "รหัสการเข้ารับบริการ"
        DATE RegistrationDate "วันที่ลงทะเบียน"
        TIME RegistrationTime "เวลาที่ลงทะเบียน"
        VARCHAR(10) RegistrarID FK "ผู้ลงทะเบียน"
        VARCHAR(10) RoomCode FK "ห้องที่จะตรวจ"
        INT QueueNumber "หมายเลขคิว"
        DECIMAL(10,2) EstimatedCost "ค่าใช้จ่ายโดยประมาณ"
        DECIMAL(10,2) PatientCopay "ส่วนที่ผู้ป่วยต้องจ่าย"
        DECIMAL(10,2) RightsCovered "ส่วนที่สิทธิคุ้มครอง"
        ENUM RegistrationStatus "สถานะ REGISTERED/WAITING/CALLED/IN_ROOM/COMPLETED"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_EXAMINATION {
        VARCHAR(20) ExaminationID PK "รหัสการตรวจ AUTO"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(20) RegistrationID FK "รหัสการลงทะเบียน"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        DATE ExamDate "วันที่ตรวจ"
        TIME StartTime "เวลาเริ่มตรวจ"
        TIME EndTime "เวลาสิ้นสุดตรวจ"
        VARCHAR(10) RadiographerID FK "นักรังสีเทคนิคผู้ทำ"
        VARCHAR(10) RoomCode FK "ห้องที่ตรวจ"
        VARCHAR(10) ModalityID FK "เครื่องมือที่ใช้"
        INT NumberOfImages "จำนวนภาพที่ถ่าย"
        INT TotalFilmUsed "จำนวนฟิล์มใช้ทั้งหมด"
        INT TotalFilmDamaged "จำนวนฟิล์มเสียทั้งหมด"
        BOOLEAN ContrastUsed "ใช้สารทึบรังสี"
        VARCHAR(50) ContrastType "ชนิดสารทึบรังสี"
        DECIMAL(6,2) ContrastAmount "ปริมาณสารทึบรังสี ml"
        TEXT TechniqueUsed "เทคนิคที่ใช้"
        TEXT TechnicalNotes "หมายเหตุทางเทคนิค"
        VARCHAR(10) KVP "ค่า KVP"
        VARCHAR(10) MAS "ค่า MAS"
        ENUM ImageQuality "คุณภาพภาพ EXCELLENT/GOOD/ACCEPTABLE/POOR"
        BOOLEAN RepeatRequired "ต้องถ่ายซ้ำ"
        TEXT RepeatReason "เหตุผลถ่ายซ้ำ"
        ENUM ExamStatus "สถานะ IN_PROGRESS/COMPLETED/REPORTED/CANCELLED"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_REPORT {
        VARCHAR(20) ReportID PK "รหัสรายงาน AUTO"
        VARCHAR(20) ExaminationID FK "รหัสการตรวจ"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(10) RadiologistID FK "รังสีแพทย์ผู้อ่าน"
        DATE ReportDate "วันที่รายงาน"
        TIME ReportTime "เวลารายงาน"
        VARCHAR(20) TemplateID FK "Template ที่ใช้"
        TEXT Findings "ผลการอ่านฟิล์ม"
        TEXT Impression "สรุปการวินิจฉัย"
        TEXT Recommendation "ข้อแนะนำ"
        TEXT ComparisonNote "เปรียบเทียบกับภาพเก่า"
        VARCHAR(20) ComparedXN "XN ที่เปรียบเทียบ"
        ENUM ReportPriority "ความสำคัญ CRITICAL/URGENT/ROUTINE"
        ENUM CriticalResult "ผลวิกฤต YES/NO"
        TEXT CriticalNote "หมายเหตุผลวิกฤต"
        BOOLEAN NotifiedDoctor "แจ้งแพทย์แล้ว"
        TIMESTAMP NotifiedAt "วันเวลาที่แจ้ง"
        BOOLEAN IsLocked "ล็อคผลแล้ว"
        TIMESTAMP LockedAt "วันเวลาที่ล็อค"
        VARCHAR(10) LockedBy FK "ผู้ล็อค"
        BOOLEAN IsAmended "แก้ไขแล้ว"
        VARCHAR(20) AmendedReportID FK "รหัสรายงานที่แก้ไข"
        TEXT AmendmentReason "เหตุผลแก้ไข"
        ENUM ReportStatus "สถานะ DRAFT/PRELIMINARY/FINAL/AMENDED"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_IMAGE {
        VARCHAR(20) ImageID PK "รหัสภาพ AUTO"
        VARCHAR(20) ExaminationID FK "รหัสการตรวจ"
        VARCHAR(20) XN FK "X-Ray Number"
        INT ImageNumber "ลำดับภาพ"
        VARCHAR(20) ViewCode FK "รหัสท่าถ่าย"
        VARCHAR(20) SideCode FK "รหัสด้าน"
        VARCHAR(100) DICOMFilePath "ที่อยู่ไฟล์ DICOM"
        VARCHAR(100) JPEGFilePath "ที่อยู่ไฟล์ JPEG preview"
        VARCHAR(50) SOPInstanceUID "DICOM SOP Instance UID"
        VARCHAR(50) StudyInstanceUID "DICOM Study Instance UID"
        VARCHAR(50) SeriesInstanceUID "DICOM Series Instance UID"
        VARCHAR(20) ModalityID FK "เครื่องมือที่ถ่าย"
        INT ImageWidth "ความกว้างภาพ pixel"
        INT ImageHeight "ความสูงภาพ pixel"
        BIGINT FileSize "ขนาดไฟล์ bytes"
        VARCHAR(10) FilmSize FK "ขนาดฟิล์มที่ใช้"
        DATE AcquisitionDate "วันที่ได้ภาพ"
        TIME AcquisitionTime "เวลาได้ภาพ"
        BOOLEAN SentToPACS "ส่งไป PACS แล้ว"
        TIMESTAMP SentToPACSAt "วันเวลาที่ส่ง PACS"
        VARCHAR(20) PACSServerID FK "PACS Server ที่เก็บ"
        ENUM ImageStatus "สถานะภาพ ACQUIRED/SENT/STORED/ARCHIVED"
        TEXT ImageNotes "หมายเหตุภาพ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    %% Relationships
    XRAY_ORDER ||--o{ XRAY_REGISTRATION : "OrderID"
    XRAY_REGISTRATION ||--|| XRAY_EXAMINATION : "RegistrationID"
    XRAY_EXAMINATION ||--|| XRAY_REPORT : "ExaminationID"
    XRAY_EXAMINATION ||--o{ XRAY_IMAGE : "ExaminationID"

2.2 ตารางสนับสนุนการทำงาน (Support Tables)

erDiagram
    XRAY_ORDER_DETAIL {
        VARCHAR(20) OrderDetailID PK "รหัสรายละเอียด AUTO"
        VARCHAR(20) OrderID FK "รหัสคำสั่งตรวจ"
        INT SequenceNo "ลำดับ"
        VARCHAR(20) ViewCode FK "รหัสท่าถ่าย AP/PA/Lateral/etc"
        VARCHAR(20) SideCode FK "รหัสด้าน Left/Right/Bilateral"
        INT NumberOfView "จำนวนภาพที่ต้องการ"
        TEXT ViewNote "หมายเหตุท่า"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_FILM_USAGE {
        VARCHAR(20) FilmUsageID PK "รหัสการใช้ฟิล์ม AUTO"
        VARCHAR(20) ExaminationID FK "รหัสการตรวจ"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) FilmSizeCode FK "รหัสขนาดฟิล์ม"
        INT Quantity "จำนวน"
        VARCHAR(20) ViewCode FK "ท่าที่ใช้"
        VARCHAR(20) SideCode FK "ด้านที่ใช้"
        VARCHAR(50) FilmLotNumber "หมายเลข Lot ฟิล์ม"
        DATE UsageDate "วันที่ใช้"
        TIME UsageTime "เวลาที่ใช้"
        VARCHAR(10) UsedBy FK "ผู้ใช้ฟิล์ม"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_FILM_DAMAGED {
        VARCHAR(20) DamagedFilmID PK "รหัสฟิล์มเสีย AUTO"
        VARCHAR(20) ExaminationID FK "รหัสการตรวจ"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) FilmSizeCode FK "รหัสขนาดฟิล์ม"
        INT Quantity "จำนวน"
        VARCHAR(20) DamageReasonCode FK "รหัสสาเหตุฟิล์มเสีย"
        TEXT DamageDescription "รายละเอียดความเสียหาย"
        DATE DamageDate "วันที่เสีย"
        TIME DamageTime "เวลาที่เสีย"
        VARCHAR(10) ReportedBy FK "ผู้รายงาน"
        VARCHAR(10) VerifiedBy FK "ผู้ตรวจสอบ"
        BOOLEAN IsApproved "อนุมัติแล้ว"
        VARCHAR(10) ApprovedBy FK "ผู้อนุมัติ"
        TIMESTAMP ApprovedAt "วันเวลาที่อนุมัติ"
        TEXT ApprovalNote "หมายเหตุการอนุมัติ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_FILM_BORROWING {
        VARCHAR(20) BorrowingID PK "รหัสการยืม AUTO"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        INT FilmCount "จำนวนฟิล์มที่ยืม"
        VARCHAR(100) BorrowerName "ชื่อผู้ยืม"
        VARCHAR(10) BorrowerDepartment FK "แผนกผู้ยืม"
        VARCHAR(50) BorrowerPhone "เบอร์โทรผู้ยืม"
        TEXT BorrowReason "เหตุผลการยืม"
        DATE BorrowDate "วันที่ยืม"
        TIME BorrowTime "เวลาที่ยืม"
        DATE ExpectedReturnDate "วันที่ต้องคืน"
        DATE ActualReturnDate "วันที่คืนจริง"
        TIME ActualReturnTime "เวลาที่คืนจริง"
        VARCHAR(10) LentBy FK "ผู้ให้ยืม"
        VARCHAR(10) ReceivedBy FK "ผู้รับคืน"
        ENUM BorrowStatus "สถานะ BORROWED/RETURNED/OVERDUE/LOST"
        INT FilmReturnedCount "จำนวนฟิล์มที่คืน"
        INT FilmLostCount "จำนวนฟิล์มสูญหาย"
        TEXT ReturnNote "หมายเหตุการคืน"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_QUEUE {
        VARCHAR(20) QueueID PK "รหัสคิว AUTO"
        VARCHAR(20) RegistrationID FK "รหัสการลงทะเบียน"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(10) RoomCode FK "รหัสห้อง"
        INT QueueNumber "หมายเลขคิว"
        DATE QueueDate "วันที่คิว"
        TIME RegisterTime "เวลาลงทะเบียนคิว"
        TIME CalledTime "เวลาเรียกคิว"
        TIME EnteredTime "เวลาเข้าห้อง"
        VARCHAR(20) UrgencyCode FK "ความเร่งด่วน"
        ENUM QueueStatus "สถานะ WAITING/CALLED/IN_ROOM/COMPLETED/CANCELLED/NO_SHOW"
        VARCHAR(10) CalledBy FK "ผู้เรียกคิว"
        TEXT CancelReason "เหตุผลยกเลิก"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_APPOINTMENT {
        VARCHAR(20) AppointmentID PK "รหัสนัดหมาย AUTO"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(20) ReportID FK "รหัสรายงาน"
        DATE AppointmentDate "วันที่นัด"
        TIME AppointmentTime "เวลานัด"
        VARCHAR(20) AppointmentType "ประเภทนัด RESULT/FOLLOWUP/REPEAT"
        VARCHAR(10) RoomCode FK "ห้องที่นัด"
        TEXT Purpose "วัตถุประสงค์การนัด"
        TEXT Instruction "คำแนะนำ"
        VARCHAR(10) AppointedBy FK "ผู้นัด"
        ENUM AppointmentStatus "สถานะ SCHEDULED/CONFIRMED/COMPLETED/CANCELLED/NO_SHOW"
        BOOLEAN IsReminded "แจ้งเตือนแล้ว"
        TIMESTAMP RemindedAt "วันเวลาที่แจ้งเตือน"
        DATE ActualArrivalDate "วันที่มาจริง"
        TIME ActualArrivalTime "เวลามาจริง"
        TEXT CancelReason "เหตุผลยกเลิก"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    %% Relationships
    XRAY_ORDER ||--o{ XRAY_ORDER_DETAIL : "OrderID"
    XRAY_EXAMINATION ||--o{ XRAY_FILM_USAGE : "ExaminationID"
    XRAY_EXAMINATION ||--o{ XRAY_FILM_DAMAGED : "ExaminationID"
    XRAY_REGISTRATION ||--|| XRAY_QUEUE : "RegistrationID"
    XRAY_REPORT ||--o{ XRAY_APPOINTMENT : "ReportID"

2.3 ตารางจัดการระบบ (System Management Tables)

erDiagram
    XRAY_REPORT_TEMPLATE {
        VARCHAR(20) TemplateID PK "รหัส Template AUTO"
        VARCHAR(20) TemplateName "ชื่อ Template"
        VARCHAR(10) XRayItemCode FK "รหัสรายการตรวจ"
        VARCHAR(10) ModalityTypeCode FK "ประเภทเครื่อง"
        TEXT TemplateFinding "แม่แบบ Findings"
        TEXT TemplateImpression "แม่แบบ Impression"
        TEXT TemplateRecommendation "แม่แบบ Recommendation"
        VARCHAR(10) CreatedBy FK "ผู้สร้าง"
        VARCHAR(10) DepartmentCode FK "แผนกเจ้าของ Template"
        BOOLEAN IsPublic "เป็น Template สาธารณะ"
        BOOLEAN IsActive "สถานะใช้งาน"
        INT UsageCount "จำนวนครั้งที่ใช้"
        TIMESTAMP LastUsedAt "ใช้ครั้งล่าสุด"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_NOTIFICATION {
        VARCHAR(20) NotificationID PK "รหัสการแจ้งเตือน AUTO"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(10) HN FK "หมายเลขผู้ป่วย"
        VARCHAR(20) RelatedID "รหัสที่เกี่ยวข้อง ReportID/AppointmentID"
        VARCHAR(50) NotificationType "ประเภท CRITICAL_RESULT/REPORT_READY/APPOINTMENT_REMINDER"
        VARCHAR(10) RecipientID FK "ผู้รับแจ้งเตือน DoctorID/PatientID"
        VARCHAR(50) RecipientType "ประเภทผู้รับ DOCTOR/PATIENT/STAFF"
        VARCHAR(100) RecipientContact "ช่องทางติดต่อ Email/Phone/LINE"
        TEXT NotificationMessage "ข้อความแจ้งเตือน"
        ENUM NotificationChannel "ช่องทาง SMS/EMAIL/LINE/IN_APP"
        ENUM NotificationStatus "สถานะ PENDING/SENT/DELIVERED/FAILED"
        TIMESTAMP ScheduledAt "วันเวลาที่กำหนดส่ง"
        TIMESTAMP SentAt "วันเวลาที่ส่ง"
        TIMESTAMP DeliveredAt "วันเวลาที่ส่งถึง"
        TEXT ErrorMessage "ข้อความ Error"
        INT RetryCount "จำนวนครั้งที่ลองใหม่"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_AUDIT_LOG {
        VARCHAR(20) AuditLogID PK "รหัส Audit Log AUTO"
        VARCHAR(20) XN "X-Ray Number"
        VARCHAR(10) HN "หมายเลขผู้ป่วย"
        VARCHAR(50) TableName "ชื่อตาราง"
        VARCHAR(20) RecordID "รหัสระเบียน"
        VARCHAR(50) ActionType "ประเภทการกระทำ INSERT/UPDATE/DELETE/VIEW/PRINT"
        VARCHAR(50) FieldChanged "ฟิลด์ที่เปลี่ยน"
        TEXT OldValue "ค่าเก่า"
        TEXT NewValue "ค่าใหม่"
        VARCHAR(10) UserID FK "ผู้ทำรายการ"
        VARCHAR(50) UserRole "บทบาทผู้ใช้"
        VARCHAR(50) IPAddress "IP Address"
        VARCHAR(100) UserAgent "User Agent"
        TEXT Reason "เหตุผลการเปลี่ยนแปลง"
        TIMESTAMP ActionTimestamp "วันเวลาที่ทำรายการ"
    }

    XRAY_INTEGRATION_LOG {
        VARCHAR(20) IntegrationLogID PK "รหัส Integration Log AUTO"
        VARCHAR(20) XN "X-Ray Number"
        VARCHAR(10) HN "หมายเลขผู้ป่วย"
        VARCHAR(20) SourceOrderID "รหัสคำสั่งจากระบบต้นทาง"
        VARCHAR(50) IntegrationType "ประเภท ORDER_RECEIVED/RESULT_SENT/CHARGE_SENT"
        VARCHAR(50) SourceSystem "ระบบต้นทาง HISTORY/EXAMINATION/EMERGENCY/IPD"
        VARCHAR(50) TargetSystem "ระบบปลายทาง FINANCE/PACS/HISTORY/EXAMINATION"
        VARCHAR(20) TransactionID "รหัส Transaction"
        TEXT RequestData "ข้อมูลที่ส่ง"
        TEXT ResponseData "ข้อมูลที่ได้รับ"
        ENUM IntegrationStatus "สถานะ SUCCESS/FAILED/PENDING/TIMEOUT"
        VARCHAR(20) HTTPStatusCode "HTTP Status Code"
        TEXT ErrorMessage "ข้อความ Error"
        INT ResponseTime "เวลาตอบกลับ ms"
        INT RetryCount "จำนวนครั้งที่ลองใหม่"
        TIMESTAMP RequestTimestamp "วันเวลาที่ส่ง"
        TIMESTAMP ResponseTimestamp "วันเวลาที่ได้รับ"
    }

    PACS_TRANSFER_LOG {
        VARCHAR(20) TransferLogID PK "รหัส Transfer Log AUTO"
        VARCHAR(20) ImageID FK "รหัสภาพ"
        VARCHAR(20) XN FK "X-Ray Number"
        VARCHAR(50) SOPInstanceUID "DICOM SOP Instance UID"
        VARCHAR(50) StudyInstanceUID "DICOM Study Instance UID"
        VARCHAR(20) PACSServerID FK "PACS Server ปลายทาง"
        VARCHAR(50) PACSEndpoint "PACS Endpoint AE Title"
        ENUM TransferType "ประเภท SEND/RETRIEVE/QUERY"
        BIGINT FileSize "ขนาดไฟล์ bytes"
        INT TransferSpeed "ความเร็วส่ง KB/s"
        ENUM TransferStatus "สถานะ INITIATED/IN_PROGRESS/COMPLETED/FAILED/CANCELLED"
        INT ProgressPercentage "ความคืบหน้า %"
        TEXT ErrorCode "รหัส Error"
        TEXT ErrorMessage "ข้อความ Error"
        INT RetryCount "จำนวนครั้งที่ลองใหม่"
        TIMESTAMP StartedAt "วันเวลาเริ่ม"
        TIMESTAMP CompletedAt "วันเวลาสำเร็จ"
        TIMESTAMP FailedAt "วันเวลาล้มเหลว"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    %% Relationships
    XRAY_REPORT ||--o{ XRAY_NOTIFICATION : "triggers"
    XRAY_REPORT ||--o{ XRAY_AUDIT_LOG : "audits"
    XRAY_ORDER ||--o{ XRAY_INTEGRATION_LOG : "integrates"
    XRAY_IMAGE ||--o{ PACS_TRANSFER_LOG : "transfers"

3. ตาราง Master Data และการเชื่อมโยง

3.1 ตาราง Master Data ทางรังสีวิทยา

erDiagram
    XRAY_ITEM {
        VARCHAR_10 XRayItemCode PK "รหัสรายการตรวจ"
        VARCHAR_200 XRayItemNameTH "ชื่อรายการภาษาไทย"
        VARCHAR_200 XRayItemNameEN "ชื่อรายการภาษาอังกฤษ"
        VARCHAR_50 ShortName "ชื่อย่อ"
        VARCHAR_20 ModalityTypeCode FK "ประเภทเครื่อง"
        VARCHAR_50 ExamType "ประเภทการตรวจ"
        VARCHAR_50 ExamGroup "กลุ่มการตรวจ"
        TEXT Description "คำอธิบาย"
        INT AverageTime "เวลาเฉลี่ย_นาที"
        TEXT PreparationRequired "การเตรียมตัว"
        TEXT Contraindication "ข้อห้าม"
        INT StandardViews "จำนวนท่ามาตรฐาน"
        VARCHAR_10 StandardFilmSize FK "ขนาดฟิล์มมาตรฐาน"
        VARCHAR_50 FinancialCategory "หมวดค่าบริการ"
        VARCHAR_20 PricingModel "รูปแบบคิดค่า"
        DECIMAL_10_2 BasePrice "ราคาฐาน"
        BOOLEAN RequireRadiologist "ต้องการรังสีแพทย์"
        BOOLEAN RequireContrast "ต้องการสารทึบรังสี"
        BOOLEAN IsActive "สถานะใช้งาน"
        INT DisplayOrder "ลำดับแสดง"
        VARCHAR_10 CreatedBy FK "ผู้สร้าง"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_ITEM_PRICE {
        VARCHAR_20 ItemPriceID PK "รหัสค่าบริการ"
        VARCHAR_10 XRayItemCode FK "รหัสรายการตรวจ"
        VARCHAR_20 RightTypeCode FK "รหัสประเภทสิทธิ"
        DECIMAL_10_2 ItemPrice "ค่ารายการ"
        DECIMAL_10_2 FilmPrice "ค่าฟิล์มต่อแผ่น"
        DECIMAL_10_2 ViewPrice "ค่าต่อท่า"
        DECIMAL_10_2 RadiologistFee "ค่าอ่านฟิล์ม"
        DECIMAL_10_2 TotalPrice "ราคารวม"
        DECIMAL_10_2 Copayment "ส่วนที่ผู้ป่วยจ่าย"
        DECIMAL_10_2 RightsCovered "ส่วนที่สิทธิคุ้มครอง"
        DATE EffectiveDate "วันที่มีผล"
        DATE ExpiryDate "วันที่สิ้นสุด"
        BOOLEAN IsActive "สถานะใช้งาน"
        VARCHAR_10 ApprovedBy FK "ผู้อนุมัติ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    XRAY_VIEW_TYPE {
        VARCHAR_20 ViewCode PK "รหัสท่าถ่าย"
        VARCHAR_100 ViewNameTH "ชื่อท่าภาษาไทย"
        VARCHAR_100 ViewNameEN "ชื่อท่าภาษาอังกฤษ"
        VARCHAR_20 ViewAbbr "ตัวย่อ"
        TEXT Description "คำอธิบาย"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_SIDE_TYPE {
        VARCHAR_20 SideCode PK "รหัสด้าน"
        VARCHAR_50 SideNameTH "ชื่อด้านภาษาไทย"
        VARCHAR_50 SideNameEN "ชื่อด้านภาษาอังกฤษ"
        VARCHAR_10 SideAbbr "ตัวย่อ"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_URGENCY {
        VARCHAR_20 UrgencyCode PK "รหัสความเร่งด่วน"
        VARCHAR_50 UrgencyNameTH "ชื่อภาษาไทย"
        VARCHAR_50 UrgencyNameEN "ชื่อภาษาอังกฤษ"
        VARCHAR_50 ColorCode "รหัสสี"
        INT Priority "ระดับความสำคัญ"
        INT TargetTime "เวลาเป้าหมาย_นาที"
        INT MaxWaitTime "เวลารอสูงสุด_นาที"
        TEXT Description "คำอธิบาย"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    FILM_SIZE {
        VARCHAR_10 FilmSizeCode PK "รหัสขนาดฟิล์ม"
        VARCHAR_50 FilmSizeName "ชื่อขนาดฟิล์ม"
        VARCHAR_50 Dimensions "ขนาด"
        VARCHAR_10 Unit "หน่วย"
        DECIMAL_8_2 UnitPrice "ราคาต่อหน่วย"
        TEXT Description "คำอธิบาย"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    FILM_DAMAGE_REASON {
        VARCHAR_20 DamageReasonCode PK "รหัสสาเหตุฟิล์มเสีย"
        VARCHAR_100 ReasonNameTH "ชื่อสาเหตุภาษาไทย"
        VARCHAR_100 ReasonNameEN "ชื่อสาเหตุภาษาอังกฤษ"
        VARCHAR_50 Category "หมวด"
        TEXT Description "คำอธิบาย"
        BOOLEAN RequireApproval "ต้องการอนุมัติ"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    XRAY_ITEM ||--o{ XRAY_ITEM_PRICE : "has"

3.2 ตารางข้อมูลเครื่องมือและห้อง

erDiagram
    RADIOLOGY_ROOM {
        VARCHAR_10 RoomCode PK "รหัสห้อง"
        VARCHAR_100 RoomName "ชื่อห้อง"
        VARCHAR_20 ModalityTypeCode FK "ประเภทเครื่องหลัก"
        VARCHAR_10 DepartmentCode FK "รหัสแผนก"
        VARCHAR_50 Location "ที่ตั้ง"
        INT Capacity "จำนวนเครื่องในห้อง"
        TEXT Equipment "อุปกรณ์ในห้อง"
        VARCHAR_50 LeadShieldStatus "สถานะเกราะป้องกันรังสี"
        DATE LastInspection "วันตรวจสอบล่าสุด"
        DATE NextInspection "วันตรวจสอบครั้งถัดไป"
        BOOLEAN IsActive "สถานะใช้งาน"
        INT DisplayOrder "ลำดับแสดง"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    MODALITY {
        VARCHAR_10 ModalityID PK "รหัสเครื่อง"
        VARCHAR_100 ModalityName "ชื่อเครื่อง"
        VARCHAR_20 ModalityTypeCode FK "ประเภทเครื่อง"
        VARCHAR_10 RoomCode FK "รหัสห้อง"
        VARCHAR_50 Manufacturer "ผู้ผลิต"
        VARCHAR_50 Model "รุ่น"
        VARCHAR_50 SerialNumber "หมายเลขเครื่อง"
        VARCHAR_50 AETitle "DICOM_AE_Title"
        VARCHAR_50 IPAddress "IP_Address"
        INT Port "Port_Number"
        VARCHAR_50 MACAddress "MAC_Address"
        DATE InstallationDate "วันที่ติดตั้ง"
        DATE WarrantyExpiry "วันหมดประกัน"
        DATE LastMaintenance "วันบำรุงรักษาล่าสุด"
        DATE NextMaintenance "วันบำรุงรักษาครั้งถัดไป"
        VARCHAR_50 MaintenanceContract "สัญญาบำรุงรักษา"
        VARCHAR_20 ModalityStatus "สถานะ"
        TEXT TechnicalSpecs "ข้อมูลทางเทคนิค"
        BOOLEAN IsDICOMEnabled "รองรับ_DICOM"
        BOOLEAN IsActive "สถานะใช้งาน"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    MODALITY_TYPE {
        VARCHAR_20 ModalityTypeCode PK "รหัสประเภทเครื่อง"
        VARCHAR_100 TypeName "ชื่อประเภท"
        VARCHAR_20 TypeAbbr "ตัวย่อ"
        TEXT Description "คำอธิบาย"
        BOOLEAN RequireContrast "สามารถใช้สารทึบรังสี"
        BOOLEAN Is3DCapable "สามารถถ่ายภาพ_3D"
        VARCHAR_50 ImageFormat "รูปแบบภาพ"
        INT DisplayOrder "ลำดับแสดง"
        BOOLEAN IsActive "สถานะใช้งาน"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
    }

    PACS_SERVER {
        VARCHAR_20 PACSServerID PK "รหัส_PACS_Server"
        VARCHAR_100 ServerName "ชื่อเซิร์ฟเวอร์"
        VARCHAR_50 AETitle "DICOM_AE_Title"
        VARCHAR_50 IPAddress "IP_Address"
        INT Port "Port_Number"
        VARCHAR_50 Protocol "โปรโตคอล"
        VARCHAR_200 APIEndpoint "API_Endpoint_URL"
        VARCHAR_100 Username "ชื่อผู้ใช้"
        VARCHAR_100 PasswordHash "รหัสผ่าน_encrypted"
        VARCHAR_20 ServerType "ประเภท"
        BIGINT StorageCapacity "ความจุ_bytes"
        BIGINT StorageUsed "ใช้ไปแล้ว_bytes"
        DATE LastBackup "วันสำรองล่าสุด"
        VARCHAR_20 ServerStatus "สถานะ"
        BOOLEAN IsActive "สถานะใช้งาน"
        INT Priority "ลำดับความสำคัญ"
        TEXT Remarks "หมายเหตุ"
        TIMESTAMP CreatedAt "วันเวลาที่สร้าง"
        TIMESTAMP UpdatedAt "วันเวลาที่แก้ไข"
    }

    MODALITY_TYPE ||--o{ MODALITY : "type"
    MODALITY_TYPE ||--o{ RADIOLOGY_ROOM : "type"
    RADIOLOGY_ROOM ||--o{ MODALITY : "location"

4. Integration Architecture Diagram

แผนภาพแสดงการเชื่อมโยงกับระบบอื่นๆ ผ่าน API และ DICOM

graph TB
    subgraph "Core_Radiology_System"
        XRAY_ORDER[XRAY_ORDER]
        XRAY_REG[XRAY_REGISTRATION]
        XRAY_EXAM[XRAY_EXAMINATION]
        XRAY_REPORT[XRAY_REPORT]
        XRAY_IMAGE[XRAY_IMAGE]
    end

    subgraph "System_Integration_APIs"
        API_MEDRECORD[Medical_Record_API_1_2_1]
        API_HISTORY[History_Taking_API_1_2_2]
        API_EXAM[Examination_API_1_2_3]
        API_ER[Emergency_API_1_2_4]
        API_IPD[IPD_API_1_2_17]
        API_FINANCE[Finance_API_1_2_14]
        API_RIGHTS[Rights_API_1_2_15]
    end

    subgraph "PACS_Integration"
        PACS[PACS_Server_DICOM]
        MODALITY_DEV[Modality_Devices]
    end

    subgraph "Master_Data_APIs"
        API_DOCTOR[Doctor_Master_from_1_2_1]
        API_DEPARTMENT[Department_Master_from_1_2_1]
        API_RIGHTS_MASTER[Rights_Type_Master_from_1_2_15]
    end

    %% Inbound Integration
    API_HISTORY -->|Order_from_History| XRAY_ORDER
    API_EXAM -->|Order_from_Exam| XRAY_ORDER
    API_ER -->|STAT_Order| XRAY_ORDER
    API_IPD -->|IPD_Order| XRAY_ORDER

    API_MEDRECORD -->|Patient_Data| XRAY_ORDER
    API_MEDRECORD -->|Visit_Data| XRAY_ORDER
    API_RIGHTS -->|Verify_Rights| XRAY_REG

    %% Outbound Integration
    XRAY_REPORT -->|Send_Result| API_HISTORY
    XRAY_REPORT -->|Send_Result| API_EXAM
    XRAY_REPORT -->|STAT_Result| API_ER
    XRAY_REPORT -->|Send_Result| API_IPD

    XRAY_ORDER -->|Charge_Create| API_FINANCE
    XRAY_EXAM -->|Charge_Detail| API_FINANCE

    %% PACS Integration
    MODALITY_DEV -.->|Send_Images| XRAY_IMAGE
    XRAY_IMAGE -.->|Store_Images| PACS
    PACS -.->|Find_Old_Images| XRAY_IMAGE
    PACS -.->|Retrieve_Images| XRAY_IMAGE

    %% Master Data Sync
    API_DOCTOR -.->|Sync_Daily| XRAY_ORDER
    API_DEPARTMENT -.->|Sync_Daily| XRAY_ORDER
    API_RIGHTS_MASTER -.->|Sync_Daily| XRAY_REG

    %% Internal Flow
    XRAY_ORDER --> XRAY_REG
    XRAY_REG --> XRAY_EXAM
    XRAY_EXAM --> XRAY_IMAGE
    XRAY_EXAM --> XRAY_REPORT

    %% Styling
    classDef coreSystem fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
    classDef apiIntegration fill:#ffcdd2,stroke:#c62828,stroke-width:2px
    classDef pacsIntegration fill:#e1bee7,stroke:#6a1b9a,stroke-width:2px
    classDef masterData fill:#fff9c4,stroke:#f57f17,stroke-width:2px

    class XRAY_ORDER,XRAY_REG,XRAY_EXAM,XRAY_REPORT,XRAY_IMAGE coreSystem
    class API_MEDRECORD,API_HISTORY,API_EXAM,API_ER,API_IPD,API_FINANCE,API_RIGHTS apiIntegration
    class PACS,MODALITY_DEV pacsIntegration
    class API_DOCTOR,API_DEPARTMENT,API_RIGHTS_MASTER masterData

5. Database Relationships Summary

Primary Relationships (ความสัมพันธ์หลัก)

  1. XRAY_ORDER เป็นจุดเริ่มต้นของกระบวนการ เชื่อมโยงกับ:
  2. XRAY_ORDER_DETAIL (1:N) - รายละเอียดท่าและด้านที่ต้องการ
  3. XRAY_REGISTRATION (1:1) - การลงทะเบียนและออก XN
  4. XRAY_INTEGRATION_LOG (1:N) - บันทึกการรับคำสั่งจากระบบอื่น
  5. XRAY_ITEM (N:1) - อ้างอิงรายการตรวจ
  6. XRAY_URGENCY (N:1) - ระดับความเร่งด่วน
  7. RADIOLOGY_ROOM (N:1) - ห้องที่ต้องการ

  8. XRAY_REGISTRATION จัดการการลงทะเบียน:

  9. XRAY_QUEUE (1:1) - คิวการรอตรวจ
  10. XRAY_EXAMINATION (1:1) - การตรวจและถ่ายภาพจริง
  11. XRAY_ITEM_PRICE (N:1) - ค่าบริการตามสิทธิ

  12. XRAY_EXAMINATION เก็บข้อมูลการตรวจ:

  13. XRAY_FILM_USAGE (1:N) - บันทึกการใช้ฟิล์ม
  14. XRAY_FILM_DAMAGED (1:N) - บันทึกฟิล์มเสีย
  15. XRAY_IMAGE (1:N) - ภาพที่ได้จากการตรวจ
  16. XRAY_REPORT (1:1) - รายงานผลการอ่าน
  17. MODALITY (N:1) - เครื่องมือที่ใช้ตรวจ
  18. RADIOLOGY_ROOM (N:1) - ห้องที่ตรวจ

  19. XRAY_REPORT เก็บรายงานผลโดยรังสีแพทย์:

  20. XRAY_APPOINTMENT (1:N) - การนัดฟังผลหรือตรวจซ้ำ
  21. XRAY_NOTIFICATION (1:N) - การแจ้งเตือนผลการตรวจ
  22. XRAY_AUDIT_LOG (1:N) - บันทึกการแก้ไขรายงาน
  23. XRAY_REPORT_TEMPLATE (N:1) - Template ที่ใช้

  24. XRAY_IMAGE จัดการภาพรังสี:

  25. PACS_TRANSFER_LOG (1:N) - บันทึกการส่งภาพไป PACS
  26. PACS_SERVER (N:1) - เซิร์ฟเวอร์ PACS ที่เก็บภาพ
  27. MODALITY (N:1) - เครื่องที่ถ่ายภาพ
  28. XRAY_VIEW_TYPE (N:1) - ท่าที่ถ่าย
  29. XRAY_SIDE_TYPE (N:1) - ด้านที่ถ่าย
  30. FILM_SIZE (N:1) - ขนาดฟิล์มที่ใช้

  31. XRAY_FILM_BORROWING ติดตามการยืม-คืนฟิล์ม:

  32. ไม่เชื่อมโยงโดยตรงกับตารางหลัก แต่ใช้ XN และ HN ในการอ้างอิง

Integration Points (จุดเชื่อมโยง)

การรับคำสั่งตรวจ (Inbound): - จากระบบซักประวัติ (1.2.2) → XRAY_ORDER ผ่าน API - จากระบบห้องตรวจแพทย์ (1.2.3) → XRAY_ORDER ผ่าน API - จากระบบห้องฉุกเฉิน (1.2.4) → XRAY_ORDER ผ่าน API (STAT Priority) - จากระบบผู้ป่วยใน (1.2.17) → XRAY_ORDER ผ่าน API

การส่งผลการตรวจ (Outbound): - ไปยังระบบซักประวัติ (1.2.2) ← XRAY_REPORT ผ่าน API Callback - ไปยังระบบห้องตรวจแพทย์ (1.2.3) ← XRAY_REPORT ผ่าน API Callback - ไปยังระบบห้องฉุกเฉิน (1.2.4) ← XRAY_REPORT ผ่าน API Callback (STAT) - ไปยังระบบผู้ป่วยใน (1.2.17) ← XRAY_REPORT ผ่าน API Callback

การส่งข้อมูลการเงิน: - ไปยังระบบการเงิน (1.2.14) ← XRAY_ORDER + XRAY_EXAM ผ่าน API

การดึงข้อมูลอ้างอิง: - จากระบบเวชระเบียน (1.2.1) → HN, VisitID, Doctor, Department - จากระบบตรวจสอบสิทธิ (1.2.15) → Rights Verification

PACS Integration (DICOM Protocol): - รับภาพจาก Modality ← XRAY_IMAGE ผ่าน DICOM C-STORE - ส่งภาพไป PACS → XRAY_IMAGE ผ่าน DICOM C-STORE - ค้นหาภาพเก่า ↔ XRAY_IMAGE ผ่าน DICOM C-FIND - ดึงภาพเก่ามาเปรียบเทียบ ↔ XRAY_IMAGE ผ่าน DICOM C-MOVE

Master Data Dependencies (การพึ่งพา Master Data)

Master Data ภายใน (ระบบรังสีวิทยา): - XRAY_ITEM - รายการตรวจทั้งหมด - XRAY_VIEW_TYPE - ท่าถ่ายมาตรฐาน (AP, PA, Lateral, Oblique, etc.) - XRAY_SIDE_TYPE - ด้าน (Left, Right, Bilateral, Center) - XRAY_URGENCY - ความเร่งด่วน (STAT, URGENT, ROUTINE) - FILM_SIZE - ขนาดฟิล์ม (8x10, 10x12, 14x17 inch) - FILM_DAMAGE_REASON - สาเหตุฟิล์มเสีย - MODALITY - เครื่องมือถ่ายภาพ - MODALITY_TYPE - ประเภทเครื่อง (CR, DR, CT, MRI, US) - RADIOLOGY_ROOM - ห้องตรวจรังสี - PACS_SERVER - เซิร์ฟเวอร์ PACS - XRAY_REPORT_TEMPLATE - Template รายงานผล

Master Data จากระบบอื่น (Reference): - PATIENT (1.2.1) - ข้อมูลผู้ป่วย - VISIT (1.2.1) - ข้อมูลการเข้ารับบริการ - DOCTOR (1.2.1) - ข้อมูลแพทย์ผู้สั่งและรังสีแพทย์ - DEPARTMENT (1.2.1) - ข้อมูลแผนก - RIGHT_TYPE (1.2.15) - ประเภทสิทธิการรักษา

Audit and Logging (การตรวจสอบและบันทึก)

การตรวจสอบ (Audit Trail): - XRAY_AUDIT_LOG - บันทึกการเข้าถึงและแก้ไขข้อมูลทั้งหมด - การดูข้อมูลผู้ป่วย - การแก้ไขคำสั่งตรวจ - การแก้ไขรายงานผล - การพิมพ์เอกสาร - การเข้าถึงภาพ

การบันทึกการเชื่อมโยง (Integration Logging): - XRAY_INTEGRATION_LOG - บันทึกการส่ง-รับข้อมูลกับระบบอื่น - รับคำสั่งตรวจ - ส่งผลการตรวจ - ส่งค่าบริการ - ตรวจสอบสิทธิ

การบันทึก PACS (PACS Transfer Logging): - PACS_TRANSFER_LOG - บันทึกการส่งภาพไป PACS - สถานะการส่งภาพ - ความเร็วการส่ง - ข้อผิดพลาด - การลองใหม่


6. ข้อมูลสำคัญและข้อจำกัด

6.1 ข้อมูลสำคัญ (Key Features Coverage)

✅ TOR 1.2.8.1 - ข้อมูลพื้นฐาน: - ✅ กำหนดรายการ X-Ray → XRAY_ITEM - ✅ เชื่อมโยงหมวดหมู่ค่าบริการ → XRAY_ITEM.FinancialCategory, XRAY_ITEM_PRICE - ✅ รูปแบบการชำระเงิน → XRAY_ITEM.PricingModel (BY_ITEM/BY_FILM/BY_VIEW/PACKAGE)

✅ TOR 1.2.8.2 - การส่งตรวจรังสีวิทยา: - ✅ บันทึกข้อมูลการลงทะเบียน → XRAY_ORDER (แพทย์ผู้สั่ง, รายการ, ท่า, ด้าน, วันที่, ความเร่งด่วน, ห้อง, สภาพผู้ป่วย) - ✅ พิมพ์รายการที่สั่ง → ผ่าน XRAY_ORDER และ XRAY_ORDER_DETAIL - ✅ ส่งตรวจ Online → XRAY_INTEGRATION_LOG ติดตาม API calls

✅ TOR 1.2.8.3 - การรายงานผลทางห้องรังสีวิทยา: - ✅ แสดงผู้ป่วยที่ส่งตรวจ Online → View จาก XRAY_ORDER + XRAY_REGISTRATION - ✅ ค้นหาผู้ป่วย → ผ่าน HN, ชื่อ-นามสกุล, บัตรประชาชน, Barcode - ✅ แสดงข้อมูล → HN, XN, ชื่อ, อายุ, วันที่สั่ง, รายการ, ความเร่งด่วน, แผนก, สิทธิ, ค่าใช้จ่าย - ✅ เรียกดูประวัติ → Integration กับระบบอื่น ผ่าน API - ✅ ลงทะเบียนและออก XN → XRAY_REGISTRATION.XN - ✅ บันทึกจำนวนฟิล์มใช้ → XRAY_FILM_USAGE - ✅ บันทึกฟิล์มเสีย → XRAY_FILM_DAMAGED - ✅ นัดหมายฟังผล → XRAY_APPOINTMENT - ✅ ตรวจสอบรายการลงผล → XRAY_REPORT.IsLocked - ✅ บันทึกผลการอ่านฟิล์ม → XRAY_REPORT.Findings, Impression - ✅ ใช้ Template → XRAY_REPORT_TEMPLATE - ✅ Load Text File → รองรับใน XRAY_REPORT.Findings - ✅ Lock ผลการอ่าน → XRAY_REPORT.IsLocked, LockedBy, LockedAt - ✅ บันทึกการส่งตรวจผู้ป่วย → Integration กับระบบอื่น - ✅ ผู้สั่งดูผลออนไลน์ → XRAY_NOTIFICATION + API Callback

✅ TOR 1.2.8.4 - การยืมคืนฟิล์ม X-Ray: - ✅ บันทึกการยืม-คืน → XRAY_FILM_BORROWING - ✅ แสดงข้อมูลผู้ยืม → BorrowerName, BorrowerDepartment, BorrowReason, BorrowerPhone, Remarks - ✅ ตรวจสอบการยืม-คืน → BorrowStatus, ExpectedReturnDate, ActualReturnDate

✅ TOR 1.2.8.5 - การพิมพ์: - ✅ พิมพ์ใบ Request X-Ray → จาก XRAY_ORDER + XRAY_ORDER_DETAIL (มี Comment Box) - ✅ พิมพ์ XN Label → จาก XRAY_REGISTRATION.XN - ✅ พิมพ์ใบรายงานผล → จาก XRAY_REPORT - ✅ พิมพ์ใบนัด → จาก XRAY_APPOINTMENT

6.2 คุณสมบัติเพิ่มเติม (Additional Features)

  • DICOM Integration: รองรับการรับ-ส่งภาพผ่าน DICOM Protocol
  • PACS Integration: เชื่อมต่อกับระบบ PACS สำหรับเก็บภาพ
  • Multi-Modality Support: รองรับหลายประเภทเครื่อง (CR, DR, CT, MRI, Ultrasound)
  • STAT Order Management: จัดการคำสั่งด่วนจากห้องฉุกเฉิน
  • Queue Management: จัดการคิวตามความเร่งด่วน
  • Critical Result Notification: แจ้งเตือนผลวิกฤตทันที
  • Structured Reporting: รายงานแบบมีโครงสร้างด้วย Template
  • Film Management: ติดตามฟิล์มใช้ ฟิล์มเสีย และการยืม-คืน
  • Image Comparison: เปรียบเทียบกับภาพเก่า
  • Audit Trail: บันทึกการเข้าถึงและแก้ไขข้อมูลทั้งหมด

6.3 ข้อจำกัดและหมายเหตุ (Constraints and Notes)

ข้อจำกัด: - 🔸 Foreign Key Constraints: ตาราง Master Data จากระบบอื่นเป็น Reference เท่านั้น - 🔸 DICOM Compliance: ต้องปฏิบัติตามมาตรฐาน DICOM อย่างเคร่งครัด - 🔸 Image Storage: ต้องมีระบบจัดเก็บภาพที่มีความจุเพียงพอ - 🔸 Network Bandwidth: การส่งภาพ DICOM ต้องการ Bandwidth สูง - 🔸 Data Retention: ภาพและรายงานต้องเก็บไว้ตามกฎหมาย (5-10 ปี) - 🔸 PACS Availability: ต้องมี PACS ที่พร้อมใช้งาน หากไม่มีต้องเก็บภาพในระบบ

หมายเหตุสำคัญ: - 📝 XN Format: ควรกำหนดรูปแบบ XN ให้ชัดเจน เช่น XR-YYMMDD-NNNN - 📝 Data Synchronization: ต้องมีกลไกซิงค์ Master Data จากระบบอื่นเป็นระยะ - 📝 Image Backup: ต้องมีระบบสำรองภาพอัตโนมัติ - 📝 DICOM Worklist: ควรใช้ DICOM Worklist (MWL) เพื่อลด Manual Entry - 📝 Radiologist Approval: รายงานที่ Lock แล้วต้องได้รับอนุมัติจากรังสีแพทย์เท่านั้น - 📝 Critical Result Protocol: ต้องมีขั้นตอนการแจ้งผลวิกฤตที่ชัดเจน - 📝 Equipment Calibration: ต้องมีการ Calibrate เครื่องมือเป็นระยะ - 📝 Radiation Safety: ต้องปฏิบัติตามหลักความปลอดภัยทางรังสี


เอกสารนี้จัดทำขึ้นเพื่อใช้ในการพัฒนาระบบรังสีวิทยาสำหรับโรงพยาบาลค่ายธนรัชน์ ที่ครอบคลุม TOR 100% พร้อมการเชื่อมโยง PACS และระบบอื่นๆ อย่างสมบูรณ์ และต้องได้รับการอนุมัติจากผู้มีอำนาจก่อนนำไปใช้ในการพัฒนาระบบ