Data Dictionary - Laboratory Master Data
พจนานุกรมข้อมูลแบบละเอียด สำหรับทุก Column ในทุก Table
📖 Table of Contents
- lab_categories
- specimen_types
- container_types
- lab_items
- lab_panels
- lab_panel_items
- lab_normal_ranges
- lab_critical_values
- lab_item_coverage
1. lab_categories
Purpose: จัดกลุ่มรายการตรวจตามประเภท เช่น โลหิตวิทยา, เคมีคลินิก
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key, รหัสอ้างอิงภายใน | 1, 2, 3 | AUTO_INCREMENT |
| code | VARCHAR(20) | NO | - | รหัสหมวดหมู่ (สั้น, Uppercase) | HEMA, CHEM, MICRO | UNIQUE, Uppercase |
| name_th | VARCHAR(255) | NO | - | ชื่อหมวดหมู่ภาษาไทย | โลหิตวิทยา, เคมีคลินิก | Required |
| name_en | VARCHAR(255) | NO | - | ชื่อหมวดหมู่ภาษาอังกฤษ | Hematology, Chemistry | Required |
| color | VARCHAR(20) | YES | NULL | สีแสดงผลใน UI (Hex Color) | #ef4444, #3b82f6 | Format: #RRGGBB |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผล (เรียงน้อย→มาก) | 0, 10, 20 | 0 = แรกสุด |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน, 0=ปิด |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้างข้อมูล | 2026-01-07 10:30:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไขล่าสุด | 2026-01-07 14:20:15 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | User ID ผู้สร้างข้อมูล | admin, doctor01 | From auth system |
| updated_by | VARCHAR(50) | YES | NULL | User ID ผู้แก้ไขล่าสุด | admin, lab_tech01 | From auth system |
Sample Data
| id | code | name_th | name_en | color | display_order |
|---|---|---|---|---|---|
| 1 | HEMA | โลหิตวิทยา | Hematology | #ef4444 | 0 |
| 2 | CHEM | เคมีคลินิก | Clinical Chemistry | #3b82f6 | 10 |
| 3 | MICRO | จุลชีววิทยา | Microbiology | #10b981 | 20 |
2. specimen_types
Purpose: ประเภทสิ่งส่งตรวจที่รับตรวจ เช่น เลือด, ปัสสาวะ
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| code | VARCHAR(20) | NO | - | รหัสประเภทสิ่งส่งตรวจ | BLOOD, URINE, STOOL | UNIQUE, Uppercase |
| name_th | VARCHAR(255) | NO | - | ชื่อภาษาไทย | เลือด, ปัสสาวะ, อุจจาระ | Required |
| name_en | VARCHAR(255) | NO | - | ชื่อภาษาอังกฤษ | Blood, Urine, Stool | Required |
| description | TEXT | YES | NULL | คำอธิบาย/วิธีเก็บตัวอย่าง | งดอาหาร 8 ชม., เก็บในภาชนะปราศจากเชื้อ | Optional |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผล | 0, 10, 20 | 0 = แรกสุด |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 11:00:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | admin | From auth |
Sample Data
| id | code | name_th | name_en | description |
|---|---|---|---|---|
| 1 | BLOOD | เลือด | Blood | เจาะเลือดจากหลอดเลือดดำ |
| 2 | URINE | ปัสสาวะ | Urine | เก็บปัสสาวะกลางระหว่าง (Mid-stream) |
| 3 | STOOL | อุจจาระ | Stool | เก็บในภาชนะปราศจากเชื้อ ส่งตรวจภายใน 2 ชม. |
3. container_types
Purpose: ประเภทหลอด/ภาชนะที่ใช้เก็บสิ่งส่งตรวจ
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| code | VARCHAR(20) | NO | - | รหัสประเภทหลอด | EDTA, PLAIN, FLUORIDE | UNIQUE, Uppercase |
| name_th | VARCHAR(255) | NO | - | ชื่อภาษาไทย | จุกม่วง EDTA, จุกแดง Plain | Required |
| name_en | VARCHAR(255) | NO | - | ชื่อภาษาอังกฤษ | Purple Top EDTA, Red Top Plain | Required |
| color | VARCHAR(20) | YES | NULL | สีจุกหลอดจริง (Hex) | #6B46C1, #DC2626 | Format: #RRGGBB |
| description | TEXT | YES | NULL | คำอธิบาย/สารกันเลือดแข็ง | มี EDTA เป็น anticoagulant | Optional |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผล | 0, 10, 20 | 0 = แรกสุด |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 10:30:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | admin | From auth |
Sample Data
| id | code | name_th | name_en | color | description |
|---|---|---|---|---|---|
| 1 | EDTA | จุกม่วง EDTA | Purple Top EDTA | #6B46C1 | มี EDTA เป็น anticoagulant สำหรับ CBC |
| 2 | PLAIN | จุกแดง Plain | Red Top Plain | #DC2626 | ไม่มี anticoagulant ใช้เก็บ Serum |
| 3 | FLUORIDE | จุกเทา Fluoride | Gray Top Fluoride | #6B7280 | มี Sodium Fluoride สำหรับ Glucose |
4. lab_items
Purpose: รายการตรวจ Lab แต่ละรายการ (รองรับ In-house และ Out Lab)
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| lab_code | VARCHAR(50) | NO | - | รหัสรายการตรวจ | CBC, FBS, HbA1c | UNIQUE, Uppercase |
| tmlt_code | VARCHAR(20) | YES | NULL | รหัส TMLT (Thai Medical Lab Test) | L081051, L082001 | สำหรับเคลม |
| loinc_code | VARCHAR(20) | YES | NULL | รหัส LOINC (International) | 6690-2, 1558-6 | Optional |
| lab_name_th | VARCHAR(255) | NO | - | ชื่อรายการตรวจภาษาไทย | ตรวจนับเม็ดเลือด, น้ำตาลในเลือด | Required |
| lab_name_en | VARCHAR(255) | NO | - | ชื่อรายการตรวจภาษาอังกฤษ | Complete Blood Count, Fasting Blood Sugar | Required |
| category_id | BIGINT UNSIGNED | YES | NULL | FK → lab_categories.id | 1, 2, 3 | Optional |
| specimen_type_id | BIGINT UNSIGNED | YES | NULL | FK → specimen_types.id | 1, 2 | Optional |
| container_type_id | BIGINT UNSIGNED | YES | NULL | FK → container_types.id | 1, 2, 3 | Optional |
| specimen_volume | DECIMAL(10,2) | YES | NULL | ปริมาณสิ่งส่งตรวจที่ต้องการ (ml) | 3.00, 5.00, 10.00 | Positive number |
| unit | VARCHAR(50) | YES | NULL | หน่วยของผลตรวจ | mg/dL, mmol/L, g/dL | Lowercase |
| default_value | VARCHAR(100) | YES | NULL | ค่าพื้นฐาน (ค่ามาตรฐาน) | 85, Negative, Normal | ค่ากลางที่แนะนำ |
| method | TEXT | YES | NULL | วิธีการตรวจ | Enzymatic, Immunoassay | Optional |
| turn_around_time | INT UNSIGNED | YES | NULL | ระยะเวลาออกผล (นาที) | 60, 120, 480 | 60=1ชม., 1440=1วัน |
| price | DECIMAL(10,2) | NO | 0.00 | ราคาขาย (บาท) | 100.00, 250.00 | ≥ 0 |
| service_category_code | VARCHAR(50) | YES | NULL | หมวดหมู่ค่าบริการ (เชื่อมโยงระบบการเงิน) | LAB-HEMA, LAB-CHEM | FK to billing system |
| cost | DECIMAL(10,2) | NO | 0.00 | ต้นทุน (บาท) | 50.00, 150.00 | ≥ 0, ≤ price |
| is_out_lab | TINYINT(1) | NO | 0 | เป็น Out Lab หรือไม่ | 0, 1 | 0=In-house, 1=Out Lab |
| out_lab_name | VARCHAR(255) | YES | NULL | ชื่อห้อง Lab ภายนอก | Bangkok Lab, Central Lab | Required if is_out_lab=1 |
| out_lab_code | VARCHAR(50) | YES | NULL | รหัสรายการของ Out Lab | BKK-CEA-001 | Optional |
| out_lab_cost | DECIMAL(10,2) | YES | NULL | ค่าใช้จ่ายจ่ายให้ Out Lab (บาท) | 500.00, 2800.00 | Required if is_out_lab=1 |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผล | 0, 10, 20 | 0 = แรกสุด |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 11:00:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | lab_admin | From auth |
Sample Data (In-house)
| id | lab_code | lab_name_th | lab_name_en | unit | price | cost | is_out_lab |
|---|---|---|---|---|---|---|---|
| 1 | CBC | นับเม็ดเลือด | Complete Blood Count | - | 100.00 | 50.00 | 0 |
| 2 | FBS | น้ำตาลในเลือด | Fasting Blood Sugar | mg/dL | 80.00 | 30.00 | 0 |
Sample Data (Out Lab)
| id | lab_code | lab_name_th | out_lab_name | price | cost | out_lab_cost | is_out_lab |
|---|---|---|---|---|---|---|---|
| 23 | CEA | CEA Tumor Marker | Bangkok Lab | 800.00 | 550.00 | 500.00 | 1 |
| 24 | CA19-9 | CA 19-9 Tumor Marker | Central Lab | 900.00 | 650.00 | 600.00 | 1 |
Business Rules - lab_items
- Validation Rules:
price >= cost(ป้องกันขายขาดทุน)- ถ้า
is_out_lab = 1ต้องระบุout_lab_nameและout_lab_cost -
specimen_volume > 0(ถ้าระบุ) -
Out Lab Cost Logic:
out_lab_cost= ราคาที่จ่ายจริงให้ Lab ภายนอกcost=out_lab_cost+ overhead (ค่าธรรมเนียมจัดการ)-
price= ราคาขายให้ผู้ป่วย (มาร์กอัพ 20-40%) -
Turn Around Time:
- เก็บเป็นนาที (minutes)
- 60 = 1 ชั่วโมง
- 480 = 8 ชั่วโมง (1 วันทำงาน)
- 1440 = 24 ชั่วโมง (1 วันเต็ม)
5. lab_panels
Purpose: กลุ่มรายการตรวจที่มักสั่งร่วมกัน (Lab Profiles)
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| panel_code | VARCHAR(50) | NO | - | รหัส Panel | LFT, RFT, LIPID | UNIQUE, Uppercase |
| panel_name_th | VARCHAR(255) | NO | - | ชื่อ Panel ภาษาไทย | ตรวจหน้าที่ตับ, ไขมันในเลือด | Required |
| panel_name_en | VARCHAR(255) | NO | - | ชื่อ Panel ภาษาอังกฤษ | Liver Function Test, Lipid Profile | Required |
| description | TEXT | YES | NULL | คำอธิบาย/ข้อบ่งชี้ | ตรวจหาความผิดปกติของตับ | Optional |
| price | DECIMAL(10,2) | NO | 0.00 | ราคาขาย Panel (บาท) | 450.00, 800.00 | ≥ 0, < Σprice(items) |
| cost | DECIMAL(10,2) | NO | 0.00 | ต้นทุนรวม (บาท) | 250.00, 500.00 | = Σcost(items) |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผล | 0, 10, 20 | 0 = แรกสุด |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 12:00:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | doctor01 | From auth |
Sample Data
| id | panel_code | panel_name_th | panel_name_en | price | cost |
|---|---|---|---|---|---|
| 1 | LFT | ตรวจหน้าที่ตับ | Liver Function Test | 350.00 | 180.00 |
| 2 | RFT | ตรวจหน้าที่ไต | Renal Function Test | 280.00 | 150.00 |
| 3 | LIPID | ไขมันในเลือด | Lipid Profile | 450.00 | 250.00 |
Business Rules - lab_panels
- Pricing Strategy:
- Panel ราคา ควรต่ำกว่า ผลรวมราคา items แยก (จูงใจให้สั่ง Panel)
-
ส่วนลด 10-20% จากราคารวม items
-
Cost Calculation:
cost= ผลรวมcostของ items ใน Panel-
Update อัตโนมัติเมื่อเพิ่ม/ลบ items
-
Mixed Panels (In-house + Out Lab):
- Panel อาจมีทั้ง In-house และ Out Lab items
- ต้นทุนคำนวณจากทั้งสองประเภท
6. lab_panel_items
Purpose: Junction Table เชื่อม lab_panels ↔ lab_items (Many-to-Many)
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| panel_id | BIGINT UNSIGNED | NO | - | FK → lab_panels.id | 1, 2, 3 | Required |
| lab_item_id | BIGINT UNSIGNED | NO | - | FK → lab_items.id | 1, 2, 3 | Required |
| display_order | INT UNSIGNED | NO | 0 | ลำดับการแสดงผลใน Panel | 0, 10, 20 | 0 = แรกสุด |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่เพิ่ม item | 2026-01-07 10:00:00 | Auto-generated |
Constraints
-- Unique Constraint (ป้องกัน item ซ้ำใน panel เดียวกัน)
UNIQUE KEY uk_panel_item (panel_id, lab_item_id)
-- Foreign Keys with CASCADE
FOREIGN KEY (panel_id) REFERENCES lab_panels(id) ON DELETE CASCADE
FOREIGN KEY (lab_item_id) REFERENCES lab_items(id) ON DELETE CASCADE
Sample Data
| id | panel_id | lab_item_id | display_order | Note |
|---|---|---|---|---|
| 1 | 1 | 5 | 0 | LFT → Total Bilirubin |
| 2 | 1 | 6 | 10 | LFT → Direct Bilirubin |
| 3 | 1 | 7 | 20 | LFT → SGOT (AST) |
| 4 | 1 | 8 | 30 | LFT → SGPT (ALT) |
Business Rules - lab_panel_items
- Uniqueness:
(panel_id, lab_item_id)ต้อง UNIQUE-
ห้ามมี item ซ้ำใน panel เดียวกัน
-
Cascading Deletes:
- ลบ Panel → ลบ items ทั้งหมดใน Panel
-
ลบ Lab Item → ลบออกจากทุก Panels
-
Display Order:
- ใช้จัดเรียงรายการใน Panel UI
- Increment ทีละ 10 เพื่อให้แทรกกลางได้
7. lab_normal_ranges
Purpose: เก็บค่าปกติของแต่ละรายการตรวจ แยกตามอายุ/เพศ
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| lab_item_id | BIGINT UNSIGNED | NO | - | FK → lab_items.id | 1, 2, 3 | Required |
| age_min_days | INT UNSIGNED | YES | NULL | อายุต่ำสุด (วัน) | 0, 365, 6570 | NULL=ไม่จำกัด |
| age_max_days | INT UNSIGNED | YES | NULL | อายุสูงสุด (วัน) | 365, 6570, NULL | NULL=ไม่จำกัด |
| gender | ENUM | NO | 'ALL' | เพศ | M, F, ALL | M=ชาย, F=หญิง |
| range_type | ENUM | NO | 'NUMERIC' | ประเภทค่าปกติ | NUMERIC, TEXT, POSSIBLE_VALUES | - |
| min_value | DECIMAL(15,4) | YES | NULL | ค่าต่ำสุด (สำหรับ NUMERIC) | 70.0000, 4.5000 | For NUMERIC only |
| max_value | DECIMAL(15,4) | YES | NULL | ค่าสูงสุด (สำหรับ NUMERIC) | 110.0000, 5.5000 | For NUMERIC only |
| text_value | TEXT | YES | NULL | ค่าปกติข้อความ (สำหรับ TEXT) | Negative, Positive | For TEXT only |
| possible_values | TEXT | YES | NULL | JSON Array (สำหรับ POSSIBLE_VALUES) | ["A", "B", "O", "AB"] | JSON format |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 11:00:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | lab_admin | From auth |
Sample Data
NUMERIC Type (Glucose - ผู้ใหญ่)
| id | lab_item_id | age_min_days | age_max_days | gender | range_type | min_value | max_value |
|---|---|---|---|---|---|---|---|
| 1 | 2 | 6570 | NULL | ALL | NUMERIC | 70.0000 | 110.0000 |
NUMERIC Type (Hemoglobin - แยกเพศ)
| id | lab_item_id | age_min_days | age_max_days | gender | range_type | min_value | max_value |
|---|---|---|---|---|---|---|---|
| 2 | 1 | 6570 | NULL | M | NUMERIC | 13.5000 | 17.5000 |
| 3 | 1 | 6570 | NULL | F | NUMERIC | 12.0000 | 16.0000 |
TEXT Type (Pregnancy Test)
| id | lab_item_id | range_type | text_value |
|---|---|---|---|
| 10 | 50 | TEXT | Negative |
POSSIBLE_VALUES Type (Blood Group)
| id | lab_item_id | range_type | possible_values |
|---|---|---|---|
| 15 | 55 | POSSIBLE_VALUES | ["A", "B", "AB", "O"] |
Business Rules - lab_normal_ranges
- Age Storage:
- เก็บเป็นวัน (days) เพื่อความแม่นยำ
- 1 ปี = 365 วัน (ไม่คำนึงปีอธิกสุรทิน)
-
NULL = ไม่จำกัด
-
Age Ranges Conversion:
- ทารก 0-1 ปี:
age_min_days=0, age_max_days=365 - เด็ก 1-12 ปี:
age_min_days=366, age_max_days=4380 - วัยรุ่น 13-18 ปี:
age_min_days=4745, age_max_days=6570 - ผู้ใหญ่ ≥18 ปี:
age_min_days=6571, age_max_days=NULL -
ทุกอายุ:
age_min_days=NULL, age_max_days=NULL -
Range Types:
- NUMERIC: ใช้
min_value,max_value(เช่น Glucose: 70-110 mg/dL) - TEXT: ใช้
text_value(เช่น HBsAg: "Negative") -
POSSIBLE_VALUES: ใช้
possible_valuesJSON (เช่น Blood Group: ["A","B","AB","O"]) -
Matching Priority:
- เพศเฉพาะ (M/F) สำคัญกว่า ALL
- Range แคบ ชัดเจนกว่า Range กว้าง
8. lab_critical_values
Purpose: เก็บค่าวิกฤต (Critical/Panic Values) ที่ต้องแจ้งแพทย์ทันที
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| lab_item_id | BIGINT UNSIGNED | NO | - | FK → lab_items.id (UNIQUE) | 1, 2, 3 | UNIQUE |
| critical_low | DECIMAL(15,4) | YES | NULL | ค่าต่ำวิกฤต | 50.0000, 2.8000 | Optional |
| critical_high | DECIMAL(15,4) | YES | NULL | ค่าสูงวิกฤต | 400.0000, 5.5000 | Optional |
| panic_low | DECIMAL(15,4) | YES | NULL | ค่าต่ำฉุกเฉิน | 40.0000, 2.5000 | < critical_low |
| panic_high | DECIMAL(15,4) | YES | NULL | ค่าสูงฉุกเฉิน | 500.0000, 6.0000 | > critical_high |
| alert_message | TEXT | YES | NULL | ข้อความแจ้งเตือน | พบค่าน้ำตาลต่ำวิกฤต โปรดตรวจสอบผู้ป่วยทันที | Optional |
| action_required | TEXT | YES | NULL | การปฏิบัติที่ต้องทำ | แจ้งแพทย์เวรทันที, ให้ Dextrose IV | Optional |
| notify_immediately | TINYINT(1) | NO | 1 | แจ้งแพทย์ทันที | 0, 1 | 1=ต้องแจ้ง |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้าง | 2026-01-07 10:00:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไข | 2026-01-07 11:00:00 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | ผู้สร้างข้อมูล | admin | From auth |
| updated_by | VARCHAR(50) | YES | NULL | ผู้แก้ไขล่าสุด | lab_supervisor | From auth |
Sample Data
| id | lab_item_id | Lab | critical_low | critical_high | panic_low | panic_high | notify_immediately |
|---|---|---|---|---|---|---|---|
| 1 | 2 | Glucose | 50.0000 | 400.0000 | 40.0000 | 500.0000 | 1 |
| 2 | 10 | Potassium | 2.8000 | 5.5000 | 2.5000 | 6.0000 | 1 |
| 3 | 1 | Hemoglobin | 7.0000 | 18.0000 | 5.0000 | 20.0000 | 1 |
Value Ranges Logic
Panic Low < Critical Low < Normal Range < Critical High < Panic High
ตัวอย่าง Glucose (mg/dL):
< 40 | 40-50 | 50-70 | 70-110 | 110-400 | 400-500 | > 500
PANIC LOW CRITICAL SLIGHTLY NORMAL SLIGHTLY CRITICAL PANIC HIGH
LOW LOW HIGH HIGH
Business Rules - lab_critical_values
- Uniqueness:
-
1 Lab Item = 1 ชุดค่าวิกฤต (
lab_item_idUNIQUE) -
Value Hierarchy:
panic_low < critical_low < normal_min < normal_max < critical_high < panic_high- Critical = ผิดปกติมาก ต้องติดตามเร่งด่วน
-
Panic = อันตรายถึงชีวิต ต้องแจ้งแพทย์ทันที
-
Alert Logic:
notify_immediately = 1: ส่ง alert ไปหาแพทย์ทันทีalert_message: แสดงข้อความเตือนใน UI-
action_required: แสดงแนวทางปฏิบัติ -
Optional Values:
- ทุก threshold เป็น NULL ได้ (ไม่บังคับระบุครบ)
- บาง Lab อาจมีเฉพาะ critical_high (เช่น Glucose)
- บาง Lab อาจมีเฉพาะ panic_low (เช่น Hemoglobin)
9. lab_item_coverage
Purpose: เก็บความครอบคลุมรายการตรวจ Lab กับสิทธิการรักษา (ราคา, ค่าร่วมจ่าย, PA)
| Column | Data Type | Nullable | Default | Description | Example Values | Business Rules |
|---|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | AUTO_INCREMENT | Primary Key | 1, 2, 3 | AUTO_INCREMENT |
| lab_item_id | VARCHAR(50) | NO | - | รหัสรายการตรวจ Lab | L081051, L082001, L082015 | FK to lab_items.lab_code |
| lab_item_name_th | VARCHAR(255) | NO | - | ชื่อรายการตรวจภาษาไทย (Auto-fetch) | นับเม็ดเลือดขาว WBC, น้ำตาลในเลือด | Auto-populated |
| lab_item_name_en | VARCHAR(255) | NO | - | ชื่อรายการตรวจภาษาอังกฤษ (Auto-fetch) | White Blood Cell Count, Fasting Blood Sugar | Auto-populated |
| eligibility_code | VARCHAR(20) | NO | - | รหัสสิทธิ | UC, SSO, CSMBS, PRIVATE, CASH, LGO | FK to eligibility |
| eligibility_name_th | VARCHAR(255) | NO | - | ชื่อสิทธิภาษาไทย (Auto-fetch) | สิทธิ UC บัตรทอง, สิทธิประกันสังคม SSO | Auto-populated |
| eligibility_name_en | VARCHAR(255) | NO | - | ชื่อสิทธิภาษาอังกฤษ (Auto-fetch) | Universal Coverage, Social Security | Auto-populated |
| coverage_status | ENUM | NO | 'covered' | สถานะความคุ้มครอง | covered, not_covered, prior_auth_required | covered=คุ้มครอง, not_covered=ไม่คุ้มครอง |
| price | DECIMAL(10,2) | NO | 0.00 | ราคารายการตรวจสำหรับสิทธินี้ (บาท) | 100.00, 250.00, 0.00 | ≥ 0 |
| copay_amount | DECIMAL(10,2) | NO | 0.00 | ค่าร่วมจ่ายคงที่ (บาท) | 0.00, 30.00, 50.00 | ≥ 0 |
| copay_percent | DECIMAL(5,2) | NO | 0.00 | ค่าร่วมจ่ายเป็นเปอร์เซ็นต์ (%) | 0.00, 10.00, 20.00 | 0-100 |
| requires_prior_auth | TINYINT(1) | NO | 0 | ต้องขออนุมัติก่อน (PA) | 0, 1 | 0=ไม่ต้อง, 1=ต้องขออนุมัติ |
| prior_auth_criteria | TEXT | YES | NULL | เกณฑ์การขออนุมัติ PA | ต้องมี HbA1C > 7% หรือมีประวัติโรคเบาหวาน | Optional |
| max_times_per_year | INT UNSIGNED | YES | NULL | จำนวนครั้งสูงสุดต่อปี | 1, 2, 4, NULL | NULL=ไม่จำกัด |
| notes | TEXT | YES | NULL | หมายเหตุเพิ่มเติม | สำหรับผู้ป่วยโรคเรื้อรังเท่านั้น | Optional |
| effective_date | DATE | YES | NULL | วันที่เริ่มใช้งาน | 2026-01-01 | Optional |
| expiry_date | DATE | YES | NULL | วันที่หมดอายุ | 2026-12-31, NULL | NULL=ไม่หมดอายุ |
| is_active | TINYINT(1) | NO | 1 | สถานะการใช้งาน | 0, 1 | 1=ใช้งาน, 0=ปิดใช้งาน |
| created_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาที่สร้างข้อมูล | 2026-01-07 10:30:00 | Auto-generated |
| updated_at | DATETIME | NO | CURRENT_TIMESTAMP | วันเวลาแก้ไขล่าสุด | 2026-01-07 14:20:15 | Auto-updated |
| created_by | VARCHAR(50) | YES | NULL | User ID ผู้สร้างข้อมูล | admin, billing_admin | From auth system |
| updated_by | VARCHAR(50) | YES | NULL | User ID ผู้แก้ไขล่าสุด | admin, lab_admin | From auth system |
Sample Data
UC (บัตรทอง) - คุ้มครองเต็ม
| id | lab_item_id | lab_item_name_th | eligibility_code | coverage_status | price | copay_amount | copay_percent | requires_prior_auth |
|---|---|---|---|---|---|---|---|---|
| 1 | L081051 | นับเม็ดเลือดขาว WBC | UC | covered | 50.00 | 0.00 | 0.00 | 0 |
| 2 | L082001 | น้ำตาลในเลือด FBS | UC | covered | 60.00 | 0.00 | 0.00 | 0 |
SSO (ประกันสังคม) - มีค่าร่วมจ่าย
| id | lab_item_id | lab_item_name_th | eligibility_code | coverage_status | price | copay_amount | copay_percent | requires_prior_auth |
|---|---|---|---|---|---|---|---|---|
| 3 | L081051 | นับเม็ดเลือดขาว WBC | SSO | covered | 50.00 | 30.00 | 0.00 | 0 |
| 4 | L082001 | น้ำตาลในเลือด FBS | SSO | covered | 60.00 | 30.00 | 0.00 | 0 |
CSMBS (ข้าราชการ) - ต้องขออนุมัติ
| id | lab_item_id | lab_item_name_th | eligibility_code | coverage_status | price | copay_amount | requires_prior_auth | prior_auth_criteria |
|---|---|---|---|---|---|---|---|---|
| 5 | L082015 | HbA1C | CSMBS | prior_auth_required | 300.00 | 0.00 | 1 | ต้องมี HbA1C > 7% หรือมีประวัติโรคเบาหวาน |
PRIVATE (ชำระเงินเอง) - ราคาเต็ม
| id | lab_item_id | lab_item_name_th | eligibility_code | coverage_status | price | copay_amount | copay_percent |
|---|---|---|---|---|---|---|---|
| 6 | L081051 | นับเม็ดเลือดขาว WBC | PRIVATE | covered | 80.00 | 0.00 | 100.00 |
| 7 | L082001 | น้ำตาลในเลือด FBS | PRIVATE | covered | 100.00 | 0.00 | 100.00 |
Business Rules - lab_item_coverage
- Uniqueness Constraint:
(lab_item_id, eligibility_code)ต้อง UNIQUE-
1 รายการตรวจ + 1 สิทธิ = 1 record เท่านั้น
-
Coverage Status Logic:
- covered: สิทธินี้คุ้มครองรายการนี้ ตัดสิทธิได้เลย
- not_covered: สิทธินี้ไม่คุ้มครอง ผู้ป่วยต้องจ่ายเองทั้งหมด
-
prior_auth_required: ต้องขออนุมัติก่อน (PA) ถึงจะเบิกได้
-
Price Calculation:
- ราคาที่ผู้ป่วยจ่าย =
price×copay_percent/100+copay_amount - ถ้า
copay_percent = 100→ ผู้ป่วยจ่ายเต็ม (เหมือน PRIVATE/CASH) -
ถ้า
copay_amount = 30→ ผู้ป่วยจ่าย 30 บาท + สิทธิจ่ายส่วนที่เหลือ -
Prior Authorization (PA) Workflow:
- ถ้า
requires_prior_auth = 1→ แพทย์ต้องขออนุมัติก่อน - ระบบตรวจสอบ
prior_auth_criteria(เช่น ต้องมี HbA1C > 7%) -
ถ้าไม่ผ่าน PA → เปลี่ยนเป็น not_covered หรือให้ผู้ป่วยจ่ายเอง
-
Annual Limits:
max_times_per_year: จำนวนครั้งสูงสุดที่สิทธิคุ้มครองต่อปี- NULL = ไม่จำกัด (ตรวจได้ไม่จำกัดครั้ง)
-
ตัวอย่าง: Tumor Marker อาจจำกัด 2 ครั้ง/ปี
-
Auto-Populated Fields:
lab_item_name_th,lab_item_name_en→ ดึงจาก lab_itemseligibility_name_th,eligibility_name_en→ ดึงจาก eligibility service-
ไม่ต้องกรอกเอง, ระบบ populate ตอน create/update
-
Effective Dates:
effective_date: วันที่เริ่มใช้อัตรานี้expiry_date: วันที่หมดอายุ (NULL=ไม่หมดอายุ)-
ใช้สำหรับ price change history
-
Integration Points:
- Doctor Module: ตรวจสอบความคุ้มครองก่อนสั่ง Lab
- Lab Module: แสดงสิทธิ์และราคาที่ผู้ป่วยต้องจ่าย
- Cashier Module: คำนวณค่าใช้จ่ายที่ผู้ป่วยต้องจ่าย
- Billing Module: ส่งเบิกสิทธิ์ไปยัง e-Claim
🔑 Data Type Standards
ตารางสรุป Data Types
| Type | Usage | Example | Notes |
|---|---|---|---|
| BIGINT UNSIGNED | Primary Keys, Foreign Keys | id, category_id | AUTO_INCREMENT |
| VARCHAR(20) | Short codes | lab_code, panel_code | Uppercase |
| VARCHAR(50) | Medium codes | out_lab_code, unit | Mixed case |
| VARCHAR(255) | Names, titles | name_th, name_en | Required |
| TEXT | Long descriptions | description, method | Optional |
| DECIMAL(10,2) | Prices, costs | price, cost | 2 decimal places |
| DECIMAL(15,4) | Lab values | min_value, max_value | 4 decimal places |
| INT UNSIGNED | Order, TAT, Age | display_order, turn_around_time | Positive numbers |
| TINYINT(1) | Boolean flags | is_active, is_out_lab | 0=False, 1=True |
| ENUM | Fixed options | gender, range_type | Predefined values |
| DATETIME | Timestamps | created_at, updated_at | Auto-managed |
📝 Naming Conventions Summary
- Tables:
snake_case(lab_items, lab_panels) - Columns:
snake_case(lab_code, name_th) - Primary Keys: Always
id - Foreign Keys:
{table_name}_id(lab_item_id, panel_id) - Boolean Flags:
is_{property}(is_active, is_out_lab) - Timestamps:
created_at,updated_at - Audit Columns:
created_by,updated_by
Next: ดู INDEXES.md สำหรับ Indexing Strategy