26-7-31-1

This commit is contained in:
shuai
2026-07-31 12:27:41 +08:00
commit 9b8b8b57b3
142 changed files with 22408 additions and 0 deletions
+273
View File
@@ -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 目录)
-- ============================================================