Commit 1f92de2cb35530df5889f00fd73eff1bf8e58787

Authored by jason
1 parent 21c44a9b

【缺陷修复】 依次审批任务回退后,重新进入后不会重新分配候选人

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java
@@ -50,6 +50,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav @@ -50,6 +50,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
50 super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); 50 super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
51 51
52 // 第二步,获取任务的所有处理人 52 // 第二步,获取任务的所有处理人
  53 + // TODO execution.getVariable 会从整个流程实例中获取变量, 可能回退后重新进入该任务,不会重新计算 collectionVariable 的值. 是不是考虑会签结束清理这个变量
53 @SuppressWarnings("unchecked") 54 @SuppressWarnings("unchecked")
54 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class); 55 Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
55 if (assigneeUserIds == null) { 56 if (assigneeUserIds == null) {
@@ -60,7 +61,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav @@ -60,7 +61,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
60 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时 61 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
61 assigneeUserIds = SetUtils.asSet((Long) null); 62 assigneeUserIds = SetUtils.asSet((Long) null);
62 } 63 }
63 - execution.setVariable(super.collectionVariable, assigneeUserIds); 64 + execution.setVariableLocal(super.collectionVariable, assigneeUserIds);
64 } 65 }
65 return assigneeUserIds.size(); 66 return assigneeUserIds.size();
66 } 67 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java
@@ -44,7 +44,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB @@ -44,7 +44,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
44 44
45 // 第二步,获取任务的所有处理人 45 // 第二步,获取任务的所有处理人
46 @SuppressWarnings("unchecked") 46 @SuppressWarnings("unchecked")
47 - Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class); 47 + Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
48 if (assigneeUserIds == null) { 48 if (assigneeUserIds == null) {
49 assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution); 49 assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
50 if (CollUtil.isEmpty(assigneeUserIds)) { 50 if (CollUtil.isEmpty(assigneeUserIds)) {
@@ -53,7 +53,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB @@ -53,7 +53,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
53 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时 53 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
54 assigneeUserIds = SetUtils.asSet((Long) null); 54 assigneeUserIds = SetUtils.asSet((Long) null);
55 } 55 }
56 - execution.setVariable(super.collectionVariable, assigneeUserIds); 56 + execution.setVariableLocal(super.collectionVariable, assigneeUserIds);
57 } 57 }
58 return assigneeUserIds.size(); 58 return assigneeUserIds.size();
59 } 59 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -755,6 +755,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -755,6 +755,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
755 runtimeService.setVariable(currentTask.getProcessInstanceId(), 755 runtimeService.setVariable(currentTask.getProcessInstanceId(),
756 String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE); 756 String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE);
757 // 4. 执行驳回 757 // 4. 执行驳回
  758 + // 使用 moveExecutionsToSingleActivityId 替换 moveExecutionsToSingleActivityId 原因:
  759 + // 当多实例任务回退的时候有问题。 相关 issue: https://github.com/flowable/flowable-engine/issues/3944
758 List<String> runExecutionIds = convertList(taskList, Task::getExecutionId); 760 List<String> runExecutionIds = convertList(taskList, Task::getExecutionId);
759 runtimeService.createChangeActivityStateBuilder() 761 runtimeService.createChangeActivityStateBuilder()
760 .processInstanceId(currentTask.getProcessInstanceId()) 762 .processInstanceId(currentTask.getProcessInstanceId())