提交 | 用户 | 时间
|
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 |
} |