package com.ruoyi.system.service.impl; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysMessageMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.mapper.SysTaskAssigneeMapper; import com.ruoyi.system.domain.SysMessage; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskAssignee; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.system.service.ISysMessageService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 系统消息Service业务层处理 * * @author ruoyi * @date 2025-10-25 */ @Service public class SysMessageServiceImpl implements ISysMessageService { private static final Logger log = LoggerFactory.getLogger(SysMessageServiceImpl.class); @Autowired private SysMessageMapper sysMessageMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; /** * 查询系统消息 * * @param messageId 系统消息主键 * @return 系统消息 */ @Override public SysMessage selectSysMessageByMessageId(Long messageId) { return sysMessageMapper.selectSysMessageByMessageId(messageId); } /** * 查询系统消息列表 * * @param sysMessage 系统消息 * @return 系统消息 */ @Override public List selectSysMessageList(SysMessage sysMessage) { return sysMessageMapper.selectSysMessageList(sysMessage); } /** * 查询用户的消息列表 * * @param receiverId 接收人ID * @return 系统消息集合 */ @Override public List selectSysMessageListByReceiverId(Long receiverId) { return sysMessageMapper.selectSysMessageListByReceiverId(receiverId); } /** * 查询用户未读消息数量 * * @param receiverId 接收人ID * @return 未读消息数量 */ @Override public int countUnreadMessageByReceiverId(Long receiverId) { return sysMessageMapper.countUnreadMessageByReceiverId(receiverId); } /** * 新增系统消息 * * @param sysMessage 系统消息 * @return 结果 */ @Override public int insertSysMessage(SysMessage sysMessage) { if (sysMessage.getCreateTime() == null) { sysMessage.setCreateTime(DateUtils.getNowDate()); } if (sysMessage.getIsRead() == null) { sysMessage.setIsRead("0"); } if (sysMessage.getDelFlag() == null) { sysMessage.setDelFlag("0"); } return sysMessageMapper.insertSysMessage(sysMessage); } /** * 修改系统消息 * * @param sysMessage 系统消息 * @return 结果 */ @Override public int updateSysMessage(SysMessage sysMessage) { sysMessage.setUpdateTime(DateUtils.getNowDate()); return sysMessageMapper.updateSysMessage(sysMessage); } /** * 批量删除系统消息 * * @param messageIds 需要删除的系统消息主键 * @return 结果 */ @Override public int deleteSysMessageByMessageIds(Long[] messageIds) { return sysMessageMapper.deleteSysMessageByMessageIds(messageIds); } /** * 删除系统消息信息 * * @param messageId 系统消息主键 * @return 结果 */ @Override public int deleteSysMessageByMessageId(Long messageId) { return sysMessageMapper.deleteSysMessageByMessageId(messageId); } /** * 标记消息为已读 * * @param messageId 消息ID * @return 结果 */ @Override public int markMessageAsRead(Long messageId) { return sysMessageMapper.markMessageAsRead(messageId); } /** * 标记用户所有消息为已读 * * @param receiverId 接收人ID * @return 结果 */ @Override public int markAllMessagesAsRead(Long receiverId) { return sysMessageMapper.markAllMessagesAsRead(receiverId); } // ========== 消息推送业务方法 ========== /** * 推送任务创建成功消息(给创建人) * * @param task 任务对象 */ @Override public void pushTaskCreateMessage(SysTask task) { try { if (task == null || task.getCreatorId() == null) { log.warn("任务对象或创建人ID为空,无法推送创建成功消息"); return; } // 获取创建人信息 SysUser creator = sysUserMapper.selectUserById(task.getCreatorId()); if (creator == null) { log.warn("找不到创建人信息,用户ID:{}", task.getCreatorId()); return; } SysMessage message = new SysMessage(); message.setMessageType("CREATE"); message.setMessageTitle("任务创建成功"); message.setMessageContent("您创建的任务已成功提交"); message.setTaskId(task.getTaskId()); message.setTaskCode(task.getTaskCode()); message.setReceiverId(task.getCreatorId()); message.setReceiverName(creator.getNickName()); message.setSenderId(task.getCreatorId()); message.setSenderName("系统"); insertSysMessage(message); log.info("推送任务创建成功消息,任务编号:{},接收人:{}", task.getTaskCode(), creator.getNickName()); } catch (Exception e) { log.error("推送任务创建成功消息失败", e); } } /** * 推送任务分配消息(给执行人) * * @param task 任务对象 * @param assigneeIds 执行人ID列表 */ @Override public void pushTaskAssignMessage(SysTask task, List assigneeIds) { try { if (task == null || assigneeIds == null || assigneeIds.isEmpty()) { log.warn("任务对象或执行人ID列表为空,无法推送任务分配消息"); return; } // 获取创建人信息 SysUser creator = null; if (task.getCreatorId() != null) { creator = sysUserMapper.selectUserById(task.getCreatorId()); } String senderName = (creator != null && StringUtils.isNotEmpty(creator.getNickName())) ? creator.getNickName() : "系统"; // 给每个执行人发送消息 for (Long assigneeId : assigneeIds) { SysUser assignee = sysUserMapper.selectUserById(assigneeId); if (assignee == null) { log.warn("找不到执行人信息,用户ID:{}", assigneeId); continue; } SysMessage message = new SysMessage(); message.setMessageType("PUSH"); message.setMessageTitle("任务推送"); message.setMessageContent("您有新的任务,请及时处理"); message.setTaskId(task.getTaskId()); message.setTaskCode(task.getTaskCode()); message.setReceiverId(assigneeId); message.setReceiverName(assignee.getNickName()); message.setSenderId(task.getCreatorId()); message.setSenderName(senderName); insertSysMessage(message); log.info("推送任务分配消息,任务编号:{},接收人:{}", task.getTaskCode(), assignee.getNickName()); } } catch (Exception e) { log.error("推送任务分配消息失败", e); } } /** * 推送任务状态变更消息(给相关人员) * * @param task 任务对象 * @param oldStatus 旧状态 * @param newStatus 新状态 */ @Override public void pushTaskStatusChangeMessage(SysTask task, String oldStatus, String newStatus) { try { if (task == null || StringUtils.isEmpty(newStatus)) { log.warn("任务对象或新状态为空,无法推送状态变更消息"); return; } // 构建状态变更内容 String statusContent = getStatusChangeContent(newStatus); // 查询任务的所有执行人 List assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(task.getTaskId()); if (assignees != null && !assignees.isEmpty()) { // 给每个执行人发送消息 for (SysTaskAssignee assignee : assignees) { SysUser user = sysUserMapper.selectUserById(assignee.getUserId()); if (user == null) { log.warn("找不到执行人信息,用户ID:{}", assignee.getUserId()); continue; } SysMessage message = new SysMessage(); message.setMessageType("STATUS"); message.setMessageTitle("任务状态变更"); message.setMessageContent(statusContent); message.setTaskId(task.getTaskId()); message.setTaskCode(task.getTaskCode()); message.setReceiverId(assignee.getUserId()); message.setReceiverName(user.getNickName()); message.setSenderId(task.getCreatorId()); message.setSenderName("系统"); insertSysMessage(message); log.info("推送任务状态变更消息,任务编号:{},新状态:{},接收人:{}", task.getTaskCode(), newStatus, user.getNickName()); } } // 同时给创建人发送消息(如果创建人不是执行人) if (task.getCreatorId() != null) { boolean isCreatorAlsoAssignee = assignees != null && assignees.stream() .anyMatch(a -> a.getUserId().equals(task.getCreatorId())); if (!isCreatorAlsoAssignee) { SysUser creator = sysUserMapper.selectUserById(task.getCreatorId()); if (creator != null) { SysMessage message = new SysMessage(); message.setMessageType("STATUS"); message.setMessageTitle("任务状态变更"); message.setMessageContent(statusContent); message.setTaskId(task.getTaskId()); message.setTaskCode(task.getTaskCode()); message.setReceiverId(task.getCreatorId()); message.setReceiverName(creator.getNickName()); message.setSenderId(task.getCreatorId()); message.setSenderName("系统"); insertSysMessage(message); log.info("推送任务状态变更消息给创建人,任务编号:{},新状态:{},接收人:{}", task.getTaskCode(), newStatus, creator.getNickName()); } } } } catch (Exception e) { log.error("推送任务状态变更消息失败", e); } } /** * 根据状态获取状态变更内容 * * @param status 任务状态 * @return 状态变更内容 */ private String getStatusChangeContent(String status) { switch (status) { case "PENDING": return "任务状态变更为:待处理"; case "DEPARTED": return "任务状态变更为:已出发"; case "ARRIVED": return "任务状态变更为:已到达"; case "RETURNING": return "任务状态变更为:返程中"; case "COMPLETED": return "任务状态变更为:已完成"; case "CANCELLED": return "任务状态变更为:已取消"; default: return "任务状态已更新"; } } }