-- ============================================================ -- 功能:系统管理 - 消息通知管理(客户超额通知) -- 日期:2026-10-09 -- 说明: -- 1) sys_notify_rule 通知规则(当前事件类型:CUSTOMER_OVERDUE 客户已超额) -- 2) sys_notify_rule_target 规则通知对象(USER 指定用户 / ROLE 指定角色,可多个) -- 3) sys_notify_message 通知消息(一次超额扫描/客户/天最多一条,防重复打扰) -- 4) sys_notify_receive 接收人与已读/弹屏记录 -- 5) sys_notify_scan_log 扫描状态日志(用于超额->恢复状态机与当日去重) -- 6) 菜单:系统管理 -> 消息通知管理(system/notify/index) -- 7) 定时任务:notifyCustomerTask.scanOverdue() 每日09:00 -- 口径:通知与核销无关,不涉及任何余额/额度变动。 -- ============================================================ -- 1. 通知规则 CREATE TABLE IF NOT EXISTS `sys_notify_rule` ( `rule_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规则ID', `rule_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '规则名称', `event_type` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'CUSTOMER_OVERDUE' COMMENT '事件类型:CUSTOMER_OVERDUE客户已超额', `status` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '状态(0启用 1停用)', `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', `create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `del_flag` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', PRIMARY KEY (`rule_id`), KEY `idx_snr_event_status` (`event_type`,`status`,`del_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息通知规则'; -- 2. 规则通知对象 CREATE TABLE IF NOT EXISTS `sys_notify_rule_target` ( `target_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '对象ID', `rule_id` bigint(20) NOT NULL COMMENT '规则ID', `target_type` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '对象类型:USER用户/ROLE角色', `ref_id` bigint(20) NOT NULL COMMENT '用户ID或角色ID', `ref_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名/角色名快照', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`target_id`), UNIQUE KEY `uk_snrt_rule_type_ref` (`rule_id`,`target_type`,`ref_id`), KEY `idx_snrt_type_ref` (`target_type`,`ref_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知规则对象(用户/角色)'; -- 3. 通知消息 CREATE TABLE IF NOT EXISTS `sys_notify_message` ( `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息ID', `event_type` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'CUSTOMER_OVERDUE' COMMENT '事件类型', `title` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题', `content` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '内容', `customer_id` bigint(20) DEFAULT NULL COMMENT '关联客户ID', `customer_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户编号快照', `customer_name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户名称快照', `overdue_amount` decimal(18,2) DEFAULT NULL COMMENT '超额金额(CNY,正数)', `create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者(系统任务记为system)', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`message_id`), KEY `idx_snm_event_customer` (`event_type`,`customer_id`), KEY `idx_snm_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知消息'; -- 4. 接收人 CREATE TABLE IF NOT EXISTS `sys_notify_receive` ( `receive_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '接收ID', `message_id` bigint(20) NOT NULL COMMENT '消息ID', `user_id` bigint(20) NOT NULL COMMENT '接收用户ID', `read_flag` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '已读标志(0未读 1已读)', `read_time` datetime DEFAULT NULL COMMENT '阅读时间', `popup_flag` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'N' COMMENT '登录弹屏是否已展示(N否 Y是)', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`receive_id`), UNIQUE KEY `uk_snr_message_user` (`message_id`,`user_id`), KEY `idx_snr_user_popup` (`user_id`,`popup_flag`,`read_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知消息接收人'; -- 5. 扫描状态日志(每客户每事件一行) CREATE TABLE IF NOT EXISTS `sys_notify_scan_log` ( `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', `event_type` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '事件类型', `customer_id` bigint(20) NOT NULL COMMENT '客户ID', `last_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最近状态:OVERDUE超额/NORMAL正常', `last_notify_date` date DEFAULT NULL COMMENT '最近通知日期(当日去重)', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`log_id`), UNIQUE KEY `uk_snsl_event_customer` (`event_type`,`customer_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知扫描状态日志'; -- 6. 菜单:系统管理 -> 消息通知管理 INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES (2450, '消息通知管理', 1, 9, 'notify', 'system/notify/index', NULL, 1, 0, 'C', '0', '0', 'system:notify:list', 'message', 'admin', sysdate(), '消息通知配置与记录'); INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES (2451, '通知规则查询', 2450, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:notify:query', '#', 'admin', sysdate(), ''), (2452, '通知规则新增', 2450, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:notify:add', '#', 'admin', sysdate(), ''), (2453, '通知规则修改', 2450, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:notify:edit', '#', 'admin', sysdate(), ''), (2454, '通知规则删除', 2450, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:notify:remove', '#', 'admin', sysdate(), ''); -- 7. 定时任务:客户超额通知扫描(每日09:00,misfire不补偿、禁止并发) INSERT INTO `sys_job`(`job_id`, `job_name`, `job_group`, `invoke_target`, `cron_expression`, `misfire_policy`, `concurrent`, `status`, `create_by`, `create_time`, `remark`) VALUES (8, '客户超额通知扫描', 'DEFAULT', 'notifyCustomerTask.scanOverdue()', '0 0 9 * * ?', '3', '1', '0', 'admin', sysdate(), '扫描已超额(欠费)客户并按通知规则投递消息');