编辑 | blame | 历史 | 原始文档

系统消息推送功能实现总结

功能概述

实现了完整的系统消息推送功能,包括在任务创建、任务分配用户、任务状态变更时自动推送消息给相关用户。

实现内容

1. 数据库表结构

文件位置: sql/sys_message.sql

创建了 sys_message 表,包含以下字段:
- message_id: 消息ID(主键)
- message_type: 消息类型(CREATE-创建成功, PUSH-任务推送, STATUS-状态变更, ASSIGN-分配任务)
- message_title: 消息标题
- message_content: 消息内容
- task_id: 关联任务ID
- task_code: 任务编号
- receiver_id: 接收人ID
- receiver_name: 接收人姓名
- sender_id: 发送人ID
- sender_name: 发送人姓名
- is_read: 是否已读(0-未读, 1-已读)
- read_time: 读取时间
- create_time: 创建时间
- update_time: 更新时间
- del_flag: 删除标志

2. 后端实现

2.1 实体类

文件位置: ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMessage.java

  • 包含所有数据库字段的getter/setter
  • 支持Excel导出注解
  • 日期格式化注解

2.2 Mapper层

文件位置:
- ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMessageMapper.java
- ruoyi-system/src/main/resources/mapper/system/SysMessageMapper.xml

提供的方法:
- selectSysMessageList: 查询消息列表
- selectSysMessageListByReceiverId: 查询用户消息列表
- countUnreadMessageByReceiverId: 查询未读消息数量
- insertSysMessage: 新增消息
- updateSysMessage: 修改消息
- deleteSysMessageByMessageIds: 批量删除消息
- markMessageAsRead: 标记消息为已读
- markAllMessagesAsRead: 标记所有消息为已读

2.3 Service层

文件位置:
- ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMessageService.java
- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMessageServiceImpl.java

提供的业务方法:
- 基础CRUD方法
- pushTaskCreateMessage: 推送任务创建成功消息
- pushTaskAssignMessage: 推送任务分配消息
- pushTaskStatusChangeMessage: 推送任务状态变更消息

2.4 Controller层

文件位置: ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java

提供的API接口:
- GET /system/message/list: 查询消息列表
- GET /system/message/my: 查询当前用户消息列表
- GET /system/message/unread/count: 查询未读消息数量
- GET /system/message/{messageId}: 获取消息详情
- POST /system/message: 新增消息
- PUT /system/message: 修改消息
- DELETE /system/message/{messageIds}: 删除消息
- PUT /system/message/read/{messageId}: 标记消息为已读
- PUT /system/message/read/all: 标记所有消息为已读

2.5 任务服务集成

文件位置: ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java

在以下场景自动推送消息:

  1. 任务创建成功
  • 时机:insertSysTask 方法执行成功后
  • 接收人:任务创建人
  • 消息类型:CREATE
  • 消息内容:"您创建的任务已成功提交"
  1. 任务分配用户
  • 时机:insertSysTask 方法保存执行人员后、assignTask 方法执行后
  • 接收人:所有执行人员
  • 消息类型:PUSH/ASSIGN
  • 消息内容:"您有新的任务,请及时处理"
  1. 任务状态变更
  • 时机:changeTaskStatusWithLocation 方法执行成功后
  • 接收人:所有执行人员 + 创建人
  • 消息类型:STATUS
  • 消息内容:根据状态变化动态生成
    • PENDING: "任务状态变更为:待处理"
    • DEPARTED: "任务状态变更为:已出发"
    • ARRIVED: "任务状态变更为:已到达"
    • RETURNING: "任务状态变更为:返程中"
    • COMPLETED: "任务状态变更为:已完成"
    • CANCELLED: "任务状态变更为:已取消"

3. 前端实现

3.1 API接口

文件位置: app/api/message.js

提供的方法:
- getMyMessages: 获取当前用户消息列表
- listMessage: 查询消息列表
- getMessage: 获取消息详情
- getUnreadCount: 获取未读消息数量
- addMessage: 新增消息
- updateMessage: 修改消息
- delMessage: 删除消息
- markAsRead: 标记消息为已读
- markAllAsRead: 标记所有消息为已读

3.2 消息中心页面

