潘志宝
2024-12-03 51c1c2c9fa28fb1765dd6e81c70b78566792aebe
提交 | 用户 | 时间
e7c126 1 package com.iailab.module.bpm.framework.flowable.core.behavior;
H 2
3 import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
4 import com.iailab.module.bpm.framework.flowable.core.util.FlowableUtils;
5 import lombok.Setter;
6 import org.flowable.bpmn.model.Activity;
7 import org.flowable.engine.delegate.DelegateExecution;
8 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
9 import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
10
11 import java.util.Set;
12
13 /**
14  * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配
15  * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。
16  * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它
17  *
18  * @author kemengkai
19  * @since 2022-04-21 16:57
20  */
21 @Setter
22 public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior {
23
24     private BpmTaskCandidateInvoker taskCandidateInvoker;
25
26     public BpmParallelMultiInstanceBehavior(Activity activity,
27                                             AbstractBpmnActivityBehavior innerActivityBehavior) {
28         super(activity, innerActivityBehavior);
29     }
30
31     /**
32      * 重写该方法,主要实现两个功能:
33      * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的
34      * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人
35      *
36      * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量
37      *
38      * @param execution 执行任务
39      * @return 数量
40      */
41     @Override
42     protected int resolveNrOfInstances(DelegateExecution execution) {
43         // 第一步,设置 collectionVariable 和 CollectionVariable
44         // 从  execution.getVariable() 读取所有任务处理人的 key
45         super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
46         super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
47         // 从 execution.getVariable() 读取当前所有任务处理的人的 key
48         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
49
50         // 第二步,获取任务的所有处理人
51         Set<Long> assigneeUserIds = taskCandidateInvoker.calculateUsers(execution);
52         execution.setVariable(super.collectionVariable, assigneeUserIds);
53         return assigneeUserIds.size();
54     }
55
56 }