Commit 5f993c6a9fb75887f751531c30a1041c4815e215

Authored by YunaiV
2 parents 539746d1 dace9cfe

Merge branch 'develop' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into master-jdk17

# Conflicts:
#	yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java
@@ -54,11 +54,11 @@ public class BpmnVariableConstants { @@ -54,11 +54,11 @@ public class BpmnVariableConstants {
54 public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s"; 54 public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s";
55 55
56 /** 56 /**
57 - * 流程实例的变量前缀 - 用于退回操作,记录需要预测的节点:格式 NEED_SIMULATE_TASK_{节点定义 id} 57 + * 流程实例的变量 - 用于退回操作,记录需要预测的节点 ids, 变量值类型为 Set
58 * 58 *
59 * 目的是:退回操作,预测节点会不准,在流程变量中记录需要预测的节点,来辅助预测 59 * 目的是:退回操作,预测节点会不准,在流程变量中记录需要预测的节点,来辅助预测
60 */ 60 */
61 - public static final String PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX = "NEED_SIMULATE_TASK_"; 61 + public static final String PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS = "NEED_SIMULATE_TASK_IDS";
62 62
63 /** 63 /**
64 * 流程实例的变量 - 是否跳过表达式 64 * 流程实例的变量 - 是否跳过表达式
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.convert.Convert;
5 import cn.hutool.core.date.DateUtil; 6 import cn.hutool.core.date.DateUtil;
6 import cn.hutool.core.lang.Assert; 7 import cn.hutool.core.lang.Assert;
7 -import cn.hutool.core.map.MapUtil;  
8 import cn.hutool.core.util.*; 8 import cn.hutool.core.util.*;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 10 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -72,7 +72,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @@ -72,7 +72,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
72 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode; 72 import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNode;
73 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; 73 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
74 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; 74 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
75 -import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX;  
76 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType; 75 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseNodeType;
77 import static java.util.Arrays.asList; 76 import static java.util.Arrays.asList;
78 import static java.util.Collections.singletonList; 77 import static java.util.Collections.singletonList;
@@ -227,11 +226,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -227,11 +226,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
227 // 3.2 获取由于退回操作,需要预测的节点。从流程变量中获取,回退操作会设置这些变量 226 // 3.2 获取由于退回操作,需要预测的节点。从流程变量中获取,回退操作会设置这些变量
228 Set<String> needSimulateTaskDefKeysByReturn = new HashSet<>(); 227 Set<String> needSimulateTaskDefKeysByReturn = new HashSet<>();
229 if (StrUtil.isNotEmpty(reqVO.getProcessInstanceId())) { 228 if (StrUtil.isNotEmpty(reqVO.getProcessInstanceId())) {
230 - Map<String, Object> variables = runtimeService.getVariables(reqVO.getProcessInstanceId());  
231 - Map<String, Object> simulateTaskVariables = MapUtil.filter(variables,  
232 - item -> item.getKey().startsWith(PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX));  
233 - simulateTaskVariables.forEach((key, value) ->  
234 - needSimulateTaskDefKeysByReturn.add(StrUtil.removePrefix(key, PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX))); 229 + Object needSimulateTaskIds = runtimeService.getVariable(reqVO.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS);
  230 + needSimulateTaskDefKeysByReturn.addAll(Convert.toSet(String.class, needSimulateTaskIds));
235 } 231 }
236 // 移除运行中的节点,运行中的节点无需预测 232 // 移除运行中的节点,运行中的节点无需预测
237 if (CollUtil.isNotEmpty(runActivityNodes)) { 233 if (CollUtil.isNotEmpty(runActivityNodes)) {
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -69,7 +69,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -69,7 +69,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; 69 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
70 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; 70 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
71 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID; 71 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
72 -//import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.*;  
73 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*; 72 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*;
74 73
75 /** 74 /**
@@ -604,11 +603,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -604,11 +603,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
604 bpmnModel, reqVO.getNextAssignees(), instance); 603 bpmnModel, reqVO.getNextAssignees(), instance);
605 runtimeService.setVariables(task.getProcessInstanceId(), variables); 604 runtimeService.setVariables(task.getProcessInstanceId(), variables);
606 605
607 - // 5. 移除辅助预测的流程变量,这些变量在回退操作中设置  
608 - // todo @jason:可以直接 + 拼接哈  
609 - String simulateVariableName = StrUtil.concat(false,  
610 - BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, task.getTaskDefinitionKey());  
611 - runtimeService.removeVariable(task.getProcessInstanceId(), simulateVariableName); 606 + // 5. 如果当前节点 Id 存在于需要预测的流程节点中,从中移除。 流程变量在回退操作中设置
  607 + Object needSimulateTaskIds = runtimeService.getVariable(task.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS);
  608 + Set<String> needSimulateTaskIdsByReturn = Convert.toSet(String.class, needSimulateTaskIds);
  609 + if (needSimulateTaskIdsByReturn.contains(task.getTaskDefinitionKey())) {
  610 + needSimulateTaskIdsByReturn.remove(task.getTaskDefinitionKey());
  611 + runtimeService.setVariable(task.getProcessInstanceId(), BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS, needSimulateTaskIdsByReturn);
  612 + }
612 613
613 // 6. 调用 BPM complete 去完成任务 614 // 6. 调用 BPM complete 去完成任务
614 taskService.complete(task.getId(), variables, true); 615 taskService.complete(task.getId(), variables, true);
@@ -937,11 +938,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -937,11 +938,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
937 }); 938 });
938 939
939 // 3. 构建需要预测的任务流程变量 940 // 3. 构建需要预测的任务流程变量
940 - // TODO @jason:【驳回预测相关】是不是搞成一个变量,里面是 set 更简洁一点呀?  
941 Set<String> needSimulateTaskDefinitionKeys = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement); 941 Set<String> needSimulateTaskDefinitionKeys = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement);
942 - Map<String, Object> needSimulateVariables = convertMap(needSimulateTaskDefinitionKeys,  
943 - key -> StrUtil.concat(false, BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, key), item -> Boolean.TRUE);  
944 -  
945 942
946 // 4. 执行驳回 943 // 4. 执行驳回
947 // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因: 944 // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因:
@@ -949,12 +946,11 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -949,12 +946,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
949 runtimeService.createChangeActivityStateBuilder() 946 runtimeService.createChangeActivityStateBuilder()
950 .processInstanceId(currentTask.getProcessInstanceId()) 947 .processInstanceId(currentTask.getProcessInstanceId())
951 .moveExecutionsToSingleActivityId(runExecutionIds, reqVO.getTargetTaskDefinitionKey()) 948 .moveExecutionsToSingleActivityId(runExecutionIds, reqVO.getTargetTaskDefinitionKey())
952 - // 设置需要预测的任务流程变量,用于辅助预测  
953 - .processVariables(needSimulateVariables)  
954 - // 设置流程变量(local)节点退回标记, 用于退回到节点,不执行 BpmUserTaskAssignStartUserHandlerTypeEnum 策略,导致自动通过 949 + // 设置需要预测的任务 ids 的流程变量,用于辅助预测
  950 + .processVariable(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_TASK_IDS, needSimulateTaskDefinitionKeys)
  951 + // 设置流程变量(local)节点退回标记, 用于退回到节点,不执行 BpmUserTaskAssignStartUserHandlerTypeEnum 策略,导致自动通过
955 .localVariable(reqVO.getTargetTaskDefinitionKey(), 952 .localVariable(reqVO.getTargetTaskDefinitionKey(),
956 - String.format(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()),  
957 - Boolean.TRUE) 953 + String.format(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE)
958 .changeState(); 954 .changeState();
959 } 955 }
960 956