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<TaskCreateVO.AssigneeInfo> assignees, String userName) {
|
if (assignees == null || assignees.isEmpty()) {
|
return;
|
}
|
|
List<SysTaskAssignee> 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<TaskCreateVO.AssigneeInfo> newAssignees, String userName) {
|
if (newAssignees == null) {
|
return false;
|
}
|
try {
|
List<Long> newAssigneeIds = newAssignees.stream().map(TaskCreateVO.AssigneeInfo::getUserId).collect(Collectors.toList());
|
// 查询现有的执行人员
|
List<SysTaskAssignee> existingAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
|
|
List<Long> existingAssigneeIds = existingAssignees.stream().map(SysTaskAssignee::getUserId).collect(Collectors.toList());
|
// 找出需要删除的执行人(在数据库中存在但在新列表中不存在)
|
List<Long> assigneesToDelete = existingAssignees.stream().map(SysTaskAssignee::getUserId)
|
.filter(id -> !newAssigneeIds.contains(id))
|
.collect(Collectors.toList());
|
|
// 找出需要添加的执行人(在新列表中存在但在数据库中不存在)
|
List<TaskCreateVO.AssigneeInfo> 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<SysTaskAssignee> 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<SysTaskAssignee> allAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
|
Map<Long, SysTaskAssignee> 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<SysTaskAssignee> 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<SysTaskAssignee> 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<String, Object> result = new HashMap<>();
|
result.put("allReady", allReady);
|
result.put("message", "就绪成功");
|
|
return AjaxResult.success(result);
|
}
|
|
@Override
|
@Transactional
|
public AjaxResult cancelAssigneeReady(Long taskId, Long userId) {
|
// 查询执行人关联信息
|
List<SysTaskAssignee> 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<Long> getAssigneeIds(Long taskId) {
|
List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
|
if (assignees == null || assignees.isEmpty()) {
|
return Collections.emptyList();
|
}
|
return assignees.stream()
|
.map(SysTaskAssignee::getUserId)
|
.collect(Collectors.toList());
|
}
|
|
@Override
|
public List<String> getAssigneeNames(Long taskId) {
|
List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId);
|
if (assignees == null || assignees.isEmpty()) {
|
return Collections.emptyList();
|
}
|
return assignees.stream()
|
.map(SysTaskAssignee::getUserName)
|
.collect(Collectors.toList());
|
}
|
}
|