Commit a1defeb48af149a3277498a41b84642560ecdb5a

Authored by YunaiV
1 parent f5f73adc

BPM:新增顺序会签、或签的能力

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java
... ... @@ -6,6 +6,7 @@ import org.flowable.bpmn.model.Activity;
6 6 import org.flowable.bpmn.model.UserTask;
7 7 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
8 8 import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
  9 +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
9 10 import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
10 11 import org.flowable.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory;
11 12  
... ... @@ -28,11 +29,16 @@ public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory {
28 29  
29 30 @Override
30 31 public ParallelMultiInstanceBehavior createParallelMultiInstanceBehavior(Activity activity,
31   - AbstractBpmnActivityBehavior innerActivityBehavior) {
32   - return new BpmParallelMultiInstanceBehavior(activity, innerActivityBehavior)
  32 + AbstractBpmnActivityBehavior behavior) {
  33 + return new BpmParallelMultiInstanceBehavior(activity, behavior)
33 34 .setTaskCandidateInvoker(taskCandidateInvoker);
34 35 }
35 36  
36   - // TODO @ke:SequentialMultiInstanceBehavior 这个抽空也可以看看
  37 + @Override
  38 + public SequentialMultiInstanceBehavior createSequentialMultiInstanceBehavior(Activity activity,
  39 + AbstractBpmnActivityBehavior behavior) {
  40 + return new BpmSequentialMultiInstanceBehavior(activity, behavior)
  41 + .setTaskCandidateInvoker(taskCandidateInvoker);
  42 + }
37 43  
38 44 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior;
3 3 import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils;
4 4 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
5 5 import lombok.Setter;
6   -import lombok.extern.slf4j.Slf4j;
7 6 import org.flowable.bpmn.model.Activity;
8 7 import org.flowable.engine.delegate.DelegateExecution;
9 8 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
... ... @@ -17,12 +16,11 @@ import java.util.Set;
17 16 * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它
18 17 *
19 18 * @author kemengkai
20   - * @date 2022-04-21 16:57
  19 + * @since 2022-04-21 16:57
21 20 */
22   -@Slf4j
  21 +@Setter
23 22 public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior {
24 23  
25   - @Setter
26 24 private BpmTaskCandidateInvoker taskCandidateInvoker;
27 25  
28 26 public BpmParallelMultiInstanceBehavior(Activity activity,
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmSequentialMultiInstanceBehavior.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior;
  2 +
  3 +import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils;
  4 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
  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.SequentialMultiInstanceBehavior;
  10 +
  11 +import java.util.LinkedHashSet;
  12 +import java.util.Set;
  13 +
  14 +/**
  15 + * 自定义的【串行】的【多个】流程任务的 assignee 负责人的分配
  16 + *
  17 + * 本质上,实现和 {@link BpmParallelMultiInstanceBehavior} 一样,只是继承的类不一样
  18 + *
  19 + * @author 芋道源码
  20 + */
  21 +@Setter
  22 +public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceBehavior {
  23 +
  24 + private BpmTaskCandidateInvoker taskCandidateInvoker;
  25 +
  26 + public BpmSequentialMultiInstanceBehavior(Activity activity, AbstractBpmnActivityBehavior innerActivityBehavior) {
  27 + super(activity, innerActivityBehavior);
  28 + }
  29 +
  30 + /**
  31 + * 逻辑和 {@link BpmParallelMultiInstanceBehavior#resolveNrOfInstances(DelegateExecution)} 类似
  32 + *
  33 + * 差异的点:是在【第二步】的时候,需要返回 LinkedHashSet 集合!因为它需要有序!
  34 + */
  35 + @Override
  36 + protected int resolveNrOfInstances(DelegateExecution execution) {
  37 + // 第一步,设置 collectionVariable 和 CollectionVariable
  38 + // 从 execution.getVariable() 读取所有任务处理人的 key
  39 + super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的
  40 + super.collectionVariable = FlowableUtils.formatCollectionVariable(execution.getCurrentActivityId());
  41 + // 从 execution.getVariable() 读取当前所有任务处理的人的 key
  42 + super.collectionElementVariable = FlowableUtils.formatCollectionElementVariable(execution.getCurrentActivityId());
  43 +
  44 + // 第二步,获取任务的所有处理人
  45 + Set<Long> assigneeUserIds = new LinkedHashSet<>(taskCandidateInvoker.calculateUsers(execution)); // 保证有序!!!
  46 + execution.setVariable(super.collectionVariable, assigneeUserIds);
  47 + return assigneeUserIds.size();
  48 + }
  49 +
  50 +}
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java
... ... @@ -47,7 +47,8 @@ public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior {
47 47 }
48 48  
49 49 private Long calculateTaskCandidateUsers(DelegateExecution execution) {
50   - // 情况一,如果是多实例的任务,例如说会签、或签等情况,则从 Variable 中获取。它的任务处理人在 BpmParallelMultiInstanceBehavior 中已经被分配了
  50 + // 情况一,如果是多实例的任务,例如说会签、或签等情况,则从 Variable 中获取。
  51 + // 顺序审批可见 BpmSequentialMultiInstanceBehavior,并发审批可见 BpmSequentialMultiInstanceBehavior
51 52 if (super.multiInstanceActivityBehavior != null) {
52 53 return execution.getVariable(super.multiInstanceActivityBehavior.getCollectionElementVariable(), Long.class);
53 54 }
... ...