Database Schema Design
ระบบซักประวัติ (History Taking System)
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.2-SCHEMA
เวอร์ชัน: 1.0
วันที่: 5 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
Database Schema Design
ระบบซักประวัติเป็นระบบที่รองรับการบันทึกข้อมูลการซักประวัติและการตรวจรักษาของแพทย์ โดยเชื่อมโยงกับระบบอื่นผ่าน API Integration:
- ระบบเวชระเบียน (1.2.1): ข้อมูลผู้ป่วยหลักและการส่งตรวจ
- ระบบห้องตรวจแพทย์ (1.2.3): การส่งต่อการตรวจรักษา
- ระบบตรวจสอบสิทธิ (1.2.15): การตรวจสอบสิทธิการรักษา
- ระบบเภสัชกรรม (1.2.13): การสั่งจ่ายยาและเวชภัณฑ์
- ระบบการเงิน (1.2.14): การคำนวณค่าบริการ
- ระบบงานชันสูตร (1.2.7): การสั่ง Lab
- ระบบรังสีวิทยา (1.2.8): การสั่ง X-Ray
8.2.1 ตารางหลัก (Core Tables)
8.2.1.1 ข้อมูลการซักประวัติหลัก
Table: HISTORY_TAKING (การซักประวัติหลัก)
วัตถุประสงค์: เก็บข้อมูลการซักประวัติของผู้ป่วยในแต่ละครั้งที่มารับบริการ รวมถึง Chief Complaint, Present Illness, Past History, Family History และ Social History ตาม TOR ข้อ 1.2.2.2.1
| Field | Type | Key | Description |
|---|---|---|---|
| HistoryID | VARCHAR(20) | PK | รหัสการซักประวัติ |
| VisitID | VARCHAR(20) | FK | รหัส Visit (อ้างอิงจาก ระบบเวชระเบียน 1.2.1) |
| HN | VARCHAR(10) | FK | Hospital Number |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้ซักประวัติ |
| HistoryDate | DATETIME | วันที่ซักประวัติ | |
| ChiefComplaint | NTEXT | อาการสำคัญ (CC) | |
| PresentIllness | NTEXT | ประวัติการเจ็บป่วยในปัจจุบัน (HPI) | |
| OnsetDuration | VARCHAR(50) | เป็นมากี่วันแล้ว | |
| PastMedicalHistory | NTEXT | ประวัติการเจ็บป่วยในอดีต (PMH) | |
| FamilyHistory | NTEXT | ประวัติการเจ็บป่วยในครอบครัว (FH) | |
| SocialHistory | NTEXT | ประวัติเกี่ยวกับการดำเนินชีวิต (SH) | |
| IsPregnant | BIT | กำลังตั้งครรภ์ | |
| IsBreastfeeding | BIT | กำลังให้นมบุตร | |
| TemplateName | NVARCHAR(100) | ชื่อ Template ที่ใช้ | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด | |
| IsCompleted | BIT | เสร็จสิ้นการซักประวัติ |
Table: VITAL_SIGNS (สัญญาณชีพ)
วัตถุประสงค์: เก็บข้อมูลสัญญาณชีพและการ Screen ของผู้ป่วย ตาม TOR ข้อ 1.2.2.2.1 รวมถึงการคำนวณ BMI อัตโนมัติ
| Field | Type | Key | Description |
|---|---|---|---|
| VitalSignsID | VARCHAR(20) | PK | รหัสสัญญาณชีพ |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| MeasurementDate | DATETIME | วันที่วัด | |
| Weight | DECIMAL(5,2) | น้ำหนัก (กิโลกรัม) | |
| Height | DECIMAL(5,2) | ส่วนสูง (เซนติเมตร) | |
| BMI | DECIMAL(5,2) | ดัชนีมวลกาย (คำนวณอัตโนมัติ) | |
| Temperature | DECIMAL(4,1) | อุณหภูมิ (องศาเซลเซียส) | |
| WaistCircumference | DECIMAL(5,2) | รอบเอว (เซนติเมตร) | |
| PulseRate | INT | อัตราเต้นชีพจร (ครั้ง/นาที) | |
| RespiratoryRate | INT | อัตราหายใจ (ครั้ง/นาที) | |
| SystolicBP | INT | ความดันโลหิตซิสโตลิก | |
| DiastolicBP | INT | ความดันโลหิตไดแอสโตลิก | |
| BloodPressurePosition | VARCHAR(20) | ท่าวัดความดันโลหิต | |
| MeasuredBy | VARCHAR(50) | ผู้วัด | |
| Notes | NTEXT | หมายเหตุ | |
| IsRepeatedMeasurement | BIT | การวัดซ้ำ (เช่น BP ซ้ำ) |
8.2.1.2 ข้อมูลการแพ้ยาและข้อมูลสำคัญ
Table: DRUG_ALLERGY (การแพ้ยา)
วัตถุประสงค์: เก็บข้อมูลการแพ้ยาของผู้ป่วยแบบละเอียด ตาม TOR ข้อ 1.2.2.2.4 รวมถึงการประเมินระดับการแพ้ยาด้วย Naranjo Algorithm
| Field | Type | Key | Description |
|---|---|---|---|
| AllergyID | VARCHAR(20) | PK | รหัสการแพ้ยา |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| DrugName | NVARCHAR(200) | ชื่อยาที่แพ้ (ชื่อสามัญ) | |
| DrugCode | VARCHAR(20) | รหัสยา | |
| ReportDate | DATETIME | วันที่รายงาน | |
| OnsetDate | DATETIME | วันที่มีอาการ | |
| AllergySymptoms | NTEXT | อาการที่แพ้ | |
| Reporter | NVARCHAR(100) | ผู้รายงาน | |
| Severity | VARCHAR(20) | ความร้ายแรง (MILD/MODERATE/SEVERE) | |
| CausativeAgent | NVARCHAR(200) | สาเหตุการเกิด | |
| RelationshipLevel | VARCHAR(20) | ระดับความสัมพันธ์ | |
| Outcome | NTEXT | ผลที่เกิดขึ้นภายหลัง | |
| AdditionalNotes | NTEXT | หมายเหตุเพิ่มเติม | |
| IsContraindicated | BIT | ห้ามสั่งใช้กับผู้ป่วย | |
| NaranjoScore | INT | คะแนน Naranjo | |
| NaranjoResult | VARCHAR(50) | ผลการประเมินระดับการแพ้ยา | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| IsActive | BIT | ใช้งานอยู่ |
8.2.1.3 การวินิจฉัยและหัตถการ
Table: MEDICAL_DIAGNOSIS (การวินิจฉัยทางการแพทย์ - Shared Table)
วัตถุประสงค์: เก็บข้อมูลการวินิจฉัยโรคจากทั้งระบบซักประวัติ (1.2.2) และระบบห้องตรวจแพทย์ (1.2.3) ด้วยรหัส ICD-10 และ ICD-11 ตาม TOR ข้อ 1.2.2.1.2, 1.2.2.2.7 และ 1.2.3.1.2, 1.2.3.2.7 รวมถึงการจัดกลุ่มตาม DRG
| Field | Type | Key | Description |
|---|---|---|---|
| DiagnosisID | VARCHAR(20) | PK | รหัสการวินิจฉัย |
| SourceSystem | VARCHAR(20) | ระบบที่สร้าง (HISTORY_TAKING/EXAMINATION) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงต้นทาง (HistoryID หรือ ExaminationID) |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| HN | VARCHAR(10) | FK | Hospital Number |
| ICDCode | VARCHAR(10) | รหัส ICD (WHO) | |
| ICDCodeThai | VARCHAR(10) | รหัส ICD ไทย | |
| DiseaseName | NVARCHAR(200) | ชื่อโรค | |
| DiseaseNameEng | NVARCHAR(200) | ชื่อโรค (อังกฤษ) | |
| DiagnosisType | VARCHAR(20) | ประเภทการวินิจฉัย (PRIMARY/SECONDARY/PROVISIONAL) | |
| CertaintyLevel | VARCHAR(20) | ระดับความแน่นอน (CONFIRMED/SUSPECTED/RULE_OUT) | |
| OnsetType | VARCHAR(20) | ลักษณะการเกิด (ACUTE/CHRONIC/SUBACUTE) | |
| DiagnosisText | NTEXT | การวินิจฉัยแบบข้อความ (Diag Text) | |
| TreatmentGroupCode | VARCHAR(20) | FK | รหัสกลุ่มค่ารักษาพยาบาล (อ้างอิง TREATMENT_GROUP) |
| DRGCode | VARCHAR(10) | รหัส DRG | |
| DRGWeight | DECIMAL(5,3) | น้ำหนัก DRG | |
| ComplicationCode | VARCHAR(10) | รหัสภาวะแทรกซ้อน | |
| IsFromTemplate | BIT | มาจาก Template | |
| IsFromReDiag | BIT | มาจาก Re-diag | |
| TemplateID | VARCHAR(20) | รหัส Template | |
| OriginalDiagnosisID | VARCHAR(20) | รหัสการวินิจฉัยต้นฉบับ (สำหรับ Re-diag) | |
| DiagnosisDate | DATETIME | วันที่วินิจฉัย | |
| DiagnosedBy | VARCHAR(50) | แพทย์ผู้วินิจฉัย | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| FinanceServiceCode | VARCHAR(20) | รหัสบริการสำหรับการคิดเงิน (อ้างอิงไปยัง 1.2.14) |
Table: MEDICAL_PROCEDURE (หัตถการทางการแพทย์ - Shared Table)
วัตถุประสงค์: เก็บข้อมูลหัตถการที่ทำกับผู้ป่วยจากทั้งระบบซักประวัติ (1.2.2) และระบบห้องตรวจแพทย์ (1.2.3) ตาม TOR ข้อ 1.2.2.1.1, 1.2.2.2.8 และ 1.2.3.1.1, 1.2.3.2.8 รวมถึงรายละเอียดผู้ทำและระยะเวลา
| Field | Type | Key | Description |
|---|---|---|---|
| ProcedureID | VARCHAR(20) | PK | รหัสหัตถการ |
| SourceSystem | VARCHAR(20) | ระบบที่สร้าง (HISTORY_TAKING/EXAMINATION) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงต้นทาง (HistoryID หรือ ExaminationID) |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| HN | VARCHAR(10) | FK | Hospital Number |
| ICDProcedureCode | VARCHAR(10) | รหัสหัตถการ ICD (WHO) | |
| ProcedureName | NVARCHAR(200) | ชื่อหัตถการ | |
| ProcedureNameEng | NVARCHAR(200) | ชื่อหัตถการ (อังกฤษ) | |
| TreatmentGroupCode | VARCHAR(20) | FK | รหัสกลุ่มค่ารักษาพยาบาล |
| PerformerID | VARCHAR(20) | FK | รหัสแพทย์/เจ้าหน้าที่ผู้ทำ |
| PerformerName | NVARCHAR(100) | ชื่อผู้ทำหัตถการ | |
| StartTime | DATETIME | เวลาเริ่ม | |
| EndTime | DATETIME | เวลาสิ้นสุด | |
| Duration | INT | ระยะเวลา (นาที) | |
| ProcedureLocation | NVARCHAR(100) | สถานที่ทำหัตถการ | |
| ProcedureNotes | NTEXT | หมายเหตุหัตถการ | |
| Complications | NTEXT | ภาวะแทรกซ้อน | |
| ProcedureDate | DATETIME | วันที่ทำหัตถการ | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| FinanceServiceCode | VARCHAR(20) | รหัสบริการสำหรับการคิดเงิน (อ้างอิงไปยัง 1.2.14) |
8.2.1.4 การสั่งยาและเวชภัณฑ์
Table: MEDICATION_ORDER (การสั่งยาและเวชภัณฑ์ - Shared Table)
วัตถุประสงค์: เก็บข้อมูลการสั่งจ่ายยาและเวชภัณฑ์จากทั้งระบบซักประวัติ (1.2.2) และระบบห้องตรวจแพทย์ (1.2.3) ตาม TOR ข้อ 1.2.2.2.5, 1.2.2.2.6 และ 1.2.3.2.5, 1.2.3.2.6 รวมถึงการตรวจสอบ Drug Interaction และการ RE-MED
| Field | Type | Key | Description |
|---|---|---|---|
| MedicationOrderID | VARCHAR(20) | PK | รหัสการสั่งยา |
| SourceSystem | VARCHAR(20) | ระบบที่สร้าง (HISTORY_TAKING/EXAMINATION) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงต้นทาง (HistoryID หรือ ExaminationID) |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| HN | VARCHAR(10) | FK | Hospital Number |
| DrugCode | VARCHAR(20) | FK | รหัสยา (อ้างอิงจาก ระบบเภสัชกรรม 1.2.13) |
| DrugName | NVARCHAR(200) | ชื่อยา | |
| GenericName | NVARCHAR(200) | ชื่อสามัญยา | |
| Strength | VARCHAR(50) | ความแรง | |
| DosageForm | VARCHAR(50) | รูปแบบยา | |
| Quantity | DECIMAL(10,2) | จำนวน | |
| Unit | VARCHAR(20) | หน่วย | |
| Frequency | VARCHAR(50) | ความถี่การใช้ | |
| Duration | INT | จำนวนวันใช้ยา | |
| Instructions | NTEXT | วิธีการใช้ | |
| Route | VARCHAR(50) | วิธีให้ยา | |
| IsFromTemplate | BIT | มาจาก Template | |
| TemplateID | VARCHAR(20) | รหัส Template | |
| IsFromReMed | BIT | มาจาก RE-MED | |
| OriginalMedicationID | VARCHAR(20) | รหัสการสั่งยาต้นฉบับ (สำหรับ RE-MED) | |
| IsChronicDisease | BIT | ยาโรคเรื้อรัง | |
| TotalAmount | DECIMAL(10,2) | จำนวนรวม (คำนวณจากวันใช้) | |
| OrderDate | DATETIME | วันที่สั่งยา | |
| OrderedBy | VARCHAR(50) | แพทย์ผู้สั่งยา | |
| PharmacyStatus | VARCHAR(20) | สถานะเภสัชกรรม (ORDERED/DISPENSED/CANCELLED) | |
| AllergyChecked | BIT | ตรวจสอบการแพ้ยาแล้ว | |
| DrugInteractionChecked | BIT | ตรวจสอบ Drug Interaction แล้ว | |
| FinanceReferenceID | VARCHAR(20) | FK | รหัสอ้างอิงระบบการเงิน (1.2.14) |
| FinanceServiceCode | VARCHAR(20) | รหัสบริการสำหรับการคิดเงิน |
Table: DRUG_INTERACTION_CHECK (การตรวจสอบ Drug Interaction)
วัตถุประสงค์: เก็บข้อมูลการตรวจสอบอันตกริยาของยา ตาม TOR ข้อ 1.2.2.2.6
| Field | Type | Key | Description |
|---|---|---|---|
| InteractionID | VARCHAR(20) | PK | รหัสการตรวจสอบ |
| MedicationOrderID1 | VARCHAR(20) | FK | รหัสการสั่งยาที่ 1 |
| MedicationOrderID2 | VARCHAR(20) | FK | รหัสการสั่งยาที่ 2 |
| DrugCode1 | VARCHAR(20) | รหัสยาที่ 1 | |
| DrugCode2 | VARCHAR(20) | รหัสยาที่ 2 | |
| InteractionLevel | VARCHAR(20) | ระดับอันตกริยา (MINOR/MODERATE/MAJOR) | |
| InteractionDescription | NTEXT | รายละเอียดอันตกริยา | |
| RecommendedAction | NTEXT | คำแนะนำ | |
| CheckDate | DATETIME | วันที่ตรวจสอบ | |
| CheckedBy | VARCHAR(50) | ผู้ตรวจสอบ | |
| IsOverridden | BIT | ข้ามการเตือน | |
| OverrideReason | NTEXT | เหตุผลการข้าม |
8.2.1.5 การสั่งตรวจทางห้องปฏิบัติการ
Table: LAB_ORDER (การสั่ง Lab - Shared Table)
วัตถุประสงค์: เก็บข้อมูลการสั่งตรวจทางห้องปฏิบัติการจากทั้งระบบซักประวัติ (1.2.2) และระบบห้องตรวจแพทย์ (1.2.3) ตาม TOR ข้อ 1.2.2.2.9 และ 1.2.3.2.9 รวมถึงการกำหนดความเร่งด่วนและห้องที่รับผล
| Field | Type | Key | Description |
|---|---|---|---|
| LabOrderID | VARCHAR(20) | PK | รหัสการสั่ง Lab |
| SourceSystem | VARCHAR(20) | ระบบที่สร้าง (HISTORY_TAKING/EXAMINATION) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงต้นทาง (HistoryID หรือ ExaminationID) |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| HN | VARCHAR(10) | FK | Hospital Number |
| LabCode | VARCHAR(20) | FK | รหัสรายการ Lab (อ้างอิงจาก ระบบงานชันสูตร 1.2.7) |
| LabName | NVARCHAR(200) | ชื่อรายการตรวจ | |
| LabGroupCode | VARCHAR(20) | รหัสกลุ่มการตรวจ | |
| OrderingDoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้สั่ง |
| LabRoomCode | VARCHAR(10) | FK | รหัสห้อง Lab |
| ResultNotifyRoom | VARCHAR(10) | FK | ห้องที่ต้องการให้เตือนผล |
| UrgencyLevel | VARCHAR(20) | ความเร่งด่วน (ROUTINE/URGENT/STAT) | |
| SpecimenType | VARCHAR(50) | ประเภทสิ่งส่งตรวจ | |
| ClinicalInfo | NTEXT | ข้อมูลทางคลินิก | |
| IsAdvanceOrder | BIT | การสั่งล่วงหน้า | |
| AdvanceOrderDate | DATETIME | วันที่สั่งล่วงหน้า | |
| ExpectedCollectionDate | DATETIME | วันที่คาดว่าจะเก็บสิ่งส่งตรวจ | |
| CollectionDate | DATETIME | วันที่เก็บสิ่งส่งตรวจ | |
| CollectedBy | VARCHAR(50) | ผู้เก็บสิ่งส่งตรวจ | |
| OrderDate | DATETIME | วันที่สั่ง | |
| OrderedBy | VARCHAR(50) | ผู้สั่ง | |
| LabStatus | VARCHAR(20) | สถานะ Lab (ORDERED/COLLECTED/COMPLETED/CANCELLED) | |
| ResultAvailableDate | DATETIME | วันที่มีผลตรวจ | |
| NotificationSent | BIT | ส่งการแจ้งเตือนแล้ว | |
| FinanceServiceCode | VARCHAR(20) | รหัสบริการสำหรับการคิดเงิน | |
| IsAbnormal | BIT | ผลผิดปกติ | |
| ReportedBy | VARCHAR(50) | ผู้รายงานผล | |
| LabSystemRef | VARCHAR(20) | FK | รหัสอ้างอิงระบบชันสูตร (1.2.7) |
| FinanceReferenceID | VARCHAR(20) | FK | รหัสอ้างอิงระบบการเงิน (1.2.14) |
8.2.1.6 การสั่งตรวจทางรังสี
Table: RADIOLOGY_ORDER (การสั่ง X-Ray - Shared Table)
วัตถุประสงค์: เก็บข้อมูลการสั่งตรวจทางรังสีจากทั้งระบบซักประวัติ (1.2.2) และระบบห้องตรวจแพทย์ (1.2.3) ตาม TOR ข้อ 1.2.2.2.13, 1.2.2.2.14 และ 1.2.3.2.9 รวมถึงการระบุข้อมูลต่างๆ
| Field | Type | Key | Description |
|---|---|---|---|
| RadiologyOrderID | VARCHAR(20) | PK | รหัสการสั่ง X-Ray |
| SourceSystem | VARCHAR(20) | ระบบที่สร้าง (HISTORY_TAKING/EXAMINATION) | |
| SourceID | VARCHAR(20) | FK | รหัสอ้างอิงต้นทาง (HistoryID หรือ ExaminationID) |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| HN | VARCHAR(10) | FK | Hospital Number |
| XRayCode | VARCHAR(20) | FK | รหัสรายการ X-Ray (อ้างอิงจาก ระบบรังสีวิทยา 1.2.8) |
| XRayName | NVARCHAR(200) | ชื่อรายการตรวจ | |
| XRayGroupCode | VARCHAR(20) | รหัสกลุ่มการตรวจ | |
| OrderingDoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้สั่ง |
| BodyPart | VARCHAR(100) | ส่วนของร่างกายที่ตรวจ | |
| Position | VARCHAR(50) | ท่า | |
| Side | VARCHAR(20) | ด้าน | |
| XRayRoomCode | VARCHAR(10) | FK | ห้องตรวจ (กรณีมีหลายห้อง) |
| PatientCondition | VARCHAR(100) | สภาพผู้ป่วย | |
| UrgencyLevel | VARCHAR(20) | ความเร่งด่วน (ROUTINE/URGENT/STAT) | |
| ClinicalInfo | NTEXT | ข้อมูลทางคลินิก (Clinical Information) | |
| ClinicalDiagnosis | NTEXT | การวินิจฉัยทางคลินิก (Clinical Diagnosis) | |
| IsAdvanceOrder | BIT | การสั่งล่วงหน้า | |
| AdvanceOrderDate | DATETIME | วันที่สั่งล่วงหน้า | |
| ExpectedExamDate | DATETIME | วันที่คาดว่าจะตรวจ | |
| OrderDate | DATETIME | วันที่สั่ง | |
| OrderedBy | VARCHAR(50) | ผู้สั่ง | |
| RadiologyStatus | VARCHAR(20) | สถานะ X-Ray (ORDERED/COMPLETED/CANCELLED) | |
| ResultAvailableDate | DATETIME | วันที่มีผลตรวจ | |
| NotificationSent | BIT | ส่งการแจ้งเตือนแล้ว | |
| OrderNotes | NTEXT | หมายเหตุ | |
| FinanceServiceCode | VARCHAR(20) | รหัสบริการสำหรับการคิดเงิน |
8.2.1.7 การนัดหมาย
Table: APPOINTMENT_HISTORY (การนัดหมายจากการซักประวัติ)
วัตถุประสงค์: เก็บข้อมูลการนัดหมายที่สร้างจากการซักประวัติ ตาม TOR ข้อ 1.2.2.3 รวมถึงการนัดหลายแผนกและการสั่ง Lab/X-Ray ล่วงหน้า
| Field | Type | Key | Description |
|---|---|---|---|
| AppointmentHistoryID | VARCHAR(20) | PK | รหัสการนัดหมาย |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| HN | VARCHAR(10) | FK | รหัสผู้ป่วย |
| AppointmentDate | DATE | วันที่นัดหมาย | |
| AppointmentTime | TIME | เวลานัดหมาย | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| RoomCode | VARCHAR(10) | FK | รหัสห้อง |
| DoctorID | VARCHAR(20) | FK | รหัสแพทย์ |
| AppointmentType | VARCHAR(20) | ประเภทการนัด (FOLLOW_UP/CHECK_UP/TREATMENT) | |
| AppointmentReason | NTEXT | สาเหตุการนัดหมาย | |
| PatientInstructions | NTEXT | การปฏิบัติตัวสำหรับผู้ป่วย | |
| SpecialInstructions | NTEXT | คำแนะนำพิเศษ | |
| IsMultipleDepartments | BIT | นัดหลายแผนก | |
| IsAdvanceLabOrder | BIT | สั่ง Lab ล่วงหน้า | |
| IsAdvanceXrayOrder | BIT | สั่ง X-Ray ล่วงหน้า | |
| IsTemplate | BIT | เป็น Template (เช่น นัดรับยา/ฉีดยา) | |
| TemplateID | VARCHAR(20) | รหัส Template | |
| CreatedDate | DATETIME | วันที่สร้างนัด | |
| CreatedBy | VARCHAR(50) | ผู้สร้างนัด | |
| Status | VARCHAR(20) | สถานะ (SCHEDULED/CONFIRMED/COMPLETED/CANCELLED) | |
| IsHolidayWarning | BIT | เตือนวันหยุด |
Table: MULTIPLE_APPOINTMENT (การนัดหลายแผนก)
วัตถุประสงค์: เก็บรายละเอียดการนัดหลายแผนกในการมา Visit 1 ครั้ง ตาม TOR ข้อ 1.2.2.3.2
| Field | Type | Key | Description |
|---|---|---|---|
| MultipleAppointmentID | VARCHAR(20) | PK | รหัสการนัดหลายแผนก |
| AppointmentHistoryID | VARCHAR(20) | FK | รหัสการนัดหมายหลัก |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| RoomCode | VARCHAR(10) | FK | รหัสห้อง |
| AppointmentSequence | INT | ลำดับการนัด | |
| EstimatedTime | TIME | เวลาโดยประมาณ | |
| SpecialNotes | NTEXT | หมายเหตุพิเศษ |
8.2.1.8 การส่งต่อและปรึกษา
Table: REFERRAL (การส่งต่อ - Refer)
วัตถุประสงค์: เก็บข้อมูลการส่งต่อผู้ป่วยไปยังสถานพยาบาลอื่น ตาม TOR ข้อ 1.2.2.2.10
| Field | Type | Key | Description |
|---|---|---|---|
| ReferralID | VARCHAR(20) | PK | รหัสการส่งต่อ |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| ReferToHospital | NVARCHAR(200) | สถานพยาบาลที่ส่งต่อ | |
| ReferReason | NTEXT | เหตุผลการส่งตัว | |
| PreliminaryDiagnosis | NTEXT | การวินิจฉัยขั้นต้น | |
| MainDiagnosis | NTEXT | การวินิจฉัยหลัก | |
| ReferringDoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้สั่ง |
| ReferPoint | NVARCHAR(100) | จุดส่งต่อ | |
| Department | NVARCHAR(100) | แผนก | |
| CauseType | VARCHAR(50) | สาเหตุ | |
| TreatmentGiven | NTEXT | การรักษาที่ให้ไว้ | |
| TransportType | VARCHAR(50) | การขนส่ง (NURSE_REFER/AMBULANCE/FAMILY) | |
| ReferType | VARCHAR(50) | ประเภทการส่งต่อ | |
| ReferEndDate | DATE | วันที่สิ้นสุดการส่งต่อ | |
| ReferDate | DATETIME | วันที่ส่งต่อ | |
| Status | VARCHAR(20) | สถานะ (PENDING/SENT/RECEIVED/COMPLETED) | |
| IsEmergency | BIT | ฉุกเฉิน | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| RightsVerificationRef | VARCHAR(20) | FK | รหัสอ้างอิงการตรวจสอบสิทธิ (1.2.15) |
| FinanceReferenceID | VARCHAR(20) | FK | รหัสอ้างอิงระบบการเงิน (1.2.14) |
Table: CONSULTATION (การปรึกษา - Consult)
วัตถุประสงค์: เก็บข้อมูลการขอปรึกษาแพทย์/ทันตแพทย์หรือแผนกอื่น ตาม TOR ข้อ 1.2.2.4
| Field | Type | Key | Description |
|---|---|---|---|
| ConsultationID | VARCHAR(20) | PK | รหัสการปรึกษา |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| ConsultToDoctorID | VARCHAR(20) | FK | รหัสแพทย์ที่ขอปรึกษา |
| ConsultToDepartment | VARCHAR(10) | FK | รหัสแผนกที่ขอปรึกษา |
| RequestingDoctorID | VARCHAR(20) | FK | รหัสแพทย์ผู้ขอปรึกษา |
| UrgencyLevel | VARCHAR(20) | ความเร่งด่วน (ROUTINE/URGENT/EMERGENT) | |
| ConsultQuestion | NTEXT | คำถามการปรึกษา | |
| ClinicalFindings | NTEXT | ผลการตรวจทางคลินิก | |
| RequestDate | DATETIME | วันที่ขอปรึกษา | |
| ResponseDate | DATETIME | วันที่ตอบกลับ | |
| ConsultAnswer | NTEXT | คำตอบการปรึกษา | |
| Recommendations | NTEXT | คำแนะนำ | |
| Status | VARCHAR(20) | สถานะ (PENDING/ANSWERED/COMPLETED) | |
| IsComplete | BIT | เสร็จสิ้น | |
| ExamRoomSystemRef | VARCHAR(20) | FK | รหัสอ้างอิงระบบห้องตรวจ (1.2.3) |
8.2.2 ตารางรองรับการทำงาน (Support Tables)
8.2.2.1 การให้คำแนะนำผู้ป่วย
Table: PATIENT_EDUCATION (การให้คำแนะนำผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลการให้คำแนะนำผู้ป่วย ตาม TOR ข้อ 1.2.2.2.12 เช่น การใช้ยา การปฏิบัติตัว การรับประทานอาหาร
| Field | Type | Key | Description |
|---|---|---|---|
| EducationID | VARCHAR(20) | PK | รหัสการให้คำแนะนำ |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| EducationType | VARCHAR(50) | ประเภทคำแนะนำ (MEDICATION/LIFESTYLE/DIET/EXERCISE/FOLLOW_UP/PREVENTION/EMERGENCY) | |
| EducationTitle | NVARCHAR(200) | หัวข้อคำแนะนำ | |
| EducationContent | NTEXT | เนื้อหาคำแนะนำ | |
| IsStandardContent | BIT | เป็นเนื้อหามาตรฐาน | |
| TemplateID | VARCHAR(20) | รหัส Template | |
| Priority | VARCHAR(20) | ระดับความสำคัญ (HIGH/MEDIUM/LOW) | |
| CreatedDate | DATETIME | วันที่ให้คำแนะนำ | |
| CreatedBy | VARCHAR(50) | ผู้ให้คำแนะนำ | |
| IsPatientUnderstood | BIT | ผู้ป่วยเข้าใจ |
8.2.2.2 Template และการใช้ซ้ำ
Table: HISTORY_TEMPLATE (Template การซักประวัติ)
วัตถุประสงค์: เก็บ Template สำหรับการซักประวัติและการรักษาที่ใช้บ่อย เพื่อความสะดวกในการบันทึกข้อมูล
| Field | Type | Key | Description |
|---|---|---|---|
| TemplateID | VARCHAR(20) | PK | รหัส Template |
| TemplateName | NVARCHAR(100) | ชื่อ Template | |
| TemplateType | VARCHAR(50) | ประเภท Template (HISTORY/MEDICATION/APPOINTMENT/EDUCATION) | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนก |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| TemplateContent | NTEXT | เนื้อหา Template (JSON format) | |
| IsPublic | BIT | ใช้ร่วมกันได้ | |
| UsageCount | INT | จำนวนครั้งที่ใช้ | |
| LastUsedDate | DATETIME | ใช้ครั้งล่าสุด | |
| IsActive | BIT | ใช้งานอยู่ |
Table: BP_MONITORING (การติดตามความดันโลหิต)
วัตถุประสงค์: เก็บข้อมูลการวัดความดันโลหิตซ้ำและการนั่งพักวัด BP ตาม TOR ข้อ 1.2.2.2.11
| Field | Type | Key | Description |
|---|---|---|---|
| BPMonitoringID | VARCHAR(20) | PK | รหัสการติดตาม BP |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| VitalSignsID | VARCHAR(20) | FK | รหัสสัญญาณชีพ |
| MeasurementSequence | INT | ลำดับการวัด | |
| RestingTime | INT | เวลาพัก (นาที) | |
| SystolicBP | INT | ความดันโลหิตซิสโตลิก | |
| DiastolicBP | INT | ความดันโลหิตไดแอสโตลิก | |
| MeasurementTime | DATETIME | เวลาที่วัด | |
| Position | VARCHAR(20) | ท่านั่ง/นอน | |
| ArmUsed | VARCHAR(10) | แขนที่ใช้วัด (LEFT/RIGHT) | |
| CuffSize | VARCHAR(20) | ขนาดข้อมือ | |
| Notes | NVARCHAR(200) | หมายเหตุ | |
| MeasuredBy | VARCHAR(50) | ผู้วัด |
8.2.2.3 การจัดการข้อมูลอ้างอิง
Table: ICD_CODE_MAPPING (การแมป ICD Code)
วัตถุประสงค์: จัดการการแมปรหัส ICD ระหว่างเวอร์ชันต่างๆ และรหัสไทย ตาม TOR ข้อ 1.2.2.1.2 และ 1.2.2.2.7
| Field | Type | Key | Description |
|---|---|---|---|
| MappingID | VARCHAR(20) | PK | รหัสการแมป |
| ICDCodeWHO | VARCHAR(10) | รหัส ICD WHO | |
| ICDCodeThai | VARCHAR(10) | รหัส ICD ไทย | |
| ICDVersion | VARCHAR(10) | เวอร์ชัน ICD (10/11) | |
| DiseaseName | NVARCHAR(200) | ชื่อโรค | |
| DiseaseNameEng | NVARCHAR(200) | ชื่อโรค (อังกฤษ) | |
| CategoryCode | VARCHAR(20) | รหัสหมวด | |
| IsCommonDiagnosis | BIT | วินิจฉัยบ่อย | |
| UsageCount | INT | จำนวนครั้งที่ใช้ | |
| IsActive | BIT | ใช้งานอยู่ |
Table: TREATMENT_GROUPING (การจัดกลุ่มค่ารักษาพยาบาล)
วัตถุประสงค์: เก็บข้อมูลการจัดกลุ่มค่ารักษาพยาบาลตาม DRG ตาม TOR ข้อ 1.2.2.1.3
| Field | Type | Key | Description |
|---|---|---|---|
| GroupingID | VARCHAR(20) | PK | รหัสการจัดกลุ่ม |
| DRGCode | VARCHAR(10) | รหัส DRG | |
| DRGName | NVARCHAR(200) | ชื่อ DRG | |
| DRGWeight | DECIMAL(5,3) | น้ำหนัก DRG | |
| BaseRate | DECIMAL(10,2) | อัตราพื้นฐาน | |
| ServiceCharges | NTEXT | ค่าบริการที่รวม (JSON format) | |
| IsActive | BIT | ใช้งานอยู่ |
8.2.3 ตารางจัดการระบบ (System Tables)
8.2.3.1 การพิมพ์เอกสาร
Table: DOCUMENT_PRINTING (การพิมพ์เอกสาร)
วัตถุประสงค์: เก็บข้อมูลการพิมพ์เอกสารต่างๆ ตาม TOR ข้อ 1.2.2.5 เช่น ใบรับรองแพทย์ ใบสั่งยา ใบนัดหมาย
| Field | Type | Key | Description |
|---|---|---|---|
| PrintingID | VARCHAR(20) | PK | รหัสการพิมพ์ |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| DocumentType | VARCHAR(50) | ประเภทเอกสาร (MEDICAL_CERT/SICK_LEAVE/OPD_CARD/PRESCRIPTION/REFER/APPOINTMENT) | |
| DocumentSubType | VARCHAR(50) | ประเภทย่อย (WORK_APPLICATION/SICK_LEAVE/REFER_OUT/REFER_REPLY) | |
| Language | VARCHAR(10) | ภาษา (TH/EN) | |
| TemplateName | VARCHAR(100) | ชื่อ Template | |
| PrintDate | DATETIME | วันที่พิมพ์ | |
| PrintedBy | VARCHAR(50) | ผู้พิมพ์ | |
| PrinterName | VARCHAR(100) | ชื่อเครื่องพิมพ์ | |
| Copies | INT | จำนวนฉบับ | |
| DocumentContent | NTEXT | เนื้อหาเอกสาร | |
| Status | VARCHAR(20) | สถานะ (SUCCESS/FAILED/PENDING) |
8.2.3.2 บันทึกการแก้ไข
Table: HISTORY_AUDIT_LOG (บันทึกการแก้ไข)
วัตถุประสงค์: เก็บบันทึกการเปลี่ยนแปลงข้อมูลการซักประวัติทั้งหมด เพื่อการตรวจสอบย้อนหลัง (Audit Trail)
| Field | Type | Key | Description |
|---|---|---|---|
| LogID | VARCHAR(20) | PK | รหัส Log |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| TableName | VARCHAR(50) | ชื่อตาราง | |
| RecordID | VARCHAR(20) | รหัสระเบียน | |
| FieldName | VARCHAR(50) | ชื่อฟิลด์ | |
| OldValue | NTEXT | ค่าเดิม | |
| NewValue | NTEXT | ค่าใหม่ | |
| Action | VARCHAR(50) | การกระทำ (INSERT/UPDATE/DELETE) | |
| ActionDate | DATETIME | วันที่ทำรายการ | |
| ActionBy | VARCHAR(50) | ผู้ทำรายการ | |
| IPAddress | VARCHAR(50) | IP Address | |
| UserAgent | VARCHAR(200) | User Agent | |
| Reason | NVARCHAR(200) | เหตุผล |
8.2.3.3 การเชื่อมโยงระบบ
Table: SYSTEM_INTEGRATION_LOG (Log การเชื่อมโยงระบบ)
วัตถุประสงค์: เก็บ Log การเชื่อมต่อกับระบบอื่นๆ เช่น ระบบเภสัชกรรม ระบบการเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| IntegrationLogID | VARCHAR(20) | PK | รหัส Integration Log |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| TargetSystem | VARCHAR(50) | ระบบปลายทาง (PHARMACY/FINANCE/LAB/RADIOLOGY) | |
| IntegrationType | VARCHAR(50) | ประเภทการเชื่อมต่อ (MEDICATION_ORDER/LAB_ORDER/BILLING) | |
| RequestData | NTEXT | ข้อมูลที่ส่ง | |
| ResponseData | NTEXT | ข้อมูลที่ได้รับ | |
| ResponseCode | VARCHAR(10) | รหัสตอบกลับ | |
| ResponseMessage | NVARCHAR(200) | ข้อความตอบกลับ | |
| ProcessingTime | INT | เวลาประมวลผล (มิลลิวินาที) | |
| CreatedDate | DATETIME | วันที่ทำรายการ | |
| IsSuccess | BIT | สำเร็จ | |
| ErrorDetails | NTEXT | รายละเอียดข้อผิดพลาด |
8.2.4 ดัชนี (Indexes)
8.2.4.1 Primary Indexes
-- ดัชนีหลักสำหรับการค้นหาข้อมูลผู้ป่วย
CREATE INDEX IX_HISTORY_TAKING_HN ON HISTORY_TAKING (HN);
CREATE INDEX IX_HISTORY_TAKING_VISIT ON HISTORY_TAKING (VisitID);
CREATE INDEX IX_HISTORY_TAKING_DATE ON HISTORY_TAKING (HistoryDate);
CREATE INDEX IX_HISTORY_TAKING_DOCTOR ON HISTORY_TAKING (DoctorID);
-- ดัชนีสำหรับการสั่งยา
CREATE INDEX IX_MEDICATION_ORDER_HISTORY ON MEDICATION_ORDER (HistoryID);
CREATE INDEX IX_MEDICATION_ORDER_DRUG ON MEDICATION_ORDER (DrugCode);
CREATE INDEX IX_MEDICATION_ORDER_DATE ON MEDICATION_ORDER (OrderDate);
CREATE INDEX IX_MEDICATION_ORDER_STATUS ON MEDICATION_ORDER (Status);
-- ดัชนีสำหรับการสั่ง Lab และ X-Ray
CREATE INDEX IX_LAB_ORDER_HISTORY ON LAB_ORDER (HistoryID);
CREATE INDEX IX_LAB_ORDER_DATE ON LAB_ORDER (OrderDate);
CREATE INDEX IX_LAB_ORDER_STATUS ON LAB_ORDER (Status);
CREATE INDEX IX_RADIOLOGY_ORDER_HISTORY ON RADIOLOGY_ORDER (HistoryID);
CREATE INDEX IX_RADIOLOGY_ORDER_DATE ON RADIOLOGY_ORDER (OrderDate);
-- ดัชนีสำหรับการวินิจฉัย
CREATE INDEX IX_DIAGNOSIS_HISTORY ON DIAGNOSIS (HistoryID);
CREATE INDEX IX_DIAGNOSIS_ICD ON DIAGNOSIS (ICDCode);
CREATE INDEX IX_DIAGNOSIS_TYPE ON DIAGNOSIS (DiagnosisType);
-- ดัชนีสำหรับการแพ้ยา
CREATE INDEX IX_DRUG_ALLERGY_HN ON DRUG_ALLERGY (HN);
CREATE INDEX IX_DRUG_ALLERGY_DRUG ON DRUG_ALLERGY (DrugCode);
CREATE INDEX IX_DRUG_ALLERGY_ACTIVE ON DRUG_ALLERGY (IsActive);
8.2.4.2 Composite Indexes
-- ดัชนีรวมสำหรับการค้นหาที่ซับซ้อน
CREATE INDEX IX_HISTORY_TAKING_HN_DATE ON HISTORY_TAKING (HN, HistoryDate);
CREATE INDEX IX_MEDICATION_ORDER_HN_DATE ON MEDICATION_ORDER (HistoryID, OrderDate);
CREATE INDEX IX_VITAL_SIGNS_HISTORY_DATE ON VITAL_SIGNS (HistoryID, MeasurementDate);
CREATE INDEX IX_APPOINTMENT_HISTORY_HN_DATE ON APPOINTMENT_HISTORY (HN, AppointmentDate);
8.2.5 ข้อจำกัดและกฎธุรกิจ (Constraints & Business Rules)
8.2.5.1 Foreign Key Constraints
-- ความสัมพันธ์กับระบบเวชระเบียน
ALTER TABLE HISTORY_TAKING ADD FOREIGN KEY (VisitID) REFERENCES VISIT(VisitID);
ALTER TABLE HISTORY_TAKING ADD FOREIGN KEY (HN) REFERENCES PATIENT(HN);
-- ความสัมพันธ์ภายในระบบซักประวัติ
ALTER TABLE VITAL_SIGNS ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
ALTER TABLE DRUG_ALLERGY ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
ALTER TABLE DIAGNOSIS ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
ALTER TABLE MEDICATION_ORDER ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
ALTER TABLE LAB_ORDER ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
ALTER TABLE RADIOLOGY_ORDER ADD FOREIGN KEY (HistoryID) REFERENCES HISTORY_TAKING(HistoryID);
-- ความสัมพันธ์กับระบบอื่นๆ (Cross-System References)
-- ระบบเภสัชกรรม (1.2.13)
ALTER TABLE MEDICATION_ORDER ADD FOREIGN KEY (DrugCode) REFERENCES PHARMACY_DRUG_MASTER(DrugCode);
ALTER TABLE MEDICATION_ORDER ADD FOREIGN KEY (PharmacistID) REFERENCES PHARMACY_STAFF(PharmacistID);
-- ระบบงานชันสูตร (1.2.7)
ALTER TABLE LAB_ORDER ADD FOREIGN KEY (LabCode) REFERENCES LAB_TEST_MASTER(LabCode);
-- ระบบรังสีวิทยา (1.2.8)
ALTER TABLE RADIOLOGY_ORDER ADD FOREIGN KEY (ExamCode) REFERENCES RADIOLOGY_EXAM_MASTER(ExamCode);
-- ระบบตรวจสอบสิทธิ (1.2.15)
ALTER TABLE REFERRAL ADD FOREIGN KEY (RightsVerificationRef) REFERENCES RIGHTSVERIFICATION(VerificationID);
-- ระบบการเงิน (1.2.14)
ALTER TABLE MEDICATION_ORDER ADD FOREIGN KEY (FinanceReferenceID) REFERENCES FINANCE_TRANSACTION(TransactionID);
ALTER TABLE LAB_ORDER ADD FOREIGN KEY (FinanceReferenceID) REFERENCES FINANCE_TRANSACTION(TransactionID);
ALTER TABLE RADIOLOGY_ORDER ADD FOREIGN KEY (FinanceReferenceID) REFERENCES FINANCE_TRANSACTION(TransactionID);
-- ระบบห้องตรวจแพทย์ (1.2.3)
ALTER TABLE CONSULTATION ADD FOREIGN KEY (ExamRoomSystemRef) REFERENCES EXAM_ROOM_CONSULT(ConsultID);
8.2.5.2 Check Constraints
-- ตรวจสอบค่าสัญญาณชีพ
ALTER TABLE VITAL_SIGNS ADD CONSTRAINT CHK_Weight CHECK (Weight > 0 AND Weight < 500);
ALTER TABLE VITAL_SIGNS ADD CONSTRAINT CHK_Height CHECK (Height > 0 AND Height < 300);
ALTER TABLE VITAL_SIGNS ADD CONSTRAINT CHK_Temperature CHECK (Temperature >= 30 AND Temperature <= 50);
ALTER TABLE VITAL_SIGNS ADD CONSTRAINT CHK_BloodPressure CHECK (SystolicBP >= 50 AND SystolicBP <= 300 AND DiastolicBP >= 30 AND DiastolicBP <= 200);
-- ตรวจสอบปริมาณยา
ALTER TABLE MEDICATION_ORDER ADD CONSTRAINT CHK_Quantity CHECK (Quantity > 0);
ALTER TABLE MEDICATION_ORDER ADD CONSTRAINT CHK_Duration CHECK (Duration > 0 AND Duration <= 365);
8.2.5.3 Business Rules
-- กฎธุรกิจ: BMI คำนวณอัตโนมัติ
CREATE TRIGGER TRG_CALCULATE_BMI
ON VITAL_SIGNS
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE VITAL_SIGNS
SET BMI = ROUND((Weight / POWER(Height/100, 2)), 2)
WHERE VitalSignsID IN (SELECT VitalSignsID FROM INSERTED)
AND Weight IS NOT NULL AND Height IS NOT NULL AND Height > 0;
END;
-- กฎธุรกิจ: ตรวจสอบการแพ้ยาก่อนสั่งยา
CREATE TRIGGER TRG_CHECK_DRUG_ALLERGY
ON MEDICATION_ORDER
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT 1 FROM INSERTED i
INNER JOIN DRUG_ALLERGY da ON da.HN = (
SELECT HN FROM HISTORY_TAKING WHERE HistoryID = i.HistoryID
)
WHERE da.DrugCode = i.DrugCode
AND da.IsContraindicated = 1
AND da.IsActive = 1
)
BEGIN
RAISERROR ('ผู้ป่วยแพ้ยาที่สั่ง กรุณาตรวจสอบ', 16, 1);
ROLLBACK TRANSACTION;
END;
END;
8.2.6 Views สำหรับการทำงาน
8.2.6.1 Views หลัก
-- View สำหรับแสดงข้อมูลการซักประวัติพร้อมข้อมูลผู้ป่วย
CREATE VIEW VW_HISTORY_TAKING_SUMMARY AS
SELECT
ht.HistoryID,
ht.VisitID,
p.HN,
p.FirstName + ' ' + p.LastName AS PatientName,
ht.HistoryDate,
ht.ChiefComplaint,
ht.DoctorID,
ht.IsCompleted,
vs.Weight,
vs.Height,
vs.BMI,
vs.SystolicBP,
vs.DiastolicBP,
COUNT(mo.MedicationOrderID) AS MedicationCount,
COUNT(lo.LabOrderID) AS LabOrderCount,
COUNT(ro.RadiologyOrderID) AS RadiologyOrderCount
FROM HISTORY_TAKING ht
LEFT JOIN PATIENT p ON p.HN = ht.HN
LEFT JOIN VITAL_SIGNS vs ON vs.HistoryID = ht.HistoryID
LEFT JOIN MEDICATION_ORDER mo ON mo.HistoryID = ht.HistoryID
LEFT JOIN LAB_ORDER lo ON lo.HistoryID = ht.HistoryID
LEFT JOIN RADIOLOGY_ORDER ro ON ro.HistoryID = ht.HistoryID
GROUP BY ht.HistoryID, ht.VisitID, p.HN, p.FirstName, p.LastName,
ht.HistoryDate, ht.ChiefComplaint, ht.DoctorID, ht.IsCompleted,
vs.Weight, vs.Height, vs.BMI, vs.SystolicBP, vs.DiastolicBP;
-- View สำหรับแสดงประวัติการแพ้ยาที่ใช้งานอยู่
CREATE VIEW VW_ACTIVE_DRUG_ALLERGIES AS
SELECT
da.HN,
p.FirstName + ' ' + p.LastName AS PatientName,
da.DrugName,
da.AllergySymptoms,
da.Severity,
da.IsContraindicated,
da.NaranjoResult,
da.ReportDate
FROM DRUG_ALLERGY da
INNER JOIN PATIENT p ON p.HN = da.HN
WHERE da.IsActive = 1;
8.2.7 การเชื่อมโยงระบบ (System Integration Tables)
8.2.7.1 ตารางแมปข้อมูลระหว่างระบบ
Table: SYSTEM_REFERENCE_MAPPING (การแมปอ้างอิงระหว่างระบบ)
วัตถุประสงค์: เก็บข้อมูลการแมปและอ้างอิงระหว่างระบบซักประวัติกับระบบอื่นๆ เพื่อการ Integration และ Data Synchronization
| Field | Type | Key | Description |
|---|---|---|---|
| MappingID | VARCHAR(20) | PK | รหัสการแมป |
| SourceSystem | VARCHAR(20) | ระบบต้นทาง (HISTORY_TAKING) | |
| SourceTableName | VARCHAR(50) | ชื่อตารางต้นทาง | |
| SourceRecordID | VARCHAR(20) | รหัสระเบียนต้นทาง | |
| TargetSystem | VARCHAR(20) | ระบบปลายทาง (PHARMACY/FINANCE/LAB/RADIOLOGY/RIGHTS/EXAM_ROOM) | |
| TargetTableName | VARCHAR(50) | ชื่อตารางปลายทาง | |
| TargetRecordID | VARCHAR(20) | รหัสระเบียนปลายทาง | |
| MappingType | VARCHAR(30) | ประเภทการแมป (ORDER/REFERENCE/BILLING/VERIFICATION) | |
| SyncStatus | VARCHAR(20) | สถานะ Sync (PENDING/SYNCED/FAILED/CONFLICT) | |
| LastSyncDate | DATETIME | วันที่ Sync ล่าสุด | |
| SyncAttempts | INT | จำนวนครั้งที่พยายาม Sync | |
| ErrorMessage | NTEXT | ข้อความข้อผิดพลาด | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| IsActive | BIT | ใช้งานอยู่ |
Table: CROSS_SYSTEM_VALIDATION (การตรวจสอบข้อมูลข้ามระบบ)
วัตถุประสงค์: เก็บข้อมูลการตรวจสอบข้อมูลที่ต้องมีการยืนยันจากระบบอื่น เช่น การตรวจสอบสิทธิ การอนุมัติการเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| ValidationID | VARCHAR(20) | PK | รหัสการตรวจสอบ |
| HistoryID | VARCHAR(20) | FK | รหัสการซักประวัติ |
| ValidationType | VARCHAR(30) | ประเภทการตรวจสอบ (DRUG_ALLERGY/RIGHTS/FINANCE/LAB_APPROVAL) | |
| ExternalSystemID | VARCHAR(20) | รหัสระบบภายนอก | |
| ValidationRequest | NTEXT | ข้อมูลที่ส่งไปตรวจสอบ | |
| ValidationResponse | NTEXT | ข้อมูลที่ได้รับกลับ | |
| ValidationResult | VARCHAR(20) | ผลการตรวจสอบ (APPROVED/REJECTED/PENDING/WARNING) | |
| RequestDate | DATETIME | วันที่ร้องขอ | |
| ResponseDate | DATETIME | วันที่ได้รับผล | |
| ValidatedBy | VARCHAR(50) | ผู้ตรวจสอบ | |
| OverrideReason | NTEXT | เหตุผลการข้ามการตรวจสอบ | |
| IsOverridden | BIT | ข้ามการตรวจสอบ |
8.2.8 API Integration Specifications
8.2.8.1 การเชื่อมต่อแบบ Real-time
-- Table: API_ENDPOINT_CONFIG (การตั้งค่า API Endpoints)
CREATE TABLE API_ENDPOINT_CONFIG (
EndpointID VARCHAR(20) PRIMARY KEY,
SystemCode VARCHAR(20) NOT NULL, -- PHARMACY/FINANCE/LAB/RADIOLOGY/RIGHTS
EndpointName VARCHAR(100) NOT NULL,
BaseURL VARCHAR(500) NOT NULL,
AuthType VARCHAR(20) NOT NULL, -- JWT/API_KEY/OAUTH
TimeoutSeconds INT DEFAULT 30,
MaxRetryAttempts INT DEFAULT 3,
IsActive BIT DEFAULT 1,
CreatedDate DATETIME DEFAULT GETDATE()
);
-- Table: API_CALL_LOG (บันทึกการเรียก API)
CREATE TABLE API_CALL_LOG (
CallLogID VARCHAR(20) PRIMARY KEY,
HistoryID VARCHAR(20),
EndpointID VARCHAR(20) REFERENCES API_ENDPOINT_CONFIG(EndpointID),
RequestMethod VARCHAR(10), -- GET/POST/PUT/DELETE
RequestURL VARCHAR(500),
RequestHeaders NTEXT,
RequestBody NTEXT,
ResponseCode INT,
ResponseHeaders NTEXT,
ResponseBody NTEXT,
ProcessingTime INT, -- milliseconds
CallDate DATETIME DEFAULT GETDATE(),
IsSuccess BIT,
ErrorMessage NTEXT
);
8.2.8.2 Integration Patterns ตาม TOR
🔗 ระบบเภสัชกรรม (1.2.13) Integration:
{
"medication_order_sync": {
"trigger": "MEDICATION_ORDER.INSERT/UPDATE",
"endpoint": "/api/v1/pharmacy/orders",
"payload": {
"order_id": "MedicationOrderID",
"drug_code": "DrugCode",
"quantity": "Quantity",
"patient_allergies": "from DRUG_ALLERGY table"
},
"response_mapping": {
"pharmacy_order_id": "PharmacySystemRef",
"dispensing_status": "Status"
}
}
}
💰 ระบบการเงิน (1.2.14) Integration:
{
"billing_calculation": {
"trigger": "HISTORY_TAKING.IsCompleted = 1",
"endpoint": "/api/v1/finance/calculate",
"payload": {
"visit_id": "VisitID",
"medications": "from MEDICATION_ORDER",
"lab_orders": "from LAB_ORDER",
"radiology_orders": "from RADIOLOGY_ORDER",
"procedures": "from PROCEDURES",
"patient_rights": "from VISIT_RIGHTS"
}
}
}
🏥 ระบบห้องตรวจ (1.2.3) Integration:
{
"consultation_request": {
"trigger": "CONSULTATION.INSERT",
"endpoint": "/api/v1/examroom/consult/request",
"payload": {
"consultation_id": "ConsultationID",
"target_department": "ConsultToDepartment",
"urgency": "UrgencyLevel",
"clinical_question": "ConsultQuestion"
}
}
}
หมายเหตุการออกแบบ:
- การเชื่อมโยงระบบ: Schema นี้ออกแบบให้เชื่อมโยงกับระบบอื่นผ่าน Foreign Key และ API Integration
- ความยืดหยุ่น: รองรับการขยายระบบในอนาคต เช่น การเพิ่ม Template, การ Integration กับระบบภายนอก
- การตรวจสอบข้อมูล: มี Trigger และ Constraint เพื่อรักษาความถูกต้องของข้อมูล
- ประสิทธิภาพ: ออกแบบ Index เพื่อการค้นหาที่รวดเร็ว
- ความปลอดภัย: มี Audit Log เพื่อติดตามการเปลี่ยนแปลงข้อมูล
- Cross-System Integrity: มีการตรวจสอบความสอดคล้องข้อมูลระหว่างระบบ
เอกสารนี้จัดทำขึ้นเพื่อใช้ในการพัฒนาระบบซักประวัติสำหรับโรงพยาบาลค่ายธนรัชน์ และต้องได้รับการอนุมัติจากผู้มีอำนาจก่อนนำไปใช้ในการพัฒนาระบบ