文件位置: app/pages/message/index.vue

功能特性:
- 自动加载当前用户的消息列表
- 未读消息显示红点标记
- 未读消息排在前面
- 支持下拉刷新
- 点击消息自动标记为已读并跳转到任务详情
- 消息类型显示(创建成功、任务推送、状态变更、任务分配)

3.3 首页集成

文件位置: app/pages/index.vue

功能特性:
- 消息中心入口
- 显示未读消息数量徽章
- 页面显示时自动刷新未读消息数量

消息类型说明

消息类型 代码 触发场景 接收人 消息内容
创建成功 CREATE 任务创建成功 创建人 您创建的任务已成功提交
任务推送 PUSH 任务分配给执行人 执行人 您有新的任务,请及时处理
任务分配 ASSIGN 重新分配任务 新执行人 您有新的任务,请及时处理
状态变更 STATUS 任务状态变更 执行人+创建人 任务状态变更为:XXX

使用指南

部署步骤

  1. 执行数据库脚本
    bash mysql -u root -p your_database < sql/sys_message.sql

  2. 重新编译后端
    bash cd ruoyi-admin mvn clean package

  3. 重启后端服务
    ```bash

    Windows

    bin\run.bat

Linux

sh bin/run.sh
```

  1. 前端无需额外操作,代码已自动集成

测试验证

  1. 创建任务
  • 创建任务后,创建人应收到"创建成功"消息
  • 执行人应收到"任务推送"消息
  1. 更新任务状态
  • 在前端点击"出发"、"已到达"等按钮
  • 相关人员应收到"状态变更"消息
  1. 分配任务
  • 调用任务分配接口
  • 新执行人应收到"任务分配"消息
  1. 查看消息
  • 进入消息中心页面
  • 未读消息显示红点
  • 点击消息跳转到任务详情并标记为已读

技术特点

1. 异步推送

  • 消息推送不影响主业务流程
  • 使用 @Autowired(required = false) 确保服务可选

2. 事务安全

  • 消息推送在事务提交后执行
  • 避免事务回滚导致的数据不一致

3. 容错处理

  • 消息推送失败不影响主业务
  • 完善的异常捕获和日志记录

4. 性能优化

  • 批量查询用户信息
  • 索引优化(receiver_id、task_id、is_read、create_time)

5. 用户体验

  • 实时未读消息计数
  • 消息分类显示
  • 未读消息优先排序
  • 一键标记已读

扩展建议

1. WebSocket实时推送

可以集成WebSocket实现实时消息推送,而不需要用户刷新页面:

@Service
public class WebSocketMessageService {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;
    
    public void pushMessage(Long userId, SysMessage message) {
        messagingTemplate.convertAndSendToUser(
            userId.toString(), 
            "/queue/messages", 
            message
        );
    }
}

2. 推送通知

可以集成第三方推送服务(如极光推送、个推等)实现APP通知:

public void sendPushNotification(Long userId, String title, String content) {
    // 调用推送服务SDK
    JPushClient.push(userId, title, content);
}

3. 消息模板

可以配置消息模板,支持变量替换:

public class MessageTemplate {
    private String type;
    private String titleTemplate;
    private String contentTemplate;
    
    public String render(Map<String, Object> params) {
        // 模板渲染逻辑
    }
}

4. 消息分组

可以增加消息分组功能:

  • 系统通知
  • 任务提醒
  • 审批消息
  • 公告消息

5. 消息已读回执

可以记录消息的详细阅读记录:

CREATE TABLE sys_message_read_log (
    log_id BIGINT PRIMARY KEY,
    message_id BIGINT,
    user_id BIGINT,
    read_time DATETIME,
    device_type VARCHAR(20)
);

注意事项

  1. 权限控制:确保用户只能查看自己的消息
  2. 数据清理:定期清理过期的已读消息
  3. 性能监控:监控消息推送的性能,避免大量消息推送造成性能问题
  4. 日志记录:完整记录消息推送的日志,便于排查问题

总结

本次实现了完整的系统消息推送功能,涵盖了任务创建、分配、状态变更三个核心场景。后端采用Service层统一管理消息推送逻辑,前端提供友好的消息中心界面。整个系统设计合理,易于扩展和维护。