|
|
@@ -0,0 +1,251 @@
|
|
|
+# 消息通知与待办模块设计开发文档
|
|
|
+
|
|
|
+## 一、概述
|
|
|
+
|
|
|
+本文档记录了消息通知模块和待办模块的数据库设计、后端接口与实现,以及其他业务模块(面试、录用)对这两个模块的调用示例。
|
|
|
+
|
|
|
+- **消息通知模块**:为系统提供统一的消息发送能力,支持给企业/人员发送通知消息,记录接收人关联并更新最后通知时间。
|
|
|
+- **待办模块**:为系统提供待办事项的创建与查询能力,支持给企业/人员生成待办,前端可通过目标页面路径进行跳转。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、数据库设计
|
|
|
+
|
|
|
+### 2.1 消息通知记录表
|
|
|
+
|
|
|
+**文件**:`.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)
|
|
|
+);
|
|
|
+
|
|
|
+-- 后增字段(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已读';
|
|
|
+```
|
|
|
+
|
|
|
+**接收人关联表**:
|
|
|
+
|
|
|
+```sql
|
|
|
+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`
|
|
|
+
|
|
|
+```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` | 修改 | 新增 `expireTime`、`status` 字段 |
|
|
|
+| `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` | 企业发起录用 | 创建录用记录 → 生成待办「录用通知」给求职者 |
|
|
|
+
|
|
|
+**待办配置(发起录用时)**:
|
|
|
+
|
|
|
+```java
|
|
|
+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` | 录用相关通知/待办 |
|