Преглед на файлове

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

jason преди 8 месеца
родител
ревизия
1f92de2cb3

+ 2 - 1
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
         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
 
         // 第二步,获取任务的所有处理人
+        // TODO execution.getVariable 会从整个流程实例中获取变量, 可能回退后重新进入该任务,不会重新计算 collectionVariable 的值. 是不是考虑会签结束清理这个变量
         @SuppressWarnings("unchecked")
         Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
         if (assigneeUserIds == null) {
@@ -60,7 +61,7 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav
                 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
                 assigneeUserIds = SetUtils.asSet((Long) null);
             }
-            execution.setVariable(super.collectionVariable, assigneeUserIds);
+            execution.setVariableLocal(super.collectionVariable, assigneeUserIds);
         }
         return assigneeUserIds.size();
     }

+ 2 - 2
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
 
         // 第二步,获取任务的所有处理人
         @SuppressWarnings("unchecked")
-        Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
+        Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
         if (assigneeUserIds == null) {
             assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
             if (CollUtil.isEmpty(assigneeUserIds)) {
@@ -53,7 +53,7 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
                 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
                 assigneeUserIds = SetUtils.asSet((Long) null);
             }
-            execution.setVariable(super.collectionVariable, assigneeUserIds);
+            execution.setVariableLocal(super.collectionVariable, assigneeUserIds);
         }
         return assigneeUserIds.size();
     }

+ 2 - 0
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 {
         runtimeService.setVariable(currentTask.getProcessInstanceId(),
                 String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE);
         // 4. 执行驳回
+        // 使用 moveExecutionsToSingleActivityId 替换 moveExecutionsToSingleActivityId 原因:
+        // 当多实例任务回退的时候有问题。 相关 issue: https://github.com/flowable/flowable-engine/issues/3944
         List<String> runExecutionIds = convertList(taskList, Task::getExecutionId);
         runtimeService.createChangeActivityStateBuilder()
                 .processInstanceId(currentTask.getProcessInstanceId())