潘志宝
9 天以前 6b13839488edcd06046e26a41fe897358176689c
提交 | 用户 | 时间
e7c126 1 package com.iailab.module.bpm.framework.flowable.core.behavior;
H 2
bb2880 3 import cn.hutool.core.collection.CollUtil;
H 4 import com.iailab.framework.common.util.collection.SetUtils;
e7c126 5 import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
H 6 import com.iailab.module.bpm.framework.flowable.core.util.FlowableUtils;
7 import lombok.Setter;
8 import org.flowable.bpmn.model.Activity;
9 import org.flowable.engine.delegate.DelegateExecution;
10 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
11 import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
12
13 import java.util.Set;
14
15 /**
16  * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配
17  * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。
18  * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它
19  *
20  * @author kemengkai
21  * @since 2022-04-21 16:57
22  */
23 @Setter
24 public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior {
25
26     private BpmTaskCandidateInvoker taskCandidateInvoker;
27
28     public BpmParallelMultiInstanceBehavior(Activity activity,
29                                             AbstractBpmnActivityBehavior innerActivityBehavior) {
30         super(activity, innerActivityBehavior);
31     }
32
33     /**
34      * 重写该方法,主要实现两个功能:
35      * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的
36      * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人
37      *
38      * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量
39      *
40      * @param execution 执行任务
41      * @return 数量
42      */
43     @Override
44     protected int resolveNrOfInstances(DelegateExecution execution) {
45         // 第一步,设置 collectionVariable 和 CollectionVariable
46         // 从  execution.getVariable() 读取所有任务处理人的 key
47         super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
48         super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
49         // 从 execution.getVariable() 读取当前所有任务处理的人的 key
50         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
51
52         // 第二步,获取任务的所有处理人
bb2880 53         @SuppressWarnings("unchecked")
H 54         Set<Long> assigneeUserIds = (Set<Long>) execution.getVariable(super.collectionVariable, Set.class);
55         if (assigneeUserIds == null) {
56             assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
57             execution.setVariable(super.collectionVariable, assigneeUserIds);
58             if (CollUtil.isEmpty(assigneeUserIds)) {
59                 // 特殊:如果没有处理人的情况下,至少有一个 null 空元素,避免自动通过!
60                 // 这样,保证在 BpmUserTaskActivityBehavior 至少创建出一个 Task 任务
61                 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
62                 assigneeUserIds = SetUtils.asSet((Long) null);
63             }
64         }
e7c126 65         return assigneeUserIds.size();
H 66     }
67
bb2880 68
e7c126 69 }