```sql
-- =============================================
-- HỆ THỐNG QUẢN LÝ ẢNH CHỤP DICOM (AIDIMS)
-- Database SQL Script Without AI Components
-- Thiết kế bởi: Duyên & Kiệt
-- Version: 1.1
-- Date: 2025-05-31
-- =============================================
-- Tạo database
CREATE DATABASE IF NOT EXISTS medical_imaging_system;
USE medical_imaging_system;
-- Set charset
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
-- =============================================
-- 1. BẢNG NGƯỜI DÙNG VÀ PHÂN QUYỀN
-- =============================================
CREATE TABLE roles (
role_id INT PRIMARY KEY AUTO_INCREMENT,
role_name VARCHAR(50) NOT NULL UNIQUE,
role_description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE permissions (
permission_id INT PRIMARY KEY AUTO_INCREMENT,
role_id INT NOT NULL,
permission_name VARCHAR(100) NOT NULL,
description TEXT,
FOREIGN KEY (role_id) REFERENCES roles(role_id),
UNIQUE (role_id, permission_name),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
full_name VARCHAR(100) NOT NULL,
phone VARCHAR(20),
role_id INT NOT NULL,
specialty_id INT,
is_active BOOLEAN DEFAULT TRUE,
last_login TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (role_id) REFERENCES roles(role_id),
FOREIGN KEY (specialty_id) REFERENCES specialties(specialty_id),
INDEX idx_username (username),
INDEX idx_email (email),
INDEX idx_role (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE user_sessions (
session_id VARCHAR(255) PRIMARY KEY,
user_id INT NOT NULL,
ip_address VARCHAR(45),
user_agent TEXT,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
INDEX idx_user_session (user_id),
INDEX idx_expires (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- =============================================
-- 2. BẢNG BỆNH NHÂN VÀ HỒ SƠ
-- =============================================
CREATE TABLE patients (
patient_id INT PRIMARY KEY AUTO_INCREMENT,
patient_code VARCHAR(20) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
date_of_birth DATE NOT NULL,
gender ENUM('Nam', 'Nữ', 'Khác') NOT NULL,
phone VARCHAR(20) NOT NULL,
email VARCHAR(100),
address TEXT,
identity_number VARCHAR(20),
insurance_number VARCHAR(20),
emergency_contact_name VARCHAR(100),
emergency_contact_phone VARCHAR(20),
blood_type VARCHAR(5),
allergies TEXT,
medical_history TEXT,
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES users(user_id),
INDEX idx_patient_code (patient_code),
INDEX idx_patient_name (full_name),
INDEX idx_patient_phone (phone),
INDEX idx_identity_number (identity_number)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE patient_consent (
consent_id INT PRIMARY KEY AUTO_INCREMENT,
patient_id INT NOT NULL,
consent_type ENUM('Imaging', 'Treatment', 'Data Sharing') NOT NULL,
consent_date DATE NOT NULL,
valid_until DATE,
consent_document VARCHAR(500),
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (patient_id) REFERENCES patients(patient_id),
FOREIGN KEY (created_by) REFERENCES users(user_id),
INDEX idx_consent_patient (patient_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE medical_conditions (
condition_id INT PRIMARY KEY AUTO_INCREMENT,
patient_id INT NOT NULL,
icd_10_code VARCHAR(10),
condition_name VARCHAR(100),
diagnosed_date DATE,
notes TEXT,
FOREIGN KEY (patient_id) REFERENCES patients(patient_id),
INDEX idx_condition_patient (patient_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE specialties (
specialty_id INT PRIMARY KEY AUTO_INCREMENT,
specialty_name VARCHAR(100) NOT NULL UNIQUE,
specialty_code VARCHAR(10) NOT NULL UNIQUE,
description TEXT,
is_active BOOLEAN DEFAULT TRUE Ascending
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_specialty_code (specialty_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE symptoms (
symptom_id INT PRIMARY KEY AUTO_INCREMENT,
symptom_name VARCHAR(100) NOT NULL,
symptom_code VARCHAR(10),
specialty_id INT,
description TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (specialty_id) REFERENCES specialties(specialty_id),
INDEX idx_symptom_code (symptom_code),
INDEX idx_specialty_symptom (specialty_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE medical_records (
record_id INT PRIMARY KEY AUTO_INCREMENT,
record_code VARCHAR(20) NOT NULL UNIQUE,
patient_id INT NOT NULL,
visit_date DATE NOT NULL,
chief_complaint TEXT,
symptoms_recorded TEXT,
vital_signs JSON,
specialty_id INT,
assigned_doctor_id INT,
status ENUM('Chờ khám', 'Đang khám', 'Chờ chụp', 'Chờ kết quả', 'Hoàn thành', 'Hủy')
DEFAULT 'Chờ khám',
priority_level ENUM('Bình thường', 'Khẩn cấp', 'Cấp cứu') DEFAULT 'Bình thường',
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (patient_id) REFERENCES patients(patient_id),
FOREIGN KEY (specialty_id) REFERENCES specialties(specialty_id),
FOREIGN KEY (assigned_doctor_id) REFERENCES users(user_id),
FOREIGN KEY (created_by) REFERENCES users(user_id),
INDEX idx_record_code (record_code),
INDEX idx_record_patient (patient_id),
INDEX idx_record_date (visit_date),
INDEX idx_record_status (status),
INDEX idx_record_doctor (assigned_doctor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE record_symptoms (
record_symptom_id INT PRIMARY KEY AUTO_INCREMENT,
record_id INT NOT NULL,
symptom_id INT NOT NULL,
severity ENUM('Nhẹ', 'Vừa', 'Nặng') DEFAULT 'Vừa',
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (record_id) REFERENCES medical_records(record_id) ON DELETE
CASCADE,
FOREIGN KEY (symptom_id) REFERENCES symptoms(symptom_id),
INDEX idx_record_symptom (record_id),
INDEX idx_symptom_record (symptom_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- =============================================
-- 3. BẢNG HÌNH ẢNH DICOM VÀ XỬ LÝ
-- =============================================
CREATE TABLE imaging_types (
imaging_type_id INT PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(50) NOT NULL UNIQUE,
type_code VARCHAR(10) NOT NULL UNIQUE,
description TEXT,
default_settings JSON,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_type_code (type_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE imaging_devices (
device_id INT PRIMARY KEY AUTO_INCREMENT,
device_name VARCHAR(100) NOT NULL,
device_model VARCHAR(100),
manufacturer VARCHAR(100),
serial_number VARCHAR(100),
location VARCHAR(100),
imaging_type_id INT NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
last_maintenance DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (imaging_type_id) REFERENCES imaging_types(imaging_type_id),
INDEX idx_device_type (imaging_type_id),
INDEX idx_device_serial (serial_number)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE imaging_requests (
request_id INT PRIMARY KEY AUTO_INCREMENT,
request_code VARCHAR(20) NOT NULL UNIQUE,
record_id INT NOT NULL,
imaging_type_id INT NOT NULL,
body_part VARCHAR(100),
clinical_indication TEXT,
contrast_used BOOLEAN DEFAULT FALSE,
urgency ENUM('Bình thường', 'Khẩn cấp', 'Cấp cứu') DEFAULT 'Bình thường',
special_instructions TEXT,
requested_by INT NOT NULL,
status ENUM('Chờ chụp', 'Đang chụp', 'Hoàn thành', 'Hủy') DEFAULT 'Chờ chụp',
requested_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
scheduled_at TIMESTAMP NULL,
completed_at TIMESTAMP NULL,
updated_by INT,
FOREIGN KEY (record_id) REFERENCES medical_records(record_id),
FOREIGN KEY (imaging_type_id) REFERENCES imaging_types(imaging_type_id),
FOREIGN KEY (requested_by) REFERENCES users(user_id),
FOREIGN KEY (updated_by) REFERENCES users(user_id),
INDEX idx_request_code (request_code),
INDEX idx_request_record (record_id),
INDEX idx_request_status (status),
INDEX idx_request_date (requested_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE request_status_history (
history_id INT PRIMARY KEY AUTO_INCREMENT,
request_id INT NOT NULL,
old_status VARCHAR(50),
new_status VARCHAR(50),
changed_by INT NOT NULL,
change_reason TEXT,
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (request_id) REFERENCES imaging_requests(request_id),
FOREIGN KEY (changed_by) REFERENCES users(user_id),
INDEX idx_history_request (request_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE dicom_images (
image_id INT PRIMARY KEY AUTO_INCREMENT,
request_id INT NOT NULL,
dicom_file_path VARCHAR(500) NOT NULL,
thumbnail_path VARCHAR(500),
storage_location VARCHAR(500),
file_size BIGINT,
image_width INT,
image_height INT,
slice_thickness DECIMAL(8,3),
pixel_spacing VARCHAR(50),
study_instance_uid VARCHAR(100),
series_instance_uid VARCHAR(100),
sop_instance_uid VARCHAR(100),
acquisition_date DATE,
acquisition_time TIME,
device_id INT,
technician_id INT NOT NULL,
quality_status ENUM('Tốt', 'Chấp nhận được', 'Kém', 'Cần chụp lại') DEFAULT 'Tốt',
quality_notes TEXT,
display_settings JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (request_id) REFERENCES imaging_requests(request_id),
FOREIGN KEY (device_id) REFERENCES imaging_devices(device_id),
FOREIGN KEY (technician_id) REFERENCES users(user_id),
INDEX idx_image_request (request_id),
INDEX idx_image_technician (technician_id),
INDEX idx_image_date (acquisition_date),
INDEX idx_image_quality (quality_status),
INDEX idx_study_uid (study_instance_uid),
INDEX idx_series_uid (series_instance_uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE dicom_metadata (
metadata_id INT PRIMARY KEY AUTO_INCREMENT,
image_id INT NOT NULL,
tag_group VARCHAR(10) NOT NULL,
tag_element VARCHAR(10) NOT NULL,
tag_name VARCHAR(100),
tag_value TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (image_id) REFERENCES dicom_images(image_id) ON DELETE
CASCADE,
INDEX idx_metadata_image (image_id),
INDEX idx_metadata_tag (tag_group, tag_element)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE image_view_logs (
view_id INT PRIMARY KEY AUTO_INCREMENT,
image_id INT NOT NULL,
user_id INT NOT NULL,
viewed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (image_id) REFERENCES dicom_images(image_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
INDEX idx_view_image (image_id),
INDEX idx_view_user (viewed_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE comparison_sets (
comparison_id INT PRIMARY KEY AUTO_INCREMENT,
patient_id INT NOT NULL,
image_id_1 INT NOT NULL,
image_id_2 INT NOT NULL,
created_by INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
notes TEXT,
FOREIGN KEY (patient_id) REFERENCES patients(patient_id),
FOREIGN KEY (image_id_1) REFERENCES dicom_images(image_id),
FOREIGN KEY (image_id_2) REFERENCES dicom_images(image_id),
FOREIGN KEY (created_by) REFERENCES users(user_id),
INDEX idx_comparison_patient (patient_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- =============================================
-- 4. BẢNG CHẨN ĐOÁN VÀ BÁO CÁO
-- =============================================
CREATE TABLE diagnoses (
diagnosis_id INT PRIMARY KEY AUTO_INCREMENT,
record_id INT NOT NULL,
doctor_id INT NOT NULL,
primary_diagnosis TEXT NOT NULL,
secondary_diagnoses TEXT,
icd_10_code VARCHAR(10),
severity ENUM('Nhẹ', 'Vừa', 'Nặng', 'Nguy kịch'),
confidence_level ENUM('Chắc chắn', 'Có thể', 'Nghi ngờ'),
treatment_plan TEXT,
recommendations TEXT,
follow_up_required BOOLEAN DEFAULT FALSE,
follow_up_date DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (record_id) REFERENCES medical_records(record_id),
FOREIGN KEY (doctor_id) REFERENCES users(user_id),
INDEX idx_diagnosis_record (record_id),
INDEX idx_diagnosis_doctor (doctor_id),
INDEX idx_diagnosis_icd (icd_10_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE image_annotations (
annotation_id INT PRIMARY KEY AUTO_INCREMENT,
image_id INT NOT NULL,
doctor_id INT NOT NULL,
annotation_type ENUM('Điểm', 'Vùng', 'Đường', 'Văn bản') NOT NULL,
coordinates JSON NOT NULL,
annotation_text TEXT,
color VARCHAR(7) DEFAULT '#FF0000',
version INT DEFAULT 1,
parent_annotation_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (image_id) REFERENCES dicom_images(image_id),
FOREIGN KEY (doctor_id) REFERENCES users(user_id),
FOREIGN KEY (parent_annotation_id) REFERENCES
image_annotations(annotation_id),
INDEX idx_annotation_image (image_id),
INDEX idx_annotation_doctor (doctor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE imaging_results (
result_id INT PRIMARY KEY AUTO_INCREMENT,
request_id INT NOT NULL,
dicom_file_path VARCHAR(500) NOT NULL,
thumbnail_path VARCHAR(500),
performed_by INT NOT NULL,
performed_at TIMESTAMP,
technical_parameters JSON,
image_quality ENUM('Tốt', 'Xuất sắc', 'Kém', 'Cần chụp lại') DEFAULT 'Tốt',
radiologist_id INT,
status ENUM('Chờ đọc', 'Đang đọc', 'Hoàn thành') DEFAULT 'Chờ đọc',
FOREIGN KEY (request_id) REFERENCES imaging_requests(request_id),
FOREIGN KEY (performed_by) REFERENCES users(user_id),
FOREIGN KEY (radiologist_id) REFERENCES users(user_id),
INDEX idx_result_request (request_id),
INDEX idx_result_performed (performed_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE diagnostic_reports (
report_id INT PRIMARY KEY AUTO_INCREMENT,
result_id INT NOT NULL,
report_code VARCHAR(20) NOT NULL UNIQUE,
findings TEXT,
impression TEXT,
recommendations TEXT,
report_type ENUM('Sơ bộ', 'Chính thức', 'Cấp cứu') NOT NULL,
radiologist_id INT NOT NULL,
dictated_at TIMESTAMP,
finalized_at TIMESTAMP,
status ENUM('Nháp', 'Hoàn thành', 'Đã phê duyệt') DEFAULT 'Nháp',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (result_id) REFERENCES imaging_results(result_id),
FOREIGN KEY (radiologist_id) REFERENCES users(user_id),
INDEX idx_report_result (result_id),
INDEX idx_report_radiologist (radiologist_id),
INDEX idx_report_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- =============================================
-- 5. BẢNG THÔNG BÁO VÀ HỆ THỐNG
-- =============================================
CREATE TABLE notifications (
notification_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
title VARCHAR(200) NOT NULL,
message TEXT NOT NULL,
notification_type ENUM('Thông tin', 'Cảnh báo', 'Khẩn cấp', 'Hệ thống') NOT NULL,
priority ENUM('Thấp', 'Bình thường', 'Cao', 'Rất cao') DEFAULT 'Bình thường',
is_read BOOLEAN DEFAULT FALSE,
action_url VARCHAR(500),
expires_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
read_at TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id),
INDEX idx_notification_user (user_id),
INDEX idx_notification_read (is_read),
INDEX idx_notification_type (notification_type),
INDEX idx_notification_date (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE system_settings (
setting_id INT PRIMARY KEY AUTO_INCREMENT,
setting_key VARCHAR(100) NOT NULL UNIQUE,
setting_value TEXT,
setting_type ENUM('String', 'Number', 'Boolean', 'JSON') DEFAULT 'String',
category VARCHAR(50),
description TEXT,
is_public BOOLEAN DEFAULT FALSE,
updated_by INT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (updated_by) REFERENCES users(user_id),
INDEX idx_setting_key (setting_key),
INDEX idx_setting_category (category)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE activity_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
action VARCHAR(100) NOT NULL,
table_name VARCHAR(50),
record_id INT,
old_values JSON,
new_values JSON,
ip_address VARCHAR(45),
user_agent TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
INDEX idx_log_user (user_id),
INDEX idx_log_action (action),
INDEX idx_log_table (table_name),
INDEX idx_log_date (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE system_errors (
error_id INT PRIMARY KEY AUTO_INCREMENT,
error_type VARCHAR(50) NOT NULL,
error_message TEXT NOT NULL,
stack_trace TEXT,
user_id INT,
request_url VARCHAR(500),
request_method VARCHAR(10),
request_data JSON,
severity ENUM('Thấp', 'Trung bình', 'Cao', 'Nghiêm trọng') DEFAULT 'Trung bình',
is_resolved BOOLEAN DEFAULT FALSE,
resolved_by INT,
resolved_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (resolved_by) REFERENCES users(user_id),
INDEX idx_error_type (error_type),
INDEX idx_error_severity (severity),
INDEX idx_error_resolved (is_resolved),
INDEX idx_error_date (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE work_schedules (
schedule_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
date DATE NOT NULL,
shift_type ENUM('Sáng', 'Chiều', 'Tối', 'Trực') NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
status ENUM('Đã xếp', 'Hủy', 'Hoàn thành') DEFAULT 'Đã xếp',
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
INDEX idx_schedule_user (user_id),
INDEX idx_schedule_date (date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE backup_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
backup_type ENUM('Full', 'Incremental') NOT NULL,
file_path VARCHAR(500) NOT NULL,
file_size_mb DECIMAL(10,2),
backup_status ENUM('Thành công', 'Thất bại') DEFAULT 'Thành công',
started_by INT,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
notes TEXT,
FOREIGN KEY (started_by) REFERENCES users(user_id),
INDEX idx_backup_time (start_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- =============================================
-- KHỞI TẠO DỮ LIỆU MẪU
-- =============================================
-- Thêm vai trò người dùng
INSERT INTO roles (role_name, role_description) VALUES
('admin', 'Quản trị viên hệ thống'),
('doctor', 'Bác sĩ'),
('receptionist', 'Nhân viên tiếp nhận'),
('technician', 'Kỹ thuật viên hình ảnh');
-- Thêm tài khoản người dùng
INSERT INTO users (username, password_hash, email, full_name, phone, role_id,
is_active) VALUES
('admin', '$2b$10$N8P6E7/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF9Fi',
'admin@[Link]', 'Quản trị viên chính', '0901234567', 1, TRUE),
('kiet_admin',
'$2b$10$N8P6E7/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF9Fi',
'kiet@[Link]', 'Kiệt - Quản trị viên', '0901234568', 1, TRUE),
('long_admin',
'$2b$10$N8P6E7/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF9Fi',
'long@[Link]', 'Long - Quản trị viên', '0901234569', 1, TRUE),
('dr_nguyen',
'$2b$10$K9Q2E6/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF8Gi',
'nguyen@[Link]', 'BS. Nguyễn Văn A', '0902345678', 2, TRUE),
('dr_thoai', '$2b$10$K9Q2E6/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF8Gi',
'thoai@[Link]', 'BS. Thoại Thanh B', '0902345679', 2, TRUE),
('nv_huy', '$2b$10$L7P1D5/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF7Hi',
'huy@[Link]', 'Huy - Nhân viên tiếp nhận', '0903456789', 3, TRUE),
('kv_duyen',
'$2b$10$M6O8C4/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF6Ji',
'duyen@[Link]', 'Duyên - Kỹ thuật viên', '0904567890', 4, TRUE),
('kv_cuong',
'$2b$10$M6O8C4/FJoTFR5GhJQxJfe5KjY5p7qJZ9h8VqQ8wZ3R3oNMQmF6Ji',
'cuong@[Link]', 'Cương - Kỹ thuật viên', '0904567891', 4, TRUE);
-- Thêm chuyên khoa
INSERT INTO specialties (specialty_name, specialty_code, description) VALUES
('Chẩn đoán hình ảnh', 'CDHA', 'Chuyên khoa chẩn đoán hình ảnh'),
('Tim mạch', 'TM', 'Chuyên khoa tim mạch'),
('Hô hấp', 'HH', 'Chuyên khoa hô hấp'),
('Tiêu hóa', 'TH', 'Chuyên khoa tiêu hóa'),
('Thần kinh', 'TK', 'Chuyên khoa thần kinh'),
('Cơ xương khớp', 'CXK', 'Chuyên khoa cơ xương khớp'),
('Nội tổng hợp', 'NTH', 'Chuyên khoa nội tổng hợp'),
('Ngoại tổng hợp', 'NGH', 'Chuyên khoa ngoại tổng hợp'),
('Sản phụ khoa', 'SPK', 'Chuyên khoa sản phụ khoa'),
('Nhi khoa', 'NK', 'Chuyên khoa nhi'),
('Da liễu', 'DL', 'Chuyên khoa da liễu'),
('Mắt', 'M', 'Chuyên khoa mắt'),
('Tai mũi họng', 'TMH', 'Chuyên khoa tai mũi họng'),
('Răng hàm mặt', 'RHM', 'Chuyên khoa răng hàm mặt');
-- Thêm triệu chứng
INSERT INTO symptoms (symptom_name, symptom_code, specialty_id, description)
VALUES
('Đau ngực', 'TM01', 2, 'Cảm giác đau, tức ngực'),
('Khó thở', 'TM02', 2, 'Khó thở, thở gấp'),
('Hồi hộp', 'TM03', 2, 'Tim đập nhanh, hồi hộp'),
('Phù chân', 'TM04', 2, 'Sưng phù vùng chân'),
('Ho khan', 'HH01', 3, 'Ho không có đờm'),
('Ho có đờm', 'HH02', 3, 'Ho kèm đờm'),
('Thở khò khè', 'HH03', 3, 'Thở có tiếng khò khè'),
('Thở gấp', 'HH04', 3, 'Nhịp thở nhanh, khó thở'),
('Đau bụng', 'TH01', 4, 'Đau vùng bụng'),
('Buồn nôn', 'TH02', 4, 'Cảm giác buồn nôn'),
('Tiêu chảy', 'TH03', 4, 'Đi ngoài lỏng nhiều lần'),
('Táo bón', 'TH04', 4, 'Khó đi ngoài, đại tiện cứng'),
('Đau đầu', 'TK01', 5, 'Cảm giác đau đầu'),
('Chóng mặt', 'TK02', 5, 'Cảm giác chóng mặt, choáng váng'),
('Tê liệt', 'TK03', 5, 'Mất cảm giác, không cử động được'),
('Co giật', 'TK04', 5, 'Cơn co giật không kiểm soát'),
('Đau khớp', 'CXK01', 6, 'Đau vùng khớp'),
('Sưng khớp', 'CXK02', 6, 'Khớp bị sưng'),
('Cứng khớp', 'CXK03', 6, 'Khớp bị cứng, khó cử động'),
('Yếu cơ', 'CXK04', 6, 'Cơ bắp yếu, mất sức'),
('Sốt', 'NTH01', 7, 'Thân nhiệt cao'),
('Mệt mỏi', 'NTH02', 7, 'Cảm giác mệt mỏi, uể oải'),
('Chán ăn', 'NTH03', 7, 'Không muốn ăn uống'),
('Sụt cân', 'NTH04', 7, 'Giảm cân không rõ nguyên nhân'),
('Quấy khóc', 'NK01', 10, 'Trẻ khóc nhiều, quấy'),
('Nôn trớ', 'NK02', 10, 'Nôn sau khi ăn'),
('Phát ban', 'NK03', 10, 'Da xuất hiện ban đỏ'),
('Khó ngủ', 'NK04', 10, 'Trẻ khó ngủ, ngủ không sâu'),
('Ngứa', 'DL01', 11, 'Cảm giác ngứa trên da'),
('Phát ban đỏ', 'DL02', 11, 'Da có ban đỏ'),
('Mẩn nước', 'DL03', 11, 'Da có mẩn nước'),
('Da khô', 'DL04', 11, 'Da bị khô, bong tróc'),
('Mờ mắt', 'M01', 12, 'Nhìn mờ, không rõ'),
('Đau mắt', 'M02', 12, 'Cảm giác đau ở mắt'),
('Chảy nước mắt', 'M03', 12, 'Mắt chảy nước liên tục'),
('Sợ ánh sáng', 'M04', 12, 'Khó chịu khi tiếp xúc ánh sáng'),
('Đau họng', 'TMH01', 13, 'Cảm giác đau ở họng'),
('Nghẹt mũi', 'TMH02', 13, 'Mũi bị tắc, khó thở'),
('Chảy nước mũi', 'TMH03', 13, 'Mũi chảy nước'),
('Ù tai', 'TMH04', 13, 'Cảm giác ù ù trong tai');
-- Thêm loại hình ảnh
INSERT INTO imaging_types (type_name, type_code, description, default_settings)
VALUES
('X-quang thường', 'XR', 'Chụp X-quang thông thường', '{"kVp": 80, "mAs": 10, "filter": "Al"}'),
('CT Scanner', 'CT', 'Chụp cắt lớp vi tính', '{"slice_thickness": 1.25, "pitch": 1.0, "kVp": 120}'),
('MRI', 'MRI', 'Cộng hưởng từ', '{"field_strength": "1.5T", "sequence": "T1", "slice_thickness":
5}'),
('Siêu âm', 'US', 'Siêu âm', '{"frequency": "3.5MHz", "gain": 50, "depth": 15}'),
('Mammography', 'MG', 'Chụp tuyến vú', '{"kVp": 28, "mAs": 63, "compression": "medium"}'),
('Fluoroscopy', 'FL', 'Chụp thấu quang', '{"kVp": 100, "mAs": 5, "frame_rate": 15}'),
('PET-CT', 'PET', 'Chụp PET-CT', '{"tracer": "F18-FDG", "uptake_time": 60, "slice_thickness":
2}'),
('SPECT', 'SP', 'Chụp SPECT', '{"isotope": "Tc99m", "matrix": "128x128", "zoom": 1.0}');
-- Thêm thiết bị chụp
INSERT INTO imaging_devices (device_name, device_model, manufacturer, serial_number,
location, imaging_type_id, last_maintenance) VALUES
('X-ray Room 1', 'DigitalDiagnost C90', 'Philips', 'XR001-2023', 'Phòng X-quang 1', 1, '2024-
12-01'),
('X-ray Room 2', 'AXIOM Aristos VX Plus', 'Siemens', 'XR002-2023', 'Phòng X-quang 2', 1,
'2024-11-15'),
('Portable X-ray', 'MobileArt Neo', 'Shimadzu', 'XR003-2024', 'Di động', 1, '2024-12-10'),
('CT Scanner 1', 'SOMATOM Drive', 'Siemens', 'CT001-2023', 'Phòng CT 1', 2, '2024-11-20'),
('CT Scanner 2', 'Revolution Apex', 'GE Healthcare', 'CT002-2024', 'Phòng CT 2', 2, '2024-
12-05'),
('MRI 1.5T', 'MAGNETOM Aera', 'Siemens', 'MR001-2023', 'Phòng MRI 1', 3, '2024-10-15'),
('MRI 3.0T', 'SIGNA Pioneer', 'GE Healthcare', 'MR002-2024', 'Phòng MRI 2', 3, '2024-11-
30'),
('Siêu âm đa năng 1', 'EPIQ Elite', 'Philips', 'US001-2023', 'Phòng siêu âm 1', 4, '2024-12-
01'),
('Siêu âm đa năng 2', 'LOGIQ E10', 'GE Healthcare', 'US002-2023', 'Phòng siêu âm 2', 4,
'2024-11-25'),
('Siêu âm tim', 'CX50', 'Philips', 'US003-2024', 'Phòng siêu âm tim', 4, '2024-12-08'),
('Máy chụp tuyến vú', 'Senographe Pristina', 'GE Healthcare', 'MG001-2023', 'Phòng chụp
tuyến vú', 5, '2024-11-10');
-- Thêm bệnh nhân
INSERT INTO patients (patient_code, full_name, date_of_birth, gender, phone, email,
address, identity_number, insurance_number, blood_type, created_by) VALUES
('BN001', 'Nguyễn Văn Nam', '1985-03-15', 'Nam', '0912345678', 'nvnam@[Link]', '123
Nguyễn Huệ, Q.1, [Link]', '123456789', 'SV123456789', 'A+', 6),
('BN002', 'Trần Thị Hoa', '1990-07-22', 'Nữ', '0923456789', 'tthoa@[Link]', '456 Lê Lợi,
Q.3, [Link]', '987654321', 'SV987654321', 'B+', 6),
('BN003', 'Lê Minh Tuấn', '1978-11-08', 'Nam', '0934567890', 'lmtuan@[Link]', '789 Hai
Bà Trưng, Q.1, [Link]', '456789123', 'SV456789123', 'O+', 6),
('BN004', 'Phạm Thị Lan', '1992-05-30', 'Nữ', '0945678901', 'ptlan@[Link]', '321 Nguyễn
Thị Minh Khai, Q.3, [Link]', '789123456', 'SV789123456', 'AB+', 6),
('BN005', 'Hoàng Văn Đức', '1987-12-12', 'Nam', '0956789012', 'hvduc@[Link]', '654
Điện Biên Phủ, Q.10, [Link]', '321654987', 'SV321654987', 'A-', 6),
('BN006', 'Võ Thị Mai', '1995-02-14', 'Nữ', '0967890123', 'vtmai@[Link]', '987 Cách
Mạng Tháng Tám, Q.10, [Link]', '654987321', 'SV654987321', 'O-', 6),
('BN007', 'Đặng Minh Khoa', '1983-09-25', 'Nam', '0978901234', 'dmkhoa@[Link]', '147
Phạm Ngũ Lão, Q.1, [Link]', '147258369', 'SV147258369', 'B-', 6),
('BN008', 'Bùi Thị Nga', '1989-06-18', 'Nữ', '0989012345', 'btnga@[Link]', '258 Trần
Hưng Đạo, Q.5, [Link]', '369258147', 'SV369258147', 'AB-', 6);
-- Thêm hồ sơ khám bệnh
INSERT INTO medical_records (record_code, patient_id, visit_date, chief_complaint,
symptoms_recorded, vital_signs, specialty_id, assigned_doctor_id, status, priority_level,
created_by) VALUES
('HS001', 1, '2024-12-15', 'Đau ngực, khó thở khi gắng sức', 'Bệnh nhân than phiền đau
ngực từ 3 ngày nay, kèm khó thở khi đi bộ', '{"temperature": 36.5, "blood_pressure":
"140/90", "heart_rate": 85, "respiratory_rate": 18, "oxygen_saturation": 97}', 2, 4, 'Chờ chụp',
'Bình thường', 6),
('HS002', 2, '2024-12-16', 'Ho khan kéo dài, sốt nhẹ', 'Ho khan khoảng 2 tuần, sốt nhẹ buổi
chiều', '{"temperature": 37.2, "blood_pressure": "120/80", "heart_rate": 78, "respiratory_rate":
20, "oxygen_saturation": 98}', 3, 5, 'Chờ chụp', 'Bình thường', 6),
('HS003', 3, '2024-12-17', 'Đau đầu dữ dội, buồn nôn', 'Đau đầu từ sáng nay, kèm buồn nôn
và chóng mặt', '{"temperature": 36.8, "blood_pressure": "160/100", "heart_rate": 92,
"respiratory_rate": 16, "oxygen_saturation": 99}', 5, 4, 'Chờ chụp', 'Khẩn cấp', 6),
('HS004', 4, '2024-12-18', 'Đau bụng dưới, đi tiểu buốt', 'Đau bụng dưới bên phải từ 2 ngày,
đi tiểu có máu', '{"temperature": 37.8, "blood_pressure": "110/70", "heart_rate": 88,
"respiratory_rate": 18, "oxygen_saturation": 98}', 7, 5, 'Chờ chụp', 'Bình thường', 6),
('HS005', 5, '2024-12-19', 'Đau lưng, tê chân trái', 'Đau lưng từ 1 tuần nay, tê bì chân trái',
'{"temperature": 36.3, "blood_pressure": "130/85", "heart_rate": 72, "respiratory_rate": 16,
"oxygen_saturation": 99}', 6, 4, 'Chờ chụp', 'Bình thường', 6),
('HS006', 6, '2024-12-20', 'Thai 32 tuần, kiểm tra định kỳ', 'Thai phụ 32 tuần tuổi, đến khám
định kỳ', '{"temperature": 36.4, "blood_pressure": "125/75", "heart_rate": 82,
"respiratory_rate": 18, "oxygen_saturation": 99}', 9, 5, 'Chờ chụp', 'Bình thường', 6),
('HS007', 7, '2024-12-21', 'Đau khớp gối, sưng', 'Đau khớp gối phải từ 5 ngày, sưng và khó
cử động', '{"temperature": 36.6, "blood_pressure": "135/80", "heart_rate": 75,
"respiratory_rate": 16, "oxygen_saturation": 98}', 6, 4, 'Chờ chụp', 'Bình thường', 6),
('HS008', 8, '2024-12-22', 'Đau bụng trên, ợ chua', 'Đau bụng trên sau ăn, ợ chua, đầy hơi',
'{"temperature": 36.7, "blood_pressure": "115/75", "heart_rate": 80, "respiratory_rate": 17,
"oxygen_saturation": 99}', 4, 5, 'Chờ chụp', 'Bình thường', 6);
-- Thêm triệu chứng cho hồ sơ
INSERT INTO record_symptoms (record_id, symptom_id, severity, notes) VALUES
(1, 1, 'Vừa', 'Đau ngực dạng thắt, tăng khi gắng sức'),
(1, 2, 'Vừa', 'Khó thở khi đi bộ nhanh hoặc lên cầu thang'),
(2, 5, 'Vừa', 'Ho khan dai dẳng, không có đờm'),
(2, 21, 'Nhẹ', 'Sốt nhẹ về chiều, khoảng 37-37.5°C'),
(3, 13, 'Nặng', 'Đau đầu dữ dội, đập thình thịch'),
(3, 14, 'Vừa', 'Chóng mặt khi đứng lên'),
(3, 10, 'Vừa', 'Buồn nôn nhiều, chưa nôn'),
(4, 9, 'Vừa', 'Đau bụng dưới bên phải, đau âm ỉ'),
(5, 17, 'Vừa', 'Đau lưng vùng thắt lưng'),
(5, 15, 'Nhẹ', 'Tê bì chân trái, mất cảm giác'),
(7, 17, 'Vừa', 'Đau khớp gối khi cử động'),
(7, 18, 'Nhẹ', 'Sưng khớp gối, ấn đau');
-- Thêm yêu cầu chụp hình
INSERT INTO imaging_requests (request_code, record_id, imaging_type_id, body_part,
clinical_indication, contrast_used, urgency, special_instructions, requested_by, status,
requested_at, scheduled_at) VALUES
('YC001', 1, 1, 'Ngực thẳng và nghiêng', 'Đau ngực, nghi ngờ bệnh lý tim phổi', FALSE, 'Bình
thường', 'Chụp 2 tư thế PA và Lateral', 4, 'Chờ chụp', '2024-12-15 10:30:00', '2024-12-15
14:00:00'),
('YC002', 2, 1, 'Ngực thẳng', 'Ho khan kéo dài, loại trừ viêm phổi', FALSE, 'Bình thường',
'Chụp tư thế PA', 5, 'Chờ chụp', '2024-12-16 09:15:00', '2024-12-16 15:30:00'),
('YC003', 3, 2, 'Não không cản quang', 'Đau đầu dữ dội, loại trừ xuất huyết não', FALSE,
'Khẩn cấp', 'CT cấp cứu, không cần chuẩn bị', 4, 'Chờ chụp', '2024-12-17 11:45:00', '2024-
12-17 12:30:00'),
('YC004', 4, 4, 'Tiểu khung', 'Đau bụng dưới, nghi ngờ sỏi thận', FALSE, 'Bình thường', 'Siêu
âm bàng quang đầy', 5, 'Chờ chụp', '2024-12-18 08:20:00', '2024-12-18 16:00:00'),
('YC005', 5, 3, 'Cột sống thắt lưng', 'Đau lưng, tê chân, nghi thoát vị đĩa đệm', FALSE, 'Bình
thường', 'MRI cột sống thắt lưng, cần chuẩn bị', 4, 'Chờ chụp', '2024-12-19 13:10:00', '2024-
12-20 09:00:00'),
('YC006', 6, 4, 'Thai nhi', 'Thai 32 tuần, kiểm tra phát triển thai', FALSE, 'Bình thường', 'Siêu
âm thai định kỳ', 5, 'Chờ chụp', '2024-12-20 10:00:00', '2024-12-20 14:30:00'),
('YC007', 7, 1, 'Đầu gối phải', 'Đau khớp gối, nghi ngờ tổn thương khớp', FALSE, 'Bình
thường', 'X-quang gối 2 tư thế', 4, 'Chờ chụp', '2024-12-21 14:25:00', '2024-12-21 16:45:00'),
('YC008', 8, 2, 'Bụng có cản quang', 'Đau bụng trên, loại trừ bệnh lý gan mật', TRUE, 'Bình
thường', 'CT bụng có tiêm thuốc cản quang', 5, 'Chờ chụp', '2024-12-22 09:40:00', '2024-12-
22 15:15:00');
-- Thêm kết quả chụp
INSERT INTO imaging_results (request_id, dicom_file_path, thumbnail_path, performed_by,
performed_at, technical_parameters, image_quality, radiologist_id, status) VALUES
(1, '/dicom/2024/12/15/YC001_chest_pa.dcm', '/thumbnails/YC001_chest_pa.jpg', 7, '2024-
12-15 14:15:00', '{"kVp": 80, "mAs": 10, "distance": 180}', 'Tốt', 4, 'Chờ đọc'),
(2, '/dicom/2024/12/16/YC002_chest_pa.dcm', '/thumbnails/YC002_chest_pa.jpg', 7, '2024-
12-16 15:45:00', '{"kVp": 85, "mAs": 12, "distance": 180}', 'Tốt', 5, 'Chờ đọc'),
(3, '/dicom/2024/12/17/YC003_brain_ct.dcm', '/thumbnails/YC003_brain_ct.jpg', 8, '2024-12-
17 12:45:00', '{"kVp": 120, "mAs": 250, "slice_thickness": 5}', 'Xuất sắc', 4, 'Chờ đọc'),
(4, '/dicom/2024/12/18/YC004_pelvis_us.dcm', '/thumbnails/YC004_pelvis_us.jpg', 8, '2024-
12-18 16:20:00', '{"frequency": 3.5, "gain": 45, "depth": 12}', 'Tốt', 5, 'Chờ đọc');
-- Thêm báo cáo đọc phim
INSERT INTO diagnostic_reports (result_id, report_code, findings, impression,
recommendations, report_type, radiologist_id, dictated_at, finalized_at, status) VALUES
(1, 'BC001', 'Tim bình thường về hình dạng và kích thước. Phổi hai bên thông thoáng,
không thấy thâm nhiễm hay tổn thương dạng nốt. Cấu trúc xương sườn bình thường.', 'X-
quang ngực bình thường', 'Theo dõi lâm sàng', 'Sơ bộ', 4, '2024-12-15 16:00:00', '2024-12-
15 16:30:00', 'Hoàn thành'),
(2, 'BC002', 'Phổi hai bên có tăng vân phế nang ở thùy dưới. Tim bình thường. Không thấy
dấu hiệu tràn dịch màng phổi.', 'Tăng vân phế nang hai thùy dưới phổi, có thể do viêm',
'Điều trị kháng sinh theo chỉ định lâm sàng. Tái khám sau 1 tuần', 'Chính thức', 5, '2024-12-
16 17:00:00', '2024-12-16 17:45:00', 'Hoàn thành'),
(3, 'BC003', 'Não không thấy dấu hiệu xuất huyết cấp tính. Cấu trúc não thất bình thường.
Không thấy dấu hiệu tăng áp lực nội sọ.', 'CT não không cản quang bình thường', 'Theo dõi
triệu chứng lâm sàng. Nếu đau đầu dai dẳng cần MRI', 'Cấp cứu', 4, '2024-12-17 13:30:00',
'2024-12-17 14:00:00', 'Hoàn thành');
-- Thêm thông báo
INSERT INTO notifications (user_id, notification_type, title, message, related_entity_type,
related_entity_id, priority) VALUES
(4, 'new_request', 'Yêu cầu chụp mới', 'Có yêu cầu chụp X-quang ngực mới từ bệnh nhân
Nguyễn Văn Nam', 'imaging_request', 1, 'Bình thường'),
(5, 'urgent_request', 'Yêu cầu chụp khẩn cấp', 'Yêu cầu CT não khẩn cấp cho bệnh nhân Lê
Minh Tuấn', 'imaging_request', 3, 'Khẩn cấp'),
(4, 'report_ready', 'Báo cáo hoàn thành', 'Báo cáo X-quang ngực cho bệnh nhân Nguyễn
Văn Nam đã hoàn thành', 'diagnostic_report', 1, 'Bình thường'),
(6, 'system_maintenance', 'Bảo trì hệ thống', 'Hệ thống sẽ bảo trì từ 2:00-4:00 sáng ngày
mai', 'system', NULL, 'Thông tin');
-- Thêm lịch sử trạng thái yêu cầu
INSERT INTO request_status_history (request_id, old_status, new_status, changed_by,
change_reason) VALUES
(1, 'Chờ chụp', 'Đang chụp', 7, 'Bắt đầu thực hiện chụp'),
(1, 'Đang chụp', 'Chờ đọc', 7, 'Hoàn thành chụp'),
(2, 'Chờ chụp', 'Đang chụp', 7, 'Bắt đầu thực hiện chụp'),
(2, 'Đang chụp', 'Chờ đọc', 7, 'Hoàn thành chụp'),
(3, 'Chờ chụp', 'Đang chụp', 8, 'Bắt đầu CT khẩn cấp'),
(3, 'Đang chụp', 'Chờ đọc', 8, 'Hoàn thành CT');
-- Thêm lịch làm việc
INSERT INTO work_schedules (user_id, date, shift_type, start_time, end_time, status,
notes) VALUES
(4, '2024-12-23', 'Sáng', '07:00:00', '15:00:00', 'Đã xếp', 'Ca sáng thường'),
(5, '2024-12-23', 'Chiều', '15:00:00', '23:00:00', 'Đã xếp', 'Ca chiều thường'),
(7, '2024-12-23', 'Sáng', '07:30:00', '15:30:00', 'Đã xếp', 'Kỹ thuật viên ca sáng'),
(8, '2024-12-23', 'Chiều', '15:30:00', '23:30:00', 'Đã xếp', 'Kỹ thuật viên ca chiều'),
(4, '2024-12-24', 'Trực', '07:00:00', '07:00:00', 'Đã xếp', 'Trực 24h'),
(8, '2024-12-24', 'Sáng', '08:00:00', '16:00:00', 'Đã xếp', 'Siêu âm ca sáng');
-- Thêm backup logs
INSERT INTO backup_logs (backup_type, file_path, file_size_mb, backup_status,
started_by, start_time, end_time, notes) VALUES
('Full', '/backups/2024/12/full_backup_20241220.[Link]', 145.6, 'Thành công', 1, '2024-12-20
02:00:00', '2024-12-20 02:45:00', 'Backup định kỳ hàng ngày'),
('Incremental', '/backups/2024/12/inc_backup_20241221.[Link]', 23.4, 'Thành công', 1,
'2024-12-21 02:00:00', '2024-12-21 02:12:00', 'Backup tăng trường'),
('Full', '/backups/2024/12/full_backup_20241222.[Link]', 148.2, 'Thành công', 1, '2024-12-22
02:00:00', '2024-12-22 02:48:00', 'Backup định kỳ hàng ngày');
-- Cấu hình hệ thống
INSERT INTO system_settings (setting_key, setting_value, setting_type, category,
description, is_public) VALUES
('system_name', 'Hệ thống Quản lý Ảnh chụp DICOM', 'String', 'General', 'Tên hệ thống',
TRUE),
('hospital_name', 'Bệnh viện Đa khoa Trung ương', 'String', 'General', 'Tên bệnh viện',
TRUE),
('hospital_address', '123 Đường ABC, Quận XYZ, [Link]', 'String', 'General', 'Địa chỉ bệnh
viện', TRUE),
('hospital_phone', '028-1234-5678', 'String', 'General', 'Số điện thoại bệnh viện', TRUE),
('timezone', 'Asia/Ho_Chi_Minh', 'String', 'General', 'Múi giờ hệ thống', FALSE),
('language', 'vi_VN', 'String', 'General', 'Ngôn ngữ mặc định', FALSE),
('dicom_storage_path', '/var/dicom/images/', 'String', 'DICOM', 'Đường dẫn lưu trữ DICOM',
FALSE),
('dicom_port', '11112', 'Number', 'DICOM', 'Port DICOM C-STORE', FALSE),
('dicom_aet', 'HOSPITAL_PACS', 'String', 'DICOM', 'Application Entity Title', FALSE),
('max_file_size_mb', '500', 'Number', 'DICOM', 'Kích thước file tối đa (MB)', FALSE),
('session_timeout_minutes', '120', 'Number', 'Security', 'Timeout phiên làm việc (phút)',
FALSE),
('max_login_attempts', '5', 'Number', 'Security', 'Số lần đăng nhập sai tối đa', FALSE),
('password_min_length', '8', 'Number', 'Security', 'Độ dài mật khẩu tối thiểu', FALSE),
('require_password_complexity', 'true', 'Boolean', 'Security', 'Yêu cầu mật khẩu phức tạp',
FALSE),
('email_notifications_enabled', 'true', 'Boolean', 'Notifications', 'Bật thông báo email', FALSE),
('smtp_server', '[Link]', 'String', 'Notifications', 'SMTP Server', FALSE),
('smtp_port', '587', 'Number', 'Notifications', 'SMTP Port', FALSE),
('notification_retention_days', '30', 'Number', 'Notifications', 'Thời gian lưu thông báo (ngày)',
FALSE),
('auto_backup_enabled', 'true', 'Boolean', 'Backup', 'Tự động backup', FALSE),
('backup_retention_days', '90', 'Number', 'Backup', 'Thời gian lưu backup (ngày)', FALSE),
('backup_schedule', '0 2 * * *', 'String', 'Backup', 'Lịch backup (cron format)', FALSE),
('total_patients', '8', 'Number', 'Statistics', 'Tổng số bệnh nhân', FALSE),
('total_requests_today', '3', 'Number', 'Statistics', 'Số yêu cầu hôm nay', FALSE),
('avg_turnaround_time', '4.5', 'Number', 'Statistics', 'Thời gian xử lý trung bình (giờ)', FALSE),
('system_uptime', '99.8', 'Number', 'Statistics', 'Thời gian hoạt động hệ thống (%)', FALSE);
-- =============================================
-- STORED PROCEDURES
-- =============================================
DELIMITER $$
CREATE PROCEDURE sp_generate_patient_code()
BEGIN
DECLARE next_code VARCHAR(20);
DECLARE last_number INT DEFAULT 0;
SELECT COALESCE(MAX(CAST(SUBSTRING(patient_code, 3) AS UNSIGNED)), 0)
INTO last_number
FROM patients
WHERE patient_code LIKE 'BN%';
SET next_code = CONCAT('BN', LPAD(last_number + 1, 3, '0'));
SELECT next_code AS new_patient_code;
END$$
CREATE PROCEDURE sp_generate_record_code()
BEGIN
DECLARE next_code VARCHAR(20);
DECLARE last_number INT DEFAULT 0;
SELECT COALESCE(MAX(CAST(SUBSTRING(record_code, 3) AS UNSIGNED)), 0)
INTO last_number
FROM medical_records
WHERE record_code LIKE 'HS%';
SET next_code = CONCAT('HS', LPAD(last_number + 1, 3, '0'));
SELECT next_code AS new_record_code;
END$$
CREATE PROCEDURE sp_generate_request_code()
BEGIN
DECLARE next_code VARCHAR(20);
DECLARE last_number INT DEFAULT 0;
SELECT COALESCE(MAX(CAST(SUBSTRING(request_code, 3) AS UNSIGNED)), 0)
INTO last_number
FROM imaging_requests
WHERE request_code LIKE 'YC%';
SET next_code = CONCAT('YC', LPAD(last_number + 1, 3, '0'));
SELECT next_code AS new_request_code;
END$$
CREATE PROCEDURE sp_validate_record_assignment(
IN record_id_param INT,
OUT is_valid BOOLEAN,
OUT error_message VARCHAR(255)
)
BEGIN
DECLARE symptom_specialty_id INT;
DECLARE record_specialty_id INT;
SELECT specialty_id INTO record_specialty_id
FROM medical_records
WHERE record_id = record_id_param;
SELECT DISTINCT s.specialty_id INTO symptom_specialty_id
FROM record_symptoms rs
JOIN symptoms s ON rs.symptom_id = s.symptom_id
WHERE rs.record_id = record_id_param
LIMIT 1;
IF record_specialty_id = symptom_specialty_id OR symptom_specialty_id IS NULL THEN
SET is_valid = TRUE;
SET error_message = '';
ELSE
SET is_valid = FALSE;
SET error_message = 'Chuyên khoa không phù hợp với triệu chứng';
END IF;
END$$
CREATE PROCEDURE sp_send_priority_reminders()
BEGIN
INSERT INTO notifications (user_id, notification_type, title, message, related_entity_type,
related_entity_id, priority)
SELECT mr.assigned_doctor_id, 'priority_review', 'Yêu cầu xem xét ưu tiên',
CONCAT('Hồ sơ ', mr.record_code, ' cần xem xét ưu tiên'),
'medical_record', mr.record_id, 'Khẩn cấp'
FROM medical_records mr
WHERE mr.priority_level IN ('Khẩn cấp', 'Cấp cứu')
AND [Link] IN ('Chờ khám', 'Chờ chụp', 'Chờ kết quả')
AND NOT EXISTS (
SELECT 1 FROM notifications n
WHERE n.related_entity_type = 'medical_record'
AND n.related_entity_id = mr.record_id
AND n.created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)
);
END$$
DELIMITER ;
-- =============================================
-- TRIGGERS
-- =============================================
DELIMITER $$
CREATE TRIGGER tr_urgent_request_notification
AFTER INSERT ON imaging_requests
FOR EACH ROW
BEGIN
IF [Link] = 'Khẩn cấp' THEN
INSERT INTO notifications (user_id, notification_type, title, message,
related_entity_type, related_entity_id, priority)
SELECT u.user_id, 'urgent_request', 'Yêu cầu chụp khẩn cấp',
CONCAT('Yêu cầu chụp khẩn cấp: ', it.type_name, ' - ', NEW.body_part),
'imaging_request', NEW.request_id, 'Khẩn cấp'
FROM users u
JOIN imaging_types it ON it.imaging_type_id = NEW.imaging_type_id
WHERE u.role_id IN (SELECT role_id FROM roles WHERE role_name IN ('technician',
'doctor'))
AND u.is_active = TRUE;
END IF;
END$$
CREATE TRIGGER tr_poor_quality_notification
AFTER INSERT ON dicom_images
FOR EACH ROW
BEGIN
IF NEW.quality_status = 'Cần chụp lại' THEN
INSERT INTO notifications (user_id, notification_type, title, message,
related_entity_type, related_entity_id, priority)
VALUES (NEW.technician_id, 'poor_quality', 'Hình ảnh cần chụp lại',
CONCAT('Hình ảnh ', NEW.dicom_file_path, ' có chất lượng kém, cần chụp lại'),
'dicom_image', NEW.image_id, 'Khẩn cấp');
END IF;
END$$
CREATE TRIGGER tr_report_completion_notification
AFTER UPDATE ON diagnostic_reports
FOR EACH ROW
BEGIN
IF [Link] != 'Hoàn thành' AND [Link] = 'Hoàn thành' THEN
INSERT INTO notifications (user_id, notification_type, title, message,
related_entity_type, related_entity_id, priority)
SELECT ir.requested_by, 'report_ready', 'Báo cáo hoàn thành',
CONCAT('Báo cáo ', NEW.report_code, ' đã hoàn thành'),
'diagnostic_report', NEW.report_id, 'Bình thường'
FROM imaging_results ires
JOIN imaging_requests ir ON ir.request_id = ires.request_id
WHERE ires.result_id = NEW.result_id;
END IF;
END$$
DELIMITER ;
-- =============================================
-- INDEXES
-- =============================================
CREATE INDEX idx_patients_search ON patients(full_name, patient_code, phone,
identity_number);
CREATE INDEX idx_medical_records_date ON medical_records(visit_date);
CREATE INDEX idx_imaging_requests_status_date ON imaging_requests(status,
requested_at);
CREATE INDEX idx_dicom_images_date ON dicom_images(acquisition_date);
CREATE INDEX idx_diagnostic_reports_date ON diagnostic_reports(updated_at);
CREATE INDEX idx_notifications_recipient_read ON notifications(user_id, is_read);
CREATE INDEX idx_requests_patient_date ON imaging_requests(record_id, requested_at);
CREATE INDEX idx_results_status_date ON imaging_results(status, performed_at);
CREATE INDEX idx_reports_radiologist_date ON diagnostic_reports(radiologist_id,
updated_at);
-- =============================================
-- PARTITIONING
-- =============================================
ALTER TABLE dicom_images
PARTITION BY RANGE (YEAR(acquisition_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026)
);
-- =============================================
-- SCRIPT HOÀN THÀNH
-- =============================================
SELECT 'DATABASE INITIALIZATION COMPLETED' as Status;
SELECT COUNT(*) as Total_Tables FROM information_schema.tables WHERE
table_schema = DATABASE();
SELECT 'AIDIMS schema without AI initialized successfully' as Message;
SELECT
'Patients' as Entity, COUNT(*) as Count FROM patients
UNION ALL
SELECT 'Medical Records', COUNT(*) FROM medical_records
UNION ALL
SELECT 'Imaging Requests', COUNT(*) FROM imaging_requests
UNION ALL
SELECT 'Imaging Results', COUNT(*) FROM imaging_results
UNION ALL
SELECT 'Diagnostic Reports', COUNT(*) FROM diagnostic_reports
UNION ALL
SELECT 'Users', COUNT(*) FROM users
UNION ALL
SELECT 'Specialties', COUNT(*) FROM specialties
UNION ALL
SELECT 'Imaging Types', COUNT(*) FROM imaging_types;
```