Flowable27多实例(多人会签)-----------持续更新中

“多人会签”的官方术语是 “多实例活动”(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个人完成审批,就通过)结合通过/拒绝票数:假设审批时设置变量approvedCountrejectedCount。完成条件可以是:{approvedCount >= 3 || rejectedCount >= 1} (3人同意或1人拒绝,都结束会签)。

### Flowable 工作流引擎中会签功能的实现与配置 #### 1. 多实例活动的概念 在 Flowable 中,会签可以通过多实例活动(Multi-Instance Activity)来实现。多实例活动允许在一个业务流程中为特定步骤定义重复执行的方式[^2]。这种机制类似于编程中的 `for-each` 结构,能够针对集合中的每一项按顺序或并行地执行某个任务。 #### 2. 配置方式 为了支持会签,在设计流程时需要对目标用户任务节点启用多实例特性。以下是具体的配置方法: ##### XML 定义 通过 BPMN 文件中的 `<userTask>` 节点添加多实例扩展属性即可实现。以下是一个简单的示例: ```xml <userTask id="miUserTask" name="Multiple Instance User Task"> <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="${assignees}" flowable:elementVariable="assignee"> <!-- 设置并发模式 --> </multiInstanceLoopCharacteristics> </userTask> ``` 在此示例中: - 属性 `isSequential="false"` 表明该任务将以 **并行** 方式分配给个参与者。 - 如果设置为 `true`,则表示任务将按照指定顺序逐一完成。 - 参数 `flowable:collection` 是一个值数据源,通常是从上下文中获取的一个列表对象,比如参与者的 ID 列表。 - 参数 `flowable:elementVariable` 定义了每次迭代过程中使用的单个元素名称,这里指代每位具体参与者。 #### 3. 默认流程变量的作用 当启用了多实例特性之后,Flowable 自动提供了一些内置变量用于跟踪状态变化过程[^3]: - `nrOfInstances`: 总共创建了少个实例; - `nrOfCompletedInstances`: 当前已完成的任务数; - `nrOfActiveInstances`: 正处于活跃状态下的未结束任务数目; 这些信息可以帮助开发者监控整体进度以及判断何时满足条件从而继续后续逻辑处理。 #### 4. 示例代码展示如何动态加载参与者名单 假设我们需要根据实际场景计算得出最终审批员,则可以在启动流程之前或者运行期间更新相关字段值。下面给出一段 Java 的伪代码演示这一操作: ```java // 假设我们有一个服务类负责返回候选数组 List<String> assignees = candidateService.getCandidatesForApproval(); Map<String, Object> variables = new HashMap<>(); variables.put("assignees", assignees); // 将候选列表放入流程变量中 runtimeService.startProcessInstanceByKey("processKey", variables); ``` 上述片段展示了怎样把外部获得的数据注入到正在构建的新实例里去供内部使用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值