Database Schema - ระบบนัดหมายผู้ป่วยและระบบบริหารจัดการคิว
Document Version: 1.0
Date: 11 สิงหาคม 2025
Integration with: ระบบงานเวชระเบียนและเวชสถิติ (EMR System)
เอกสารนี้รวบรวมโครงสร้างตารางฐานข้อมูลสำหรับระบบนัดหมายผู้ป่วยและระบบบริหารจัดการคิว ที่เชื่อมโยงกับระบบเวชระเบียนที่มีอยู่
Table of Contents
SECTION 1: CORE MASTER DATA TABLES
SECTION 2: DOCTOR SCHEDULE MANAGEMENT
SECTION 3: APPOINTMENT SYSTEM
- ตาราง
appointment_packages - ตาราง
appointment_package_items - ตาราง
appointments - ตาราง
appointment_slots - ตาราง
appointment_history - ตาราง
appointment_reminders
SECTION 4: QUEUE MANAGEMENT SYSTEM
SECTION 5: MULTI-CHANNEL INTEGRATION
- ตาราง
line_bot_users - ตาราง
mobile_app_sessions - ตาราง
notification_logs - ตาราง
communication_templates
SECTION 6: INTEGRATION & AUDIT
MASTER SCHEMA ALIGNMENT NOTES
ระบบนัดหมายและคิวใช้ Foundation Tables จาก Master Schema และเพิ่ม Module-specific tables:
- ✅ Foundation Tables:
users,departments,medical_visits,patientsจาก Master Schema - ✅ Integration Points: เชื่อมต่อกับ EMR Core System อย่างไร้รอยต่อ
- ✅ Multi-Channel Support: Mobile App, Line Bot, Kiosk, Staff Portal integration
- ✅ Real-time Updates: WebSocket สำหรับ queue status updates
- ✅ Compliance Ready: Audit trails และ PDPA compliance
SECTION 1: SHARED FOUNDATION TABLES (จาก Master Schema)
หมายเหตุ: ตารางหลักเหล่านี้ถูกกำหนดใน MASTER_DATABASE_SCHEMA.md และใช้ร่วมกันทุกโมดูล
Foundation Tables ที่ใช้ร่วมกัน:
users- ผู้ใช้งานระบบทั้งหมด (Healthcare staff, admin)patients- ข้อมูลผู้ป่วยหลัก (Master Patient Index)departments- โครงสร้างแผนกโรงพยาบาลclinics- คลินิกต่างๆ ภายในแผนกmedical_visits- ข้อมูลการมารับบริการappointments- ระบบนัดหมายหลัก (จาก Master Schema)queues- ระบบคิวแบบ Real-time (จาก Master Schema)rolesและpermissions- ระบบ RBACaudit_logs- Audit trail สำหรับ compliancenotifications- ระบบแจ้งเตือนแบบ Multi-channel
Integration Benefits: - ไม่มีการสร้างตารางซ้ำซ้อน - ข้อมูลสอดคล้องกันระหว่างโมดูล
- รองรับ Real-time integration - ปฏิบัติตาม Healthcare compliance standards
2. ตาราง departments
ตารางแผนก/หน่วยงาน - เชื่อมโยงกับระบบเวชระเบียนที่มีอยู่
CREATE TABLE departments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
dept_code VARCHAR(10) UNIQUE NOT NULL,
dept_name_thai VARCHAR(100) NOT NULL,
dept_name_eng VARCHAR(100),
dept_type VARCHAR(20) CHECK (dept_type IN ('clinical', 'support', 'administration')) DEFAULT 'clinical',
-- Department Information
description TEXT,
location VARCHAR(100),
floor_number INTEGER,
building VARCHAR(50),
-- Contact Information
phone_number VARCHAR(15),
extension VARCHAR(10),
email VARCHAR(100),
-- Operating Hours
operating_hours JSONB,
-- Management
head_doctor_id UUID,
-- Status
is_active BOOLEAN DEFAULT TRUE,
accepts_appointments BOOLEAN DEFAULT TRUE,
accepts_walkins BOOLEAN DEFAULT TRUE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของแผนก |
dept_code |
VARCHAR(10) | UNIQUE, NOT NULL | รหัสแผนก (เช่น MED001, SUR002) |
dept_name_thai |
VARCHAR(100) | NOT NULL | ชื่อแผนก (ภาษาไทย) |
dept_name_eng |
VARCHAR(100) | ชื่อแผนก (ภาษาอังกฤษ) | |
dept_type |
VARCHAR(20) | CHECK | ประเภทแผนก (clinical, support, administration) |
description |
TEXT | คำอธิบายแผนก | |
location |
VARCHAR(100) | ที่ตั้งของแผนก | |
floor_number |
INTEGER | ชั้นที่ตั้ง | |
building |
VARCHAR(50) | อาคารที่ตั้ง | |
phone_number |
VARCHAR(15) | เบอร์โทรศัพท์แผนก | |
extension |
VARCHAR(10) | เบอร์ภายใน | |
email |
VARCHAR(100) | อีเมลแผนก | |
operating_hours |
JSONB | เวลาทำการ (JSON format) | |
head_doctor_id |
UUID | FK | รหัสหัวหน้าแผนก |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
accepts_appointments |
BOOLEAN | DEFAULT TRUE | รับการนัดหมายหรือไม่ |
accepts_walkins |
BOOLEAN | DEFAULT TRUE | รับ Walk-in หรือไม่ |
3. ตาราง clinics
ตารางคลินิกภายในแผนก - รองรับการจัดการตารางเวลาและคิว
CREATE TABLE clinics (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
department_id UUID NOT NULL REFERENCES departments(id),
clinic_code VARCHAR(10) NOT NULL,
clinic_name_thai VARCHAR(100) NOT NULL,
clinic_name_eng VARCHAR(100),
-- Clinic Information
description TEXT,
room_number VARCHAR(20),
capacity INTEGER DEFAULT 1,
-- Operating Schedule
default_operating_hours JSONB,
appointment_duration_minutes INTEGER DEFAULT 30,
-- Queue Settings
max_queue_per_day INTEGER,
allow_walkin BOOLEAN DEFAULT TRUE,
priority_queue_percentage DECIMAL(3,2) DEFAULT 0.20,
-- Status
is_active BOOLEAN DEFAULT TRUE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
UNIQUE(department_id, clinic_code)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของคลินิก |
department_id |
UUID | NOT NULL, FK | รหัสแผนกที่สังกัด |
clinic_code |
VARCHAR(10) | NOT NULL | รหัสคลินิก (เช่น MED001-01) |
clinic_name_thai |
VARCHAR(100) | NOT NULL | ชื่อคลินิก (ภาษาไทย) |
clinic_name_eng |
VARCHAR(100) | ชื่อคลินิก (ภาษาอังกฤษ) | |
description |
TEXT | คำอธิบายคลินิก | |
room_number |
VARCHAR(20) | หมายเลขห้อง | |
capacity |
INTEGER | DEFAULT 1 | จำนวนผู้ป่วยที่รับได้พร้อมกัน |
default_operating_hours |
JSONB | เวลาทำการมาตรฐาน (JSON format) | |
appointment_duration_minutes |
INTEGER | DEFAULT 30 | ระยะเวลานัดมาตรฐาน (นาที) |
max_queue_per_day |
INTEGER | จำนวนคิวสูงสุดต่อวัน | |
allow_walkin |
BOOLEAN | DEFAULT TRUE | อนุญาต Walk-in หรือไม่ |
priority_queue_percentage |
DECIMAL(3,2) | DEFAULT 0.20 | เปอร์เซ็นต์สำหรับคิวพิเศษ |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
4. ตาราง doctors
ตารางข้อมูลแพทย์ - รวมข้อมูลทางวิชาชีพและการตั้งค่าการนัด
CREATE TABLE doctors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID UNIQUE REFERENCES users(id),
doctor_code VARCHAR(10) UNIQUE NOT NULL,
-- Professional Information
medical_license_number VARCHAR(20) UNIQUE NOT NULL,
specialization_thai VARCHAR(100),
specialization_eng VARCHAR(100),
title_thai VARCHAR(50) NOT NULL,
title_eng VARCHAR(50),
-- Affiliation
primary_department_id UUID REFERENCES departments(id),
secondary_departments UUID[],
-- Schedule Settings
default_appointment_duration INTEGER DEFAULT 30,
max_patients_per_day INTEGER DEFAULT 40,
consultation_fee DECIMAL(8,2),
-- Professional Details
education JSONB,
board_certifications JSONB,
experience_years INTEGER,
-- Contact and Availability
available_for_emergency BOOLEAN DEFAULT FALSE,
on_call_phone VARCHAR(15),
-- Status
is_active BOOLEAN DEFAULT TRUE,
employment_status VARCHAR(20) CHECK (employment_status IN ('full_time', 'part_time', 'consultant', 'retired')) DEFAULT 'full_time',
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของแพทย์ |
user_id |
UUID | UNIQUE, FK | รหัสผู้ใช้ที่เชื่อมโยง |
doctor_code |
VARCHAR(10) | UNIQUE, NOT NULL | รหัสแพทย์ (เช่น DOC001) |
medical_license_number |
VARCHAR(20) | UNIQUE, NOT NULL | เลขที่ใบอนุญาตประกอบวิชาชีพ |
specialization_thai |
VARCHAR(100) | ความเชี่ยวชาญ (ภาษาไทย) | |
specialization_eng |
VARCHAR(100) | ความเชี่ยวชาญ (ภาษาอังกฤษ) | |
title_thai |
VARCHAR(50) | NOT NULL | คำนำหน้า (นพ./พญ./ผศ.นพ.) |
title_eng |
VARCHAR(50) | คำนำหน้า (Dr./Prof.Dr.) | |
primary_department_id |
UUID | FK | รหัสแผนกหลัก |
secondary_departments |
UUID[] | รหัสแผนกรอง (Array) | |
default_appointment_duration |
INTEGER | DEFAULT 30 | ระยะเวลานัดมาตรฐาน (นาที) |
max_patients_per_day |
INTEGER | DEFAULT 40 | จำนวนผู้ป่วยสูงสุดต่อวัน |
consultation_fee |
DECIMAL(8,2) | ค่าตรวจ | |
education |
JSONB | ประวัติการศึกษา (JSON format) | |
board_certifications |
JSONB | ใบรับรอง (JSON format) | |
experience_years |
INTEGER | จำนวนปีประสบการณ์ | |
available_for_emergency |
BOOLEAN | DEFAULT FALSE | พร้อมรับเคสฉุกเฉินหรือไม่ |
on_call_phone |
VARCHAR(15) | เบอร์โทรศัพท์เวร | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
employment_status |
VARCHAR(20) | CHECK | สถานะการจ้างงาน |
SECTION 2: DOCTOR SCHEDULE MANAGEMENT
5. ตาราง doctor_schedules
ตารางเวลาการทำงานของแพทย์ - รองรับการจัดสรร slots ตามช่องทาง
CREATE TABLE doctor_schedules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
doctor_id UUID NOT NULL REFERENCES doctors(id),
clinic_id UUID NOT NULL REFERENCES clinics(id),
-- Schedule Date and Time
schedule_date DATE NOT NULL,
session_type VARCHAR(10) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'night')) NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
-- Slot Configuration
slot_duration_minutes INTEGER DEFAULT 30,
max_patients_per_slot INTEGER DEFAULT 1,
max_patients_per_session INTEGER,
-- Channel Allocation
total_slots INTEGER,
staff_reserved_slots INTEGER DEFAULT 0,
mobile_app_slots INTEGER DEFAULT 0,
line_bot_slots INTEGER DEFAULT 0,
walkin_slots INTEGER DEFAULT 0,
-- Status
status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'cancelled', 'modified', 'completed')),
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของตารางเวลา |
doctor_id |
UUID | NOT NULL, FK | รหัสแพทย์ |
clinic_id |
UUID | NOT NULL, FK | รหัสคลินิก |
schedule_date |
DATE | NOT NULL | วันที่ทำการ |
session_type |
VARCHAR(10) | CHECK | ช่วงเวลา (morning, afternoon, evening, night) |
start_time |
TIME | NOT NULL | เวลาเริ่ม |
end_time |
TIME | NOT NULL | เวลาสิ้นสุด |
slot_duration_minutes |
INTEGER | DEFAULT 30 | ระยะเวลาต่อ slot (นาที) |
max_patients_per_slot |
INTEGER | DEFAULT 1 | จำนวนผู้ป่วยสูงสุดต่อ slot |
max_patients_per_session |
INTEGER | จำนวนผู้ป่วยสูงสุดต่อ session | |
total_slots |
INTEGER | จำนวน slots ทั้งหมด | |
staff_reserved_slots |
INTEGER | DEFAULT 0 | slots สำหรับเจ้าหน้าที่ |
mobile_app_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Mobile App |
line_bot_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Line Bot |
walkin_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Walk-in |
status |
VARCHAR(20) | CHECK | สถานะตารางเวลา |
6. ตาราง clinic_schedules
ตารางตั้งค่าเวลาทำการของคลินิก - รองรับการกำหนด slot และช่องทาง
CREATE TABLE clinic_schedules (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
clinic_id UUID NOT NULL REFERENCES clinics(id),
-- Schedule Configuration
schedule_date DATE NOT NULL,
session_type VARCHAR(10) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'allday')) NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
-- Slot Configuration
slot_type VARCHAR(20) CHECK (slot_type IN ('fixed_time', 'duration_based', 'flexible')) DEFAULT 'duration_based',
slot_duration_minutes INTEGER DEFAULT 30,
slots_per_hour INTEGER DEFAULT 2,
-- Capacity Management
max_appointments_per_day INTEGER,
max_appointments_per_slot INTEGER DEFAULT 1,
-- Channel Allocation (รองรับ TOR 6)
total_available_slots INTEGER,
staff_channel_slots INTEGER DEFAULT 0,
mobile_app_slots INTEGER DEFAULT 0,
line_bot_slots INTEGER DEFAULT 0,
walk_in_reserved_slots INTEGER DEFAULT 0,
-- Special Settings
allows_emergency_booking BOOLEAN DEFAULT FALSE,
priority_booking_percentage DECIMAL(3,2) DEFAULT 0.10,
-- Status
status VARCHAR(20) DEFAULT 'open' CHECK (status IN ('open', 'closed', 'full', 'restricted')),
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของตารางเวลาคลินิก |
clinic_id |
UUID | NOT NULL, FK | รหัสคลินิก |
schedule_date |
DATE | NOT NULL | วันที่เปิดให้บริการ |
session_type |
VARCHAR(10) | CHECK | ช่วงเวลา (morning, afternoon, evening, allday) |
start_time |
TIME | NOT NULL | เวลาเริ่มให้บริการ |
end_time |
TIME | NOT NULL | เวลาสิ้นสุดให้บริการ |
slot_type |
VARCHAR(20) | CHECK | รูปแบบการจอง (fixed_time, duration_based, flexible) |
slot_duration_minutes |
INTEGER | DEFAULT 30 | ระยะเวลาต่อ slot (นาที) |
slots_per_hour |
INTEGER | DEFAULT 2 | จำนวน slots ต่อชั่วโมง |
max_appointments_per_day |
INTEGER | จำนวนการนัดสูงสุดต่อวัน | |
max_appointments_per_slot |
INTEGER | DEFAULT 1 | จำนวนการนัดสูงสุดต่อ slot |
total_available_slots |
INTEGER | จำนวน slots ทั้งหมดที่เปิดให้จอง | |
staff_channel_slots |
INTEGER | DEFAULT 0 | slots สำหรับเจ้าหน้าที่ |
mobile_app_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Mobile App |
line_bot_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Line Bot |
walk_in_reserved_slots |
INTEGER | DEFAULT 0 | slots สำหรับ Walk-in |
allows_emergency_booking |
BOOLEAN | DEFAULT FALSE | อนุญาตการนัดฉุกเฉินหรือไม่ |
priority_booking_percentage |
DECIMAL(3,2) | DEFAULT 0.10 | เปอร์เซ็นต์สำหรับการนัดพิเศษ |
status |
VARCHAR(20) | CHECK | สถานะการเปิดให้บริการ |
7. ตาราง schedule_exceptions
ตารางข้อยกเว้นตารางเวลา - วันหยุด, วันพิเศษ, การเปลี่ยนแปลงตารางเวลา
CREATE TABLE schedule_exceptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Target (Doctor or Clinic)
doctor_id UUID REFERENCES doctors(id),
clinic_id UUID REFERENCES clinics(id),
department_id UUID REFERENCES departments(id),
-- Exception Details
exception_date DATE NOT NULL,
exception_type VARCHAR(20) NOT NULL CHECK (exception_type IN ('holiday', 'special_hours', 'closed', 'emergency_only', 'reduced_capacity')),
-- Alternative Schedule
alternative_start_time TIME,
alternative_end_time TIME,
alternative_max_patients INTEGER,
-- Description
reason TEXT NOT NULL,
description_thai TEXT,
description_eng TEXT,
-- Notification
notify_existing_appointments BOOLEAN DEFAULT TRUE,
auto_reschedule_appointments BOOLEAN DEFAULT FALSE,
-- Status
is_active BOOLEAN DEFAULT TRUE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Constraint: Must have at least one target
CONSTRAINT chk_exception_target CHECK (
(doctor_id IS NOT NULL) OR (clinic_id IS NOT NULL) OR (department_id IS NOT NULL)
)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของข้อยกเว้น |
doctor_id |
UUID | FK | รหัสแพทย์ (ถ้าเป็นยกเว้นเฉพาะแพทย์) |
clinic_id |
UUID | FK | รหัสคลินิก (ถ้าเป็นยกเว้นทั้งคลินิก) |
department_id |
UUID | FK | รหัสแผนก (ถ้าเป็นยกเว้นทั้งแผนก) |
exception_date |
DATE | NOT NULL | วันที่มีข้อยกเว้น |
exception_type |
VARCHAR(20) | CHECK | ประเภทข้อยกเว้น |
alternative_start_time |
TIME | เวลาเริ่มทางเลือก (ถ้ามี) | |
alternative_end_time |
TIME | เวลาสิ้นสุดทางเลือก (ถ้ามี) | |
alternative_max_patients |
INTEGER | จำนวนผู้ป่วยสูงสุดทางเลือก | |
reason |
TEXT | NOT NULL | เหตุผลข้อยกเว้น |
description_thai |
TEXT | คำอธิบายภาษาไทย | |
description_eng |
TEXT | คำอธิบายภาษาอังกฤษ | |
notify_existing_appointments |
BOOLEAN | DEFAULT TRUE | แจ้งเตือนการนัดที่มีอยู่ |
auto_reschedule_appointments |
BOOLEAN | DEFAULT FALSE | เลื่อนการนัดอัตโนมัติ |
SECTION 3: APPOINTMENT SYSTEM
8. ตาราง appointment_packages
ตารางแพคเกจการนัด - รองรับการนัดเป็นชุดตาม TOR 3
CREATE TABLE appointment_packages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
package_code VARCHAR(20) UNIQUE NOT NULL,
package_name_thai VARCHAR(100) NOT NULL,
package_name_eng VARCHAR(100),
-- Package Information
description_thai TEXT,
description_eng TEXT,
package_type VARCHAR(30) CHECK (package_type IN ('health_checkup', 'pre_operative', 'follow_up_series', 'treatment_cycle', 'screening_program')) NOT NULL,
-- Target Group
target_department_id UUID REFERENCES departments(id),
applicable_conditions TEXT[],
age_range_min INTEGER,
age_range_max INTEGER,
gender_restriction CHAR(1) CHECK (gender_restriction IN ('M', 'F')),
-- Package Settings
total_appointments INTEGER NOT NULL DEFAULT 1,
sequence_required BOOLEAN DEFAULT TRUE,
interval_days INTEGER DEFAULT 7,
max_duration_days INTEGER DEFAULT 90,
-- Pricing
package_price DECIMAL(10,2),
individual_booking_allowed BOOLEAN DEFAULT TRUE,
-- Instructions
preparation_instructions_thai TEXT,
preparation_instructions_eng TEXT,
-- Status
is_active BOOLEAN DEFAULT TRUE,
effective_from DATE DEFAULT CURRENT_DATE,
effective_to DATE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของแพคเกจ |
package_code |
VARCHAR(20) | UNIQUE, NOT NULL | รหัสแพคเกจ |
package_name_thai |
VARCHAR(100) | NOT NULL | ชื่อแพคเกจ (ภาษาไทย) |
package_name_eng |
VARCHAR(100) | ชื่อแพคเกจ (ภาษาอังกฤษ) | |
description_thai |
TEXT | คำอธิบายแพคเกจ (ภาษาไทย) | |
description_eng |
TEXT | คำอธิบายแพคเกจ (ภาษาอังกฤษ) | |
package_type |
VARCHAR(30) | CHECK | ประเภทแพคเกจ |
target_department_id |
UUID | FK | แผนกเป้าหมาย |
applicable_conditions |
TEXT[] | เงื่อนไขการใช้งาน | |
age_range_min |
INTEGER | อายุต่ำสุด | |
age_range_max |
INTEGER | อายุสูงสุด | |
gender_restriction |
CHAR(1) | CHECK | จำกัดเพศ (M, F) |
total_appointments |
INTEGER | NOT NULL | จำนวนการนัดในแพคเกจ |
sequence_required |
BOOLEAN | DEFAULT TRUE | ต้องนัดตามลำดับหรือไม่ |
interval_days |
INTEGER | DEFAULT 7 | ระยะห่างระหว่างการนัด (วัน) |
max_duration_days |
INTEGER | DEFAULT 90 | ระยะเวลาสูงสุดของแพคเกจ |
package_price |
DECIMAL(10,2) | ราคาแพคเกจ | |
individual_booking_allowed |
BOOLEAN | DEFAULT TRUE | อนุญาตนัดแยกรายการได้ |
preparation_instructions_thai |
TEXT | คำแนะนำการเตรียมตัว (ไทย) | |
preparation_instructions_eng |
TEXT | คำแนะนำการเตรียมตัว (อังกฤษ) |
9. ตาราง appointment_package_items
ตารางรายการในแพคเกจการนัด - รองรับการนัดหลายขั้นตอน
CREATE TABLE appointment_package_items (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
package_id UUID NOT NULL REFERENCES appointment_packages(id) ON DELETE CASCADE,
-- Item Details
sequence_number INTEGER NOT NULL,
item_name_thai VARCHAR(100) NOT NULL,
item_name_eng VARCHAR(100),
item_description_thai TEXT,
item_description_eng TEXT,
-- Appointment Configuration
department_id UUID REFERENCES departments(id),
clinic_id UUID REFERENCES clinics(id),
doctor_specialization VARCHAR(100),
appointment_type VARCHAR(30) CHECK (appointment_type IN ('consultation', 'examination', 'lab_test', 'imaging', 'procedure', 'follow_up')),
-- Timing
days_from_start INTEGER DEFAULT 0,
estimated_duration_minutes INTEGER DEFAULT 30,
-- Requirements
required_preparation TEXT,
prerequisite_items INTEGER[], -- Array of sequence_numbers that must be completed first
-- Pricing
item_price DECIMAL(8,2),
-- Status
is_mandatory BOOLEAN DEFAULT TRUE,
is_active BOOLEAN DEFAULT TRUE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
UNIQUE(package_id, sequence_number)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของรายการ |
package_id |
UUID | NOT NULL, FK | รหัสแพคเกจที่สังกัด |
sequence_number |
INTEGER | NOT NULL | ลำดับในแพคเกจ |
item_name_thai |
VARCHAR(100) | NOT NULL | ชื่อรายการ (ภาษาไทย) |
item_name_eng |
VARCHAR(100) | ชื่อรายการ (ภาษาอังกฤษ) | |
item_description_thai |
TEXT | คำอธิบายรายการ (ไทย) | |
item_description_eng |
TEXT | คำอธิบายรายการ (อังกฤษ) | |
department_id |
UUID | FK | แผนกที่ให้บริการ |
clinic_id |
UUID | FK | คลินิกที่ให้บริการ |
doctor_specialization |
VARCHAR(100) | ความเชี่ยวชาญแพทย์ที่ต้องการ | |
appointment_type |
VARCHAR(30) | CHECK | ประเภทการนัด |
days_from_start |
INTEGER | DEFAULT 0 | จำนวนวันนับจากการเริ่มแพคเกจ |
estimated_duration_minutes |
INTEGER | DEFAULT 30 | เวลาโดยประมาณ (นาที) |
required_preparation |
TEXT | การเตรียมตัวที่จำเป็น | |
prerequisite_items |
INTEGER[] | รายการที่ต้องทำก่อน | |
item_price |
DECIMAL(8,2) | ราคารายการ | |
is_mandatory |
BOOLEAN | DEFAULT TRUE | บังคับหรือไม่ |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะใช้งาน |
10. ตาราง appointments (Master Schema Foundation Table)
ตารางหลักจาก Master Schema: ตาราง
appointmentsถูกกำหนดใน MASTER_DATABASE_SCHEMA.md
Integration Points: ตารางนี้เชื่อมโยงกับappointment_packages,appointment_slots,appointment_historyในโมดูลนี้
Key Features from Master Schema:
- รองรับการจองแบบ Multi-channel (staff, mobile_app, line_bot, kiosk, website)
- ระบบ Package appointments สำหรับการนัดแบบชุด
- Reschedule tracking และ notification preferences
- เชื่อมโยงกับ patients, medical_visits, users จาก Master Schema
- Audit trail และ digital signature support
Module-Specific Extensions:
- appointment_packages - แพคเกจการนัดแบบชุด
- appointment_slots - การจัดการ time slots
- appointment_history - ประวัติการเปลี่ยนแปลง
- appointment_reminders - ระบบแจ้งเตือนแบบ Multi-channel
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการนัด |
appointment_number |
VARCHAR(20) | UNIQUE, NOT NULL | หมายเลขการนัด (สร้างอัตโนมัติ) |
patient_id |
UUID | NOT NULL | รหัสผู้ป่วยจากระบบ EMR |
visit_id |
UUID | รหัส Visit (ถ้าเชื่อมโยงกับการรับบริการ) | |
package_id |
UUID | FK | รหัสแพคเกจการนัด (ถ้าเป็นส่วนหนึ่งของแพคเกจ) |
package_sequence_number |
INTEGER | ลำดับในแพคเกจ | |
parent_appointment_id |
UUID | FK | การนัดหลักในชุด (สำหรับ series appointments) |
doctor_id |
UUID | FK | รหัสแพทย์ |
clinic_id |
UUID | NOT NULL, FK | รหัสคลินิก |
department_id |
UUID | NOT NULL, FK | รหัสแผนก |
appointment_date |
DATE | NOT NULL | วันที่นัด |
appointment_time |
TIME | เวลาที่นัด | |
estimated_duration_minutes |
INTEGER | DEFAULT 30 | ระยะเวลาโดยประมาณ (นาที) |
session_type |
VARCHAR(10) | CHECK | ช่วงเวลา (morning, afternoon, evening) |
appointment_type |
VARCHAR(30) | CHECK | ประเภทการนัด (รวม admit, discharge_followup) |
priority_level |
INTEGER | CHECK | ระดับความสำคัญ (1=สูงสุด, 10=ต่ำสุด) |
chief_complaint |
TEXT | อาการสำคัญ | |
reason_for_appointment |
TEXT | เหตุผลการนัด | |
preparation_instructions |
TEXT | คำแนะนำการเตรียมตัว | |
pre_appointment_checklist |
JSONB | รายการเตรียมตัวก่อนนัด | |
booking_channel |
VARCHAR(20) | CHECK | ช่องทางการจอง (รวม ward) |
booking_reference |
VARCHAR(50) | หมายเลขอ้างอิงจากระบบภายนอก | |
booked_by_user_id |
UUID | FK | ผู้ทำการนัด |
referral_source |
VARCHAR(30) | CHECK | แหล่งที่มาของการส่งตัว |
referring_doctor_id |
UUID | FK | แพทย์ผู้ส่งตัว |
referring_department_id |
UUID | FK | แผนกผู้ส่งตัว |
status |
VARCHAR(20) | CHECK | สถานะการนัด |
confirmation_status |
VARCHAR(20) | CHECK | สถานะการยืนยัน |
reschedule_count |
INTEGER | DEFAULT 0 | จำนวนครั้งที่เลื่อนนัด |
original_appointment_date |
DATE | วันนัดเดิม | |
original_appointment_time |
TIME | เวลานัดเดิม | |
reschedule_reason |
TEXT | เหตุผลการเลื่อนนัด | |
last_rescheduled_at |
TIMESTAMP | เวลาที่เลื่อนนัดครั้งล่าสุด | |
last_rescheduled_by |
UUID | FK | ผู้ที่ทำการเลื่อนนัด |
notification_preferences |
JSONB | การตั้งค่าการแจ้งเตือน | |
appointment_card_generated |
BOOLEAN | DEFAULT FALSE | สร้างใบนัดแล้ว |
appointment_card_sent |
BOOLEAN | DEFAULT FALSE | ส่งใบนัดแล้ว |
special_needs |
TEXT | ความต้องการพิเศษ | |
wheelchair_required |
BOOLEAN | DEFAULT FALSE | ต้องการรถเข็น |
interpreter_needed |
VARCHAR(20) | ต้องการล่าม | |
estimated_cost |
DECIMAL(10,2) | ประมาณการค่าใช้จ่าย | |
insurance_coverage_confirmed |
BOOLEAN | DEFAULT FALSE | ยืนยันสิทธิการรักษาแล้ว |
11. ตาราง appointment_slots
ตารางการจัดการ slots การนัด - รองรับการจองตาม TOR 5
CREATE TABLE appointment_slots (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Schedule Reference
doctor_schedule_id UUID REFERENCES doctor_schedules(id),
clinic_schedule_id UUID REFERENCES clinic_schedules(id),
-- Slot Information
slot_date DATE NOT NULL,
slot_time TIME NOT NULL,
slot_duration_minutes INTEGER DEFAULT 30,
slot_number INTEGER NOT NULL,
-- Availability Configuration (รองรับ TOR 5 - slot configuration)
slot_type VARCHAR(20) CHECK (slot_type IN ('fixed_10min', 'fixed_15min', 'fixed_30min', 'fixed_60min', 'flexible', 'allday')) DEFAULT 'fixed_30min',
max_appointments INTEGER DEFAULT 1,
-- Channel Allocation (รองรับ TOR 6 - multi-channel)
reserved_for_channel VARCHAR(20) CHECK (reserved_for_channel IN ('any', 'staff', 'mobile_app', 'line_bot', 'walk_in')),
channel_quota_used INTEGER DEFAULT 0,
-- Appointment Assignment
appointment_id UUID REFERENCES appointments(id),
-- Status
status VARCHAR(20) DEFAULT 'available' CHECK (status IN ('available', 'booked', 'blocked', 'cancelled', 'completed')),
blocking_reason TEXT,
-- Emergency Override
emergency_slot BOOLEAN DEFAULT FALSE,
can_be_overbooked BOOLEAN DEFAULT FALSE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Ensure slot uniqueness
UNIQUE(doctor_schedule_id, slot_date, slot_time, slot_number),
UNIQUE(clinic_schedule_id, slot_date, slot_time, slot_number)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของ slot |
doctor_schedule_id |
UUID | FK | รหัสตารางเวลาแพทย์ |
clinic_schedule_id |
UUID | FK | รหัสตารางเวลาคลินิก |
slot_date |
DATE | NOT NULL | วันที่ของ slot |
slot_time |
TIME | NOT NULL | เวลาของ slot |
slot_duration_minutes |
INTEGER | DEFAULT 30 | ระยะเวลาของ slot (นาที) |
slot_number |
INTEGER | NOT NULL | หมายเลข slot ในวันนั้น |
slot_type |
VARCHAR(20) | CHECK | ประเภท slot (10/15/30/60 นาที, flexible, allday) |
max_appointments |
INTEGER | DEFAULT 1 | จำนวนการนัดสูงสุดใน slot |
reserved_for_channel |
VARCHAR(20) | CHECK | จองไว้สำหรับช่องทางใด |
channel_quota_used |
INTEGER | DEFAULT 0 | จำนวนที่ใช้ไปแล้วใน quota |
appointment_id |
UUID | FK | รหัสการนัดที่จอง slot นี้ |
status |
VARCHAR(20) | CHECK | สถานะของ slot |
blocking_reason |
TEXT | เหตุผลการบล็อก slot | |
emergency_slot |
BOOLEAN | DEFAULT FALSE | slot ฉุกเฉิน |
can_be_overbooked |
BOOLEAN | DEFAULT FALSE | อนุญาต overbooking |
12. ตาราง appointment_history
ตารางประวัติการเปลี่ยนแปลงการนัด - รองรับ TOR 8
CREATE TABLE appointment_history (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
appointment_id UUID NOT NULL REFERENCES appointments(id),
-- Change Information
action_type VARCHAR(20) NOT NULL CHECK (action_type IN ('created', 'rescheduled', 'cancelled', 'confirmed', 'checked_in', 'completed', 'no_show')),
-- Previous Values (สำหรับ reschedule)
previous_date DATE,
previous_time TIME,
previous_doctor_id UUID REFERENCES doctors(id),
previous_clinic_id UUID REFERENCES clinics(id),
-- New Values
new_date DATE,
new_time TIME,
new_doctor_id UUID REFERENCES doctors(id),
new_clinic_id UUID REFERENCES clinics(id),
-- Change Details
reason TEXT,
notes TEXT,
initiated_by VARCHAR(20) CHECK (initiated_by IN ('patient', 'staff', 'system', 'doctor')),
-- Communication
notification_sent BOOLEAN DEFAULT FALSE,
notification_method VARCHAR(20) CHECK (notification_method IN ('sms', 'line', 'email', 'phone', 'mobile_app')),
patient_acknowledged BOOLEAN DEFAULT FALSE,
-- User Information
changed_by_user_id UUID REFERENCES users(id),
changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- System Information
ip_address INET,
user_agent TEXT
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของประวัติ |
appointment_id |
UUID | NOT NULL, FK | รหัสการนัดที่เกี่ยวข้อง |
action_type |
VARCHAR(20) | CHECK | ประเภทการเปลี่ยนแปลง |
previous_date |
DATE | วันที่เดิม (ก่อนเปลี่ยน) | |
previous_time |
TIME | เวลาเดิม | |
previous_doctor_id |
UUID | FK | แพทย์เดิม |
previous_clinic_id |
UUID | FK | คลินิกเดิม |
new_date |
DATE | วันที่ใหม่ | |
new_time |
TIME | เวลาใหม่ | |
new_doctor_id |
UUID | FK | แพทย์ใหม่ |
new_clinic_id |
UUID | FK | คลินิกใหม่ |
reason |
TEXT | เหตุผลการเปลี่ยนแปลง | |
notes |
TEXT | หมายเหตุเพิ่มเติม | |
initiated_by |
VARCHAR(20) | CHECK | ผู้ริเริ่มการเปลี่ยนแปลง |
notification_sent |
BOOLEAN | DEFAULT FALSE | ส่งการแจ้งเตือนแล้ว |
notification_method |
VARCHAR(20) | CHECK | วิธีการแจ้งเตือน |
patient_acknowledged |
BOOLEAN | DEFAULT FALSE | ผู้ป่วยรับทราบแล้ว |
changed_by_user_id |
UUID | FK | ผู้ทำการเปลี่ยนแปลง |
changed_at |
TIMESTAMP | DEFAULT NOW() | เวลาที่เปลี่ยนแปลง |
13. ตาราง appointment_reminders
ตารางการแจ้งเตือนการนัด - รองรับ TOR 6 และ 2.6
CREATE TABLE appointment_reminders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
appointment_id UUID NOT NULL REFERENCES appointments(id),
-- Reminder Configuration
reminder_type VARCHAR(20) NOT NULL CHECK (reminder_type IN ('confirmation', 'reminder_24h', 'reminder_2h', 'preparation', 'custom')),
-- Schedule
scheduled_datetime TIMESTAMP WITH TIME ZONE NOT NULL,
send_before_minutes INTEGER NOT NULL,
-- Message Configuration
message_template_id UUID REFERENCES communication_templates(id),
custom_message_thai TEXT,
custom_message_eng TEXT,
-- Delivery Channels (รองรับ Multi-channel ตาม TOR 2.6)
send_sms BOOLEAN DEFAULT FALSE,
send_line BOOLEAN DEFAULT FALSE,
send_email BOOLEAN DEFAULT FALSE,
send_push_notification BOOLEAN DEFAULT FALSE,
phone_call_required BOOLEAN DEFAULT FALSE,
-- Delivery Status
status VARCHAR(20) DEFAULT 'scheduled' CHECK (status IN ('scheduled', 'sent', 'delivered', 'failed', 'cancelled')),
sent_at TIMESTAMP WITH TIME ZONE,
delivered_at TIMESTAMP WITH TIME ZONE,
-- Delivery Details
sms_status VARCHAR(20),
line_status VARCHAR(20),
email_status VARCHAR(20),
push_status VARCHAR(20),
phone_call_status VARCHAR(20),
-- Error Handling
error_message TEXT,
retry_count INTEGER DEFAULT 0,
max_retries INTEGER DEFAULT 3,
next_retry_at TIMESTAMP WITH TIME ZONE,
-- Patient Response
patient_responded BOOLEAN DEFAULT FALSE,
response_method VARCHAR(20),
response_at TIMESTAMP WITH TIME ZONE,
response_content TEXT,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการแจ้งเตือน |
appointment_id |
UUID | NOT NULL, FK | รหัสการนัดที่เกี่ยวข้อง |
reminder_type |
VARCHAR(20) | CHECK | ประเภทการแจ้งเตือน |
scheduled_datetime |
TIMESTAMP | NOT NULL | เวลาที่กำหนดส่ง |
send_before_minutes |
INTEGER | NOT NULL | ส่งก่อนนัดกี่นาที |
message_template_id |
UUID | FK | รหัส template ข้อความ |
custom_message_thai |
TEXT | ข้อความกำหนดเอง (ไทย) | |
custom_message_eng |
TEXT | ข้อความกำหนดเอง (อังกฤษ) | |
send_sms |
BOOLEAN | DEFAULT FALSE | ส่ง SMS |
send_line |
BOOLEAN | DEFAULT FALSE | ส่งผ่าน Line |
send_email |
BOOLEAN | DEFAULT FALSE | ส่ง Email |
send_push_notification |
BOOLEAN | DEFAULT FALSE | ส่ง Push Notification |
phone_call_required |
BOOLEAN | DEFAULT FALSE | ต้องการโทรแจ้ง |
status |
VARCHAR(20) | CHECK | สถานะการส่ง |
sent_at |
TIMESTAMP | เวลาที่ส่ง | |
delivered_at |
TIMESTAMP | เวลาที่ส่งถึง | |
sms_status |
VARCHAR(20) | สถานะการส่ง SMS | |
line_status |
VARCHAR(20) | สถานะการส่ง Line | |
email_status |
VARCHAR(20) | สถานะการส่ง Email | |
push_status |
VARCHAR(20) | สถานะการส่ง Push | |
phone_call_status |
VARCHAR(20) | สถานะการโทร | |
error_message |
TEXT | ข้อความ Error | |
retry_count |
INTEGER | DEFAULT 0 | จำนวนครั้งที่ลองใหม่ |
max_retries |
INTEGER | DEFAULT 3 | จำนวนครั้งสูงสุดที่ลองได้ |
next_retry_at |
TIMESTAMP | เวลาที่จะลองใหม่ | |
patient_responded |
BOOLEAN | DEFAULT FALSE | ผู้ป่วยตอบกลับ |
response_method |
VARCHAR(20) | วิธีการตอบกลับ | |
response_at |
TIMESTAMP | เวลาที่ตอบกลับ | |
response_content |
TEXT | เนื้อหาที่ตอบกลับ |
SECTION 4: QUEUE MANAGEMENT SYSTEM
14. ตาราง queue_configurations
ตารางการตั้งค่าระบบคิว - รองรับ TOR 2.3
CREATE TABLE queue_configurations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Target Configuration
department_id UUID REFERENCES departments(id),
clinic_id UUID REFERENCES clinics(id),
service_point VARCHAR(30) NOT NULL, -- registration, screening, examination, pharmacy, cashier
-- Queue Settings
queue_prefix VARCHAR(10) NOT NULL,
queue_reset_type VARCHAR(20) CHECK (queue_reset_type IN ('daily', 'weekly', 'session', 'manual')) DEFAULT 'daily',
queue_start_number INTEGER DEFAULT 1,
queue_increment INTEGER DEFAULT 1,
max_queue_number INTEGER DEFAULT 999,
-- Priority Configuration (รองรับ TOR 2.3.1 - แยกประเภทคิว)
priority_weights JSONB DEFAULT '{
"emergency": 1000,
"vip": 500,
"elderly": 100,
"disabled": 100,
"pregnant": 100,
"appointment": 50,
"child": 25,
"walkin": 10
}',
-- Time Management
average_service_time_minutes INTEGER DEFAULT 15,
buffer_time_minutes INTEGER DEFAULT 5,
-- Display Settings
display_name_thai VARCHAR(100) NOT NULL,
display_name_eng VARCHAR(100),
show_estimated_time BOOLEAN DEFAULT TRUE,
show_queue_ahead INTEGER DEFAULT 3,
-- Audio Settings
enable_audio_call BOOLEAN DEFAULT TRUE,
audio_language VARCHAR(10) DEFAULT 'thai',
repeat_call_times INTEGER DEFAULT 3,
call_interval_seconds INTEGER DEFAULT 30,
-- Integration Settings
auto_call_next BOOLEAN DEFAULT FALSE,
integration_endpoint VARCHAR(200),
-- Status
is_active BOOLEAN DEFAULT TRUE,
operating_hours JSONB,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Unique constraint
UNIQUE(department_id, clinic_id, service_point)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการตั้งค่าคิว |
department_id |
UUID | FK | รหัสแผนก |
clinic_id |
UUID | FK | รหัสคลินิก |
service_point |
VARCHAR(30) | NOT NULL | จุดบริการ (registration, screening, examination, pharmacy, cashier) |
queue_prefix |
VARCHAR(10) | NOT NULL | อักษรนำหน้าคิว (เช่น A, B, C) |
queue_reset_type |
VARCHAR(20) | CHECK | รูปแบบการ reset หมายเลขคิว |
queue_start_number |
INTEGER | DEFAULT 1 | หมายเลขเริ่มต้น |
queue_increment |
INTEGER | DEFAULT 1 | การเพิ่มหมายเลขคิว |
max_queue_number |
INTEGER | DEFAULT 999 | หมายเลขคิวสูงสุด |
priority_weights |
JSONB | น้ำหนักความสำคัญของแต่ละประเภทคิว | |
average_service_time_minutes |
INTEGER | DEFAULT 15 | เวลาให้บริการเฉลี่ย (นาที) |
buffer_time_minutes |
INTEGER | DEFAULT 5 | เวลา buffer (นาที) |
display_name_thai |
VARCHAR(100) | NOT NULL | ชื่อแสดงผล (ภาษาไทย) |
display_name_eng |
VARCHAR(100) | ชื่อแสดงผล (ภาษาอังกฤษ) | |
show_estimated_time |
BOOLEAN | DEFAULT TRUE | แสดงเวลาโดยประมาณ |
show_queue_ahead |
INTEGER | DEFAULT 3 | แสดงจำนวนคิวข้างหน้า |
enable_audio_call |
BOOLEAN | DEFAULT TRUE | เปิดเสียงเรียกคิว |
audio_language |
VARCHAR(10) | DEFAULT 'thai' | ภาษาเสียงเรียก |
repeat_call_times |
INTEGER | DEFAULT 3 | จำนวนครั้งที่เรียกซ้ำ |
call_interval_seconds |
INTEGER | DEFAULT 30 | ช่วงเวลาระหว่างการเรียก (วินาที) |
auto_call_next |
BOOLEAN | DEFAULT FALSE | เรียกคิวถัดไปอัตโนมัติ |
integration_endpoint |
VARCHAR(200) | Endpoint สำหรับ integration | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะการใช้งาน |
operating_hours |
JSONB | เวลาทำการ |
15. ตาราง queue_sessions
ตารางเซสชันการทำงานของคิว - รองรับการจัดการคิวรายวัน
CREATE TABLE queue_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
queue_config_id UUID NOT NULL REFERENCES queue_configurations(id),
-- Session Information
session_date DATE NOT NULL DEFAULT CURRENT_DATE,
session_type VARCHAR(20) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'full_day')) DEFAULT 'full_day',
-- Session Schedule
start_time TIME NOT NULL,
end_time TIME NOT NULL,
planned_end_time TIME,
actual_end_time TIME,
-- Queue Counter
current_queue_number INTEGER DEFAULT 0,
total_queues_issued INTEGER DEFAULT 0,
total_queues_served INTEGER DEFAULT 0,
total_no_shows INTEGER DEFAULT 0,
-- Performance Metrics
average_wait_time_minutes DECIMAL(5,2),
average_service_time_minutes DECIMAL(5,2),
peak_queue_count INTEGER DEFAULT 0,
peak_queue_time TIME,
-- Status
status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('scheduled', 'active', 'paused', 'completed', 'cancelled')),
pause_reason TEXT,
paused_at TIMESTAMP WITH TIME ZONE,
resumed_at TIMESTAMP WITH TIME ZONE,
-- Staff Assignment
assigned_staff UUID[] DEFAULT ARRAY[]::UUID[],
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id),
-- Unique constraint per day
UNIQUE(queue_config_id, session_date, session_type)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของเซสชันคิว |
queue_config_id |
UUID | NOT NULL, FK | รหัสการตั้งค่าคิว |
session_date |
DATE | NOT NULL | วันที่ของเซสชัน |
session_type |
VARCHAR(20) | CHECK | ประเภทเซสชัน (morning, afternoon, evening, full_day) |
start_time |
TIME | NOT NULL | เวลาเริ่มต้นเซสชัน |
end_time |
TIME | NOT NULL | เวลาสิ้นสุดเซสชัน |
planned_end_time |
TIME | เวลาสิ้นสุดที่วางแผนไว้ | |
actual_end_time |
TIME | เวลาสิ้นสุดจริง | |
current_queue_number |
INTEGER | DEFAULT 0 | หมายเลขคิวปัจจุบัน |
total_queues_issued |
INTEGER | DEFAULT 0 | จำนวนคิวทั้งหมดที่ออก |
total_queues_served |
INTEGER | DEFAULT 0 | จำนวนคิูที่ให้บริการแล้ว |
total_no_shows |
INTEGER | DEFAULT 0 | จำนวนผู้ไม่มา |
average_wait_time_minutes |
DECIMAL(5,2) | เวลารอเฉลี่ย | |
average_service_time_minutes |
DECIMAL(5,2) | เวลาให้บริการเฉลี่ย | |
peak_queue_count |
INTEGER | DEFAULT 0 | จำนวนคิวสูงสุด |
peak_queue_time |
TIME | เวลาที่มีคิวสูงสุด | |
status |
VARCHAR(20) | CHECK | สถานะเซสชัน |
pause_reason |
TEXT | เหตุผลการหยุด | |
paused_at |
TIMESTAMP | เวลาที่หยุด | |
resumed_at |
TIMESTAMP | เวลาที่เริ่มใหม่ | |
assigned_staff |
UUID[] | รายการเจ้าหน้าที่ที่มอบหมาย |
16. ตาราง queues (Master Schema Foundation Table)
ตารางหลักจาก Master Schema: ตาราง
queuesถูกกำหนดใน MASTER_DATABASE_SCHEMA.md
Integration Points: ตารางนี้เชื่อมโยงกับqueue_configurations,queue_sessions,queue_callsในโมดูลนี้
Key Features from Master Schema:
- รองรับ Real-time queue management ด้วย WebSocket integration
- ระบบ Priority-based queuing ตาม healthcare standards
- Service flow tracking สำหรับ Multi-service point workflow
- เชื่อมโยงกับ appointments, medical_visits, patients จาก Master Schema
- QR Code integration สำหรับ Digital patient experience
Module-Specific Extensions:
- queue_configurations - การตั้งค่าระบบคิวแต่ละแผนก/คลินิก
- queue_sessions - การจัดการเซสชันคิวรายวัน
- queue_calls - ระบบเรียกคิวด้วยเสียงและจอแสดงผล
- queue_displays - การจัดการจอแสดงผลคิวแบบ Real-time
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของคิว |
queue_number |
VARCHAR(20) | NOT NULL | หมายเลขคิว |
visit_id |
UUID | รหัส Visit จากระบบ EMR | |
appointment_id |
UUID | FK | รหัสการนัดหมาย |
patient_id |
UUID | NOT NULL | รหัสผู้ป่วยจากระบบ EMR |
clinic_id |
UUID | NOT NULL, FK | รหัสคลินิก |
doctor_id |
UUID | FK | รหัสแพทย์ |
queue_type |
VARCHAR(20) | CHECK | ประเภทคิว |
priority_score |
INTEGER | NOT NULL | คะแนนความสำคัญ |
service_points |
TEXT[] | จุดบริการที่ต้องผ่าน | |
current_service_point |
VARCHAR(20) | จุดบริการปัจจุบัน | |
service_point_history |
JSONB | ประวัติการผ่านจุดบริการ | |
status |
VARCHAR(20) | CHECK | สถานะคิว |
issued_at |
TIMESTAMP | เวลาที่ออกคิว | |
estimated_service_time |
TIMESTAMP | เวลาโดยประมาณที่จะได้รับบริการ | |
called_at |
TIMESTAMP | เวลาที่ถูกเรียก | |
service_started_at |
TIMESTAMP | เวลาที่เริ่มรับบริการ | |
service_completed_at |
TIMESTAMP | เวลาที่เสร็จสิ้นบริการ | |
estimated_wait_minutes |
INTEGER | เวลารอโดยประมาณ (นาที) | |
actual_wait_minutes |
INTEGER | GENERATED | เวลารอจริง (คำนวณอัตโนมัติ) |
special_requirements |
TEXT[] | ความต้องการพิเศษ | |
notes |
TEXT | หมายเหตุ | |
qr_code |
VARCHAR(100) | QR Code สำหรับติดตามสถานะ |
17. ตาราง queue_calls
ตารางการเรียกคิว - รองรับ TOR 2.3.3 และ 2.3.4 (เรียกคิวอัตโนมัติและแสดงผล)
CREATE TABLE queue_calls (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
queue_id UUID NOT NULL REFERENCES queues(id),
queue_session_id UUID REFERENCES queue_sessions(id),
-- Call Information
call_number INTEGER NOT NULL,
queue_number VARCHAR(20) NOT NULL,
service_point VARCHAR(30) NOT NULL,
-- Call Details
called_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
call_type VARCHAR(20) CHECK (call_type IN ('first_call', 'repeat_call', 'final_call', 'manual_call')) DEFAULT 'first_call',
-- Target Destination
display_screen_id VARCHAR(50),
audio_zone VARCHAR(30),
counter_number VARCHAR(10),
room_number VARCHAR(20),
-- Call Status
call_status VARCHAR(20) DEFAULT 'called' CHECK (call_status IN ('called', 'acknowledged', 'no_response', 'completed')),
acknowledged_at TIMESTAMP WITH TIME ZONE,
response_timeout_at TIMESTAMP WITH TIME ZONE,
-- Audio Settings
audio_enabled BOOLEAN DEFAULT TRUE,
audio_language VARCHAR(10) DEFAULT 'thai',
custom_message TEXT,
voice_file_path VARCHAR(500),
-- Display Settings
display_duration_seconds INTEGER DEFAULT 60,
display_priority INTEGER DEFAULT 1,
show_preparation_info BOOLEAN DEFAULT FALSE,
preparation_message TEXT,
-- Staff Assignment
called_by_user_id UUID REFERENCES users(id),
serving_staff_id UUID REFERENCES users(id),
-- Integration
external_display_sent BOOLEAN DEFAULT FALSE,
external_audio_sent BOOLEAN DEFAULT FALSE,
integration_response JSONB,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการเรียกคิว |
queue_id |
UUID | NOT NULL, FK | รหัสคิวที่เรียก |
queue_session_id |
UUID | FK | รหัสเซสชันคิว |
call_number |
INTEGER | NOT NULL | ลำดับการเรียก |
queue_number |
VARCHAR(20) | NOT NULL | หมายเลขคิวที่เรียก |
service_point |
VARCHAR(30) | NOT NULL | จุดบริการที่เรียก |
called_at |
TIMESTAMP | DEFAULT NOW() | เวลาที่เรียก |
call_type |
VARCHAR(20) | CHECK | ประเภทการเรียก (first_call, repeat_call, final_call, manual_call) |
display_screen_id |
VARCHAR(50) | รหัสจอแสดงผล | |
audio_zone |
VARCHAR(30) | โซนเสียง | |
counter_number |
VARCHAR(10) | หมายเลขเคาน์เตอร์ | |
room_number |
VARCHAR(20) | หมายเลขห้อง | |
call_status |
VARCHAR(20) | CHECK | สถานะการเรียก |
acknowledged_at |
TIMESTAMP | เวลาที่รับทราบ | |
response_timeout_at |
TIMESTAMP | เวลาหมดเวลาตอบสนอง | |
audio_enabled |
BOOLEAN | DEFAULT TRUE | เปิดเสียงหรือไม่ |
audio_language |
VARCHAR(10) | DEFAULT 'thai' | ภาษาเสียง |
custom_message |
TEXT | ข้อความกำหนดเอง | |
voice_file_path |
VARCHAR(500) | ไฟล์เสียง | |
display_duration_seconds |
INTEGER | DEFAULT 60 | ระยะเวลาแสดงผล (วินาที) |
display_priority |
INTEGER | DEFAULT 1 | ลำดับความสำคัญการแสดงผล |
show_preparation_info |
BOOLEAN | DEFAULT FALSE | แสดงข้อมูลการเตรียมตัว |
preparation_message |
TEXT | ข้อความการเตรียมตัว | |
called_by_user_id |
UUID | FK | ผู้เรียกคิว |
serving_staff_id |
UUID | FK | เจ้าหน้าที่ให้บริการ |
18. ตาราง queue_displays
ตารางการแสดงผลคิว - รองรับ TOR 2.3.4 (จอแสดงผลและระบบเสียง)
CREATE TABLE queue_displays (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Display Configuration
display_name VARCHAR(100) NOT NULL,
display_code VARCHAR(20) UNIQUE NOT NULL,
display_type VARCHAR(20) CHECK (display_type IN ('main_board', 'counter_display', 'mobile_app', 'kiosk', 'department_tv')) NOT NULL,
-- Physical Location
location_description TEXT,
department_id UUID REFERENCES departments(id),
clinic_id UUID REFERENCES clinics(id),
building VARCHAR(50),
floor_number INTEGER,
zone VARCHAR(30),
-- Display Settings
screen_resolution VARCHAR(20) DEFAULT '1920x1080',
orientation VARCHAR(10) CHECK (orientation IN ('landscape', 'portrait')) DEFAULT 'landscape',
-- Content Configuration
show_current_queue BOOLEAN DEFAULT TRUE,
show_queue_ahead INTEGER DEFAULT 5,
show_estimated_time BOOLEAN DEFAULT TRUE,
show_preparation_info BOOLEAN DEFAULT FALSE,
-- Service Points Display
service_points_displayed TEXT[] DEFAULT ARRAY['examination'],
max_queues_per_service_point INTEGER DEFAULT 10,
-- Visual Settings
theme VARCHAR(20) DEFAULT 'hospital_blue',
font_size VARCHAR(10) CHECK (font_size IN ('small', 'medium', 'large', 'extra_large')) DEFAULT 'large',
language_display VARCHAR(10) DEFAULT 'thai',
show_clock BOOLEAN DEFAULT TRUE,
show_hospital_logo BOOLEAN DEFAULT TRUE,
-- Audio Settings (รองรับ TOR 2.3.4)
audio_enabled BOOLEAN DEFAULT TRUE,
audio_zone VARCHAR(30),
speaker_ip_address INET,
audio_volume INTEGER DEFAULT 70 CHECK (audio_volume BETWEEN 0 AND 100),
-- Real-time Updates
refresh_interval_seconds INTEGER DEFAULT 5,
websocket_endpoint VARCHAR(200),
-- Network Configuration
ip_address INET,
mac_address VARCHAR(17),
device_model VARCHAR(50),
device_serial VARCHAR(100),
-- Status and Monitoring
status VARCHAR(20) DEFAULT 'online' CHECK (status IN ('online', 'offline', 'maintenance', 'error')),
last_heartbeat TIMESTAMP WITH TIME ZONE,
uptime_minutes INTEGER DEFAULT 0,
error_log TEXT,
-- Integration
api_endpoint VARCHAR(200),
api_key VARCHAR(100),
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของจอแสดงผล |
display_name |
VARCHAR(100) | NOT NULL | ชื่อจอแสดงผล |
display_code |
VARCHAR(20) | UNIQUE, NOT NULL | รหัสจอแสดงผล |
display_type |
VARCHAR(20) | CHECK | ประเภทจอแสดงผล |
location_description |
TEXT | คำอธิบายที่ตั้ง | |
department_id |
UUID | FK | รหัสแผนก |
clinic_id |
UUID | FK | รหัสคลินิก |
building |
VARCHAR(50) | อาคาร | |
floor_number |
INTEGER | ชั้น | |
zone |
VARCHAR(30) | โซน | |
screen_resolution |
VARCHAR(20) | DEFAULT '1920x1080' | ความละเอียดหน้าจอ |
orientation |
VARCHAR(10) | CHECK | แนวหน้าจอ |
show_current_queue |
BOOLEAN | DEFAULT TRUE | แสดงคิวปัจจุบัน |
show_queue_ahead |
INTEGER | DEFAULT 5 | แสดงคิวข้างหน้ากี่คิว |
show_estimated_time |
BOOLEAN | DEFAULT TRUE | แสดงเวลาโดยประมาณ |
show_preparation_info |
BOOLEAN | DEFAULT FALSE | แสดงข้อมูลการเตรียมตัว |
service_points_displayed |
TEXT[] | จุดบริการที่แสดง | |
max_queues_per_service_point |
INTEGER | DEFAULT 10 | จำนวนคิวสูงสุดต่อจุดบริการ |
theme |
VARCHAR(20) | DEFAULT 'hospital_blue' | ธีมการแสดงผล |
font_size |
VARCHAR(10) | CHECK | ขนาดตัวอักษร |
language_display |
VARCHAR(10) | DEFAULT 'thai' | ภาษาแสดงผล |
show_clock |
BOOLEAN | DEFAULT TRUE | แสดงนาฬิกา |
show_hospital_logo |
BOOLEAN | DEFAULT TRUE | แสดงโลโก้โรงพยาบาล |
audio_enabled |
BOOLEAN | DEFAULT TRUE | เปิดเสียง |
audio_zone |
VARCHAR(30) | โซนเสียง | |
speaker_ip_address |
INET | IP Address ของลำโพง | |
audio_volume |
INTEGER | CHECK | ระดับเสียง (0-100) |
refresh_interval_seconds |
INTEGER | DEFAULT 5 | ช่วงเวลา refresh (วินาที) |
websocket_endpoint |
VARCHAR(200) | Websocket endpoint | |
ip_address |
INET | IP Address | |
mac_address |
VARCHAR(17) | MAC Address | |
device_model |
VARCHAR(50) | รุ่นอุปกรณ์ | |
device_serial |
VARCHAR(100) | หมายเลขซีเรียล | |
status |
VARCHAR(20) | CHECK | สถานะ |
last_heartbeat |
TIMESTAMP | Heartbeat ครั้งล่าสุด | |
uptime_minutes |
INTEGER | DEFAULT 0 | เวลาทำงาน (นาที) |
error_log |
TEXT | บันทึก Error | |
api_endpoint |
VARCHAR(200) | API Endpoint | |
api_key |
VARCHAR(100) | API Key |
SECTION 5: MULTI-CHANNEL INTEGRATION
19. ตาราง line_bot_users
ผู้ใช้ Line Bot - การเชื่อมโยงบัญชีและการตั้งค่า
CREATE TABLE line_bot_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
line_user_id VARCHAR(100) UNIQUE NOT NULL,
patient_id UUID, -- REFERENCES patients(id) - nullable until linked
-- Line User Information
display_name VARCHAR(100),
profile_picture_url TEXT,
-- Account Linking
linking_status VARCHAR(20) DEFAULT 'unlinked' CHECK (linking_status IN ('unlinked', 'linking_pending', 'linked', 'linking_failed')),
linking_code VARCHAR(10),
linking_expires_at TIMESTAMP WITH TIME ZONE,
linked_at TIMESTAMP WITH TIME ZONE,
-- User Preferences
preferred_language VARCHAR(10) DEFAULT 'thai',
notification_enabled BOOLEAN DEFAULT TRUE,
reminder_enabled BOOLEAN DEFAULT TRUE,
-- Usage Statistics
total_appointments_made INTEGER DEFAULT 0,
last_interaction_at TIMESTAMP WITH TIME ZONE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
20. ตาราง mobile_app_sessions
ตารางเซสชัน Mobile App - รองรับการใช้งาน PWA และ Native App
CREATE TABLE mobile_app_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
patient_id UUID, -- REFERENCES patients(id) - nullable for guest sessions
-- Session Information
session_token VARCHAR(255) UNIQUE NOT NULL,
device_id VARCHAR(100) NOT NULL,
platform VARCHAR(20) CHECK (platform IN ('ios', 'android', 'web', 'pwa')) NOT NULL,
-- Device Information
device_model VARCHAR(100),
os_version VARCHAR(50),
app_version VARCHAR(20),
browser_info VARCHAR(200),
-- Location and Network
ip_address INET,
user_agent TEXT,
-- Session State
is_authenticated BOOLEAN DEFAULT FALSE,
login_method VARCHAR(20) CHECK (login_method IN ('username_password', 'phone_otp', 'line_login', 'guest')),
-- Features Used
features_used TEXT[] DEFAULT ARRAY[]::TEXT[],
last_activity_type VARCHAR(50),
-- FCM/Push Notification
fcm_token VARCHAR(500),
push_enabled BOOLEAN DEFAULT TRUE,
-- Session Management
session_start TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
session_end TIMESTAMP WITH TIME ZONE,
last_activity TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE,
-- Usage Statistics
total_appointments_booked INTEGER DEFAULT 0,
total_time_spent_minutes INTEGER DEFAULT 0,
-- Security
failed_login_attempts INTEGER DEFAULT 0,
locked_until TIMESTAMP WITH TIME ZONE,
-- Audit
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของเซสชัน |
patient_id |
UUID | รหัสผู้ป่วย (null สำหรับ guest) | |
session_token |
VARCHAR(255) | UNIQUE, NOT NULL | Token เซสชัน |
device_id |
VARCHAR(100) | NOT NULL | รหัสอุปกรณ์ |
platform |
VARCHAR(20) | CHECK | แพลตฟอร์ม (ios, android, web, pwa) |
device_model |
VARCHAR(100) | รุ่นอุปกรณ์ | |
os_version |
VARCHAR(50) | เวอร์ชัน OS | |
app_version |
VARCHAR(20) | เวอร์ชันแอป | |
browser_info |
VARCHAR(200) | ข้อมูลเบราว์เซอร์ | |
ip_address |
INET | IP Address | |
user_agent |
TEXT | User Agent | |
is_authenticated |
BOOLEAN | DEFAULT FALSE | สถานะการยืนยันตัวตน |
login_method |
VARCHAR(20) | CHECK | วิธีการเข้าสู่ระบบ |
features_used |
TEXT[] | ฟีเจอร์ที่ใช้งาน | |
last_activity_type |
VARCHAR(50) | กิจกรรมล่าสุด | |
fcm_token |
VARCHAR(500) | FCM Token สำหรับ Push Notification | |
push_enabled |
BOOLEAN | DEFAULT TRUE | เปิดใช้ Push Notification |
session_start |
TIMESTAMP | DEFAULT NOW() | เวลาเริ่มเซสชัน |
session_end |
TIMESTAMP | เวลาสิ้นสุดเซสชัน | |
last_activity |
TIMESTAMP | DEFAULT NOW() | กิจกรรมล่าสุด |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะเซสชัน |
total_appointments_booked |
INTEGER | DEFAULT 0 | จำนวนการนัดที่จองผ่านเซสชันนี้ |
total_time_spent_minutes |
INTEGER | DEFAULT 0 | เวลาใช้งานรวม (นาที) |
21. ตาราง notification_logs
ตารางบันทึกการแจ้งเตือนทั้งหมด - รองรับ multi-channel notification
CREATE TABLE notification_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Target Information
patient_id UUID, -- REFERENCES patients(id)
appointment_id UUID REFERENCES appointments(id),
queue_id UUID REFERENCES queues(id),
-- Notification Details
notification_type VARCHAR(30) NOT NULL CHECK (notification_type IN ('appointment_reminder', 'appointment_confirmed', 'appointment_cancelled', 'queue_called', 'queue_reminder', 'system_announcement', 'health_alert')),
-- Message Content
subject_thai VARCHAR(200),
subject_eng VARCHAR(200),
message_thai TEXT NOT NULL,
message_eng TEXT,
-- Delivery Channel
delivery_channel VARCHAR(20) NOT NULL CHECK (delivery_channel IN ('sms', 'line', 'email', 'push', 'phone_call', 'in_app')),
-- Recipient Information
recipient_phone VARCHAR(15),
recipient_line_id VARCHAR(100),
recipient_email VARCHAR(100),
recipient_device_token VARCHAR(500),
-- Delivery Status
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'delivered', 'failed', 'bounce')),
sent_at TIMESTAMP WITH TIME ZONE,
delivered_at TIMESTAMP WITH TIME ZONE,
read_at TIMESTAMP WITH TIME ZONE,
-- External Service Response
external_message_id VARCHAR(100),
external_response JSONB,
error_code VARCHAR(20),
error_message TEXT,
-- Retry Logic
retry_count INTEGER DEFAULT 0,
max_retries INTEGER DEFAULT 3,
next_retry_at TIMESTAMP WITH TIME ZONE,
-- Cost Tracking
delivery_cost DECIMAL(6,4) DEFAULT 0.0000, -- Cost per message in THB
-- Templates
template_used VARCHAR(100),
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของบันทึกการแจ้งเตือน |
patient_id |
UUID | รหัสผู้ป่วย | |
appointment_id |
UUID | FK | รหัสการนัดที่เกี่ยวข้อง |
queue_id |
UUID | FK | รหัสคิวที่เกี่ยวข้อง |
notification_type |
VARCHAR(30) | CHECK | ประเภทการแจ้งเตือน |
subject_thai |
VARCHAR(200) | หัวข้อ (ภาษาไทย) | |
subject_eng |
VARCHAR(200) | หัวข้อ (ภาษาอังกฤษ) | |
message_thai |
TEXT | NOT NULL | ข้อความ (ภาษาไทย) |
message_eng |
TEXT | ข้อความ (ภาษาอังกฤษ) | |
delivery_channel |
VARCHAR(20) | CHECK | ช่องทางการส่ง |
recipient_phone |
VARCHAR(15) | เบอร์โทรผู้รับ | |
recipient_line_id |
VARCHAR(100) | Line ID ผู้รับ | |
recipient_email |
VARCHAR(100) | Email ผู้รับ | |
recipient_device_token |
VARCHAR(500) | Device Token ผู้รับ | |
status |
VARCHAR(20) | CHECK | สถานะการส่ง |
sent_at |
TIMESTAMP | เวลาที่ส่ง | |
delivered_at |
TIMESTAMP | เวลาที่ส่งถึง | |
read_at |
TIMESTAMP | เวลาที่อ่าน | |
external_message_id |
VARCHAR(100) | Message ID จากระบบภายนอก | |
external_response |
JSONB | Response จากระบบภายนอก | |
error_code |
VARCHAR(20) | รหัสข้อผิดพลาด | |
error_message |
TEXT | ข้อความข้อผิดพลาด | |
retry_count |
INTEGER | DEFAULT 0 | จำนวนครั้งที่ลองใหม่ |
delivery_cost |
DECIMAL(6,4) | DEFAULT 0.0000 | ค่าใช้จ่ายในการส่ง |
template_used |
VARCHAR(100) | Template ที่ใช้ |
22. ตาราง communication_templates
ตารางเทมเพลตการสื่อสาร - รองรับ TOR 6 การสื่อสารและแจ้งเตือน
CREATE TABLE communication_templates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Template Identification
template_code VARCHAR(50) UNIQUE NOT NULL,
template_name_thai VARCHAR(100) NOT NULL,
template_name_eng VARCHAR(100),
-- Template Category
category VARCHAR(30) CHECK (category IN ('appointment_reminder', 'appointment_confirmation', 'appointment_cancellation', 'queue_notification', 'system_alert', 'health_education', 'promotional')) NOT NULL,
-- Usage Context
usage_context VARCHAR(50) CHECK (usage_context IN ('before_appointment', 'appointment_confirmed', 'appointment_day', 'queue_called', 'emergency', 'general')) NOT NULL,
-- Message Content (Multi-language)
subject_thai VARCHAR(200),
subject_eng VARCHAR(200),
message_thai TEXT NOT NULL,
message_eng TEXT,
-- Dynamic Variables
variables JSONB DEFAULT '[]', -- List of variables that can be replaced
sample_data JSONB, -- Sample data for testing
-- Channel Specific Content
sms_message_thai VARCHAR(160), -- SMS has character limit
sms_message_eng VARCHAR(160),
line_message_format JSONB, -- Rich message format for Line
email_html_thai TEXT,
email_html_eng TEXT,
push_title_thai VARCHAR(100),
push_title_eng VARCHAR(100),
-- Delivery Settings
applicable_channels TEXT[] DEFAULT ARRAY['sms', 'line', 'email', 'push'],
priority_level INTEGER DEFAULT 3 CHECK (priority_level BETWEEN 1 AND 5),
-- Timing Configuration
default_send_before_minutes INTEGER, -- For appointment reminders
can_be_scheduled BOOLEAN DEFAULT TRUE,
-- Approval and Compliance
requires_approval BOOLEAN DEFAULT FALSE,
approved_by UUID REFERENCES users(id),
approved_at TIMESTAMP WITH TIME ZONE,
compliance_checked BOOLEAN DEFAULT FALSE,
-- Usage Statistics
total_sent INTEGER DEFAULT 0,
success_rate DECIMAL(5,4) DEFAULT 0.0000,
last_used_at TIMESTAMP WITH TIME ZONE,
-- Template Status
is_active BOOLEAN DEFAULT TRUE,
effective_from DATE DEFAULT CURRENT_DATE,
effective_to DATE,
-- Version Control
version_number INTEGER DEFAULT 1,
parent_template_id UUID REFERENCES communication_templates(id),
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของเทมเพลต |
template_code |
VARCHAR(50) | UNIQUE, NOT NULL | รหัสเทมเพลต |
template_name_thai |
VARCHAR(100) | NOT NULL | ชื่อเทมเพลต (ภาษาไทย) |
template_name_eng |
VARCHAR(100) | ชื่อเทมเพลต (ภาษาอังกฤษ) | |
category |
VARCHAR(30) | CHECK | หมวดหมู่เทมเพลต |
usage_context |
VARCHAR(50) | CHECK | บริบทการใช้งาน |
subject_thai |
VARCHAR(200) | หัวข้อ (ภาษาไทย) | |
subject_eng |
VARCHAR(200) | หัวข้อ (ภาษาอังกฤษ) | |
message_thai |
TEXT | NOT NULL | ข้อความ (ภาษาไทย) |
message_eng |
TEXT | ข้อความ (ภาษาอังกฤษ) | |
variables |
JSONB | DEFAULT '[]' | ตัวแปรที่สามารถแทนที่ได้ |
sample_data |
JSONB | ข้อมูลตัวอย่างสำหรับทดสอบ | |
sms_message_thai |
VARCHAR(160) | ข้อความ SMS (ไทย) | |
sms_message_eng |
VARCHAR(160) | ข้อความ SMS (อังกฤษ) | |
line_message_format |
JSONB | รูปแบบข้อความ Line (Rich Format) | |
email_html_thai |
TEXT | HTML Email (ไทย) | |
email_html_eng |
TEXT | HTML Email (อังกฤษ) | |
push_title_thai |
VARCHAR(100) | หัวข้อ Push Notification (ไทย) | |
push_title_eng |
VARCHAR(100) | หัวข้อ Push Notification (อังกฤษ) | |
applicable_channels |
TEXT[] | ช่องทางที่สามารถใช้ได้ | |
priority_level |
INTEGER | CHECK | ระดับความสำคัญ (1-5) |
default_send_before_minutes |
INTEGER | ส่งก่อนนัดกี่นาที (default) | |
can_be_scheduled |
BOOLEAN | DEFAULT TRUE | สามารถกำหนดเวลาส่งได้ |
requires_approval |
BOOLEAN | DEFAULT FALSE | ต้องการอนุมัติ |
approved_by |
UUID | FK | ผู้อนุมัติ |
approved_at |
TIMESTAMP | วันที่อนุมัติ | |
compliance_checked |
BOOLEAN | DEFAULT FALSE | ตรวจสอบความถูกต้องแล้ว |
total_sent |
INTEGER | DEFAULT 0 | จำนวนครั้งที่ใช้ |
success_rate |
DECIMAL(5,4) | DEFAULT 0.0000 | อัตราความสำเร็จ |
last_used_at |
TIMESTAMP | ใช้ครั้งล่าสุดเมื่อไหร่ | |
is_active |
BOOLEAN | DEFAULT TRUE | สถานะใช้งาน |
version_number |
INTEGER | DEFAULT 1 | หมายเลขเวอร์ชัน |
parent_template_id |
UUID | FK | เทมเพลตต้นแบบ |
23. ตาราง external_integrations
ตารางการเชื่อมต่อระบบภายนอก - รองรับ TOR การเชื่อมต่อ APIs
CREATE TABLE external_integrations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Integration Identity
integration_name VARCHAR(100) NOT NULL,
integration_type VARCHAR(50) CHECK (integration_type IN ('sms_gateway', 'line_messaging', 'email_service', 'nhso_api', 'sso_api', 'civil_registration', 'his_integration', 'payment_gateway')) NOT NULL,
-- Service Provider
provider_name VARCHAR(100) NOT NULL,
service_endpoint VARCHAR(500) NOT NULL,
-- Authentication
auth_type VARCHAR(30) CHECK (auth_type IN ('api_key', 'oauth2', 'basic_auth', 'jwt', 'custom')) NOT NULL,
api_key VARCHAR(500),
client_id VARCHAR(200),
client_secret VARCHAR(500),
oauth_token TEXT,
oauth_refresh_token TEXT,
oauth_expires_at TIMESTAMP WITH TIME ZONE,
-- Configuration
configuration JSONB NOT NULL DEFAULT '{}',
headers JSONB DEFAULT '{}',
timeout_seconds INTEGER DEFAULT 30,
retry_attempts INTEGER DEFAULT 3,
-- Rate Limiting
rate_limit_per_minute INTEGER,
rate_limit_per_hour INTEGER,
rate_limit_per_day INTEGER,
-- Status Monitoring
status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'maintenance', 'error', 'suspended')),
last_health_check TIMESTAMP WITH TIME ZONE,
health_check_interval_minutes INTEGER DEFAULT 15,
consecutive_failures INTEGER DEFAULT 0,
max_consecutive_failures INTEGER DEFAULT 5,
-- Usage Statistics
total_requests INTEGER DEFAULT 0,
successful_requests INTEGER DEFAULT 0,
failed_requests INTEGER DEFAULT 0,
average_response_time_ms DECIMAL(8,2),
-- Cost Management
cost_per_request DECIMAL(8,4) DEFAULT 0.0000,
monthly_budget DECIMAL(10,2),
current_month_cost DECIMAL(10,2) DEFAULT 0.00,
-- Security
ip_whitelist TEXT[],
ssl_required BOOLEAN DEFAULT TRUE,
certificate_path VARCHAR(500),
-- Fallback Configuration
fallback_integration_id UUID REFERENCES external_integrations(id),
auto_fallback_enabled BOOLEAN DEFAULT FALSE,
-- Compliance and Logging
log_requests BOOLEAN DEFAULT TRUE,
log_responses BOOLEAN DEFAULT FALSE, -- Due to privacy
gdpr_compliant BOOLEAN DEFAULT FALSE,
data_retention_days INTEGER DEFAULT 90,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
created_by UUID REFERENCES users(id),
updated_by UUID REFERENCES users(id)
);
คำอธิบายฟิลด์ (Field Descriptions):
| Field | Type | Constraints | คำอธิบาย |
|---|---|---|---|
id |
UUID | PRIMARY KEY | รหัสเฉพาะของการเชื่อมต่อ |
integration_name |
VARCHAR(100) | NOT NULL | ชื่อการเชื่อมต่อ |
integration_type |
VARCHAR(50) | CHECK | ประเภทการเชื่อมต่อ |
provider_name |
VARCHAR(100) | NOT NULL | ชื่อผู้ให้บริการ |
service_endpoint |
VARCHAR(500) | NOT NULL | Endpoint ของบริการ |
auth_type |
VARCHAR(30) | CHECK | ประเภทการยืนยันตัวตน |
api_key |
VARCHAR(500) | API Key | |
client_id |
VARCHAR(200) | Client ID (OAuth2) | |
client_secret |
VARCHAR(500) | Client Secret (OAuth2) | |
oauth_token |
TEXT | OAuth Token | |
oauth_refresh_token |
TEXT | OAuth Refresh Token | |
oauth_expires_at |
TIMESTAMP | เวลาหมดอายุ OAuth Token | |
configuration |
JSONB | NOT NULL | การตั้งค่าเพิ่มเติม |
headers |
JSONB | DEFAULT '{}' | HTTP Headers |
timeout_seconds |
INTEGER | DEFAULT 30 | Timeout (วินาที) |
retry_attempts |
INTEGER | DEFAULT 3 | จำนวนครั้งที่ลองใหม่ |
rate_limit_per_minute |
INTEGER | จำกัดการใช้ต่อนาที | |
rate_limit_per_hour |
INTEGER | จำกัดการใช้ต่อชั่วโมง | |
rate_limit_per_day |
INTEGER | จำกัดการใช้ต่อวัน | |
status |
VARCHAR(20) | CHECK | สถานะการเชื่อมต่อ |
last_health_check |
TIMESTAMP | Health Check ครั้งล่าสุด | |
health_check_interval_minutes |
INTEGER | DEFAULT 15 | ช่วงเวลา Health Check |
consecutive_failures |
INTEGER | DEFAULT 0 | ความล้มเหลวติดต่อกัน |
total_requests |
INTEGER | DEFAULT 0 | จำนวน Request ทั้งหมด |
successful_requests |
INTEGER | DEFAULT 0 | จำนวน Request สำเร็จ |
failed_requests |
INTEGER | DEFAULT 0 | จำนวน Request ล้มเหลว |
average_response_time_ms |
DECIMAL(8,2) | เวลาตอบสนองเฉลี่ย (มิลลิวินาที) | |
cost_per_request |
DECIMAL(8,4) | DEFAULT 0.0000 | ค่าใช้จ่ายต่อ Request |
monthly_budget |
DECIMAL(10,2) | งบประมาณรายเดือน | |
current_month_cost |
DECIMAL(10,2) | DEFAULT 0.00 | ค่าใช้จ่ายเดือนปัจจุบัน |
SECTION 6: INTEGRATION & AUDIT
24. ตาราง system_audit_logs
ระบบ Audit ทั้งหมด - data protection และ compliance
CREATE TABLE system_audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Audit Target
table_name VARCHAR(50) NOT NULL,
record_id UUID NOT NULL,
action_type VARCHAR(20) NOT NULL CHECK (action_type IN ('INSERT', 'UPDATE', 'DELETE', 'VIEW', 'EXPORT')),
-- Change Information
field_changes JSONB,
full_record_before JSONB,
full_record_after JSONB,
-- User and Session Information
user_id UUID REFERENCES users(id),
session_id VARCHAR(100),
ip_address INET,
user_agent TEXT,
-- Context Information
business_context VARCHAR(50),
change_reason TEXT,
-- Data Protection
contains_pii BOOLEAN DEFAULT FALSE,
-- Audit Fields
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Business Rules และ Constraints
Appointment Business Rules
-- Business rule: นัดหมายต้องเป็นอนาคต
ALTER TABLE appointments
ADD CONSTRAINT chk_appointment_time_logic
CHECK (
(appointment_date > CURRENT_DATE) OR
(appointment_date = CURRENT_DATE AND appointment_time > CURRENT_TIME)
);
-- Business rule: จำกัดจำนวนการ reschedule
ALTER TABLE appointments
ADD CONSTRAINT chk_appointment_reschedule_limit
CHECK (reschedule_count >= 0 AND reschedule_count <= 5);
Queue Business Rules
-- Business rule: เวลารอต้องสมเหตุสมผล
ALTER TABLE queues
ADD CONSTRAINT chk_queue_wait_time_reasonable
CHECK (estimated_wait_minutes IS NULL OR (estimated_wait_minutes >= 0 AND estimated_wait_minutes <= 480));
Indexes for Performance Optimization
-- Appointment indexes
CREATE INDEX idx_appointments_patient_date ON appointments(patient_id, appointment_date);
CREATE INDEX idx_appointments_clinic_date ON appointments(clinic_id, appointment_date, appointment_time);
CREATE INDEX idx_appointments_doctor_date ON appointments(doctor_id, appointment_date, appointment_time) WHERE doctor_id IS NOT NULL;
CREATE INDEX idx_appointments_status_date ON appointments(status, appointment_date);
-- Queue indexes
CREATE INDEX idx_queues_clinic_status ON queues(clinic_id, status, priority_score DESC);
CREATE INDEX idx_queues_patient ON queues(patient_id, issued_at DESC);
CREATE INDEX idx_queues_service_point ON queues(current_service_point, status);
-- Schedule indexes
CREATE INDEX idx_doctor_schedules_doctor_date ON doctor_schedules(doctor_id, schedule_date) WHERE status = 'active';
CREATE INDEX idx_clinic_schedules_clinic_date ON clinic_schedules(clinic_id, schedule_date) WHERE status = 'open';
Integration Points with EMR System
Foreign Key Relationships
-- Integration with existing EMR tables
-- appointments.patient_id -> patients.id (existing EMR table)
-- appointments.visit_id -> medical_visits.id (existing EMR table)
-- queues.patient_id -> patients.id (existing EMR table)
-- queues.visit_id -> medical_visits.id (existing EMR table)
Data Flow Integration
- Patient Registration: ใช้ตาราง
patientsที่มีอยู่ในระบบ EMR - Appointment Booking: สร้างข้อมูลในตาราง
appointments - Visit Check-in: สร้างข้อมูลในตาราง
medical_visits(existing EMR) - Queue Generation: สร้างข้อมูลในตาราง
queues(enhanced system)
Comments สำหรับ Documentation
-- Table comments
COMMENT ON TABLE appointments IS 'ตารางการนัดหมายหลัก - เชื่อมโยงกับระบบเวชระเบียนและคิว';
COMMENT ON TABLE queues IS 'ตารางคิวหลัก - เสริมระบบ visit_queues ที่มีอยู่ รองรับ multi-service point';
COMMENT ON TABLE doctor_schedules IS 'ตารางเวลาการทำงานของแพทย์ - รองรับการจัดสรร slots ตามช่องทาง';
-- Key column comments
COMMENT ON COLUMN appointments.appointment_number IS 'หมายเลขการนัด - สร้างอัตโนมัติตามรูปแบบ: CLINIC + YYYYMM + SEQUENCE';
COMMENT ON COLUMN appointments.booking_channel IS 'ช่องทางการจอง: staff, mobile_app, line_bot, phone, kiosk, website';
COMMENT ON COLUMN queues.queue_number IS 'หมายเลขคิว - สร้างอัตโนมัติตาม queue_configurations';
COMMENT ON COLUMN queues.service_points IS 'จุดบริการ: registration, screening, examination, pharmacy, cashier';
INTEGRATION WITH MEDITECH MASTER SCHEMA
Foundation Tables Integration
| Master Schema Table | Usage in Queue Module | Purpose |
|---|---|---|
users |
Authentication & Authorization | Staff, doctors, nurses, kiosk users |
departments |
Department-based scheduling | Links to clinics and appointments |
patients |
Patient identification | Master patient index for all appointments |
medical_visits |
Visit correlation | Links appointments to actual visits |
audit_logs |
Compliance tracking | Complete audit trail for PDPA compliance |
notifications |
Multi-channel alerts | SMS, Line, Email, Push notifications |
permissions |
Access control | Module-specific permissions for queue management |
Real-Time Integration Events
-- Event-driven integration with other modules
-- (Uses MASTER_DATABASE_SCHEMA.md integration_events table)
-- Key events from Queue Management module:
-- - 'appointment_created', 'appointment_cancelled', 'appointment_rescheduled'
-- - 'queue_number_assigned', 'queue_called', 'queue_completed'
-- - 'patient_checked_in', 'patient_no_show'
-- - 'schedule_updated', 'clinic_capacity_changed'
-- Events consumed from other modules:
-- - 'patient_registered' (EMR) → Auto-create appointment eligibility
-- - 'visit_started' (EMR) → Update queue status
-- - 'visit_completed' (EMR) → Release queue position
-- - 'user_role_changed' (Admin) → Update access permissions
Cross-Module Data Flow Patterns
- Patient-Centric Flow:
-
Master Schema
patients→ Queueappointments→ EMRmedical_visits -
Staff Access Flow:
-
Master Schema
users/roles→ Queue permission validation -
Multi-Channel Notification Flow:
-
Queue events → Master Schema
notifications→ SMS/Line/Email delivery -
Compliance Audit Flow:
- All Queue actions → Master Schema
audit_logs→ Compliance reporting
Benefits of Master Schema Integration
🎯 Unified Patient Journey
ผู้ป่วยมีประสบการณ์ที่ต่อเนื่องตั้งแต่การนัดหมายจนถึงการรับบริการ
📱 Multi-Channel Excellence
การนัดหมายผ่านช่องทางหลากหลายด้วยข้อมูลที่สอดคล้องและ real-time
⚡ Real-Time Performance
จัดการคิวแบบ real-time ที่เชื่อมโยงกับระบบ EMR อย่างไร้รอยต่อ
🔒 Enterprise Security & Compliance
ระบบความปลอดภัยและการปฏิบัติตาม PDPA/Medical Records Act ครบถ้วน
📊 Data-Driven Insights
Analytics ที่สมบูรณ์สำหรับการปรับปรุงประสิทธิภาพการให้บริการ
🏥 Hospital-Wide Ecosystem
บูรณาการสมบูรณ์กับระบบ MediTech HIS ทั้งหมด
การออกแบบนี้ทำให้ระบบนัดหมายและคิวเป็น Patient Experience Hub ที่เชื่อมต่อผู้ป่วยกับบริการทางการแพทย์อย่างครบวงจร พร้อมรองรับการเติบโตและนวัตกรรมในอนาคต
Document Version: 2.0 (Master Schema Aligned)
Last Updated: 28 สิงหาคม 2025
Integration Status: ✅ Fully aligned with MASTER_DATABASE_SCHEMA.md