# 系统消息推送功能 - 快速开始 ## 功能说明 实现了在任务创建、状态变更、分配用户时自动推送消息给相关人员的功能。 ## 快速部署 ### 1. 执行数据库脚本 ```bash # 进入项目sql目录 cd d:\project\急救转运\code\Api\RuoYi-Vue-master\sql # 执行消息表创建脚本 mysql -u root -p your_database < sys_message.sql ``` 或者手动执行SQL: ```sql -- 在MySQL客户端中执行 source d:/project/急救转运/code/Api/RuoYi-Vue-master/sql/sys_message.sql; ``` ### 2. 重启后端服务 ```bash # Windows cd d:\project\急救转运\code\Api\RuoYi-Vue-master bin\run.bat # Linux cd /path/to/RuoYi-Vue-master sh bin/run.sh ``` ### 3. 前端已自动集成,无需额外操作 ## 快速测试 ### 测试1:创建任务消息推送 1. 在前端创建一个任务 2. 进入"消息中心"页面 3. 应该看到一条"创建成功"消息 ### 测试2:任务分配消息推送 1. 创建任务时选择执行人员 2. 执行人员登录系统 3. 进入"消息中心"页面 4. 应该看到一条"任务推送"消息 ### 测试3:状态变更消息推送 1. 在首页点击任务的"出发"按钮 2. 相关人员(执行人+创建人)进入"消息中心" 3. 应该看到一条"状态变更"消息 ## 消息类型 | 类型 | 场景 | 接收人 | 内容 | |------|------|--------|------| | 创建成功 | 创建任务 | 创建人 | 您创建的任务已成功提交 | | 任务推送 | 分配执行人 | 执行人 | 您有新的任务,请及时处理 | | 状态变更 | 更新状态 | 执行人+创建人 | 任务状态变更为:XXX | ## 核心文件 ### 后端 - `sql/sys_message.sql` - 数据库表 - `SysMessage.java` - 实体类 - `SysMessageMapper.java` - Mapper接口 - `SysMessageMapper.xml` - MyBatis映射 - `ISysMessageService.java` - Service接口 - `SysMessageServiceImpl.java` - Service实现 - `SysMessageController.java` - Controller - `SysTaskServiceImpl.java` - 任务服务(已集成消息推送) ### 前端 - `app/api/message.js` - API接口 - `app/pages/message/index.vue` - 消息中心页面 - `app/pages/index.vue` - 首页(显示未读数量) ## 主要API ### 后端接口 ``` GET /system/message/my - 获取当前用户消息列表 GET /system/message/unread/count - 获取未读消息数量 PUT /system/message/read/{id} - 标记消息为已读 PUT /system/message/read/all - 标记所有消息为已读 ``` ### 前端调用示例 ```javascript import { getMyMessages, getUnreadCount, markAsRead } from '@/api/message' // 获取消息列表 const messages = await getMyMessages() // 获取未读数量 const count = await getUnreadCount() // 标记已读 await markAsRead(messageId) ``` ## 消息推送时机 ### 1. 创建任务(insertSysTask) ```java // 推送创建成功消息(给创建人) if (result > 0 && sysMessageService != null) { sysMessageService.pushTaskCreateMessage(task); } // 推送任务分配消息(给执行人) if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) { List assigneeIds = createVO.getAssignees().stream() .map(assignee -> assignee.getUserId()) .collect(Collectors.toList()); sysMessageService.pushTaskAssignMessage(task, assigneeIds); } ``` ### 2. 分配任务(assignTask) ```java // 推送任务分配消息 if (result > 0 && sysMessageService != null) { List assigneeIds = new ArrayList<>(); assigneeIds.add(assigneeId); sysMessageService.pushTaskAssignMessage(task, assigneeIds); } ``` ### 3. 状态变更(changeTaskStatusWithLocation) ```java // 推送任务状态变更消息 if (result > 0 && sysMessageService != null) { sysMessageService.pushTaskStatusChangeMessage( oldTask, oldTaskStatus.getCode(), newStatus.getCode() ); } ``` ## 常见问题 ### Q1: 消息没有推送怎么办? A: 检查以下几点: 1. 数据库表是否创建成功 2. 后端服务是否重启 3. 查看后端日志是否有异常 4. 确认 `ISysMessageService` 是否注入成功 ### Q2: 消息推送失败会影响主业务吗? A: 不会。消息推送使用 `@Autowired(required = false)`,且所有异常都被捕获,不会影响任务的创建、分配和状态变更。 ### Q3: 如何查看消息推送日志? A: 查看后端日志,搜索关键字: - "推送任务创建成功消息" - "推送任务分配消息" - "推送任务状态变更消息" ### Q4: 未读消息数量不更新怎么办? A: 1. 确认 `app/pages/index.vue` 已更新 2. 确认 `app/api/message.js` 已创建 3. 重新编译前端:`npm run build:h5` ## 扩展建议 1. **WebSocket实时推送**:集成WebSocket实现消息实时推送 2. **推送通知**:集成极光推送等第三方推送服务 3. **消息模板**:配置消息模板,支持变量替换 4. **消息分组**:增加消息分组(系统通知、任务提醒等) ## 详细文档 请查看完整文档:`prd/系统消息推送功能实现总结.md` --- **更新时间**: 2025-10-25 **版本**: v1.0