feat: 完成消息通知中心全功能开发

1. 新增消息通知相关实体、Mapper、Service、控制器与前端页面
2. 实现审批通知、报价到期提醒等通知发送逻辑
3. 完成通知菜单配置与路由注册
4. 修复通知数据与跳转路径问题
5. 新增配套SQL脚本与定时任务
This commit is contained in:
2026-06-21 04:20:44 +08:00
parent 41b2e3e772
commit 8bdb8d7c23
27 changed files with 1817 additions and 132 deletions

5
sql/_q2.sql Normal file
View File

@@ -0,0 +1,5 @@
SELECT menu_id, menu_name, parent_id, path FROM sys_menu WHERE parent_id=2000 ORDER BY menu_id;
SELECT '---bid_sub2---' AS '';
SELECT m.menu_id, m.menu_name, m.parent_id, m.path, m.component FROM sys_menu m WHERE m.parent_id IN (SELECT menu_id FROM sys_menu WHERE parent_id=2000);
SELECT '---bizconfig---' AS '';
SELECT menu_id, menu_name, parent_id, path, component FROM sys_menu WHERE parent_id=2130;

1
sql/_q3.sql Normal file
View File

@@ -0,0 +1 @@
SELECT menu_id, menu_name, parent_id, path, component FROM sys_menu WHERE parent_id=2060;

3
sql/_query.sql Normal file
View File

@@ -0,0 +1,3 @@
SELECT menu_id, menu_name, parent_id, order_num, path FROM sys_menu WHERE menu_name LIKE '%approval%' OR menu_name LIKE '%待我%' OR path LIKE '%approval%' OR path LIKE '%待我%';
SELECT '---' AS 'all_menus';
SELECT menu_id, menu_name, parent_id, order_num, path FROM sys_menu ORDER BY parent_id, order_num;

72
sql/bid_notify.sql Normal file
View File

