package com.ruoyi.system.service.impl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.SysTaskAssignee; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.mapper.SysTaskAssigneeMapper; import com.ruoyi.system.service.ISysTaskAssigneeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * 任务执行人服务实现类 * * @author ruoyi */ @Slf4j @Service public class SysTaskAssigneeServiceImpl implements ISysTaskAssigneeService { @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; @Autowired private ApplicationEventPublisher eventPublisher; @Override @Transactional public void saveTaskAssignees(Long taskId, List assignees, String userName) { if (assignees == null || assignees.isEmpty()) { return; } List taskAssignees = new ArrayList<>(); Date now = DateUtils.getNowDate(); for (int i = 0; i < assignees.size(); i++) { TaskCreateVO.AssigneeInfo assigneeInfo = assignees.get(i); SysTaskAssignee taskAssignee = new SysTaskAssignee(); taskAssignee.setTaskId(taskId); taskAssignee.setUserId(assigneeInfo.getUserId()); taskAssignee.setUserName(assigneeInfo.getUserName()); taskAssignee.setUserType(assigneeInfo.getUserType()); // 第一个执行人员为主要执行人 taskAssignee.setIsPrimary(i == 0 ? "1" : "0"); taskAssignee.setSortOrder(i); taskAssignee.setCreateTime(now); taskAssignee.setCreateBy(userName); taskAssignee.setUpdateTime(now); taskAssignee.setUpdateBy(userName); taskAssignees.add(taskAssignee); } // 批量保存 if (!taskAssignees.isEmpty()) { sysTaskAssigneeMapper.batchInsertSysTaskAssignee(taskAssignees); } } @Override @Transactional public boolean updateTaskAssignees(Long taskId, List newAssignees, String userName) { if (newAssignees == null) { return false; } try { List newAssigneeIds = newAssignees.stream().map(TaskCreateVO.AssigneeInfo::getUserId).collect(Collectors.toList()); // 查询现有的执行人员 List existingAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); List existingAssigneeIds = existingAssignees.stream().map(SysTaskAssignee::getUserId).collect(Collectors.toList()); // 找出需要删除的执行人(在数据库中存在但在新列表中不存在) List assigneesToDelete = existingAssignees.stream().map(SysTaskAssignee::getUserId) .filter(id -> !newAssigneeIds.contains(id)) .collect(Collectors.toList()); // 找出需要添加的执行人(在新列表中存在但在数据库中不存在) List assigneesToAdd = newAssignees.stream() .filter(assignee -> !existingAssigneeIds.contains(assignee.getUserId())) .collect(Collectors.toList()); boolean hasChanges = !assigneesToDelete.isEmpty() || !assigneesToAdd.isEmpty(); // 只有执行人员发生变化时才更新 if (hasChanges) { // 删除不需要的执行人员关联 if (!assigneesToDelete.isEmpty()) { for (Long userId : assigneesToDelete) { sysTaskAssigneeMapper.deleteByTaskIdAndUserId(taskId, userId); } } // 添加新的执行人员关联 if (!assigneesToAdd.isEmpty()) { // 为新增的执行人设置排序和主要执行人标志 Date now = DateUtils.getNowDate(); List newTaskAssignees = new ArrayList<>(); for (int i = 0; i < assigneesToAdd.size(); i++) { TaskCreateVO.AssigneeInfo assigneeInfo = assigneesToAdd.get(i); SysTaskAssignee taskAssignee = new SysTaskAssignee(); taskAssignee.setTaskId(taskId); taskAssignee.setUserId(assigneeInfo.getUserId()); taskAssignee.setUserName(assigneeInfo.getUserName()); taskAssignee.setUserType(assigneeInfo.getUserType()); // 注意:这里我们不知道最终的排序,所以暂时设置为一个较大的值 // 在后续重新排序时会修正 taskAssignee.setIsPrimary("0"); // 默认不是主要执行人 taskAssignee.setSortOrder(999 + i); // 临时排序值 taskAssignee.setCreateTime(now); taskAssignee.setCreateBy(userName); taskAssignee.setUpdateTime(now); taskAssignee.setUpdateBy(userName); newTaskAssignees.add(taskAssignee); } // 批量保存新增的执行人 if (!newTaskAssignees.isEmpty()) { sysTaskAssigneeMapper.batchInsertSysTaskAssignee(newTaskAssignees); } } // 重新查询所有执行人并设置正确的排序和主要执行人标志 List allAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); Map allAssigneeMap = allAssignees.stream() .collect(Collectors.toMap(SysTaskAssignee::getUserId, a -> a)); // 更新所有执行人的排序和主要执行人标志 Date now = DateUtils.getNowDate(); for (int i = 0; i < newAssignees.size(); i++) { TaskCreateVO.AssigneeInfo assigneeInfo = newAssignees.get(i); SysTaskAssignee taskAssignee = allAssigneeMap.get(assigneeInfo.getUserId()); if (taskAssignee != null) { // 保持原有的状态信息(如就绪状态),只更新基本信息 taskAssignee.setUserName(assigneeInfo.getUserName()); taskAssignee.setUserType(assigneeInfo.getUserType()); taskAssignee.setIsPrimary(i == 0 ? "1" : "0"); // 第一个为主要执行人 taskAssignee.setSortOrder(i); taskAssignee.setUpdateTime(now); taskAssignee.setUpdateBy(userName); sysTaskAssigneeMapper.updateSysTaskAssignee(taskAssignee); } } return true; } }catch (Exception e){ log.error("报错了,保存到执行人员分配,taskId:{}",taskId,e); throw e; } return false; } @Override public List getAssigneesByTaskId(Long taskId) { return sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); } @Override @Transactional public int deleteAssigneesByTaskId(Long taskId) { return sysTaskAssigneeMapper.deleteSysTaskAssigneeByTaskId(taskId); } @Override @Transactional public AjaxResult setAssigneeReady(Long taskId, Long userId) { // 1. 查询执行人关联信息 List assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); SysTaskAssignee targetAssignee = assignees.stream() .filter(a -> a.getUserId().equals(userId)) .findFirst() .orElse(null); if (targetAssignee == null) { return AjaxResult.error("您不是该任务的执行人"); } // 2. 更新就绪状态 targetAssignee.setIsReady("1"); targetAssignee.setReadyTime(new Date()); targetAssignee.setUpdateBy(SecurityUtils.getUsername()); targetAssignee.setUpdateTime(new Date()); sysTaskAssigneeMapper.updateSysTaskAssignee(targetAssignee); // 3. 检查是否所有执行人都已就绪 boolean allReady = assignees.stream() .allMatch(a -> a.getUserId().equals(userId) || "1".equals(a.getIsReady())); Map result = new HashMap<>(); result.put("allReady", allReady); result.put("message", "就绪成功"); return AjaxResult.success(result); } @Override @Transactional public AjaxResult cancelAssigneeReady(Long taskId, Long userId) { // 查询执行人关联信息 List assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); SysTaskAssignee targetAssignee = assignees.stream() .filter(a -> a.getUserId().equals(userId)) .findFirst() .orElse(null); if (targetAssignee == null) { return AjaxResult.error("您不是该任务的执行人"); } // 更新就绪状态 targetAssignee.setIsReady("0"); targetAssignee.setReadyTime(null); targetAssignee.setUpdateBy(SecurityUtils.getUsername()); targetAssignee.setUpdateTime(new Date()); sysTaskAssigneeMapper.updateSysTaskAssignee(targetAssignee); return AjaxResult.success("已取消就绪"); } @Override public List getAssigneeIds(Long taskId) { List assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); if (assignees == null || assignees.isEmpty()) { return Collections.emptyList(); } return assignees.stream() .map(SysTaskAssignee::getUserId) .collect(Collectors.toList()); } @Override public List getAssigneeNames(Long taskId) { List assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); if (assignees == null || assignees.isEmpty()) { return Collections.emptyList(); } return assignees.stream() .map(SysTaskAssignee::getUserName) .collect(Collectors.toList()); } }