-- 患者画像回访话术系统数据库初始化脚本
-- 更新日期: 2025-09-06
-- 说明: 此文件与 database/models.py 保持同步，包含完整的表结构和初始数据

-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- 创建数据库（如果不存在）
CREATE DATABASE IF NOT EXISTS `callback_system`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE `callback_system`;

-- 创建回访记录表
CREATE TABLE IF NOT EXISTS `callback_records` (
  `record_id` int NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `case_number` varchar(50) NOT NULL COMMENT '病历号',
  `callback_methods` json NOT NULL COMMENT '回访方式（JSON格式）',
  `callback_record` text NOT NULL COMMENT '回访记录内容',
  `callback_result` varchar(50) NOT NULL COMMENT '回访结果（成功/不成功/放弃回访）',
  `next_appointment_time` varchar(50) DEFAULT NULL COMMENT '下次预约时间',
  `failure_reason` varchar(200) DEFAULT NULL COMMENT '不成功原因',
  `failure_note` text COMMENT '不成功备注',
  `abandon_reason` varchar(200) DEFAULT NULL COMMENT '放弃回访原因',
  `abandon_note` text COMMENT '放弃回访备注',
  `ai_feedback_type` varchar(200) DEFAULT NULL COMMENT 'AI反馈类型',
  `ai_feedback_note` text COMMENT 'AI反馈备注',
  `operator` varchar(100) NOT NULL COMMENT '操作员',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `callback_status` varchar(50) NOT NULL DEFAULT '已回访' COMMENT '回访状态',
  `failure_reason_note` text COMMENT '不成功备注',
  `abandon_reason_note` text COMMENT '放弃回访备注',
  PRIMARY KEY (`record_id`),
  KEY `idx_case_number` (`case_number`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_operator` (`operator`),
  KEY `idx_callback_result` (`callback_result`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='回访记录表';

-- 创建用户管理表
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password_hash` varchar(255) NOT NULL COMMENT '密码哈希',
  `salt` varchar(32) DEFAULT NULL,
  `user_type` varchar(20) DEFAULT 'user' COMMENT '用户类型',
  `clinic_access` json DEFAULT NULL COMMENT '诊所访问权限',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_active` tinyint(1) DEFAULT '1' COMMENT '是否激活',
  `last_login` timestamp NULL DEFAULT NULL COMMENT '最后登录时间',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `username` (`username`),
  KEY `idx_user_type` (`user_type`),
  KEY `idx_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户管理表';

-- 插入默认管理员用户（密码: admin123）
INSERT INTO `users` (`username`, `password_hash`, `user_type`, `clinic_access`) VALUES
('admin', 'pbkdf2:sha256:260000$salt$hash', 'admin', '["all"]')
ON DUPLICATE KEY UPDATE `user_type` = 'admin';

-- 创建诊所信息表
CREATE TABLE IF NOT EXISTS `clinics` (
  `clinic_id` int NOT NULL AUTO_INCREMENT COMMENT '诊所ID',
  `clinic_name` varchar(100) NOT NULL COMMENT '诊所名称',
  `clinic_code` varchar(50) NOT NULL COMMENT '诊所代码',
  `clinic_address` varchar(255) DEFAULT NULL COMMENT '诊所地址',
  `clinic_phone` varchar(20) DEFAULT NULL COMMENT '诊所电话',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_active` tinyint(1) DEFAULT '1' COMMENT '是否激活',
  PRIMARY KEY (`clinic_id`),
  UNIQUE KEY `clinic_code` (`clinic_code`),
  KEY `idx_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='诊所信息表';

-- 插入默认诊所信息
INSERT INTO `clinics` (`clinic_name`, `clinic_code`) VALUES 
('东亭门诊', 'dongting'),
('大丰门诊', 'dafeng'),
('惠山门诊', 'huishan'),
('新吴门诊', 'xinwu'),
('河埒门诊', 'helai'),
('红豆门诊', 'hongdou'),
('通善口腔医院', 'hospital'),
('马山门诊', 'mashan'),
('学前街门诊', 'xuexian')
ON DUPLICATE KEY UPDATE `clinic_name` = VALUES(`clinic_name`);

-- 创建患者信息表
CREATE TABLE IF NOT EXISTS `patients` (
  `patient_id` int NOT NULL AUTO_INCREMENT COMMENT '患者ID',
  `case_number` varchar(50) NOT NULL COMMENT '病历号',
  `patient_name` varchar(100) DEFAULT NULL COMMENT '患者姓名',
  `patient_phone` varchar(20) DEFAULT NULL COMMENT '患者电话',
  `gender` varchar(10) DEFAULT NULL COMMENT '性别',
  `age` int DEFAULT NULL COMMENT '年龄',
  `clinic_id` int DEFAULT NULL COMMENT '诊所ID',
  `clinic_name` varchar(100) DEFAULT NULL COMMENT '诊所名称',
  `diagnosis` json DEFAULT NULL COMMENT '诊断信息',
  `treatment_date` date DEFAULT NULL COMMENT '治疗日期',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`patient_id`),
  UNIQUE KEY `case_number` (`case_number`),
  KEY `idx_patient_name` (`patient_name`),
  KEY `idx_clinic_name` (`clinic_name`),
  KEY `idx_treatment_date` (`treatment_date`),
  KEY `fk_patients_clinic_id` (`clinic_id`),
  CONSTRAINT `fk_patients_clinic_id` FOREIGN KEY (`clinic_id`) REFERENCES `clinics` (`clinic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='患者信息表';

-- 创建操作日志表
CREATE TABLE IF NOT EXISTS `operation_logs` (
  `log_id` int NOT NULL AUTO_INCREMENT COMMENT '日志ID',
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `operation` varchar(100) NOT NULL COMMENT '操作类型',
  `target_type` varchar(50) DEFAULT NULL COMMENT '目标类型',
  `target_id` varchar(100) DEFAULT NULL COMMENT '目标ID',
  `operation_details` json DEFAULT NULL COMMENT '操作详情',
  `ip_address` varchar(45) DEFAULT NULL COMMENT 'IP地址',
  `user_agent` varchar(255) DEFAULT NULL COMMENT '用户代理',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`log_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_operation` (`operation`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';

-- 添加外键约束（如果不存在）
-- 注意：由于使用了 IF NOT EXISTS，如果表已存在，外键约束可能需要单独添加

-- 重置外键检查
SET FOREIGN_KEY_CHECKS = 1;

-- ==========================================
-- 数据完整性说明
-- ==========================================
-- 1. 所有表都使用 utf8mb4 字符集，支持完整的 Unicode 字符
-- 2. 时间戳字段自动更新，确保数据追踪
-- 3. 外键约束确保数据一致性
-- 4. 索引优化查询性能
-- 5. 初始数据包含系统运行必需的基础信息

-- ==========================================
-- 维护说明
-- ==========================================
-- 此文件应与 database/models.py 保持同步
-- 如需修改表结构，请同时更新：
-- 1. database/models.py 中的模型定义
-- 2. 生成新的 Flask-Migrate 迁移文件
-- 3. 更新此 init.sql 文件