Commit 8108b9b82650b407c5eee2cb67983ff7c8be49c0
1 parent
7d1946d9
fix:【bpm 工作流】BpmSequentialMultiInstanceBehavior 兼容 CallActivity、SubProcess 场景
Showing
2 changed files
with
28 additions
and
32 deletions
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()); | ... | ... |