-- ============================================================ -- 智慧医院 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', '', '系统管理员', 'ADMIN', '信息科', '13800000000', 'admin@hospital.com', TRUE), -- ('doctor1', '', '张医生', 'DOCTOR', '内科', '13800138000', 'zhang@hospital.com', TRUE), -- ('radio1', '', '王影像师', '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 目录) -- ============================================================