Database Schema Design
ระบบงานชันสูตร (Laboratory Information System)
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.7-SCHEMA
เวอร์ชัน: 1.0
วันที่: 11 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
Database Schema Design
ER Diagram: รายละเอียด Entity-Relationship Diagram และความสัมพันธ์ระหว่างตารางแบบละเอียด ดูได้ในไฟล์ ER Diagram.md
ระบบงานชันสูตรเป็นระบบที่ทำหน้าที่เป็นศูนย์กลางการจัดการงานห้องปฏิบัติการ รองรับการสั่งตรวจ การรายงานผล การควบคุมคุณภาพ และการส่งผล Lab นอก โดยเชื่อมโยงกับระบบอื่นผ่าน API Integration:
- ระบบเวชระเบียน (1.2.1): ข้อมูลผู้ป่วยหลักและ Visit
- ระบบซักประวัติ (1.2.2): การสั่งตรวจจากการซักประวัติ
- ระบบห้องตรวจแพทย์ (1.2.3): การสั่งตรวจจากห้องตรวจ
- ระบบห้องฉุกเฉิน (1.2.4): การสั่งตรวจแบบ STAT จากห้องฉุกเฉิน
- ระบบนัดหมายและตารางเวรแพทย์ (1.2.6): การสั่งตรวจล่วงหน้าตามนัด
- ระบบตรวจสอบสิทธิ (1.2.15): การตรวจสอบสิทธิสำหรับการตรวจ Lab
- ระบบการเงิน (1.2.14): การคำนวณค่าบริการตรวจ Lab
- ระบบผู้ดูแลระบบ (1.2.21): การจัดการข้อมูลพื้นฐานและตั้งค่า
8.2.7 ตารางหลัก (Core Tables)
หมายเหตุ: ตาราง PATIENT, VISIT จะอยู่ในระบบเวชระเบียน (1.2.1) ระบบงานชันสูตรจะอ้างอิงผ่าน Foreign Key เท่านั้น
8.2.7.1 ข้อมูลพื้นฐาน (Master Data)
Table: LAB_TEST_MASTER (ข้อมูลรายการตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลรายการตรวจ Lab ทั้งหมด รวมถึงค่าปกติ ค่าวิกฤต และการตั้งค่าต่างๆ ตาม TOR ข้อ 1.2.7.1.1
| Field | Type | Key | Description |
|---|---|---|---|
| TestCode | VARCHAR(20) | PK | รหัสรายการตรวจ |
| TestName | NVARCHAR(200) | ชื่อรายการตรวจ | |
| TestNameEng | NVARCHAR(200) | ชื่อรายการตรวจ (อังกฤษ) | |
| TestNameShort | NVARCHAR(50) | ชื่อรายการตรวจ (ย่อ) | |
| TestCategoryCode | VARCHAR(10) | FK | รหัสหมวดการตรวจ (อ้างอิง LAB_CATEGORY) |
| TestGroupCode | VARCHAR(10) | FK | รหัสกลุ่มการตรวจ (อ้างอิง LAB_GROUP) |
| SpecimenTypeCode | VARCHAR(10) | FK | รหัสประเภทสิ่งส่งตรวจ (อ้างอิง SPECIMEN_TYPE) |
| UnitCode | VARCHAR(10) | FK | รหัสหน่วย (อ้างอิง LAB_UNIT) |
| ServiceCost | DECIMAL(10,2) | อัตราค่าบริการ | |
| TAT_Normal | INT | เวลาออกผลปกติ (นาที) | |
| TAT_STAT | INT | เวลาออกผล STAT (นาที) | |
| TAT_ASAP | INT | เวลาออกผล ASAP (นาที) | |
| IsOutLab | BIT | เป็น Lab นอก | |
| OutLabName | NVARCHAR(200) | ชื่อ Lab นอก | |
| OutLabCode | VARCHAR(20) | รหัส Lab นอก | |
| OutLabCost | DECIMAL(10,2) | ค่าบริการ Lab นอก | |
| IsActive | BIT | ใช้งานอยู่ | |
| IsSTAT | BIT | สามารถสั่งแบบ STAT ได้ | |
| IsGroupable | BIT | สามารถจัดกลุ่มได้ | |
| RequiresFasting | BIT | ต้องงดอาหาร | |
| FastingHours | INT | จำนวนชั่วโมงงดอาหาร | |
| TreatmentGroupCode | VARCHAR(20) | FK | รหัสกลุ่มค่ารักษาพยาบาล (อ้างอิง TREATMENT_GROUP) |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
Table: LAB_NORMAL_VALUES (ค่าปกติการตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลค่าปกติของการตรวจ Lab แยกตามอายุและเพศ ตาม TOR ข้อ 1.2.7.1.1
| Field | Type | Key | Description |
|---|---|---|---|
| NormalValueID | VARCHAR(20) | PK | รหัสค่าปกติ |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| AgeMin | INT | อายุขั้นต่ำ (วัน) | |
| AgeMax | INT | อายุสูงสุด (วัน) | |
| Gender | CHAR(1) | เพศ (M/F/A=ทั้งหมด) | |
| ValueType | ENUM('NUMERIC','TEXT','RANGE') | ประเภทค่า | |
| MinValue | DECIMAL(15,6) | ค่าต่ำสุด (กรณีตัวเลข) | |
| MaxValue | DECIMAL(15,6) | ค่าสูงสุด (กรณีตัวเลข) | |
| TextValue | NVARCHAR(200) | ค่าปกติ (กรณีข้อความ) | |
| PossibleValues | NTEXT | ค่าที่เป็นไปได้ (JSON Array) | |
| CriticalLow | DECIMAL(15,6) | ค่าวิกฤตต่ำ | |
| CriticalHigh | DECIMAL(15,6) | ค่าวิกฤตสูง | |
| PanicLow | DECIMAL(15,6) | ค่า Panic ต่ำ | |
| PanicHigh | DECIMAL(15,6) | ค่า Panic สูง | |
| IsActive | BIT | ใช้งานอยู่ | |
| EffectiveDate | DATE | วันที่เริ่มใช้ | |
| ExpiryDate | DATE | วันที่หมดอายุ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_TEST_GROUP (กลุ่มการตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลกลุ่มการตรวจ Lab สำหรับการสั่งแบบเป็นกลุ่ม ตาม TOR ข้อ 1.2.7.1.2
| Field | Type | Key | Description |
|---|---|---|---|
| GroupCode | VARCHAR(10) | PK | รหัสกลุ่มการตรวจ |
| GroupName | NVARCHAR(100) | ชื่อกลุ่มการตรวจ | |
| GroupNameEng | NVARCHAR(100) | ชื่อกลุ่มการตรวจ (อังกฤษ) | |
| GroupDescription | NTEXT | คำอธิบายกลุ่มการตรวจ | |
| CategoryCode | VARCHAR(10) | FK | รหัสหมวดการตรวจ |
| GroupCost | DECIMAL(10,2) | ราคากลุ่ม | |
| DiscountPercent | DECIMAL(5,2) | เปอร์เซ็นต์ส่วนลด | |
| IsPackage | BIT | เป็นแพ็คเกจ | |
| RequiresFasting | BIT | ต้องงดอาหาร | |
| FastingHours | INT | จำนวนชั่วโมงงดอาหาร | |
| TATMinutes | INT | เวลาออกผล (นาที) | |
| IsActive | BIT | ใช้งานอยู่ | |
| DisplayOrder | INT | ลำดับการแสดง | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_GROUP_TESTS (รายการตรวจในกลุ่ม)
วัตถุประสงค์: เก็บข้อมูลรายการตรวจ Lab ที่อยู่ในแต่ละกลุ่ม
| Field | Type | Key | Description |
|---|---|---|---|
| GroupTestID | VARCHAR(20) | PK | รหัสรายการในกลุ่ม |
| GroupCode | VARCHAR(10) | FK | รหัสกลุ่มการตรวจ |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| IsRequired | BIT | จำเป็นต้องมี | |
| DisplayOrder | INT | ลำดับการแสดง | |
| CreatedDate | DATETIME | วันที่สร้าง |
Table: LAB_CATEGORY (หมวดการตรวจ Lab)
วัตถุประสงค์: จัดหมวดหมู่การตรวจ Lab ตาม TOR ข้อ 1.2.7.1.3
| Field | Type | Key | Description |
|---|---|---|---|
| CategoryCode | VARCHAR(10) | PK | รหัสหมวดการตรวจ |
| CategoryName | NVARCHAR(100) | ชื่อหมวดการตรวจ | |
| CategoryNameEng | NVARCHAR(100) | ชื่อหมวดการตรวจ (อังกฤษ) | |
| ParentCategoryCode | VARCHAR(10) | FK | หมวดหลัก |
| TreatmentGroupCode | VARCHAR(20) | FK | รหัสกลุ่มค่ารักษาพยาบาล |
| DisplayOrder | INT | ลำดับการแสดง | |
| IsActive | BIT | ใช้งานอยู่ | |
| Description | NTEXT | คำอธิบาย | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: SPECIMEN_TYPE (ประเภทสิ่งส่งตรวจ)
วัตถุประสงค์: เก็บข้อมูลประเภทสิ่งส่งตรวจต่างๆ ตาม TOR ข้อ 1.2.7.1.1
| Field | Type | Key | Description |
|---|---|---|---|
| SpecimenCode | VARCHAR(10) | PK | รหัสสิ่งส่งตรวจ |
| SpecimenName | NVARCHAR(100) | ชื่อสิ่งส่งตรวจ | |
| SpecimenNameEng | NVARCHAR(100) | ชื่อสิ่งส่งตรวจ (อังกฤษ) | |
| ContainerType | NVARCHAR(100) | ประเภทภาชนะ | |
| ContainerColor | NVARCHAR(50) | สีภาชนะ | |
| Volume | DECIMAL(10,2) | ปริมาณที่ต้องการ | |
| VolumeUnit | VARCHAR(10) | หน่วยปริมาณ | |
| StorageTemperature | NVARCHAR(50) | อุณหภูมิเก็บรักษา | |
| StabilityHours | INT | ความคงตัว (ชั่วโมง) | |
| PreparationInstructions | NTEXT | คำแนะนำการเตรียม | |
| CollectionInstructions | NTEXT | คำแนะนำการเก็บ | |
| IsActive | BIT | ใช้งานอยู่ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_UNIT (หน่วยการตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลหน่วยต่างๆ ที่ใช้ในการรายงานผล Lab
| Field | Type | Key | Description |
|---|---|---|---|
| UnitCode | VARCHAR(10) | PK | รหัสหน่วย |
| UnitName | NVARCHAR(50) | ชื่อหน่วย | |
| UnitSymbol | NVARCHAR(20) | สัญลักษณ์หน่วย | |
| UnitType | VARCHAR(20) | ประเภทหน่วย | |
| ConversionFactor | DECIMAL(15,6) | ตัวคูณการแปลง | |
| BaseUnitCode | VARCHAR(10) | FK | หน่วยพื้นฐาน |
| IsActive | BIT | ใช้งานอยู่ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_FORM_TEMPLATE (แบบฟอร์มการสั่ง Lab)
วัตถุประสงค์: เก็บ Template แบบฟอร์มการสั่ง Lab ที่สามารถออกแบบเองได้ ตาม TOR ข้อ 1.2.7.1.5
| Field | Type | Key | Description |
|---|---|---|---|
| TemplateID | VARCHAR(20) | PK | รหัส Template |
| TemplateName | NVARCHAR(100) | ชื่อ Template | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| ClinicCode | VARCHAR(10) | FK | รหัสคลินิก |
| FormLayout | NTEXT | รูปแบบฟอร์ม (JSON) | |
| DefaultTests | NTEXT | รายการตรวจเริ่มต้น (JSON Array) | |
| HeaderText | NTEXT | ข้อความหัวกระดาษ | |
| FooterText | NTEXT | ข้อความท้ายกระดาษ | |
| PaperSize | VARCHAR(10) | ขนาดกระดาษ | |
| Orientation | VARCHAR(10) | แนวกระดาษ | |
| IsDefault | BIT | เป็น Template เริ่มต้น | |
| IsActive | BIT | ใช้งานอยู่ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
8.2.7.2 การสั่งตรวจห้องปฏิบัติการ (Lab Orders)
Table: LAB_ORDER (การสั่งตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลการสั่งตรวจ Lab จากแต่ละจุดบริการ รองรับการสั่งแบบ Online ตาม TOR ข้อ 1.2.7.2.1
| Field | Type | Key | Description |
|---|---|---|---|
| OrderID | VARCHAR(20) | PK | รหัสการสั่งตรวจ (LAB-XXXXXXXXXXX) |
| LabNumber | VARCHAR(15) | UK | หมายเลข Lab (รัน Auto ต่อเนื่อง) |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย (อ้างอิง PATIENT จากระบบเวชระเบียน) |
| VisitID | VARCHAR(20) | FK | รหัสการเข้ารับบริการ (อ้างอิง VISIT จากระบบเวชระเบียน) |
| AN | VARCHAR(15) | FK | หมายเลขผู้ป่วยใน (สำหรับ IPD) |
| SourceSystem | VARCHAR(20) | ระบบที่สั่ง (HISTORY_TAKING/EXAMINATION/EMERGENCY/APPOINTMENT) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงระบบต้นทาง |
| OrderDate | DATE | วันที่สั่งตรวจ | |
| OrderTime | TIME | เวลาที่สั่งตรวจ | |
| OrderDateTime | DATETIME | วันเวลาที่สั่งตรวจ (รวม) | |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้สั่ง |
| DoctorName | NVARCHAR(100) | ชื่อแพทย์ผู้สั่ง | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนกที่สั่ง |
| ClinicCode | VARCHAR(10) | FK | รหัสคลินิกที่สั่ง |
| RoomCode | VARCHAR(10) | FK | รหัสห้องที่สั่ง |
| Priority | ENUM('NORMAL','STAT','ASAP','ROUTINE') | ลำดับความสำคัญ | |
| PatientType | ENUM('OPD','IPD','ER','CHECKUP') | ประเภทผู้ป่วย | |
| OrderStatus | ENUM('ORDERED','COLLECTED','RECEIVED','PROCESSING','COMPLETED','CANCELLED') | สถานะการสั่ง | |
| CollectionDateTime | DATETIME | วันเวลาเก็บสิ่งส่งตรวจ | |
| CollectedBy | VARCHAR(50) | ผู้เก็บสิ่งส่งตรวจ | |
| ReceivedDateTime | DATETIME | วันเวลาที่ Lab รับ | |
| ReceivedBy | VARCHAR(50) | ผู้รับใน Lab | |
| ClinicalInfo | NTEXT | ข้อมูลทางคลินิก | |
| ClinicalDiagnosis | NTEXT | การวินิจฉัยเบื้องต้น | |
| SpecialInstructions | NTEXT | คำแนะนำพิเศษ | |
| RightsCode | VARCHAR(10) | FK | รหัสสิทธิการรักษา |
| TotalCost | DECIMAL(10,2) | ค่าใช้จ่ายรวม | |
| IsGroup | BIT | สั่งแบบกลุ่ม | |
| GroupCode | VARCHAR(10) | FK | รหัสกลุ่มการตรวจ |
| TemplateID | VARCHAR(20) | FK | รหัส Template ที่ใช้ |
| IsReorder | BIT | เป็นการสั่งซ้ำ | |
| OriginalOrderID | VARCHAR(20) | FK | รหัสการสั่งต้นฉบับ |
| Barcode | VARCHAR(50) | UK | บาร์โค้ดใบ Lab |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สั่ง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
Table: LAB_ORDER_DETAIL (รายละเอียดการสั่งตรวจ)
วัตถุประสงค์: เก็บรายละเอียดรายการตรวจแต่ละรายการในการสั่ง รองรับการเลือกรายการทีละรายการหรือเป็นกลุ่ม ตาม TOR ข้อ 1.2.7.2.2
| Field | Type | Key | Description |
|---|---|---|---|
| OrderDetailID | VARCHAR(20) | PK | รหัสรายละเอียดการสั่ง |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| TestName | NVARCHAR(200) | ชื่อรายการตรวจ | |
| SpecimenCode | VARCHAR(10) | FK | รหัสสิ่งส่งตรวจ |
| Priority | ENUM('NORMAL','STAT','ASAP','ROUTINE') | ลำดับความสำคัญ | |
| OrderStatus | ENUM('ORDERED','COLLECTED','RECEIVED','PROCESSING','COMPLETED','CANCELLED') | สถานะรายการ | |
| SpecimenStatus | ENUM('NOT_COLLECTED','COLLECTED','INSUFFICIENT','REJECTED','PROCESSED') | สถานะสิ่งส่งตรวจ | |
| Cost | DECIMAL(10,2) | ค่าบริการ | |
| IsOutLab | BIT | เป็น Lab นอก | |
| OutLabCode | VARCHAR(20) | FK | รหัส Lab นอก |
| OutLabCost | DECIMAL(10,2) | ค่าบริการ Lab นอก | |
| TubeNumber | VARCHAR(20) | หมายเลข Tube | |
| TubeBarcode | VARCHAR(50) | บาร์โค้ด Tube | |
| CollectionDateTime | DATETIME | วันเวลาเก็บสิ่งส่งตรวจ | |
| CollectedBy | VARCHAR(50) | ผู้เก็บ | |
| ReceivedDateTime | DATETIME | วันเวลารับใน Lab | |
| ReceivedBy | VARCHAR(50) | ผู้รับ | |
| ProcessedDateTime | DATETIME | วันเวลาประมวลผล | |
| ProcessedBy | VARCHAR(50) | ผู้ประมวลผล | |
| CompletedDateTime | DATETIME | วันเวลาเสร็จสิ้น | |
| TAT_Expected | DATETIME | เวลาที่คาดว่าจะเสร็จ | |
| IsAddOn | BIT | เป็นรายการเพิ่ม | |
| AddedDateTime | DATETIME | วันเวลาที่เพิ่ม | |
| IsReduced | BIT | เป็นรายการที่ลด | |
| RemovedDateTime | DATETIME | วันเวลาที่ลด | |
| RemovalReason | NVARCHAR(200) | เหตุผลที่ลด | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_SPECIMEN (ข้อมูลสิ่งส่งตรวจ)
วัตถุประสงค์: เก็บข้อมูลสิ่งส่งตรวจที่ได้รับ รวมถึงคุณภาพและสภาพของสิ่งส่งตรวจ
| Field | Type | Key | Description |
|---|---|---|---|
| SpecimenID | VARCHAR(20) | PK | รหัสสิ่งส่งตรวจ |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| SpecimenCode | VARCHAR(10) | FK | รหัสประเภทสิ่งส่งตรวจ |
| TubeNumber | VARCHAR(20) | UK | หมายเลข Tube |
| Barcode | VARCHAR(50) | UK | บาร์โค้ด |
| CollectionDate | DATE | วันที่เก็บ | |
| CollectionTime | TIME | เวลาที่เก็บ | |
| CollectedBy | VARCHAR(50) | ผู้เก็บ | |
| Volume | DECIMAL(10,2) | ปริมาณ | |
| VolumeUnit | VARCHAR(10) | หน่วยปริมาณ | |
| Quality | ENUM('GOOD','ACCEPTABLE','POOR','REJECTED') | คุณภาพ | |
| Appearance | NVARCHAR(100) | ลักษณะที่ปรากฏ | |
| Color | NVARCHAR(50) | สี | |
| Clarity | NVARCHAR(50) | ความใส | |
| Temperature | DECIMAL(4,1) | อุณหภูมิ | |
| pH | DECIMAL(4,2) | ค่า pH | |
| SpecificGravity | DECIMAL(4,3) | ความถ่วงจำเพาะ | |
| ReceivedDateTime | DATETIME | วันเวลาที่รับ | |
| ReceivedBy | VARCHAR(50) | ผู้รับ | |
| StorageLocation | VARCHAR(50) | สถานที่เก็บ | |
| StorageTemperature | DECIMAL(4,1) | อุณหภูมิเก็บ | |
| ExpiryDateTime | DATETIME | วันเวลาหมดอายุ | |
| RejectionReason | NVARCHAR(200) | เหตุผลที่ปฏิเสธ | |
| IsRejected | BIT | ถูกปฏิเสธ | |
| RejectedBy | VARCHAR(50) | ผู้ปฏิเสธ | |
| RejectedDateTime | DATETIME | วันเวลาที่ปฏิเสธ | |
| Comments | NTEXT | หมายเหตุ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_APPOINTMENT_ORDER (การสั่งตรวจล่วงหน้า)
วัตถุประสงค์: เก็บข้อมูลการสั่งตรวจ Lab ล่วงหน้าตามนัดหมาย เชื่อมโยงกับระบบนัดหมาย (1.2.6)
| Field | Type | Key | Description |
|---|---|---|---|
| AppointmentOrderID | VARCHAR(20) | PK | รหัสการสั่งล่วงหน้า |
| AppointmentID | VARCHAR(20) | FK | รหัสนัดหมาย (อ้างอิงจากระบบนัดหมาย 1.2.6) |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้สั่ง |
| AppointmentDate | DATE | วันที่นัด | |
| OrderDate | DATE | วันที่สั่ง | |
| TestCodes | NTEXT | รหัสรายการตรวจ (JSON Array) | |
| SpecialInstructions | NTEXT | คำแนะนำพิเศษ | |
| IsActivated | BIT | เปิดใช้งานแล้ว | |
| ActivatedDateTime | DATETIME | วันเวลาที่เปิดใช้ | |
| GeneratedOrderID | VARCHAR(20) | FK | รหัสการสั่งที่สร้างขึ้น |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.7.3 การรายงานผลการตรวจทางห้องปฏิบัติการ (Lab Results)
Table: LAB_RESULT (ผลการตรวจ Lab)
วัตถุประสงค์: เก็บข้อมูลผลการตรวจ Lab รองรับการแสดงผลออนไลน์และการเปรียบเทียบผลย้อนหลัง ตาม TOR ข้อ 1.2.7.3.1-4
| Field | Type | Key | Description |
|---|---|---|---|
| ResultID | VARCHAR(20) | PK | รหัสผลการตรวจ (RES-XXXXXXXXXXX) |
| OrderDetailID | VARCHAR(20) | FK | รหัสรายละเอียดการสั่ง |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| VisitID | VARCHAR(20) | FK | รหัสการเข้ารับบริการ |
| LabNumber | VARCHAR(15) | หมายเลข Lab | |
| ResultValue | NTEXT | ผลการตรวจ | |
| ResultNumeric | DECIMAL(15,6) | ผลการตรวจ (ตัวเลข) | |
| ResultText | NTEXT | ผลการตรวจ (ข้อความ) | |
| ResultStatus | ENUM('NORMAL','ABNORMAL','CRITICAL','PANIC','PENDING') | สถานะผล | |
| UnitCode | VARCHAR(10) | FK | รหัสหน่วย |
| NormalRange | NVARCHAR(100) | ช่วงค่าปกติ | |
| ReferenceRange | NVARCHAR(100) | ช่วงค่าอ้างอิง | |
| Interpretation | NTEXT | การแปลผล | |
| ResultFlag | ENUM('HIGH','LOW','CRITICAL_HIGH','CRITICAL_LOW','ABNORMAL') | Flag ผลการตรวจ | |
| IsAbnormal | BIT | ผลผิดปกติ | |
| IsCritical | BIT | ผลวิกฤต | |
| IsPanic | BIT | ผลอันตราย | |
| AlertGenerated | BIT | ส่งสัญญาณเตือนแล้ว | |
| AlertDateTime | DATETIME | วันเวลาที่แจ้งเตือน | |
| TestDateTime | DATETIME | วันเวลาทำการตรวจ | |
| ResultDateTime | DATETIME | วันเวลาออกผล | |
| ReportedBy | VARCHAR(50) | ผู้รายงานผล | |
| VerifiedBy | VARCHAR(50) | ผู้ตรวจสอบผล | |
| ApprovedBy | VARCHAR(50) | ผู้อนุมัติผล | |
| TechnicianID | VARCHAR(20) | FK | รหัสนักเทคนิคการแพทย์ |
| PathologistID | VARCHAR(20) | FK | รหัสพยาธิแพทย์ |
| InstrumentCode | VARCHAR(20) | FK | รหัสเครื่องมือ |
| MethodCode | VARCHAR(20) | FK | รหัสวิธีการตรวจ |
| QualityControl | NVARCHAR(100) | การควบคุมคุณภาพ | |
| CalibrationDate | DATE | วันที่ปรับเทียบเครื่องมือ | |
| Dilution | NVARCHAR(50) | การเจือจาง | |
| Comments | NTEXT | หมายเหตุ | |
| LabNote | NTEXT | Lab Note สำหรับผู้ดูผล | |
| IsRerun | BIT | เป็นการตรวจซ้ำ | |
| RerunReason | NVARCHAR(200) | เหตุผลการตรวจซ้ำ | |
| OriginalResultID | VARCHAR(20) | FK | รหัสผลเดิม (กรณีตรวจซ้ำ) |
| IsReported | BIT | รายงานผลแล้ว | |
| ReportedDateTime | DATETIME | วันเวลาที่รายงาน | |
| IsLocked | BIT | ล็อคผลแล้ว | |
| LockedBy | VARCHAR(50) | ผู้ล็อค | |
| LockedDateTime | DATETIME | วันเวลาที่ล็อค | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
Table: LAB_RESULT_IMAGE (ภาพผลการตรวจ)
วัตถุประสงค์: เก็บข้อมูลภาพถ่ายและ Result Text ที่เกี่ยวข้องกับผลการตรวจ ตาม TOR ข้อ 1.2.7.3.6
| Field | Type | Key | Description |
|---|---|---|---|
| ImageID | VARCHAR(20) | PK | รหัสภาพ |
| ResultID | VARCHAR(20) | FK | รหัสผลการตรวจ |
| ImageType | ENUM('PHOTO','MICROSCOPY','GRAPH','CHART','DOCUMENT') | ประเภทภาพ | |
| ImagePath | VARCHAR(500) | path ไฟล์ภาพ | |
| ImageDescription | NTEXT | คำอธิบายภาพ | |
| ImageSize | BIGINT | ขนาดไฟล์ (bytes) | |
| ImageFormat | VARCHAR(10) | รูปแบบไฟล์ | |
| Magnification | VARCHAR(20) | กำลังขยาย (กรณีกล้องจุลทรรศน์) | |
| StainingMethod | NVARCHAR(100) | วิธีการย้อมสี | |
| CapturedBy | VARCHAR(50) | ผู้ถ่ายภาพ | |
| CapturedDateTime | DATETIME | วันเวลาที่ถ่าย | |
| IsDefault | BIT | เป็นภาพหลัก | |
| DisplayOrder | INT | ลำดับการแสดง | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_RESULT_HISTORY (ประวัติการแก้ไขผล)
วัตถุประสงค์: เก็บประวัติการรายงานผลและการเปลี่ยนแปลงผล Lab ตาม TOR ข้อ 1.2.7.4.4
| Field | Type | Key | Description |
|---|---|---|---|
| HistoryID | VARCHAR(20) | PK | รหัสประวัติ |
| ResultID | VARCHAR(20) | FK | รหัสผลการตรวจ |
| ChangeType | ENUM('CREATE','UPDATE','DELETE','APPROVE','REJECT','LOCK','UNLOCK') | ประเภทการเปลี่ยนแปลง | |
| OldValue | NTEXT | ค่าเดิม | |
| NewValue | NTEXT | ค่าใหม่ | |
| OldStatus | VARCHAR(20) | สถานะเดิม | |
| NewStatus | VARCHAR(20) | สถานะใหม่ | |
| ChangeReason | NVARCHAR(200) | เหตุผลการเปลี่ยนแปลง | |
| ChangedBy | VARCHAR(50) | ผู้เปลี่ยนแปลง | |
| ChangedDateTime | DATETIME | วันเวลาที่เปลี่ยน | |
| ApprovedBy | VARCHAR(50) | ผู้อนุมัติการเปลี่ยนแปลง | |
| ApprovedDateTime | DATETIME | วันเวลาที่อนุมัติ | |
| IPAddress | VARCHAR(45) | IP Address | |
| UserAgent | NVARCHAR(500) | ข้อมูล Browser |
Table: LAB_REPORT (รายงานผล Lab)
วัตถุประสงค์: เก็บข้อมูลรายงานผล Lab ที่สร้างขึ้น รองรับการพิมพ์และการดูออนไลน์
| Field | Type | Key | Description |
|---|---|---|---|
| ReportID | VARCHAR(20) | PK | รหัสรายงาน |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| VisitID | VARCHAR(20) | FK | รหัสการเข้ารับบริการ |
| ReportType | ENUM('INDIVIDUAL','CUMULATIVE','SUMMARY','TREND') | ประเภทรายงาน | |
| ReportFormat | ENUM('PDF','HTML','XML','JSON') | รูปแบบรายงาน | |
| ReportData | NTEXT | ข้อมูลรายงาน | |
| ReportPath | VARCHAR(500) | path ไฟล์รายงาน | |
| ReportStatus | ENUM('DRAFT','FINAL','AMENDED','CANCELLED') | สถานะรายงาน | |
| GeneratedDateTime | DATETIME | วันเวลาที่สร้าง | |
| GeneratedBy | VARCHAR(50) | ผู้สร้าง | |
| ReviewedBy | VARCHAR(50) | ผู้ตรวจสอบ | |
| ReviewedDateTime | DATETIME | วันเวลาที่ตรวจสอบ | |
| ApprovedBy | VARCHAR(50) | ผู้อนุมัติ | |
| ApprovedDateTime | DATETIME | วันเวลาที่อนุมัติ | |
| PrintCount | INT | จำนวนครั้งที่พิมพ์ | |
| LastPrintDateTime | DATETIME | วันเวลาพิมพ์ล่าสุด | |
| EmailSent | BIT | ส่งอีเมลแล้ว | |
| EmailDateTime | DATETIME | วันเวลาส่งอีเมล | |
| SMSSent | BIT | ส่ง SMS แล้ว | |
| SMSDateTime | DATETIME | วันเวลาส่ง SMS |
Table: LAB_APPOINTMENT_RESULT (การนัดฟังผล)
วัตถุประสงค์: เก็บข้อมูลการนัดหมายเพื่อฟังผลในวันอื่น ตาม TOR ข้อ 1.2.7.3.7
| Field | Type | Key | Description |
|---|---|---|---|
| AppointmentResultID | VARCHAR(20) | PK | รหัสการนัดฟังผล |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AppointmentDate | DATE | วันที่นัดฟังผล | |
| AppointmentTime | TIME | เวลาที่นัดฟังผล | |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ |
| ClinicCode | VARCHAR(10) | FK | รหัสคลินิก |
| RoomCode | VARCHAR(10) | FK | รหัสห้อง |
| Notes | NTEXT | หมายเหตุ | |
| IsCompleted | BIT | เสร็จสิ้นการนัด | |
| CompletedDateTime | DATETIME | วันเวลาที่เสร็จสิ้น | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_EXTERNAL_RESULT (ผล Lab นอก)
วัตถุประสงค์: เก็บข้อมูลผล Lab นอกในรูปแบบ PDF File ตาม TOR ข้อ 1.2.7.3.12
| Field | Type | Key | Description |
|---|---|---|---|
| ExternalResultID | VARCHAR(20) | PK | รหัสผล Lab นอก |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| ExternalLabCode | VARCHAR(20) | FK | รหัส Lab นอก |
| ExternalLabName | NVARCHAR(200) | ชื่อ Lab นอก | |
| PDFFilePath | VARCHAR(500) | path ไฟล์ PDF | |
| OriginalFileName | NVARCHAR(200) | ชื่อไฟล์ต้นฉบับ | |
| FileSize | BIGINT | ขนาดไฟล์ | |
| ReceivedDate | DATE | วันที่ได้รับผล | |
| ReceivedBy | VARCHAR(50) | ผู้รับผล | |
| UploadedBy | VARCHAR(50) | ผู้อัปโหลด | |
| UploadedDateTime | DATETIME | วันเวลาอัปโหลด | |
| IsReported | BIT | รายงานผลแล้ว | |
| ReportedDateTime | DATETIME | วันเวลารายงาน | |
| Comments | NTEXT | หมายเหตุ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.7.4 การควบคุมคุณภาพทางห้องปฏิบัติการ (Quality Control)
Table: LAB_ACCESS_LOG (บันทึกการเข้าอ่านผล)
วัตถุประสงค์: เก็บบันทึกการเข้ามาอ่านผล Lab ตาม TOR ข้อ 1.2.7.4.1
| Field | Type | Key | Description |
|---|---|---|---|
| AccessLogID | VARCHAR(20) | PK | รหัสบันทึกการเข้าถึง |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AccessType | ENUM('VIEW','PRINT','DOWNLOAD','EMAIL','EXPORT') | ประเภทการเข้าถึง | |
| AccessDateTime | DATETIME | วันเวลาเข้าถึง | |
| UserID | VARCHAR(50) | รหัสผู้ใช้ | |
| UserName | NVARCHAR(100) | ชื่อผู้ใช้ | |
| UserRole | VARCHAR(20) | บทบาทผู้ใช้ | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| IPAddress | VARCHAR(45) | IP Address | |
| UserAgent | NVARCHAR(500) | ข้อมูล Browser | |
| SessionID | VARCHAR(100) | รหัสเซสชัน | |
| Duration | INT | ระยะเวลาดู (วินาที) |
Table: LAB_APPROVAL_WORKFLOW (ขั้นตอนการอนุมัติ)
วัตถุประสงค์: เก็บข้อมูลการระบุ Report by และ Approved by ตาม TOR ข้อ 1.2.7.4.2
| Field | Type | Key | Description |
|---|---|---|---|
| WorkflowID | VARCHAR(20) | PK | รหัสขั้นตอนการอนุมัติ |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| ResultID | VARCHAR(20) | FK | รหัสผลการตรวจ |
| WorkflowStep | ENUM('REPORTED','REVIEWED','APPROVED','REJECTED') | ขั้นตอน | |
| StepOrder | INT | ลำดับขั้นตอน | |
| UserID | VARCHAR(50) | รหัสผู้ปฏิบัติ | |
| UserName | NVARCHAR(100) | ชื่อผู้ปฏิบัติ | |
| UserRole | VARCHAR(20) | บทบาท (TECHNICIAN/SUPERVISOR/PATHOLOGIST) | |
| ActionDateTime | DATETIME | วันเวลาดำเนินการ | |
| Comments | NTEXT | หมายเหตุ | |
| IsRequired | BIT | จำเป็นต้องผ่าน | |
| IsCompleted | BIT | เสร็จสิ้นแล้ว | |
| DigitalSignature | NTEXT | ลายเซ็นดิจิทัล |
Table: LAB_QUALITY_CONTROL (การควบคุมคุณภาพ)
วัตถุประสงค์: เก็บข้อมูลการควบคุมคุณภาพการตรวจ รวมถึงการยืนยันและล็อคผล ตาม TOR ข้อ 1.2.7.4.3
| Field | Type | Key | Description |
|---|---|---|---|
| QualityControlID | VARCHAR(20) | PK | รหัสการควบคุมคุณภาพ |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| QCType | ENUM('NORMAL_CONTROL','ABNORMAL_CONTROL','BLANK','DUPLICATE','CALIBRATION') | ประเภท QC | |
| QCLevel | ENUM('LEVEL_1','LEVEL_2','LEVEL_3') | ระดับ QC | |
| ExpectedValue | DECIMAL(15,6) | ค่าที่คาดหวัง | |
| ActualValue | DECIMAL(15,6) | ค่าที่ได้จริง | |
| Deviation | DECIMAL(15,6) | ค่าเบี่ยงเบน | |
| DeviationPercent | DECIMAL(5,2) | เปอร์เซ็นต์เบี่ยงเบน | |
| AcceptanceRange | NVARCHAR(100) | ช่วงที่ยอมรับได้ | |
| IsAcceptable | BIT | ผลยอมรับได้ | |
| QCStatus | ENUM('PASS','FAIL','WARNING') | สถานะ QC | |
| ControlLotNumber | VARCHAR(50) | เลขที่ล็อต Control | |
| ExpiryDate | DATE | วันหมดอายุ Control | |
| TestedDateTime | DATETIME | วันเวลาทดสอบ | |
| TestedBy | VARCHAR(50) | ผู้ทดสอบ | |
| ReviewedBy | VARCHAR(50) | ผู้ตรวจสอบ | |
| ReviewedDateTime | DATETIME | วันเวลาตรวจสอบ | |
| Action | NTEXT | การดำเนินการ | |
| Comments | NTEXT | หมายเหตุ |
Table: LAB_INSTRUMENT (เครื่องมือตรวจ)
วัตถุประสงค์: เก็บข้อมูลเครื่องมือและอุปกรณ์ใช้ในการตรวจ
| Field | Type | Key | Description |
|---|---|---|---|
| InstrumentCode | VARCHAR(20) | PK | รหัสเครื่องมือ |
| InstrumentName | NVARCHAR(200) | ชื่อเครื่องมือ | |
| Manufacturer | NVARCHAR(100) | ผู้ผลิต | |
| Model | NVARCHAR(100) | รุ่น | |
| SerialNumber | VARCHAR(100) | หมายเลขเครื่อง | |
| InstallationDate | DATE | วันติดตั้ง | |
| LastCalibrationDate | DATE | วันปรับเทียบล่าสุด | |
| NextCalibrationDate | DATE | วันปรับเทียบครั้งต่อไป | |
| MaintenanceSchedule | NVARCHAR(200) | กำหนดการบำรุงรักษา | |
| LastMaintenanceDate | DATE | วันบำรุงรักษาล่าสุด | |
| NextMaintenanceDate | DATE | วันบำรุงรักษาครั้งต่อไป | |
| Location | NVARCHAR(100) | สถานที่ตั้ง | |
| Status | ENUM('ACTIVE','INACTIVE','MAINTENANCE','CALIBRATION') | สถานะ | |
| IsActive | BIT | ใช้งานอยู่ | |
| WarrantyExpiry | DATE | วันหมดประกัน | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.7.5 การพิมพ์และการส่งออก (Printing & Export)
Table: LAB_PRINT_LOG (บันทึกการพิมพ์)
วัตถุประสงค์: เก็บบันทึกการพิมพ์เอกสารต่างๆ ตาม TOR ข้อ 1.2.7.5.1-4
| Field | Type | Key | Description |
|---|---|---|---|
| PrintLogID | VARCHAR(20) | PK | รหัสบันทึกการพิมพ์ |
| OrderID | VARCHAR(20) | FK | รหัสการสั่งตรวจ |
| PrintType | ENUM('REQUEST','RESULT','STICKER','APPOINTMENT','REPORT') | ประเภทการพิมพ์ | |
| DocumentType | VARCHAR(20) | ประเภทเอกสาร | |
| PrintLocation | ENUM('ORDERING_POINT','LAB','BOTH') | จุดพิมพ์ | |
| PrintDateTime | DATETIME | วันเวลาพิมพ์ | |
| PrintedBy | VARCHAR(50) | ผู้พิมพ์ | |
| PrinterName | VARCHAR(100) | ชื่อเครื่องพิมพ์ | |
| PrinterIP | VARCHAR(45) | IP Address เครื่องพิมพ์ | |
| Copies | INT | จำนวนสำเนา | |
| PaperSize | VARCHAR(10) | ขนาดกระดาษ | |
| Orientation | VARCHAR(10) | แนวกระดาษ | |
| IsSuccessful | BIT | พิมพ์สำเร็จ | |
| ErrorMessage | NTEXT | ข้อความข้อผิดพลาด | |
| DocumentPath | VARCHAR(500) | path เอกสาร |
Table: LAB_STICKER_CONFIG (การตั้งค่า Sticker)
วัตถุประสงค์: กำหนดการพิมพ์ Sticker ติด Tube ตาม TOR ข้อ 1.2.7.5.2
| Field | Type | Key | Description |
|---|---|---|---|
| StickerConfigID | VARCHAR(20) | PK | รหัสการตั้งค่า Sticker |
| ConfigName | NVARCHAR(100) | ชื่อการตั้งค่า | |
| SpecimenCode | VARCHAR(10) | FK | รหัสสิ่งส่งตรวจ |
| StickerSize | VARCHAR(20) | ขนาด Sticker | |
| StickerLayout | NTEXT | รูปแบบ Sticker (JSON) | |
| BarcodeType | VARCHAR(20) | ประเภท Barcode | |
| BarcodePosition | VARCHAR(20) | ตำแหน่ง Barcode | |
| FontSize | INT | ขนาดตัวอักษร | |
| FontFamily | VARCHAR(50) | แบบตัวอักษร | |
| IncludePatientInfo | BIT | รวมข้อมูลผู้ป่วย | |
| IncludeTestInfo | BIT | รวมข้อมูลการตรวจ | |
| IncludeDateTime | BIT | รวมวันเวลา | |
| IsDefault | BIT | เป็นค่าเริ่มต้น | |
| IsActive | BIT | ใช้งานอยู่ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.7.6 ตารางข้อมูลพื้นฐานเสริม (Supporting Master Data)
Table: EXTERNAL_LAB (ข้อมูล Lab นอก)
วัตถุประสงค์: เก็บข้อมูล Lab นอกที่ร่วมมือ ตาม TOR ข้อ 1.2.7.1.6
| Field | Type | Key | Description |
|---|---|---|---|
| ExternalLabCode | VARCHAR(20) | PK | รหัส Lab นอก |
| LabName | NVARCHAR(200) | ชื่อ Lab | |
| Address | NTEXT | ที่อยู่ | |
| Phone | VARCHAR(20) | หมายเลขโทรศัพท์ | |
| Fax | VARCHAR(20) | หมายเลขแฟกซ์ | |
| VARCHAR(100) | อีเมล | ||
| ContactPerson | NVARCHAR(100) | ผู้ติดต่อ | |
| License | VARCHAR(50) | ใบอนุญาต | |
| Accreditation | NVARCHAR(200) | การรับรอง | |
| ServiceType | NVARCHAR(200) | ประเภทบริการ | |
| TAT_Normal | INT | เวลาออกผลปกติ (วัน) | |
| TAT_STAT | INT | เวลาออกผล STAT (วัน) | |
| CostMarkup | DECIMAL(5,2) | เปอร์เซ็นต์เพิ่ม | |
| PaymentTerms | NVARCHAR(200) | เงื่อนไขการชำระ | |
| ContractStart | DATE | วันเริ่มสัญญา | |
| ContractEnd | DATE | วันสิ้นสุดสัญญา | |
| IsActive | BIT | ใช้งานอยู่ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: LAB_ALERT_CONFIG (การตั้งค่าแจ้งเตือน)
วัตถุประสงค์: กำหนดการแจ้งเตือนเมื่อมีค่าผิดปกติ ตาม TOR ข้อ 1.2.7.1.4
| Field | Type | Key | Description |
|---|---|---|---|
| AlertConfigID | VARCHAR(20) | PK | รหัสการตั้งค่าแจ้งเตือน |
| TestCode | VARCHAR(20) | FK | รหัสรายการตรวจ |
| AlertType | ENUM('CRITICAL','PANIC','ABNORMAL','DELTA_CHECK') | ประเภทการแจ้งเตือน | |
| AlertMethod | ENUM('POPUP','EMAIL','SMS','SYSTEM_NOTIFICATION') | วิธีการแจ้งเตือน | |
| RecipientGroup | VARCHAR(20) | กลุ่มผู้รับแจ้งเตือน | |
| TriggerCondition | NTEXT | เงื่อนไขการแจ้งเตือน | |
| MessageTemplate | NTEXT | Template ข้อความ | |
| IsEnabled | BIT | เปิดใช้งาน | |
| Priority | INT | ลำดับความสำคัญ | |
| DelayMinutes | INT | ความล่าช้าแจ้งเตือน (นาที) | |
| MaxRetries | INT | จำนวนครั้งลองใหม่สูงสุด | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.7.7 Views และ Stored Procedures
8.2.7.7.1 Views สำคัญ
View: VW_LAB_PENDING_ORDERS
-- แสดงรายการสั่งตรวจที่รอดำเนินการ
CREATE VIEW VW_LAB_PENDING_ORDERS AS
SELECT
o.OrderID, o.LabNumber, o.HN, p.FirstName, p.LastName,
o.OrderDateTime, o.Priority, o.OrderStatus,
COUNT(od.OrderDetailID) as TotalTests,
COUNT(CASE WHEN od.OrderStatus = 'COMPLETED' THEN 1 END) as CompletedTests
FROM LAB_ORDER o
JOIN PATIENT p ON o.HN = p.HN
JOIN LAB_ORDER_DETAIL od ON o.OrderID = od.OrderID
WHERE o.OrderStatus IN ('ORDERED','COLLECTED','RECEIVED','PROCESSING')
GROUP BY o.OrderID, o.LabNumber, o.HN, p.FirstName, p.LastName, o.OrderDateTime, o.Priority, o.OrderStatus;
View: VW_LAB_CRITICAL_RESULTS
-- แสดงผลการตรวจที่มีค่าวิกฤต
CREATE VIEW VW_LAB_CRITICAL_RESULTS AS
SELECT
r.ResultID, r.OrderID, r.HN, p.FirstName, p.LastName,
r.TestCode, tm.TestName, r.ResultValue, r.ResultFlag,
r.ResultDateTime, r.AlertGenerated
FROM LAB_RESULT r
JOIN PATIENT p ON r.HN = p.HN
JOIN LAB_TEST_MASTER tm ON r.TestCode = tm.TestCode
WHERE r.IsCritical = 1 OR r.IsPanic = 1;
View: VW_LAB_WORKLOAD
-- แสดงปริมาณงานห้อง Lab
CREATE VIEW VW_LAB_WORKLOAD AS
SELECT
DATE(o.OrderDateTime) as OrderDate,
o.Priority,
COUNT(DISTINCT o.OrderID) as TotalOrders,
COUNT(od.OrderDetailID) as TotalTests,
AVG(TIMESTAMPDIFF(MINUTE, o.OrderDateTime, r.ResultDateTime)) as AvgTAT
FROM LAB_ORDER o
JOIN LAB_ORDER_DETAIL od ON o.OrderID = od.OrderID
LEFT JOIN LAB_RESULT r ON od.OrderDetailID = r.OrderDetailID
WHERE o.OrderDateTime >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY DATE(o.OrderDateTime), o.Priority
ORDER BY OrderDate DESC, o.Priority;
View: VW_LAB_PATIENT_HISTORY
-- แสดงประวัติการตรวจ Lab ของผู้ป่วย
CREATE VIEW VW_LAB_PATIENT_HISTORY AS
SELECT
r.HN, r.TestCode, tm.TestName,
r.ResultValue, r.UnitCode, r.NormalRange,
r.ResultDateTime, r.IsAbnormal, r.IsCritical,
LAG(r.ResultValue) OVER (PARTITION BY r.HN, r.TestCode ORDER BY r.ResultDateTime) as PreviousValue,
LAG(r.ResultDateTime) OVER (PARTITION BY r.HN, r.TestCode ORDER BY r.ResultDateTime) as PreviousDate
FROM LAB_RESULT r
JOIN LAB_TEST_MASTER tm ON r.TestCode = tm.TestCode
WHERE r.IsReported = 1
ORDER BY r.HN, r.TestCode, r.ResultDateTime DESC;
8.2.7.7.2 Stored Procedures สำคัญ
SP_CreateLabOrder
-- สร้างการสั่งตรวจ Lab
DELIMITER //
CREATE PROCEDURE SP_CreateLabOrder(
IN p_HN VARCHAR(10),
IN p_VisitID VARCHAR(20),
IN p_DoctorID VARCHAR(20),
IN p_TestCodes TEXT,
IN p_Priority VARCHAR(10),
IN p_ClinicalInfo TEXT,
OUT p_OrderID VARCHAR(20)
)
BEGIN
DECLARE v_OrderID VARCHAR(20);
DECLARE v_LabNumber VARCHAR(15);
-- Generate OrderID and LabNumber
SET v_OrderID = CONCAT('LAB-', DATE_FORMAT(NOW(), '%Y%m%d'), '-', LPAD(LAST_INSERT_ID() + 1, 6, '0'));
SET v_LabNumber = LPAD(LAST_INSERT_ID() + 1, 8, '0');
-- Insert main order
INSERT INTO LAB_ORDER (OrderID, LabNumber, HN, VisitID, DoctorID, Priority, ClinicalInfo, OrderDateTime, OrderStatus, CreatedBy)
VALUES (v_OrderID, v_LabNumber, p_HN, p_VisitID, p_DoctorID, p_Priority, p_ClinicalInfo, NOW(), 'ORDERED', USER());
-- Insert order details (implementation would parse p_TestCodes)
-- ... detail insertion logic
SET p_OrderID = v_OrderID;
END //
DELIMITER ;
SP_UpdateLabResult
-- บันทึกผลการตรวจ Lab
DELIMITER //
CREATE PROCEDURE SP_UpdateLabResult(
IN p_OrderDetailID VARCHAR(20),
IN p_ResultValue TEXT,
IN p_ResultNumeric DECIMAL(15,6),
IN p_IsAbnormal BIT,
IN p_TechnicianID VARCHAR(20)
)
BEGIN
DECLARE v_IsCritical BIT DEFAULT 0;
DECLARE v_AlertNeeded BIT DEFAULT 0;
-- Check for critical values
-- ... critical value checking logic
-- Insert result
INSERT INTO LAB_RESULT (OrderDetailID, ResultValue, ResultNumeric, IsAbnormal, IsCritical,
TechnicianID, TestDateTime, ReportedBy, CreatedBy)
VALUES (p_OrderDetailID, p_ResultValue, p_ResultNumeric, p_IsAbnormal, v_IsCritical,
p_TechnicianID, NOW(), USER(), USER());
-- Generate alerts if needed
IF v_AlertNeeded = 1 THEN
CALL SP_GenerateLabAlert(LAST_INSERT_ID());
END IF;
END //
DELIMITER ;
8.2.7.8 Integration Points
8.2.7.8.1 API Endpoints
การเชื่อมต่อกับระบบอื่น:
- ระบบเวชระเบียน (1.2.1)
GET /api/patient/{HN}- ดึงข้อมูลผู้ป่วย-
GET /api/visit/{VisitID}- ดึงข้อมูลการเข้ารับบริการ -
ระบบซักประวัติ/ห้องตรวจ (1.2.2/1.2.3)
POST /api/lab/order- รับการสั่งตรวจจากระบบอื่น-
GET /api/lab/result/{OrderID}- ส่งผลการตรวจกลับ -
ระบบการเงิน (1.2.14)
POST /api/finance/charge- ส่งค่าบริการ-
GET /api/finance/payment-status/{OrderID}- ตรวจสอบสถานะการชำระ -
ระบบตรวจสอบสิทธิ (1.2.15)
GET /api/rights/verify/{HN}- ตรวจสอบสิทธิGET /api/rights/coverage/{TestCode}- ตรวจสอบความคุ้มครอง
8.2.7.8.2 Data Flow Integration
Inbound Data: - ข้อมูลผู้ป่วยจากระบบเวชระเบียน (1.2.1) - การสั่งตรวจจากระบบซักประวัติ/ห้องตรวจ (1.2.2/1.2.3) - การสั่งตรวจฉุกเฉินจากห้องฉุกเฉิน (1.2.4) - การนัดตรวจล่วงหน้าจากระบบนัดหมาย (1.2.6)
Outbound Data: - ผลการตรวจไปยังระบบต้นทาง - ค่าบริการไปยังระบบการเงิน (1.2.14) - การแจ้งเตือนผลวิกฤตไปยังระบบที่เกี่ยวข้อง - รายงานสถิติการใช้บริการ
8.2.7.8.3 Real-time Notifications
การแจ้งเตือนแบบ Real-time:
{
"event_type": "lab_critical_result",
"order_id": "LAB-20241011-001234",
"patient_hn": "0123456789",
"test_code": "GLU",
"result_value": "450",
"critical_level": "HIGH",
"alert_recipients": ["doctor_id", "nurse_id"],
"timestamp": "2024-10-11T14:30:00Z"
}
8.2.7.9 Security และ Audit Trail
8.2.7.9.1 การรักษาความปลอดภัย
- การเข้ารหัสข้อมูล:
- ผลการตรวจที่มีความลับ
- การเชื่อมต่อระหว่างระบบ (TLS/SSL)
-
ลายเซ็นดิจิทัลสำหรับการอนุมัติ
-
การควบคุมการเข้าถึง:
- Role-based access control
- Permission matrix ตามหน้าที่
-
Session management
-
การตรวจสอบการใช้งาน:
- Audit trail ทุกการเปลี่ยนแปลง
- Access log การดูผลการตรวจ
- การแจ้งเตือนความผิดปกติ
8.2.7.9.2 Performance Optimization
-
Database Indexing:
-- Indexes สำคัญ CREATE INDEX IDX_LAB_ORDER_HN_DATE ON LAB_ORDER(HN, OrderDateTime); CREATE INDEX IDX_LAB_RESULT_TEST_DATE ON LAB_RESULT(TestCode, ResultDateTime); CREATE INDEX IDX_LAB_ORDER_STATUS ON LAB_ORDER(OrderStatus, Priority); CREATE INDEX IDX_LAB_RESULT_CRITICAL ON LAB_RESULT(IsCritical, IsPanic, ResultDateTime); -
Partitioning Strategy:
-- Partition ตาราง LAB_RESULT ตามเดือน ALTER TABLE LAB_RESULT PARTITION BY RANGE (YEAR(ResultDateTime) * 100 + MONTH(ResultDateTime)) ( PARTITION p202401 VALUES LESS THAN (202402), PARTITION p202402 VALUES LESS THAN (202403), -- ... additional partitions );
สรุป
ระบบงานชันสูตรนี้ได้รับการออกแบบให้ครอบคลุมทุกข้อกำหนดใน TOR โดยเฉพาะ:
✅ ความสอดคล้องกับ TOR:
- ข้อมูลพื้นฐาน (1.2.7.1) - ครบทุกข้อ
- การสั่งตรวจ (1.2.7.2) - รองรับการสั่งออนไลน์และแบบกลุ่ม
- การรายงานผล (1.2.7.3) - รองรับการแสดงออนไลน์และเปรียบเทียบ
- การควบคุมคุณภาพ (1.2.7.4) - ระบบ audit trail ครบถ้วน
- การพิมพ์ (1.2.7.5) - รองรับทุกรูปแบบตาม TOR
🔗 Integration กับระบบอื่น:
- เชื่อมโยงกับระบบเวชระเบียน, ซักประวัติ, ห้องตรวจ
- รองรับการสั่งจากห้องฉุกเฉินและการนัดล่วงหน้า
- เชื่อมต่อระบบการเงินและตรวจสอบสิทธิ
📊 Performance และ Scalability:
- Database partitioning สำหรับข้อมูลจำนวนมาก
- Indexing strategy ที่เหมาะสม
- Real-time notification system
เอกสารนี้จัดทำขึ้นเพื่อใช้เป็นแนวทางในการพัฒนาระบบงานชันสูตรที่เชื่อมโยงกับระบบอื่นๆ ในโรงพยาบาล และจะได้รับการปรับปรุงตามความต้องการที่เปลี่ยนแปลง