26-7-31-1
This commit is contained in:
@@ -0,0 +1,273 @@
|
||||
-- ============================================================
|
||||
-- 智慧医院 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 目录)
|
||||
-- ============================================================
|
||||
Reference in New Issue
Block a user