-- =====================================================
-- 消息通知模块 - 数据库表结构
-- 包含3张表：消息主体表、消息接收对象表、用户消息表
-- =====================================================

-- 1. 消息主体表
DROP TABLE IF EXISTS tb_sys_message;
CREATE TABLE tb_sys_message (
    -- 基础标识
    id VARCHAR(50) PRIMARY KEY  COMMENT '主键ID',
    message_id VARCHAR(50) NOT NULL UNIQUE COMMENT '消息唯一标识',

    -- 消息内容
    title VARCHAR(200) NOT NULL COMMENT '消息标题',
    content TEXT NOT NULL COMMENT '消息内容',
    message_type VARCHAR(20) NOT NULL DEFAULT 'notification' COMMENT '消息类型：notification-通知/announcement-公告/warning-预警',
    priority VARCHAR(20) NOT NULL DEFAULT 'normal' COMMENT '优先级：normal-普通/important-重要/urgent-紧急',

    -- 发送人信息
    sender_id VARCHAR(50) NOT NULL COMMENT '发送人用户ID',
    sender_name VARCHAR(100) COMMENT '发送人姓名（冗余字段）',
    sender_dept_id VARCHAR(50) NOT NULL COMMENT '发送人部门ID',
    sender_dept_name VARCHAR(100) COMMENT '发送人部门名称（冗余字段）',

    -- 发送时间控制（定时发送功能）
    send_mode VARCHAR(20) NOT NULL DEFAULT 'immediate' COMMENT '发送模式：immediate-立即发送/scheduled-定时发送',
    scheduled_time DATETIME COMMENT '计划发送时间（sendMode=scheduled时必填）',
    actual_send_time DATETIME COMMENT '实际发送时间',

    -- 状态管理
    status VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT '状态：draft-草稿/pending-待发送/sending-发送中/sent-已发送/failed-失败/cancelled-已取消',

    -- 统计信息
    target_user_count INT DEFAULT 0 COMMENT '目标用户总数',
    sent_count INT DEFAULT 0 COMMENT '已发送数量',
    success_count INT DEFAULT 0 COMMENT '发送成功数量',
    failed_count INT DEFAULT 0 COMMENT '发送失败数量',
    read_count INT DEFAULT 0 COMMENT '已读数量',

    -- 失败处理和重试机制
    retry_count INT DEFAULT 0 COMMENT '当前重试次数',
    max_retry_count INT DEFAULT 3 COMMENT '最大重试次数',
    last_error TEXT COMMENT '最后错误信息',

    -- 基础字段
    creator VARCHAR(50) COMMENT '创建人ID',
    updater VARCHAR(50) COMMENT '更新人ID',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    delete_time DATETIME COMMENT '删除时间',
    deleted BIT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除：0-未删除，1-已删除',

    -- 索引
    INDEX idx_message_id (message_id),
    INDEX idx_sender_id (sender_id),
    INDEX idx_sender_dept_id (sender_dept_id),
    INDEX idx_status (status),
    INDEX idx_send_mode (send_mode),
    INDEX idx_scheduled_time (scheduled_time),
    INDEX idx_create_time (create_time),
    INDEX idx_delete_time (delete_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='消息主体表';


-- 2. 消息发送方式接收对象表
DROP TABLE IF EXISTS tb_sys_message_target;
CREATE TABLE tb_sys_message_target (
    -- 基础标识
    id VARCHAR(50) PRIMARY KEY  COMMENT '主键ID',
    message_id VARCHAR(50) NOT NULL COMMENT '消息ID（关联tb_sys_message.message_id）',

    -- 发送方式
    send_method VARCHAR(100) NOT NULL COMMENT '发送方式：system-系统消息/email-邮件/sms-短信（多选时逗号分隔，如：system,email）',

    -- 接收对象
    target_type VARCHAR(20) NOT NULL COMMENT '接收对象类型：dept-部门/role-角色/user-人员',
    target_id VARCHAR(50) NOT NULL COMMENT '接收对象ID（部门ID/角色ID/用户ID）',
    target_name VARCHAR(100) COMMENT '接收对象名称（冗余字段，便于展示）',

    -- 作用域部门（关键字段：限制角色的部门范围）
    scope_dept_id VARCHAR(50) NOT NULL COMMENT '作用域部门ID：dept时与target_id相同；role时表示该角色限定在哪个部门及其子部门范围内；user时为用户所属部门ID',

    -- 基础字段
    creator VARCHAR(50) COMMENT '创建人ID',
    updater VARCHAR(50) COMMENT '更新人ID',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    delete_time DATETIME COMMENT '删除时间',
    deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除：0-未删除，1-已删除',

    -- 索引
    INDEX idx_messageID (message_id),
    INDEX idx_target_type (target_type),
    INDEX idx_scope_dept_id (scope_dept_id),
    INDEX idx_delete_time (delete_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='消息发送方式接收对象表';


-- 3. 用户接收消息表
DROP TABLE IF EXISTS tb_sys_message_user;
CREATE TABLE tb_sys_message_user (
    -- 基础标识
    id VARCHAR(50) PRIMARY KEY  COMMENT '主键ID',
    message_id VARCHAR(50) NOT NULL COMMENT '消息ID（关联tb_sys_message.message_id）',
    user_id VARCHAR(50) NOT NULL COMMENT '接收用户ID',

    -- 发送方式
    send_method VARCHAR(20) NOT NULL COMMENT '实际发送方式：system-系统消息/email-邮件/sms-短信',

    -- 阅读状态
    is_read tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已读：0-未读，1-已读',
    read_time DATETIME COMMENT '阅读时间',

    -- 发送状态
    send_status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '发送状态：pending-待发送/success-发送成功/failed-发送失败',
    fail_reason TEXT COMMENT '失败原因',

    -- 基础字段
    creator VARCHAR(50) COMMENT '创建人ID',
    updater VARCHAR(50) COMMENT '更新人ID',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    delete_time DATETIME COMMENT '删除时间',
    deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除：0-未删除，1-已删除',

    -- 索引
    INDEX idx_message_id (message_id),
    INDEX idx_user_id (user_id),
    INDEX idx_is_read (is_read),
    INDEX idx_send_status (send_status),
    INDEX idx_deleted (deleted),
    INDEX idx_user_read (user_id, is_read, deleted) COMMENT '用户未读消息查询索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户接收消息表';


-- =====================================================
-- 初始化说明
-- =====================================================
-- 1. 执行本SQL脚本创建3张表
-- 2. 执行message_menu.sql插入菜单权限数据
-- 3. 表结构说明：
--    - tb_sys_message：存储消息主体信息，支持定时发送
--    - tb_sys_message_target：存储接收对象配置，scopeDeptID限制权限范围
--    - tb_sys_message_user：存储每个用户的消息记录，支持已读/未读状态
-- =====================================================
