# 消息通知与待办模块设计开发文档 ## 一、概述 - **消息通知模块**:统一的消息发送能力,支持给企业/人员发送通知消息,记录接收人关联。 - **待办模块**:统一的待办创建与查询能力,支持给企业/人员生成待办,前端可通过目标页面路径进行跳转。 --- ## 二、数据库设计 ### 2.1 消息通知记录表 **文件**:`jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/../.docs/sql/建表语句/消息通知记录表.sql` ```sql -- 主表 CREATE TABLE notification_record ( ID VARCHAR(36) NOT NULL, MODULE_TYPE VARCHAR(50) COMMENT '来源模块', SUBJECT VARCHAR(200) NOT NULL COMMENT '消息主题', CONTENT VARCHAR(2000) COMMENT '消息内容', SENDER_ID VARCHAR(36) COMMENT '推送人用户ID(关联sys_user)', SENDER VARCHAR(50) NOT NULL COMMENT '推送人姓名', SEND_TIME TIMESTAMP NOT NULL COMMENT '推送时间', CREATE_BY VARCHAR(50), CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, SYS_ORG_CODE VARCHAR(50), PRIMARY KEY (ID) ); COMMENT ON TABLE notification_record IS '消息通知记录表'; -- 后增字段 ALTER TABLE notification_record ADD EXPIRE_TIME TIMESTAMP; COMMENT ON COLUMN notification_record.EXPIRE_TIME IS '过期时间'; ALTER TABLE notification_record ADD STATUS VARCHAR(20) DEFAULT '0'; COMMENT ON COLUMN notification_record.STATUS IS '状态: 0未读 1已读'; -- 接收人关联表 CREATE TABLE notification_target ( NOTIFICATION_ID VARCHAR(36) NOT NULL COMMENT '消息ID', TARGET_TYPE VARCHAR(20) NOT NULL COMMENT '类型: personal/enterprise', TARGET_ID VARCHAR(36) NOT NULL COMMENT '目标ID' ); COMMENT ON TABLE notification_target IS '消息接收人关联表'; CREATE INDEX idx_nt_target ON notification_target(TARGET_TYPE, TARGET_ID); CREATE INDEX idx_nt_notify ON notification_target(NOTIFICATION_ID); ALTER TABLE notification_target ADD STATUS VARCHAR(20) DEFAULT '0'; COMMENT ON COLUMN notification_target.STATUS IS '状态: 0未读 1已读'; ``` ### 2.2 待办记录表 **文件**:`jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/../.docs/sql/建表语句/待办记录表.sql` ```sql -- 主表 CREATE TABLE todo_record ( ID VARCHAR(36) NOT NULL, MODULE_TYPE VARCHAR(50) COMMENT '来源模块', SUBJECT VARCHAR(200) NOT NULL COMMENT '待办标题', CONTENT VARCHAR(2000) COMMENT '待办内容', CREATOR_ID VARCHAR(36) COMMENT '发起人用户ID(关联sys_user)', CREATOR VARCHAR(50) NOT NULL COMMENT '发起人姓名', CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', STATUS VARCHAR(20) DEFAULT '0' NOT NULL COMMENT '状态: 0待处理 1已完成 2已取消', COMPLETE_TIME TIMESTAMP COMMENT '完成时间', EXPIRE_TIME TIMESTAMP COMMENT '过期时间', TARGET_PAGE VARCHAR(500) COMMENT '目标页面路径', DATA_ID VARCHAR(36) COMMENT '数据ID', PATH_PARAMS VARCHAR(500) COMMENT '路径参数', SYS_ORG_CODE VARCHAR(50), PRIMARY KEY (ID) ); COMMENT ON TABLE todo_record IS '待办记录表'; -- 接收人关联表 CREATE TABLE todo_target ( TODO_ID VARCHAR(36) NOT NULL COMMENT '待办ID', TARGET_TYPE VARCHAR(20) NOT NULL COMMENT '类型: personal/enterprise', TARGET_ID VARCHAR(36) NOT NULL COMMENT '目标ID' ); COMMENT ON TABLE todo_target IS '待办接收人关联表'; CREATE INDEX idx_tt_target ON todo_target(TARGET_TYPE, TARGET_ID); CREATE INDEX idx_tt_todo ON todo_target(TODO_ID); ALTER TABLE todo_target ADD STATUS VARCHAR(20) DEFAULT '0'; COMMENT ON COLUMN todo_target.STATUS IS '状态: 0待处理 1已完成 2已取消'; ``` --- ## 三、消息通知模块使用说明 ### 3.1 引入 Service ```java @Autowired private INotificationRecordService notificationRecordService; ``` ### 3.2 方法签名 ```java NotificationRecord sendMessage( String moduleType, // 来源模块(如 "interview", "offer") String subject, // 消息主题 String content, // 消息内容 String senderId, // 推送人用户ID(系统发起可传空字符串) String sender, // 推送人姓名 Date expireTime, // 过期时间(不传则传 null) List targets // 接收人列表 ); ``` ### 3.3 调用示例 ```java // 构建接收人 NotificationTarget target = new NotificationTarget(); target.setTargetType("enterprise"); // personal / enterprise target.setTargetId(enterprise.getId()); // 计算过期时间:当前时间 + 1天 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, 1); Date expireTime = cal.getTime(); // 发送通知 notificationRecordService.sendMessage( "interview", // moduleType "面试反馈通知", // subject String.format("求职者【%s】已确认参加面试【%s】", personalName, postName), // content "", // senderId(系统发起) personalName, // sender expireTime, // expireTime Collections.singletonList(target) // targets ); ``` --- ## 四、待办模块使用说明 ### 4.1 引入 Service ```java @Autowired private ITodoRecordService todoRecordService; ``` ### 4.2 方法签名 ```java TodoRecord createTodo( String moduleType, // 来源模块(如 "offer") String subject, // 待办标题 String content, // 待办内容 String creatorId, // 发起人用户ID(系统发起可传空字符串) String creator, // 发起人姓名 String targetPage, // 前端路由路径 String dataId, // 关联的业务数据主键ID String pathParams, // 路径参数 List targets // 接收人列表 ); ``` ### 4.3 调用示例 ```java // 构建接收人 TodoTarget target = new TodoTarget(); target.setTargetType("personal"); // personal / enterprise target.setTargetId(personal.getId()); // 生成待办 todoRecordService.createTodo( "offer", // moduleType "录用通知", // subject String.format("您已被【%s】的【%s】岗位录用,请前往查看并确认签约", enterpriseName, postName), // content "", // creatorId(系统发起) enterpriseName, // creator "pages/personal/my-jobs/index", // targetPage offerId, // dataId "fromTab=2", // pathParams Collections.singletonList(target) // targets ); ``` ### 4.4 接收人列表(批量发送) 两个模块都支持批量发送,`targets` 参数可以传入多个接收人: ```java List targets = Arrays.asList( new TodoTarget().setTargetType("personal").setTargetId(id1), new TodoTarget().setTargetType("enterprise").setTargetId(id2) ); ``` --- ## 五、过期时间规则 | 场景 | 过期时间计算 | |------|-------------| | 面试通知(求职者反馈给企业) | 面试时间 + 1天 | | 面试结果通知(企业回传给求职者) | 面试时间 + 1天 | | 录用待办 | 无过期(null) | | 录用反馈通知 | 无过期(null) | --- ## 六、moduleType 取值约定 | moduleType 值 | 说明 | |--------------|------| | `interview` | 面试相关通知/待办 | | `offer` | 录用相关通知/待办 |