“多人会签”的官方术语是 “多实例活动”(Multi-Instance Activity)。它允许一个任务节点(如用户任务、服务任务等)被执行多次,通常是分配给不同的处理人。
多人会签是工作流中非常常见的场景,例如:
专家评审:一份技术方案需要3位专家同时评审。
部门联合审批:一份预算申请需要财务部、行政部、人事部的负责人共同审批。
投票表决:一个决议需要委员会半数以上成员同意。
Flowable 的多实例活动主要分为两大类:并行会签 和 串行会签。
1. 并行会签 (Parallel Multi-Instance)
并行会签是指同时为多个处理人创建任务实例。所有任务实例都处于活动状态,处理人可以不分先后地完成各自的任务。
特点:
同时创建:所有任务实例一次性生成。
无序处理:处理人完成任务的顺序没有限制。
效率高:适用于不需要等待前一个处理人意见的场景。
例子: 一份报销单需要 A、B、C 三个经理审批,系统会同时给 A、B、C 创建审批任务,他们可以随时处理,互不影响。
(在 Flowable Modeler 中,并行会签的图标是三条竖线)
2. 串行会签 (Sequential Multi-Instance)
串行会签是指任务实例按顺序逐一创建。只有当上一个任务实例完成后,下一个任务实例才会被创建。
特点:
顺序创建:一次只创建一个任务实例。
有序处理:必须按照指定的顺序依次完成。
逐级审批:适用于有层级关系或依赖关系的审批链。
例子: 一份请假申请,需要先由“项目经理”审批,通过后,再由“部门总监”审批。
(在 Flowable Modeler 中,串行会签的图标是三条横线)
如何配置多人会签
在 Flowable Modeler 中配置一个用户任务为多实例非常直观。选中一个用户任务,在属性面板中找到 “Multi-instance” 部分。
Collection (集合)
这是最核心的配置,用于定义需要参与会签的人员列表。
它通常指向一个流程变量,这个变量的类型是 java.util.Collection(例如 List)。
示例:在流程启动或上一个任务中,你通过 Java 代码设置一个名为 assigneeList 的流程变量:
List<String> userList = Arrays.asList("userA", "userB", "userC");
execution.setVariable("assigneeList", userList);
然后在 Modeler 的 Collection 字段中填入 ${assigneeList}。
Element variable (元素变量)
Flowable 在遍历 Collection 集合时,会将当前遍历到的元素(即单个处理人)赋值给这个变量。
在用户任务的 Assignee 字段中,就可以使用这个元素变量来指定当前任务实例的处理人。
示例:如果 Element variable 字段填的是 assignee,那么在 Assignee 字段中就应该填 ${assignee}。
工作流程:Flowable 看到 Collection 是 assigneeList,它会遍历这个列表。
第一次循环,取出 “userA”,设置 assignee = “userA”,然后创建一个 Assignee 为 ${assignee} (即 “userA”) 的任务。
第二次循环,取出 “userB”,设置 assignee = “userB”,然后创建一个 Assignee 为 “userB” 的任务。
…以此类推。
Completion Condition (完成条件)
这是多实例活动的退出条件,决定了什么时候这个多实例节点算作完成,从而流转到下一个节点。
如果不设置,默认行为是需要所有实例都完成(即100%通过)。
你可以使用 Flowable 提供的内置变量来编写复杂的逻辑表达式。
内置的完成条件变量:
nrOfInstances: 总实例数。例如,assigneeList 的大小。
nrOfCompletedInstances: 已完成的实例数。
nrOfActiveInstances: 当前活动的实例数(未完成的)。
loopCounter: 循环计数器,仅在串行会签中有用,表示当前是第几个实例。
完成条件的常见例子:
一票否决:
在任务监听器或表单中,如果用户选择“拒绝”,就设置一个流程变量 outcome = ‘reject’。
完成条件可以写成:${outcome == ‘reject’}。
一旦有任何一个实例将 outcome 设为 reject,整个多实例任务立即结束,并可以根据这个变量走不同的流程分支。
半数通过 (投票场景):
${nrOfCompletedInstances / nrOfInstances >= 0.5}
指定票数通过:
nrOfCompletedInstances>=3(只要有3个人完成审批,就通过)结合通过/拒绝票数:假设审批时设置变量approvedCount和rejectedCount。完成条件可以是:{nrOfCompletedInstances >= 3} (只要有3个人完成审批,就通过)
结合通过/拒绝票数:
假设审批时设置变量 approvedCount 和 rejectedCount。
完成条件可以是:nrOfCompletedInstances>=3(只要有3个人完成审批,就通过)结合通过/拒绝票数:假设审批时设置变量approvedCount和rejectedCount。完成条件可以是:{approvedCount >= 3 || rejectedCount >= 1} (3人同意或1人拒绝,都结束会签)。