会签、或签、依次审批
支持多人审批,包括:
- 会签(并行会签):同一个审批节点设置多个人(如 A、B、C 三人,三人会同时收到待办任务),需全部同意之后,审批才可到下一审批节点
- 或签(并行或签):同一个审批节点设置多个人,任意一个人处理后,就能进入下一个节点
- 依次审批(顺序会签):同一个审批节点设置多个人(如 A、B、C 三人),三人按顺序依次收到待办,即 A 先审批,A 提交后 B 才能审批,需全部同意之后,审批才可到下一审批节点
# 1. 多人审批
# 1. 会签(并行会签)
- 会签配置:并行多重事件,实现多个人同时审批
- 完成条件:
${ nrOfCompletedInstances >= nrOfInstances }
,表示所有人都审批通过,才能进入下一个节点
疑问:`nrOfCompletedInstances`、`nrOfInstances` 表示什么意思?
nrOfCompletedInstances
:当前节点已完成的任务数量nrOfInstances
:当前节点总的任务数量
因此,${ nrOfCompletedInstances >= nrOfInstances }
就是,“已完成”大于“总的”数量,即所有人都审批通过。
# 2. 或签(并行或签)
- 会签配置:并行多重事件,实现多个人同时审批
- 完成条件:
${ nrOfCompletedInstances == 1 }
,表示只要有一个人审批通过,就能进入下一个节点
因此,会签和或签的差异,就在于完成条件的不同。
# 3. 依次审批
- 依次审批配置:顺序多重事件,实现多个人按顺序审批
- 循环数量:1,表示每次(“循环”)只有一个人审批
- 完成条件:
${ nrOfCompletedInstances >= nrOfInstances }
,表示只要有一个人审批通过,就能进入下一个节点
因此,依次审批和会签的差异,就在于是否并行审批。
按照这个思路,实现“票签”,是不是很简单?!
友情提示:什么是“票签”?
指同一个审批节点设置多个人,如 A、B、C 三人,当通过比例大于 50% 就能进入下一个节点。
# 2. 实现原理
在 《选择审批人、发起人自选》 小节中,我们看到使用 BpmUserTaskActivityBehavior 实现了审批任务的审批人分配。实际上,还有两个 Behavior 类,如下图所示:
- BpmParallelMultiInstanceBehavior (opens new window):并行 + 多实例(单节点多任务)的 Behavior 类
- BpmSequentialMultiInstanceBehavior (opens new window):顺序 + 多实例(单节点多任务)的 Behavior 类
# 2.1 并行 BpmParallelMultiInstanceBehavior
① BpmParallelMultiInstanceBehavior 实现 Flowable ParallelMultiInstanceBehavior 类,实现单节点多任务的审批人 “计算”。如下图所示:
② BpmUserTaskActivityBehavior,判断是多实例的情况,则复用 BpmParallelMultiInstanceBehavior “计算”结果,直接设置审批人。如下图所示:
所以,先是 BpmParallelMultiInstanceBehavior 计算审批任务数量 + 审批人列表,然后 BpmUserTaskActivityBehavior 直接设置审批人。
# 2.2 顺序 BpmSequentialMultiInstanceBehavior
① BpmSequentialMultiInstanceBehavior 实现 Flowable SequentialMultiInstanceBehavior 类,实现单节点多任务的审批人 “计算”。如下图所示:
② 还是使用 BpmUserTaskActivityBehavior,逻辑是一模一样的。
所以,BpmSequentialMultiInstanceBehavior 和 BpmParallelMultiInstanceBehavior 基本是一致的,差异只是前者返回的是 LinkedHashSet 有序集合。最终,还是交给 Flowable 到底是一次性创建多个审批任务,还是按照顺序创建多个审批任务。