274 lines
15 KiB
SQL
274 lines
15 KiB
SQL
-- ============================================================
|
||
-- 智慧医院 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 目录)
|
||
-- ============================================================
|