Files
Shixun/smart-hospital.sql
2026-07-31 12:27:41 +08:00

274 lines
15 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- 智慧医院 AI 影像诊断与电子病历辅助决策系统
-- 数据库初始化脚本(MySQL 8+ / 兼容 5.7+)
-- ============================================================
-- 版本:2026-07-23(与当前 JPA 实体 + AI/YOLO 文件侧配置同步)
--
-- 【说明】
-- 1. 本脚本:MySQL 建库建表(spring.profiles.active=mysql 时使用)。
-- 2. 默认开发:H2 内存库 + spring.jpa.hibernate.ddl-auto=update,
-- 可不执行本脚本,表结构由 JPA 自动维护。
-- 3. 初始账号由 DataInitializer 启动写入(BCrypt):
-- admin / admin123 角色 ADMIN
-- doctor1 / pass123 角色 DOCTOR
-- radio1 / radio123 角色 RADIOLOGIST
-- 4. 以下内容【不在 MySQL】,落在文件系统:
-- · YOLO 权重:ai-service/data/weights/*.pt
-- 推荐医学权重:chest-xray-yolov8-detect.pt(14 类胸部病灶)
-- 另有 pneumonia-yolov8n.pt、rsna-pneumonia-yolov8s.pt、yolov8n.pt 等
-- · YOLO 配置/逻辑删除列表:ai-service/data/yolo_config.json
-- (deleted_weights 为逻辑删除,磁盘 .pt 仍保留)
-- · YOLO 推理统计:ai-service/data/yolo_stats.json
-- · 部分 AI 配置/对话:./data/ai/(AiFileStore,视实现而定)
-- · 影像原图/标注图:./uploads/images/(含 ai-annotated/)
-- 5. 执行:mysql -u root -p < smart-hospital.sql
-- ============================================================
CREATE DATABASE IF NOT EXISTS smart_hospital
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE smart_hospital;
-- ------------------------------------------------------------
-- 1. 用户 users (User.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL COMMENT 'BCrypt 哈希',
real_name VARCHAR(50) NOT NULL,
role ENUM('DOCTOR', 'RADIOLOGIST', 'ADMIN') NOT NULL,
department VARCHAR(100) NULL,
phone VARCHAR(20) NULL,
email VARCHAR(100) NULL,
avatar VARCHAR(500) NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_users_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 2. 患者 patients (Patient.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS patients (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender ENUM('MALE', 'FEMALE', 'OTHER') NOT NULL,
age INT NOT NULL,
id_card VARCHAR(18) NULL,
phone VARCHAR(20) NULL,
address TEXT NULL,
medical_history TEXT NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_patients_id_card (id_card)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 3. 影像检查 imaging_records (ImagingRecord.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS imaging_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
patient_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
study_type ENUM('X_RAY', 'CT', 'MRI', 'ULTRASOUND') NOT NULL,
body_part VARCHAR(100) NOT NULL,
image_url VARCHAR(500) NOT NULL COMMENT '如 /uploads/images/...',
status ENUM('PENDING', 'ANALYZING', 'COMPLETED', 'ERROR')
NOT NULL DEFAULT 'PENDING',
ai_diagnosis TEXT NULL COMMENT 'AI 诊断摘要(列表展示)',
ai_confidence DECIMAL(5,4) NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_imaging_patient (patient_id),
KEY idx_imaging_doctor (doctor_id),
KEY idx_imaging_status (status),
KEY idx_imaging_study_type (study_type),
CONSTRAINT fk_imaging_patient FOREIGN KEY (patient_id) REFERENCES patients(id),
CONSTRAINT fk_imaging_doctor FOREIGN KEY (doctor_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 4. AI 诊断结果 ai_diagnosis_results (AIDiagnosisResult.java)
-- 含 YOLO 检测框 / 标注图 / 完整报告等扩展字段
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ai_diagnosis_results (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
imaging_record_id BIGINT NOT NULL,
diagnosis_text TEXT NOT NULL,
confidence_score DECIMAL(5,4) NOT NULL,
findings TEXT NULL,
recommendations TEXT NULL,
model_version VARCHAR(50) NULL,
processing_time_ms BIGINT NULL,
-- YOLO / FastAPI 扩展(与 AIDiagnosisResult 实体一致)
detections_json TEXT NULL COMMENT '检测框 JSON 数组',
annotated_image_url VARCHAR(512) NULL COMMENT '标注图路径 /uploads/images/ai-annotated/...',
full_report TEXT NULL COMMENT '完整影像诊断报告',
engine VARCHAR(64) NULL COMMENT 'fastapi-yolo / fallback 等',
fallback_flag BOOLEAN NULL COMMENT '是否本地规则降级',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_ai_diag_imaging (imaging_record_id),
CONSTRAINT fk_ai_diag_imaging FOREIGN KEY (imaging_record_id)
REFERENCES imaging_records(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 5. 电子病历 electronic_medical_records (ElectronicMedicalRecord.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS electronic_medical_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
patient_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
visit_date DATE NOT NULL,
chief_complaint TEXT NULL,
present_illness TEXT NULL,
physical_examination TEXT NULL,
diagnosis TEXT NOT NULL,
treatment_plan TEXT NULL,
medications TEXT NULL,
follow_up_notes TEXT NULL,
ai_suggestions TEXT NULL COMMENT 'AI 辅助决策建议 JSON/文本',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_emr_patient (patient_id),
KEY idx_emr_doctor (doctor_id),
KEY idx_emr_visit_date (visit_date),
CONSTRAINT fk_emr_patient FOREIGN KEY (patient_id) REFERENCES patients(id),
CONSTRAINT fk_emr_doctor FOREIGN KEY (doctor_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 6. 辅助决策记录 decision_support_records (DecisionSupportRecord.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS decision_support_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
emr_id BIGINT NOT NULL,
query_text TEXT NOT NULL,
ai_response TEXT NOT NULL,
confidence_score DECIMAL(5,4) NULL,
references_used TEXT NULL,
doctor_feedback ENUM('HELPFUL', 'NOT_HELPFUL', 'NEUTRAL') NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_ds_emr (emr_id),
CONSTRAINT fk_ds_emr FOREIGN KEY (emr_id)
REFERENCES electronic_medical_records(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 7. 预约挂号 appointments (Appointment.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS appointments (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
patient_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
department VARCHAR(64) NOT NULL,
appointment_date DATE NOT NULL,
appointment_time TIME NULL,
reason VARCHAR(128) NULL,
notes TEXT NULL,
status ENUM('SCHEDULED', 'CONFIRMED', 'COMPLETED', 'CANCELLED', 'NO_SHOW')
NOT NULL DEFAULT 'SCHEDULED',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_appt_patient (patient_id),
KEY idx_appt_doctor (doctor_id),
KEY idx_appt_date (appointment_date),
KEY idx_appt_status (status),
CONSTRAINT fk_appt_patient FOREIGN KEY (patient_id) REFERENCES patients(id),
CONSTRAINT fk_appt_doctor FOREIGN KEY (doctor_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 8. AI 配置 ai_settings (AiSettings.java,单行 id=1)
-- 亦可由 ./data/ai 文件持久化,视部署配置而定
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ai_settings (
id BIGINT PRIMARY KEY,
api_base_url VARCHAR(500) NULL,
api_key VARCHAR(500) NULL,
model VARCHAR(120) NULL,
enabled BOOLEAN NOT NULL DEFAULT FALSE,
temperature DOUBLE NOT NULL DEFAULT 0.7,
system_prompt TEXT NULL,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 9. AI 知识库 ai_knowledge_docs (AiKnowledgeDoc.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ai_knowledge_docs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
category VARCHAR(64) NULL,
content TEXT NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_knowledge_category (category),
KEY idx_knowledge_enabled (enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------
-- 10. AI 对话历史 ai_chat_messages (AiChatMessage.java)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ai_chat_messages (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
mode VARCHAR(16) NOT NULL COMMENT '如 chat / rag 等',
question TEXT NOT NULL,
answer TEXT NOT NULL,
sources_json TEXT NULL COMMENT '引用知识片段 JSON',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_chat_user (user_id),
KEY idx_chat_created (created_at),
CONSTRAINT fk_chat_user FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- 已有库升级片段(旧 MySQL → 当前结构)
-- 新库请直接用上方 CREATE;旧库按需取消注释执行
-- (重复执行可能报 Duplicate column / key,可忽略)
-- ============================================================
-- ALTER TABLE ai_diagnosis_results ADD COLUMN detections_json TEXT NULL COMMENT '检测框 JSON';
-- ALTER TABLE ai_diagnosis_results ADD COLUMN annotated_image_url VARCHAR(512) NULL COMMENT '标注图路径';
-- ALTER TABLE ai_diagnosis_results ADD COLUMN full_report TEXT NULL COMMENT '完整报告';
-- ALTER TABLE ai_diagnosis_results ADD COLUMN engine VARCHAR(64) NULL COMMENT '引擎标识';
-- ALTER TABLE ai_diagnosis_results ADD COLUMN fallback_flag BOOLEAN NULL COMMENT '是否降级';
--
-- CREATE INDEX idx_imaging_status ON imaging_records (status);
-- CREATE INDEX idx_imaging_study_type ON imaging_records (study_type);
-- CREATE INDEX idx_ai_diag_imaging ON ai_diagnosis_results (imaging_record_id);
-- CREATE INDEX idx_appt_date ON appointments (appointment_date);
-- ============================================================
-- 可选示例数据(默认由 DataInitializer 写入,无需手动执行)
-- 密码必须为 BCrypt,勿写明文。演示账号明文仅作对照:
-- admin/admin123 doctor1/pass123 radio1/radio123
-- ============================================================
-- INSERT INTO users (username, password, real_name, role, department, phone, email, enabled) VALUES
-- ('admin', '<BCrypt(admin123)>', '系统管理员', 'ADMIN', '信息科', '13800000000', 'admin@hospital.com', TRUE),
-- ('doctor1', '<BCrypt(pass123)>', '张医生', 'DOCTOR', '内科', '13800138000', 'zhang@hospital.com', TRUE),
-- ('radio1', '<BCrypt(radio123)>', '王影像师', 'RADIOLOGIST', '影像科', '13800138111', 'wang@hospital.com', TRUE);
--
-- INSERT INTO patients (name, gender, age, id_card, phone, address, medical_history) VALUES
-- ('李明', 'MALE', 45, '110101199001011234', '13900139000', '北京市朝阳区', '高血压病史5年');
--
-- INSERT INTO imaging_records (patient_id, doctor_id, study_type, body_part, image_url, status) VALUES
-- (1, 2, 'CT', '胸部', '/uploads/images/demo_chest.png', 'PENDING');
--
-- INSERT INTO appointments (patient_id, doctor_id, department, appointment_date, appointment_time, reason, notes, status) VALUES
-- (1, 2, '内科', DATE_ADD(CURDATE(), INTERVAL 1 DAY), '09:30:00', '复诊随访', '示例预约', 'SCHEDULED');
-- ============================================================
-- 非数据库:YOLO 权重侧配置示意(勿当 SQL 执行)
-- 文件:ai-service/data/yolo_config.json
-- {
-- "active_weight": "chest-xray-yolov8-detect.pt",
-- "demo_mode": "auto",
-- "deleted_weights": [],
-- "updated_at": "..."
-- }
-- deleted_weights = 逻辑删除列表(列表隐藏,.pt 文件仍在 weights 目录)
-- ============================================================