-- ===========================================
-- 通知任务主表
-- 用于统一管理待发送的通知任务，由消息系统决定发送渠道
-- ===========================================

-- 删除旧表（如果需要重建）
-- DROP TABLE IF EXISTS `sys_notify_task`;

CREATE TABLE `sys_notify_task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `task_id` bigint(20) NOT NULL COMMENT '关联的业务任务ID',
  `task_code` varchar(64) DEFAULT NULL COMMENT '任务编号',
  `notify_type` varchar(32) NOT NULL COMMENT '通知类型：TASK_ASSIGN-任务分配, STATUS_CHANGE-状态变更, TASK_CREATE-任务创建',
  `user_id` bigint(20) NOT NULL COMMENT '接收用户ID',
  `user_name` varchar(64) DEFAULT NULL COMMENT '接收用户姓名',
  `user_phone` varchar(20) DEFAULT NULL COMMENT '接收用户手机号',
  `title` varchar(200) DEFAULT NULL COMMENT '通知标题',
  `content` varchar(500) DEFAULT NULL COMMENT '通知内容',
  `extra_data` text COMMENT '扩展数据(JSON格式，用于模板变量等)',
  `status` char(1) NOT NULL DEFAULT '0' COMMENT '处理状态：0-待处理, 1-处理中, 2-已完成, 3-失败',
  `retry_count` int(11) DEFAULT '0' COMMENT '重试次数',
  `max_retry` int(11) DEFAULT '3' COMMENT '最大重试次数',
  `error_msg` varchar(500) DEFAULT NULL COMMENT '错误信息',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_user_type` (`task_id`, `user_id`, `notify_type`) COMMENT '防重索引：同一任务同一用户同一类型只能有一条',
  KEY `idx_status` (`status`) COMMENT '状态索引，用于查询待处理任务',
  KEY `idx_user_id` (`user_id`) COMMENT '用户索引',
  KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知任务主表';

-- ===========================================
-- 通知渠道配置表
-- 用于配置各类通知启用的发送渠道
-- ===========================================

CREATE TABLE `sys_notify_channel_config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `notify_type` varchar(32) NOT NULL COMMENT '通知类型',
  `channel` varchar(32) NOT NULL COMMENT '渠道：WECHAT-微信订阅消息, SMS-短信, SITE_MSG-站内消息, APP_PUSH-APP推送',
  `enabled` char(1) NOT NULL DEFAULT '1' COMMENT '是否启用：0-禁用, 1-启用',
  `priority` int(11) DEFAULT '0' COMMENT '优先级（数字越大优先级越高）',
  `config_json` text COMMENT '渠道配置(JSON格式，如模板ID等)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_type_channel` (`notify_type`, `channel`) COMMENT '通知类型和渠道唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知渠道配置表';

-- ===========================================
-- 初始化通知渠道配置
-- ===========================================

-- 任务分配通知 - 启用微信、短信、站内消息
INSERT INTO `sys_notify_channel_config` (`notify_type`, `channel`, `enabled`, `priority`, `config_json`, `create_by`, `create_time`, `remark`) VALUES
('TASK_ASSIGN', 'SITE_MSG', '1', 100, NULL, 'admin', NOW(), '任务分配-站内消息'),
('TASK_ASSIGN', 'WECHAT', '1', 90, NULL, 'admin', NOW(), '任务分配-微信订阅消息'),
('TASK_ASSIGN', 'SMS', '0', 80, NULL, 'admin', NOW(), '任务分配-短信（默认关闭）');

-- 状态变更通知 - 仅启用站内消息
INSERT INTO `sys_notify_channel_config` (`notify_type`, `channel`, `enabled`, `priority`, `config_json`, `create_by`, `create_time`, `remark`) VALUES
('STATUS_CHANGE', 'SITE_MSG', '1', 100, NULL, 'admin', NOW(), '状态变更-站内消息');

-- 任务创建通知 - 仅启用站内消息
INSERT INTO `sys_notify_channel_config` (`notify_type`, `channel`, `enabled`, `priority`, `config_json`, `create_by`, `create_time`, `remark`) VALUES
('TASK_CREATE', 'SITE_MSG', '1', 100, NULL, 'admin', NOW(), '任务创建-站内消息');

-- ===========================================
-- 修改发送记录表，增加关联通知任务主表的字段
-- ===========================================

-- 如果 sys_notify_send_log 表已存在，添加 notify_task_id 字段
ALTER TABLE `sys_notify_send_log` 
ADD COLUMN `notify_task_id` bigint(20) DEFAULT NULL COMMENT '关联的通知任务ID' AFTER `id`,
ADD INDEX `idx_notify_task_id` (`notify_task_id`);

-- ===========================================
-- 说明：
-- 1. sys_notify_task 是通知任务主表，记录需要发送的通知
-- 2. sys_notify_channel_config 配置每种通知类型启用哪些渠道
-- 3. sys_notify_send_log 记录每个渠道的发送明细
--
-- 工作流程：
-- 1) 业务系统创建通知任务（插入 sys_notify_task）
-- 2) 通知分发服务读取渠道配置（sys_notify_channel_config）
-- 3) 根据配置向各渠道发送通知，并记录发送日志（sys_notify_send_log）
-- 4) 更新通知任务状态
-- ===========================================
