Commit d7ae94443824afc1f2476b2b021fdcbda5b30188

Authored by kehaiyou
1 parent cd678e99

feat: 【工作流】--减签逻辑优化

yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java
... ... @@ -4,6 +4,9 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
4 4 import lombok.AllArgsConstructor;
5 5 import lombok.Getter;
6 6  
  7 +import java.util.Arrays;
  8 +import java.util.List;
  9 +
7 10 /**
8 11 * 流程实例的结果
9 12 *
... ... @@ -63,4 +66,9 @@ public enum BpmProcessInstanceResultEnum {
63 66 ADD_SIGN_AFTER.getResult());
64 67 }
65 68  
  69 + /**
  70 + * 能被减签的状态
  71 + */
  72 + public static final List<Integer> CAN_SUB_SIGN_STATUS = Arrays.asList(PROCESS.result, WAIT_BEFORE_TASK.result);
  73 +
66 74 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
1 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2  
3 3 import cn.hutool.core.date.LocalDateTimeUtil;
  4 +import cn.hutool.core.util.StrUtil;
4 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 6 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
6 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
... ... @@ -160,12 +161,17 @@ public interface BpmTaskConvert {
160 161 return task;
161 162 }
162 163  
163   - default List<BpmTaskSubSignRespVO> convertList(List<BpmTaskExtDO> bpmTaskExtDOList, Map<Long, AdminUserRespDTO> userMap){
  164 + default List<BpmTaskSubSignRespVO> convertList(List<BpmTaskExtDO> bpmTaskExtDOList,
  165 + Map<Long, AdminUserRespDTO> userMap,
  166 + Map<String, Task> idTaskMap){
164 167 return CollectionUtils.convertList(bpmTaskExtDOList, task->{
165 168 BpmTaskSubSignRespVO bpmTaskSubSignRespVO = new BpmTaskSubSignRespVO();
166 169 bpmTaskSubSignRespVO.setName(task.getName());
167 170 bpmTaskSubSignRespVO.setId(task.getTaskId());
168   - AdminUserRespDTO assignUser = userMap.get(task.getAssigneeUserId());
  171 + Task sourceTask = idTaskMap.get(task.getTaskId());
  172 + // 后加签任务不会直接设置 assignee ,所以不存在 assignee 的情况,则去取 owner
  173 + String assignee = StrUtil.isNotEmpty(sourceTask.getAssignee()) ? sourceTask.getAssignee() : sourceTask.getOwner();
  174 + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(assignee));
169 175 if (assignUser != null) {
170 176 bpmTaskSubSignRespVO.setAssigneeUser(convert3(assignUser));
171 177 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskExtMapper.java
1 1 package cn.iocoder.yudao.module.bpm.dal.mysql.task;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
4 5 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
  6 +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
5 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
6 8 import org.apache.ibatis.annotations.Mapper;
7 9  
... ... @@ -19,6 +21,13 @@ public interface BpmTaskExtMapper extends BaseMapperX&lt;BpmTaskExtDO&gt; {
19 21 return selectList(BpmTaskExtDO::getTaskId, taskIds);
20 22 }
21 23  
  24 + default List<BpmTaskExtDO> selectProcessListByTaskIds(Collection<String> taskIds) {
  25 + return selectList(new LambdaQueryWrapperX<BpmTaskExtDO>()
  26 + .in(BpmTaskExtDO::getTaskId, taskIds)
  27 + .in(BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.CAN_SUB_SIGN_STATUS));
  28 + }
  29 +
  30 +
22 31 default BpmTaskExtDO selectByTaskId(String taskId) {
23 32 return selectOne(BpmTaskExtDO::getTaskId, taskId);
24 33 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -34,6 +34,7 @@ import org.flowable.engine.history.HistoricProcessInstance;
34 34 import org.flowable.engine.runtime.ProcessInstance;
35 35 import org.flowable.task.api.DelegationState;
36 36 import org.flowable.task.api.Task;
  37 +import org.flowable.task.api.TaskInfo;
37 38 import org.flowable.task.api.TaskQuery;
38 39 import org.flowable.task.api.history.HistoricTaskInstance;
39 40 import org.flowable.task.api.history.HistoricTaskInstanceQuery;
... ... @@ -49,6 +50,8 @@ import javax.annotation.Resource;
49 50 import javax.validation.Valid;
50 51 import java.time.LocalDateTime;
51 52 import java.util.*;
  53 +import java.util.stream.Collectors;
  54 +import java.util.stream.Stream;
52 55  
53 56 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
54 57 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
... ... @@ -797,12 +800,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
797 800 //3. 修改扩展表状态为取消
798 801 taskExtMapper.updateBatchByTaskIdList(allTaskIdList,new BpmTaskExtDO().setResult(BpmProcessInstanceResultEnum.CANCEL.getResult())
799 802 .setReason(StrUtil.format("由于{}操作[减签],任务被取消",user.getNickname())));
800   - //4. 处理当前任务的父任务
801   - this.handleParentTask(task);
802   - //5.记录日志到父任务中
  803 + //4.记录日志到父任务中 先记录日志是因为,通过 handleParentTask 方法之后,任务可能被完成了,并且不存在了,会报异常,所以先记录
803 804 String comment = StrUtil.format("{}操作了【减签】,审批人{}的任务被取消",user.getNickname(),cancelUser.getNickname());
804 805 taskService.addComment(task.getParentTaskId(),task.getProcessInstanceId(),
805 806 BpmCommentTypeEnum.SUB_SIGN.getResult().toString(),comment);
  807 + //5. 处理当前任务的父任务
  808 + this.handleParentTask(task);
  809 +
806 810 }
807 811  
808 812 /**
... ... @@ -864,9 +868,20 @@ public class BpmTaskServiceImpl implements BpmTaskService {
864 868 if(CollUtil.isEmpty(childrenTaskIdList)){
865 869 return Collections.emptyList();
866 870 }
867   - List<BpmTaskExtDO> bpmTaskExtDOList = taskExtMapper.selectListByTaskIds(childrenTaskIdList);
868   - Set<Long> assigneeUserIdSet = convertSet(bpmTaskExtDOList, BpmTaskExtDO::getAssigneeUserId);
869   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(assigneeUserIdSet);
870   - return BpmTaskConvert.INSTANCE.convertList(bpmTaskExtDOList,userMap);
  871 + //1. 只查询进行中的任务
  872 + List<BpmTaskExtDO> bpmTaskExtDOList = taskExtMapper.selectProcessListByTaskIds(childrenTaskIdList);
  873 + //2. 后加签的任务,可能不存在 assignee,所以还需要查询 owner
  874 + List<Task> taskList = taskService.createTaskQuery().taskIds(childrenTaskIdList).list();
  875 + Map<String, Task> idTaskMap = convertMap(taskList, TaskInfo::getId);
  876 + //3. 将 owner 和 assignee 统一到一个集合中
  877 + List<Long> userIds = taskList.stream()
  878 + .flatMap(control ->
  879 + Stream.of(control.getAssignee(), control.getOwner())
  880 + .filter(Objects::nonNull))
  881 + .distinct()
  882 + .map(NumberUtils::parseLong)
  883 + .collect(Collectors.toList());
  884 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  885 + return BpmTaskConvert.INSTANCE.convertList(bpmTaskExtDOList,userMap,idTaskMap);
871 886 }
872 887 }
... ...