@@ -0,0 +1,72 @@
-- ════════════════════════════════════════════════════════════════════
-- 消息通知中心 - 数据库表结构
-- 功能:统一管理站内通知,支持审批结果、报价到期、任务分配等场景
-- 执行方式: mysql --default-character-set=utf8mb4 -u root -p < bid_notify.sql
-- ════════════════════════════════════════════════════════════════════
SET NAMES utf8mb4;
-- 1. 消息通知表(存储所有通知消息)
DROP TABLE IF EXISTS biz_notify_message;
CREATE TABLE biz_notify_message (
message_id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '消息ID',
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
user_id BIGINT NOT NULL COMMENT '接收人用户ID',
notice_type VARCHAR(32) NOT NULL COMMENT '通知类型(approval-审批结果/quotation_expire-报价到期/rfq_deadline-RFQ截止/task-任务分配/system-系统公告/exception-异常提醒)',
priority TINYINT DEFAULT 0 COMMENT '优先级(0普通 1重要 2紧急)',
title VARCHAR(200) NOT NULL COMMENT '消息标题',
content TEXT COMMENT '消息内容',
biz_type VARCHAR(32) COMMENT '关联业务类型(PURCHASE_ORDER/CLIENT_QUOTE/QUOTATION/DELIVERY_ORDER/ORDER_OBJECTION)',
biz_id BIGINT COMMENT '关联业务ID',
biz_url VARCHAR(255) COMMENT '业务跳转URL',
is_read CHAR(1) DEFAULT '0' COMMENT '是否已读(0未读 1已读)',
read_time DATETIME COMMENT '阅读时间',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
KEY idx_user_read (user_id, is_read),
KEY idx_user_type (user_id, notice_type),
KEY idx_tenant (tenant_id),
KEY idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息通知表';
-- 2. 通知规则配置表(定义各类通知的触发规则)
DROP TABLE IF EXISTS biz_notify_rule;
CREATE TABLE biz_notify_rule (
rule_id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '规则ID',
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID',
rule_name VARCHAR(100) NOT NULL COMMENT '规则名称',
notice_type VARCHAR(32) NOT NULL COMMENT '通知类型',
biz_type VARCHAR(32) COMMENT '业务类型',
trigger_condition VARCHAR(500) COMMENT '触发条件(JSON格式)',
advance_days INT DEFAULT 0 COMMENT '提前提醒天数(用于到期类提醒)',
enabled CHAR(1) DEFAULT '0' COMMENT '是否启用(0停用 1启用)',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
KEY idx_tenant_type (tenant_id, notice_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知规则配置表';
-- 3. 初始化默认通知规则
INSERT INTO biz_notify_rule (rule_name, notice_type, biz_type, trigger_condition, advance_days, enabled, create_by) VALUES
('审批结果通知', 'approval', NULL, '{"event":"approve,reject"}', 0, '1', 'admin'),
('报价到期提醒', 'quotation_expire', 'QUOTATION', '{"field":"submit_time","unit":"day"}', 3, '1', 'admin'),
('报价到期紧急提醒', 'quotation_expire', 'QUOTATION', '{"field":"submit_time","unit":"day"}', 1, '1', 'admin'),
('RFQ截止提醒', 'rfq_deadline', NULL, '{"field":"deadline","unit":"day"}', 2, '1', 'admin'),
('系统公告', 'system', NULL, '{}', 0, '1', 'admin');
-- 4. 菜单权限初始化
-- 消息通知中心菜单(挂在"系统配置"目录 menu_id=2130 path=bizconfig 下,与"待我审批"同级)
DELETE FROM sys_menu WHERE menu_id IN (2170, 2171, 2172, 2173, 2174);
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES
(2170, '消息通知中心', 2130, 100, 'notify', 'bid/notify/index', 1, 0, 'C', '0', '0', 'bid:notify:list', 'message', 'admin', sysdate(), '消息通知中心'),
(2171, '通知查询', 2170, 1, '', '', 1, 0, 'F', '0', '0', 'bid:notify:query', '#', 'admin', sysdate(), ''),
(2172, '通知删除', 2170, 2, '', '', 1, 0, 'F', '0', '0', 'bid:notify:remove', '#', 'admin', sysdate(), ''),
(2173, '标记已读', 2170, 3, '', '', 1, 0, 'F', '0', '0', 'bid:notify:read', '#', 'admin', sysdate(), ''),
(2174, '通知规则配置', 2170, 4, '', '', 1, 0, 'F', '0', '0', 'bid:notify:rule', '#', 'admin', sysdate(), '');
-- 为 admin 角色授权
DELETE FROM sys_role_menu WHERE role_id = 1 AND menu_id IN (2170, 2171, 2172, 2173, 2174);
INSERT INTO sys_role_menu (role_id, menu_id) VALUES
(1, 2170), (1, 2171), (1, 2172), (1, 2173), (1, 2174);

20
sql/bid_notify_fix.sql Normal file
View File

@@ -0,0 +1,20 @@
-- ════════════════════════════════════════════════════════════════════
-- 消息通知中心 - Bug 修复脚本
-- 修复内容:
-- 1. 注册 Quartz 定时任务(报价到期检查)
-- 2. 将现有待审批的 CLIENT_QUOTE(quote_id=6) 状态重置为 draft
-- ════════════════════════════════════════════════════════════════════
SET NAMES utf8mb4;
-- 1. 注册 Quartz 定时任务报价到期检查每天上午9点执行
-- 如果已通过 UI 注册则跳过
DELETE FROM sys_job WHERE job_name = '报价到期检查' AND job_group = 'DEFAULT';
INSERT INTO sys_job (job_id, job_name, job_group, invoke_target, cron_expression,
misfire_policy, concurrent, status, create_by, create_time, remark)
VALUES (100, '报价到期检查', 'DEFAULT',
'quotationExpireTask.checkQuotationExpire()',
'0 0 9 * * ?',
'3', '1', '0', 'admin', sysdate(), '报价到期提醒,每天检查即将到期和已过期的报价单');
-- 2. 将 quote_id=6 的测试数据重置为 draft 方便重新测试审批提交通知
UPDATE biz_client_quote SET status = 'draft', update_time = sysdate() WHERE quote_id = 6 AND status = '10';

21
sql/bid_notify_fix2.sql Normal file
View File

@@ -0,0 +1,21 @@
-- ════════════════════════════════════════════════════════════════════
-- 消息通知中心 - 修复脚本 #2
-- 修复内容:
-- 1. 修复现有通知 is_read=NULL 的问题导致铃铛未读数为0
-- 2. 将消息通知中心菜单从"系统管理"下移到"系统配置"下,与"待我审批"同级
-- ════════════════════════════════════════════════════════════════════
SET NAMES utf8mb4;
-- 1. 修复现有数据的 is_read=NULL → '0'(新消息默认未读)
UPDATE biz_notify_message SET is_read = '0' WHERE is_read IS NULL OR is_read = '';
-- 2. 移动"消息通知中心"菜单从"系统管理"(parent_id=1) 到"系统配置"(parent_id=2130)
-- 放到"待我审批"(order_num=99) 之后order_num=100
UPDATE sys_menu SET parent_id = 2130, order_num = 100
WHERE menu_id = 2170 AND parent_id = 1;
-- 3. 为 admin 角色重新授权(菜单路径变了,权限不受影响,但刷新一下角色-菜单关联)
-- 注: role_id=1(admin) 的关联已在初始化 SQL 中添加,这里不做重复插入
-- 4. 清理之前插入的测试通知记录is_read 已修复,保留即可)
-- 无需操作

17
sql/bid_notify_fix3.sql Normal file
View File

@@ -0,0 +1,17 @@
-- ════════════════════════════════════════════════════════════════════
-- 消息通知中心 - 修复脚本 #3
-- 修复内容:
-- 1. 修复通知菜单路径为绝对路径 /bid/notify解决"查看全部" 404
-- 2. 修复所有通知的 bizUrl 跳转路径(解决"查看详情" 404
-- ════════════════════════════════════════════════════════════════════
SET NAMES utf8mb4;
-- 1. 修复通知菜单路径为绝对路径,使 /bid/notify 路由生效
UPDATE sys_menu SET path = '/bid/notify' WHERE menu_id = 2170;
-- 2. 修复现有通知的 bizUrl将旧路径改为正确路径
UPDATE biz_notify_message SET biz_url = REPLACE(biz_url, '/bid/purchaseorder?id=', '/quote/purchaseorder?id=') WHERE biz_url LIKE '/bid/purchaseorder?id=%';
UPDATE biz_notify_message SET biz_url = REPLACE(biz_url, '/bid/clientquote?id=', '/bid/clientquote/detail?id=') WHERE biz_url LIKE '/bid/clientquote?id=%';
UPDATE biz_notify_message SET biz_url = REPLACE(biz_url, '/bid/quotation?quotationId=', '/quote/quotation?quotationId=') WHERE biz_url LIKE '/bid/quotation?quotationId=%';
UPDATE biz_notify_message SET biz_url = REPLACE(biz_url, '/bid/order/pending?id=', '/bid/order/pending?id=') WHERE biz_url LIKE '/bid/order/pending?id=%';
UPDATE biz_notify_message SET biz_url = REPLACE(biz_url, '/bid/objection?id=', '/bid/order/objection?id=') WHERE biz_url LIKE '/bid/objection?id=%';