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

Data Dictionary - Laboratory Master Data

พจนานุกรมข้อมูลแบบละเอียด สำหรับทุก Column ในทุก Table

📖 Table of Contents

  1. lab_categories
  2. specimen_types
  3. container_types
  4. lab_items
  5. lab_panels
  6. lab_panel_items
  7. lab_normal_ranges
  8. lab_critical_values
  9. 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

  1. Validation Rules:
  2. price >= cost (ป้องกันขายขาดทุน)
  3. ถ้า is_out_lab = 1 ต้องระบุ out_lab_name และ out_lab_cost
  4. specimen_volume > 0 (ถ้าระบุ)

  5. Out Lab Cost Logic:

  6. out_lab_cost = ราคาที่จ่ายจริงให้ Lab ภายนอก
  7. cost = out_lab_cost + overhead (ค่าธรรมเนียมจัดการ)
  8. price = ราคาขายให้ผู้ป่วย (มาร์กอัพ 20-40%)

  9. Turn Around Time:

  10. เก็บเป็นนาที (minutes)
  11. 60 = 1 ชั่วโมง
  12. 480 = 8 ชั่วโมง (1 วันทำงาน)
  13. 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

  1. Pricing Strategy:
  2. Panel ราคา ควรต่ำกว่า ผลรวมราคา items แยก (จูงใจให้สั่ง Panel)
  3. ส่วนลด 10-20% จากราคารวม items

  4. Cost Calculation:

  5. cost = ผลรวม cost ของ items ใน Panel
  6. Update อัตโนมัติเมื่อเพิ่ม/ลบ items

  7. Mixed Panels (In-house + Out Lab):

  8. Panel อาจมีทั้ง In-house และ Out Lab items
  9. ต้นทุนคำนวณจากทั้งสองประเภท

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

  1. Uniqueness:
  2. (panel_id, lab_item_id) ต้อง UNIQUE
  3. ห้ามมี item ซ้ำใน panel เดียวกัน

  4. Cascading Deletes:

  5. ลบ Panel → ลบ items ทั้งหมดใน Panel
  6. ลบ Lab Item → ลบออกจากทุก Panels

  7. Display Order:

  8. ใช้จัดเรียงรายการใน Panel UI
  9. 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

  1. Age Storage:
  2. เก็บเป็นวัน (days) เพื่อความแม่นยำ
  3. 1 ปี = 365 วัน (ไม่คำนึงปีอธิกสุรทิน)
  4. NULL = ไม่จำกัด

  5. Age Ranges Conversion:

  6. ทารก 0-1 ปี: age_min_days=0, age_max_days=365
  7. เด็ก 1-12 ปี: age_min_days=366, age_max_days=4380
  8. วัยรุ่น 13-18 ปี: age_min_days=4745, age_max_days=6570
  9. ผู้ใหญ่ ≥18 ปี: age_min_days=6571, age_max_days=NULL
  10. ทุกอายุ: age_min_days=NULL, age_max_days=NULL

  11. Range Types:

  12. NUMERIC: ใช้ min_value, max_value (เช่น Glucose: 70-110 mg/dL)
  13. TEXT: ใช้ text_value (เช่น HBsAg: "Negative")
  14. POSSIBLE_VALUES: ใช้ possible_values JSON (เช่น Blood Group: ["A","B","AB","O"])

  15. Matching Priority:

  16. เพศเฉพาะ (M/F) สำคัญกว่า ALL
  17. 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

  1. Uniqueness:
  2. 1 Lab Item = 1 ชุดค่าวิกฤต (lab_item_id UNIQUE)

  3. Value Hierarchy:

  4. panic_low < critical_low < normal_min < normal_max < critical_high < panic_high
  5. Critical = ผิดปกติมาก ต้องติดตามเร่งด่วน
  6. Panic = อันตรายถึงชีวิต ต้องแจ้งแพทย์ทันที

  7. Alert Logic:

  8. notify_immediately = 1: ส่ง alert ไปหาแพทย์ทันที
  9. alert_message: แสดงข้อความเตือนใน UI
  10. action_required: แสดงแนวทางปฏิบัติ

  11. Optional Values:

  12. ทุก threshold เป็น NULL ได้ (ไม่บังคับระบุครบ)
  13. บาง Lab อาจมีเฉพาะ critical_high (เช่น Glucose)
  14. บาง 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

  1. Uniqueness Constraint:
  2. (lab_item_id, eligibility_code) ต้อง UNIQUE
  3. 1 รายการตรวจ + 1 สิทธิ = 1 record เท่านั้น

  4. Coverage Status Logic:

  5. covered: สิทธินี้คุ้มครองรายการนี้ ตัดสิทธิได้เลย
  6. not_covered: สิทธินี้ไม่คุ้มครอง ผู้ป่วยต้องจ่ายเองทั้งหมด
  7. prior_auth_required: ต้องขออนุมัติก่อน (PA) ถึงจะเบิกได้

  8. Price Calculation:

  9. ราคาที่ผู้ป่วยจ่าย = price × copay_percent/100 + copay_amount
  10. ถ้า copay_percent = 100 → ผู้ป่วยจ่ายเต็ม (เหมือน PRIVATE/CASH)
  11. ถ้า copay_amount = 30 → ผู้ป่วยจ่าย 30 บาท + สิทธิจ่ายส่วนที่เหลือ

  12. Prior Authorization (PA) Workflow:

  13. ถ้า requires_prior_auth = 1 → แพทย์ต้องขออนุมัติก่อน
  14. ระบบตรวจสอบ prior_auth_criteria (เช่น ต้องมี HbA1C > 7%)
  15. ถ้าไม่ผ่าน PA → เปลี่ยนเป็น not_covered หรือให้ผู้ป่วยจ่ายเอง

  16. Annual Limits:

  17. max_times_per_year: จำนวนครั้งสูงสุดที่สิทธิคุ้มครองต่อปี
  18. NULL = ไม่จำกัด (ตรวจได้ไม่จำกัดครั้ง)
  19. ตัวอย่าง: Tumor Marker อาจจำกัด 2 ครั้ง/ปี

  20. Auto-Populated Fields:

  21. lab_item_name_th, lab_item_name_en → ดึงจาก lab_items
  22. eligibility_name_th, eligibility_name_en → ดึงจาก eligibility service
  23. ไม่ต้องกรอกเอง, ระบบ populate ตอน create/update

  24. Effective Dates:

  25. effective_date: วันที่เริ่มใช้อัตรานี้
  26. expiry_date: วันที่หมดอายุ (NULL=ไม่หมดอายุ)
  27. ใช้สำหรับ price change history

  28. Integration Points:

  29. Doctor Module: ตรวจสอบความคุ้มครองก่อนสั่ง Lab
  30. Lab Module: แสดงสิทธิ์และราคาที่ผู้ป่วยต้องจ่าย
  31. Cashier Module: คำนวณค่าใช้จ่ายที่ผู้ป่วยต้องจ่าย
  32. 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

  1. Tables: snake_case (lab_items, lab_panels)
  2. Columns: snake_case (lab_code, name_th)
  3. Primary Keys: Always id
  4. Foreign Keys: {table_name}_id (lab_item_id, panel_id)
  5. Boolean Flags: is_{property} (is_active, is_out_lab)
  6. Timestamps: created_at, updated_at
  7. Audit Columns: created_by, updated_by

Next: ดู INDEXES.md สำหรับ Indexing Strategy