houzhongjian
3 天以前 f4f9405f99cb35e2fd6cfeae4c54617304228fda
提交 | 用户 | 时间
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.SequentialMultiInstanceBehavior;
12
13 import java.util.Set;
14
15 /**
16  * 自定义的【串行】的【多个】流程任务的 assignee 负责人的分配
17  *
18  * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} 一样,只是继承的类不一样
19  *
20  * @author iailab
21  */
22 @Setter
23 public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior {
24
25     private BpmTaskCandidateInvoker taskCandidateInvoker;
26
27     public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
28         super(activity, innerActivityBehavior);
29     }
30
31     /**
32      * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似
33      *
34      * 差异的点:是在【第二步】的时候,需要返回 LinkedHashSet 集合!因为它需要有序!
35      */
36     @Override
37     protected int resolveNrOfInstances(DelegateExecution execution) {
38         // 第一步,设置 collectionVariable 和 CollectionVariable
39         // 从  execution.getVariable() 读取所有任务处理人的 key
40         super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
41         super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId());
42         // 从 execution.getVariable() 读取当前所有任务处理的人的 key
43         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId());
44
45         // 第二步,获取任务的所有处理人
f4f940 46         // 不使用 execution.getVariable 原因:目前依次审批任务回退后 collectionVariable 变量没有清理, 如果重新进入该任务不会重新分配审批人
bb2880 47         @SuppressWarnings("unchecked")
f4f940 48         Set<Long> assigneeUserIds = (Set<Long>) execution.getVariableLocal(super.collectionVariable, Set.class);
bb2880 49         if (assigneeUserIds == null) {
H 50             assigneeUserIds = taskCandidateInvoker.calculateUsersByTask(execution);
51             if (CollUtil.isEmpty(assigneeUserIds)) {
52                 // 特殊:如果没有处理人的情况下,至少有一个 null 空元素,避免自动通过!
53                 // 这样,保证在 BpmUserTaskActivityBehavior 至少创建出一个 Task 任务
54                 // 用途:1)审批人为空时;2)审批类型为自动通过、自动拒绝时
55                 assigneeUserIds = SetUtils.asSet((Long) null);
56             }
f4f940 57             execution.setVariableLocal(super.collectionVariable, assigneeUserIds);
bb2880 58         }
e7c126 59         return assigneeUserIds.size();
H 60     }
61 }