# 系统消息推送功能实现总结 ## 功能概述 实现了完整的系统消息推送功能,包括在任务创建、任务分配用户、任务状态变更时自动推送消息给相关用户。 ## 实现内容 ### 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 - 消息内容:"您创建的任务已成功提交" 2. **任务分配用户** - 时机:`insertSysTask` 方法保存执行人员后、`assignTask` 方法执行后 - 接收人:所有执行人员 - 消息类型:PUSH/ASSIGN - 消息内容:"您有新的任务,请及时处理" 3. **任务状态变更** - 时机:`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 ``` 4. **前端无需额外操作**,代码已自动集成 ### 测试验证 1. **创建任务** - 创建任务后,创建人应收到"创建成功"消息 - 执行人应收到"任务推送"消息 2. **更新任务状态** - 在前端点击"出发"、"已到达"等按钮 - 相关人员应收到"状态变更"消息 3. **分配任务** - 调用任务分配接口 - 新执行人应收到"任务分配"消息 4. **查看消息** - 进入消息中心页面 - 未读消息显示红点 - 点击消息跳转到任务详情并标记为已读 ## 技术特点 ### 1. 异步推送 - 消息推送不影响主业务流程 - 使用 `@Autowired(required = false)` 确保服务可选 ### 2. 事务安全 - 消息推送在事务提交后执行 - 避免事务回滚导致的数据不一致 ### 3. 容错处理 - 消息推送失败不影响主业务 - 完善的异常捕获和日志记录 ### 4. 性能优化 - 批量查询用户信息 - 索引优化(receiver_id、task_id、is_read、create_time) ### 5. 用户体验 - 实时未读消息计数 - 消息分类显示 - 未读消息优先排序 - 一键标记已读 ## 扩展建议 ### 1. WebSocket实时推送 可以集成WebSocket实现实时消息推送,而不需要用户刷新页面: ```java @Service public class WebSocketMessageService { @Autowired private SimpMessagingTemplate messagingTemplate; public void pushMessage(Long userId, SysMessage message) { messagingTemplate.convertAndSendToUser( userId.toString(), "/queue/messages", message ); } } ``` ### 2. 推送通知 可以集成第三方推送服务(如极光推送、个推等)实现APP通知: ```java public void sendPushNotification(Long userId, String title, String content) { // 调用推送服务SDK JPushClient.push(userId, title, content); } ``` ### 3. 消息模板 可以配置消息模板,支持变量替换: ```java public class MessageTemplate { private String type; private String titleTemplate; private String contentTemplate; public String render(Map params) { // 模板渲染逻辑 } } ``` ### 4. 消息分组 可以增加消息分组功能: - 系统通知 - 任务提醒 - 审批消息 - 公告消息 ### 5. 消息已读回执 可以记录消息的详细阅读记录: ```sql 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层统一管理消息推送逻辑,前端提供友好的消息中心界面。整个系统设计合理,易于扩展和维护。