-- ============================================================
-- 医学影像智能质控系统 - 数据库初始化脚本
-- Database: qconline
-- Version: 1.0.0
-- Date: 2025-12-25
-- ============================================================

-- 创建数据库
CREATE DATABASE IF NOT EXISTS `qconline` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `qconline`;

-- ============================================================
-- 1. 系统管理模块（5张表）
-- ============================================================

-- 1.1 系统用户表
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(255) NOT NULL COMMENT '密码（加密）',
  `realname` varchar(50) NOT NULL COMMENT '真实姓名',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1启用 0禁用',
  `is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否管理员：1是 0否',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户表';

-- 1.2 机构表
DROP TABLE IF EXISTS `institution`;
CREATE TABLE `institution` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `institution_code` varchar(50) NOT NULL COMMENT '机构编码',
  `institution_name` varchar(100) NOT NULL COMMENT '机构名称',
  `parent_id` varchar(32) DEFAULT '0' COMMENT '父机构ID，0表示顶级机构',
  `level` int NOT NULL DEFAULT '1' COMMENT '层级：1一级 2二级...',
  `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
  `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1启用 0禁用',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`institution_code`),
  KEY `idx_parent` (`parent_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='机构表';

-- 1.3 用户机构关联表
DROP TABLE IF EXISTS `user_institution`;
CREATE TABLE `user_institution` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `user_id` varchar(32) NOT NULL COMMENT '用户ID',
  `institution_id` varchar(32) NOT NULL COMMENT '机构ID',
  `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认机构：1是 0否',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_inst` (`user_id`, `institution_id`),
  KEY `idx_user` (`user_id`),
  KEY `idx_institution` (`institution_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户机构关联表';

-- 1.4 菜单表
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `menu_name` varchar(50) NOT NULL COMMENT '菜单名称',
  `menu_code` varchar(50) NOT NULL COMMENT '菜单编码',
  `parent_id` varchar(32) DEFAULT '0' COMMENT '父菜单ID，0表示顶级菜单',
  `menu_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '类型：1目录 2菜单 3按钮',
  `path` varchar(200) DEFAULT NULL COMMENT '路由路径',
  `component` varchar(200) DEFAULT NULL COMMENT '组件路径',
  `icon` varchar(50) DEFAULT NULL COMMENT '图标',
  `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1启用 0禁用',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`menu_code`),
  KEY `idx_parent` (`parent_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表';

-- 1.5 用户菜单权限表
DROP TABLE IF EXISTS `user_menu`;
CREATE TABLE `user_menu` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `user_id` varchar(32) NOT NULL COMMENT '用户ID',
  `menu_id` varchar(32) NOT NULL COMMENT '菜单ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_menu` (`user_id`, `menu_id`),
  KEY `idx_user` (`user_id`),
  KEY `idx_menu` (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户菜单权限表';

-- ============================================================
-- 2. 患者与检查模块（3张表）
-- ============================================================

-- 2.1 患者信息表
DROP TABLE IF EXISTS `patient_info`;
CREATE TABLE `patient_info` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `patient_id` varchar(50) NOT NULL COMMENT '患者ID（来自PACS）',
  `patient_name` varchar(100) NOT NULL COMMENT '患者姓名',
  `sex` varchar(10) DEFAULT NULL COMMENT '性别：男/女/未知',
  `birth_date` date DEFAULT NULL COMMENT '出生日期',
  `age` int DEFAULT NULL COMMENT '年龄',
  `institution_id` varchar(32) NOT NULL COMMENT '所属机构ID',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_patient_id` (`patient_id`),
  KEY `idx_institution` (`institution_id`),
  KEY `idx_name` (`patient_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='患者信息表';

-- 2.2 检查信息表
DROP TABLE IF EXISTS `study_info`;
CREATE TABLE `study_info` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `study_id` varchar(64) NOT NULL COMMENT '检查ID（用于阅片器调阅）',
  `study_instance_uid` varchar(128) DEFAULT NULL COMMENT '检查实例UID',
  `patient_id` varchar(50) NOT NULL COMMENT '患者ID',
  `study_date` date DEFAULT NULL COMMENT '检查日期',
  `study_time` time DEFAULT NULL COMMENT '检查时间',
  `modality` varchar(20) DEFAULT NULL COMMENT '检查方式：CT/MR/DR/CR/US等',
  `study_description` varchar(255) DEFAULT NULL COMMENT '检查描述',
  `accession_number` varchar(50) DEFAULT NULL COMMENT '检查号',
  `institution_id` varchar(32) NOT NULL COMMENT '所属机构ID',
  `dicom_file_path` varchar(500) DEFAULT NULL COMMENT 'DICOM文件路径',
  `series_count` int DEFAULT '0' COMMENT '序列数',
  `image_count` int DEFAULT '0' COMMENT '图像数',
  `body_part` varchar(50) DEFAULT NULL COMMENT '检查部位',
  `position` varchar(50) DEFAULT NULL COMMENT '体位',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_study_id` (`study_id`),
  KEY `idx_patient` (`patient_id`),
  KEY `idx_institution` (`institution_id`),
  KEY `idx_date` (`study_date`),
  KEY `idx_modality` (`modality`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='检查信息表';

-- 2.3 报告信息表（新增）
DROP TABLE IF EXISTS `report_info`;
CREATE TABLE `report_info` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `report_id` varchar(64) NOT NULL COMMENT '报告ID',
  `study_id` varchar(64) NOT NULL COMMENT '检查ID（关联检查）',
  `patient_id` varchar(50) NOT NULL COMMENT '患者ID',
  `institution_id` varchar(32) NOT NULL COMMENT '所属机构ID',
  `findings` text COMMENT '影像所见',
  `diagnosis` text COMMENT '诊断结论',
  `report_doctor_id` varchar(32) DEFAULT NULL COMMENT '报告医生ID',
  `report_doctor_name` varchar(50) DEFAULT NULL COMMENT '报告医生姓名',
  `report_time` datetime DEFAULT NULL COMMENT '报告时间',
  `audit_doctor_id` varchar(32) DEFAULT NULL COMMENT '审核医生ID',
  `audit_doctor_name` varchar(50) DEFAULT NULL COMMENT '审核医生姓名',
  `audit_time` datetime DEFAULT NULL COMMENT '审核时间',
  `report_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '报告状态：0未报告 1已报告 2已审核',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_report_id` (`report_id`),
  KEY `idx_study` (`study_id`),
  KEY `idx_patient` (`patient_id`),
  KEY `idx_institution` (`institution_id`),
  KEY `idx_report_time` (`report_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='报告信息表';

-- ============================================================
-- 3. 质控核心模块（6张表）
-- ============================================================

-- 3.1 质控因子表
DROP TABLE IF EXISTS `qc_factor`;
CREATE TABLE `qc_factor` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `factor_code` varchar(50) NOT NULL COMMENT '因子编码',
  `factor_name` varchar(100) NOT NULL COMMENT '因子名称',
  `factor_category` tinyint(1) NOT NULL COMMENT '因子分类：1数据质控 2影像质控 3报告质控',
  `factor_type` varchar(20) NOT NULL DEFAULT 'string' COMMENT '数据类型：string/number/date/boolean',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `check_rule` text COMMENT '检查规则（JSON格式）',
  `data_source` varchar(50) DEFAULT NULL COMMENT '数据来源字段',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1启用 0禁用',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`factor_code`),
  KEY `idx_category` (`factor_category`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='质控因子表';

-- 3.2 质控标准表
DROP TABLE IF EXISTS `qc_standard`;
CREATE TABLE `qc_standard` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `standard_code` varchar(50) NOT NULL COMMENT '标准编码',
  `standard_name` varchar(100) NOT NULL COMMENT '标准名称',
  `standard_category` tinyint(1) NOT NULL COMMENT '标准分类：1数据质控 2影像质控 3报告质控',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `pass_score` int NOT NULL DEFAULT '80' COMMENT '合格分数线',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1启用 0禁用',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`standard_code`),
  KEY `idx_category` (`standard_category`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='质控标准表';

-- 3.3 质控标准因子关联表
DROP TABLE IF EXISTS `qc_standard_factor`;
CREATE TABLE `qc_standard_factor` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `standard_id` varchar(32) NOT NULL COMMENT '标准ID',
  `factor_id` varchar(32) NOT NULL COMMENT '因子ID',
  `weight` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '权重（百分比）',
  `is_required` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否必检：1是 0否',
  `threshold_value` text COMMENT '阈值（JSON格式，覆盖因子默认规则）',
  `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_standard_factor` (`standard_id`, `factor_id`),
  KEY `idx_standard` (`standard_id`),
  KEY `idx_factor` (`factor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='质控标准因子关联表';

-- 3.4 质控任务表（支持多质控类型）
DROP TABLE IF EXISTS `qc_task`;
CREATE TABLE `qc_task` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `task_name` varchar(100) NOT NULL COMMENT '任务名称',
  `task_code` varchar(50) NOT NULL COMMENT '任务编码',
  `standard_id` varchar(32) NOT NULL COMMENT '关联质控标准ID',
  `qc_types` varchar(50) NOT NULL COMMENT '质控类型（JSON数组）：[1,2,3] 1数据 2影像 3报告',
  `institution_id` varchar(32) NOT NULL COMMENT '所属机构ID',
  `data_range_type` tinyint(1) NOT NULL COMMENT '数据范围类型：1时间范围 2患者列表',
  `start_date` date DEFAULT NULL COMMENT '开始日期',
  `end_date` date DEFAULT NULL COMMENT '结束日期',
  `patient_ids` text COMMENT '患者ID列表（JSON数组）',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态：0待执行 1执行中 2已完成 3失败',
  `execute_time` datetime DEFAULT NULL COMMENT '执行时间',
  `complete_time` datetime DEFAULT NULL COMMENT '完成时间',
  `total_count` int NOT NULL DEFAULT '0' COMMENT '总检查数',
  `checked_count` int NOT NULL DEFAULT '0' COMMENT '已检数量',
  `pass_count` int NOT NULL DEFAULT '0' COMMENT '合格数',
  `fail_count` int NOT NULL DEFAULT '0' COMMENT '不合格数',
  `is_preset` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否使用预制结果：1是 0否',
  `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`task_code`),
  KEY `idx_standard` (`standard_id`),
  KEY `idx_institution` (`institution_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='质控任务表';

-- 3.5 质控结果表
DROP TABLE IF EXISTS `qc_result`;
CREATE TABLE `qc_result` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `task_id` varchar(32) NOT NULL COMMENT '任务ID',
  `study_id` varchar(64) NOT NULL COMMENT '检查ID',
  `patient_id` varchar(50) NOT NULL COMMENT '患者ID',
  `institution_id` varchar(32) NOT NULL COMMENT '所属机构ID',
  `qc_category` tinyint(1) NOT NULL COMMENT '质控类别：1数据质控 2影像质控 3报告质控',
  `total_score` int NOT NULL DEFAULT '100' COMMENT '总分',
  `pass_score` int NOT NULL DEFAULT '80' COMMENT '合格分',
  `actual_score` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '实际得分',
  `is_pass` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否合格：1是 0否',
  `fail_factors` text COMMENT '不合格因子（JSON数组）',
  `check_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '质检时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_task` (`task_id`),
  KEY `idx_study` (`study_id`),
  KEY `idx_patient` (`patient_id`),
  KEY `idx_institution` (`institution_id`),
  KEY `idx_pass` (`is_pass`),
  KEY `idx_check_time` (`check_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='质控结果表';

-- 3.6 预制结果配置表（系统级，用于演示）
DROP TABLE IF EXISTS `qc_preset_config`;
CREATE TABLE `qc_preset_config` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `config_name` varchar(100) NOT NULL DEFAULT '默认预制配置' COMMENT '配置名称',
  `total_count` int NOT NULL DEFAULT '100' COMMENT '预设总数',
  `pass_count` int NOT NULL DEFAULT '75' COMMENT '预设合格数',
  `fail_count` int NOT NULL DEFAULT '25' COMMENT '预设不合格数',
  `fail_distribution` text COMMENT '不合格因子分布（JSON）',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预制结果配置表';

-- ============================================================
-- 4. 系统日志表
-- ============================================================

-- 4.1 操作日志表
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
  `id` varchar(32) NOT NULL COMMENT '主键ID',
  `user_id` varchar(32) DEFAULT NULL COMMENT '用户ID',
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `operation` varchar(200) DEFAULT NULL COMMENT '操作内容',
  `method` varchar(200) DEFAULT NULL COMMENT '请求方法',
  `params` text COMMENT '请求参数',
  `ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user` (`user_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
