260624-消息与待办模块设计开发文档.md 9.5 KB

消息通知与待办模块设计开发文档

一、概述

本文档记录了消息通知模块和待办模块的数据库设计、后端接口与实现,以及其他业务模块(面试、录用)对这两个模块的调用示例。

  • 消息通知模块:为系统提供统一的消息发送能力,支持给企业/人员发送通知消息,记录接收人关联并更新最后通知时间。
  • 待办模块:为系统提供待办事项的创建与查询能力,支持给企业/人员生成待办,前端可通过目标页面路径进行跳转。

二、数据库设计

2.1 消息通知记录表

文件.docs/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)
);

-- 后增字段(ALTER 方式)
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'
);

2.2 待办记录表

文件.docs/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 '路径参数(JSON格式)',
    SYS_ORG_CODE  VARCHAR(50),
    PRIMARY KEY (ID)
);

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'
);

2.3 表结构对比

特性 notification_record todo_record
主信息 主题、内容、发送人 标题、内容、发起人
时间 发送时间、过期时间 创建时间、完成时间、过期时间
状态 0未读/1已读 0待处理/1已完成/2已取消
跳转字段 TARGET_PAGE、DATA_ID、PATH_PARAMS
接收人关联 notification_target todo_target

三、后端模块设计

3.1 消息通知模块

包路径org.jeecg.modules.zjrs.notification

文件 操作 说明
entity/NotificationRecord.java 修改 新增 expireTimestatus 字段
service/INotificationRecordService.java 修改 新增 sendMessage() 方法
service/impl/NotificationRecordServiceImpl.java 修改 实现 sendMessage(),含事务写主表、关联表、更新状态表

sendMessage() 方法说明

入参:
  - moduleType : 来源模块(如 "interview", "offer")
  - subject    : 消息主题
  - content    : 消息内容
  - senderId   : 推送人用户ID
  - sender     : 推送人姓名
  - expireTime : 过期时间(可为null)
  - targets    : 接收人列表(List<NotificationTarget>)

执行流程:
  1. 构建消息主记录,STATUS 默认 "0"(未读)
  2. 保存主记录
  3. 遍历接收人,逐条写入 notification_target
  4. 根据 targetType 更新 enterprise_status_local 或 personal_status_local 的 last_notice_time

3.2 待办模块

包路径org.jeecg.modules.zjrs.todo

文件 操作 说明
entity/TodoRecord.java 新建 待办主表实体,包含跳转字段
entity/TodoTarget.java 新建 待办接收人关联实体
mapper/TodoRecordMapper.java 新建 MyBatis Plus Mapper
mapper/TodoTargetMapper.java 新建 MyBatis Plus Mapper
mapper/xml/TodoRecordMapper.xml 新建 Mapper XML(空)
service/ITodoRecordService.java 新建 接口包含 createTodo()queryMyList()
service/impl/TodoRecordServiceImpl.java 新建 实现,含事务写主表和关联表
controller/TodoController.java 新建 GET /todo/myList 分页查询当前用户待办

createTodo() 方法说明

入参:
  - moduleType : 来源模块
  - subject    : 待办标题
  - content    : 待办内容
  - creatorId  : 发起人用户ID
  - creator    : 发起人姓名
  - targetPage : 前端路由路径(如 "pages/personal/my-jobs/index")
  - dataId     : 关联的业务数据主键ID
  - pathParams : 路径参数(如 "fromTab=2")
  - targets    : 接收人列表

执行流程:
  1. 构建待办主记录,STATUS 默认 "0"(待处理)
  2. 保存主记录
  3. 遍历接收人,逐条写入 todo_target

queryMyList() 方法说明

入参:
  - targetId   : 用户ID
  - targetType : 用户类型(personal/enterprise)
  - keyword    : 关键字(模糊匹配标题)
  - moduleType : 来源模块过滤
  - status     : 状态过滤
  - pageNo     : 页码
  - pageSize   : 每页条数

执行流程:
  1. 从 todo_target 查出当前用户的所有待办ID
  2. 根据 ID 列表分页查询 todo_record,支持 keyword/moduleType/status 过滤
  3. 遍历结果,填充每条的 targets 列表及目标名称

四、业务模块调用示例

4.1 面试模块

文件变更

文件 操作 说明
interview/service/IInterviewRecordService.java 修改 新增 attendInterview、notAttendInterview、passInterview、failInterview、offerJob 方法
interview/service/impl/InterviewRecordServiceImpl.java 修改 实现上述方法,调用 sendMessage 和 createTodo
interview/controller/InterviewRecordController.java 修改 4个接口改为委托 service

调用链路

接口 触发 行为
PUT /interviewRecord/attend 求职者确认参加 状态改"参加" → 通知企业「求职者已确认参加面试」
PUT /interviewRecord/notAttend 求职者不参加 状态改"不参加" → 通知企业「求职者已不参加面试」
PUT /interviewRecord/pass 企业面试通过 状态改"通过" → 通知求职者「面试已通过」
PUT /interviewRecord/fail 企业面试不通过 状态改"不通过" → 通知求职者「面试未通过」
POST /interviewRecord/offer 企业发起录用 创建录用记录 → 生成待办「录用通知」给求职者

待办配置(发起录用时)

todoRecordService.createTodo(
    "offer",                              // moduleType
    "录用通知",                           // subject
    "您已被【XX公司】的【Java开发】岗位录用...",  // content
    "",                                   // creatorId(系统发起)
    record.getEnterpriseName(),           // creator
    "pages/personal/my-jobs/index",       // targetPage
    employmentOffer.getId(),              // dataId
    "fromTab=2",                          // pathParams
    Collections.singletonList(target)     // 接收人:求职者
);

4.2 录用模块

文件变更

文件 操作 说明
offer/service/IEmploymentOfferService.java 修改 新增 confirmOffer、rejectOffer 方法
offer/service/impl/EmploymentOfferServiceImpl.java 修改 实现,调用 sendMessage
offer/controller/EmploymentOfferController.java 修改 2个接口改为委托 service

调用链路

接口 触发 行为
PUT /employmentOffer/confirm 求职者确认签约 状态改"已签约" → 通知企业「求职者已确认签约」
PUT /employmentOffer/reject 求职者拒绝录用 状态改"已拒绝" → 通知企业「求职者已拒绝录用」

五、过期时间规则

场景 过期时间计算
面试通知(求职者反馈) 面试时间 + 1天
面试结果通知 面试时间 + 1天
录用反馈通知 无过期(null)
录用待办 无过期(null)

六、模块分类(moduleType)

moduleType 值 说明
interview 面试相关通知/待办
offer 录用相关通知/待办