Commit 8108b9b82650b407c5eee2cb67983ff7c8be49c0

Authored by YunaiV
1 parent 7d1946d9

fix:【bpm 工作流】BpmSequentialMultiInstanceBehavior 兼容 CallActivity、SubProcess 场景

yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java
... ... @@ -7,35 +7,44 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand
7 7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
8 8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
9 9 import lombok.Setter;
10   -import org.flowable.bpmn.model.*;
  10 +import org.flowable.bpmn.model.Activity;
  11 +import org.flowable.bpmn.model.CallActivity;
  12 +import org.flowable.bpmn.model.FlowElement;
  13 +import org.flowable.bpmn.model.UserTask;
11 14 import org.flowable.engine.delegate.DelegateExecution;
12 15 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
13   -import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
14   -import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
  16 +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
15 17  
16 18 import java.util.List;
17 19 import java.util.Set;
18 20  
19 21 /**
20   - * 自定义的【串行】的【多个】流程任务的 assignee 负责人的分配
  22 + * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配
  23 + * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。
  24 + * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它
21 25 *
22   - * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} 一样,只是继承的类不一样
23   - *
24   - * @author 芋道源码
  26 + * @author kemengkai
  27 + * @since 2022-04-21 16:57
25 28 */
26 29 @Setter
27   -public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior {
  30 +public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior {
28 31  
29 32 private BpmTaskCandidateInvoker taskCandidateInvoker;
30 33  
31   - public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
  34 + public BpmParallelMultiInstanceBehavior(Activity activity,
  35 + AbstractBpmnActivityBehavior innerActivityBehavior) {
32 36 super(activity, innerActivityBehavior);
33 37 }
34 38  
35 39 /**
36   - * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似
  40 + * 重写该方法,主要实现两个功能:
  41 + * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的
  42 + * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人
  43 + *
  44 + * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量
37 45 *
38   - * 差异的点:是在【第二步】的时候,需要返回 LinkedHashSet 集合!因为它需要有序!
  46 + * @param execution 执行任务
  47 + * @return 数量
39 48 */
40 49 @Override
41 50 protected int resolveNrOfInstances(DelegateExecution execution) {
... ... @@ -49,9 +58,8 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
49 58 super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
50 59  
51 60 // 第二步,获取任务的所有处理人
52   - // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人
53 61 @SuppressWarnings("unchecked")
54   - Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
  62 + Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
55 63 if (assigneeUserIds == null) {
56 64 assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
57 65 if (CollUtil.isEmpty(assigneeUserIds)) {
... ... @@ -80,19 +88,4 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
80 88 return super.resolveNrOfInstances(execution);
81 89 }
82 90  
83   - @Override
84   - protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) {
85   - // 参见 https://t.zsxq.com/53Meo 情况
86   - if (execution.getCurrentFlowElement() instanceof CallActivity
87   - || execution.getCurrentFlowElement() instanceof SubProcess) {
88   - super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
89   - return;
90   - }
91   - // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F
92   - super.collectionExpression = null;
93   - super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
94   - super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
95   - super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
96   - }
97   -
98 91 }
... ...
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java
... ... @@ -7,10 +7,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCand
7 7 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
8 8 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
9 9 import lombok.Setter;
10   -import org.flowable.bpmn.model.Activity;
11   -import org.flowable.bpmn.model.CallActivity;
12   -import org.flowable.bpmn.model.FlowElement;
13   -import org.flowable.bpmn.model.UserTask;
  10 +import org.flowable.bpmn.model.*;
14 11 import org.flowable.engine.delegate.DelegateExecution;
15 12 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
16 13 import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
... ... @@ -85,6 +82,12 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB
85 82  
86 83 @Override
87 84 protected void executeOriginalBehavior(DelegateExecution execution, ExecutionEntity multiInstanceRootExecution, int loopCounter) {
  85 + // 参见 https://t.zsxq.com/53Meo 情况
  86 + if (execution.getCurrentFlowElement() instanceof CallActivity
  87 + || execution.getCurrentFlowElement() instanceof SubProcess) {
  88 + super.executeOriginalBehavior(execution, multiInstanceRootExecution, loopCounter);
  89 + return;
  90 + }
88 91 // 参见 https://gitee.com/zhijiantianya/yudao-cloud/issues/IC239F
89 92 super.collectionExpression = null;
90 93 super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
... ...