Flowable会签与或签实战:5分钟搞定多实例任务配置(附避坑指南)

Flowable会签与或签实战:5分钟搞定多实例任务配置(附避坑指南) Flowable会签与或签实战5分钟搞定多实例任务配置附避坑指南在流程引擎开发中会签和或签是两种常见的多人任务处理模式。它们能够有效模拟现实业务场景中的多人协作审批流程比如部门集体决策、多级审核等场景。本文将深入探讨如何在Flowable中快速配置这两种模式并分享实际项目中积累的实战经验。1. 会签与或签的核心概念解析会签Counter-signature是指需要多个参与者共同完成同一任务节点的审批场景。根据业务需求不同会签又可分为以下几种典型模式全员通过所有参与者必须全部同意如重大财务审批比例通过达到设定比例即视为通过如2/3以上同意一票否决任何一位参与者反对即终止流程如安全评审一票通过任意一位参与者同意即可推进如紧急预案或签Or-signature则更为灵活只需任意一位指定参与者完成处理即可继续流程。这种模式常见于多主管平行审批任何一位主管均可处理值班人员任务分配任何在岗人员均可响应多备份联系人通知联系到任意一位即算成功!-- 典型会签配置示例 -- userTask idcounterSignTask name会签审批 multiInstanceLoopCharacteristics isSequentialfalse flowable:collectionassigneeList flowable:elementVariableassignee completionCondition${nrOfInstances nrOfCompletedInstances}/completionCondition /multiInstanceLoopCharacteristics /userTask2. 多实例任务配置全流程2.1 基础配置步骤标识多实例节点在流程设计器中勾选UserTask的Multi-instance属性设置循环类型并行parallel参与者可同时处理顺序sequential按指定顺序依次处理指定参与者集合直接指定静态列表如user1,user2,user3引用流程变量如${approvers}动态查询如${userService.findDeptManagers(execution)}注意集合变量与元素变量名需保持唯一性避免与系统变量冲突2.2 动态参与者分配技巧实际项目中参与者列表往往需要动态确定。以下是几种实用方案方案类型实现方式适用场景固定列表直接定义assignee列表审批人固定的场景表达式使用UEL表达式调用服务方法需要动态计算的场景监听器注入通过ExecutionListener设置变量复杂业务逻辑场景外部存储查询连接数据库或API获取列表审批规则复杂的系统// 通过监听器动态设置参与者示例 public class DynamicAssigneeListener implements ExecutionListener { Override public void notify(DelegateExecution execution) { String deptId (String) execution.getVariable(deptId); ListString users userService.findByDept(deptId); execution.setVariable(assigneeList, users); } }3. 完成条件的高级配置3.1 内置变量说明Flowable为多实例任务提供了三个关键变量nrOfInstances总实例数nrOfCompletedInstances已完成实例数nrOfActiveInstances活动实例数基于这些变量可以构建各种完成条件!-- 不同完成条件示例 -- completionCondition !-- 全员通过 -- ${nrOfInstances nrOfCompletedInstances} !-- 或签模式 -- ${nrOfCompletedInstances 1} !-- 比例通过超过50% -- ${nrOfCompletedInstances nrOfInstances/2} !-- 一票否决 -- ${!rejected nrOfCompletedInstances nrOfInstances} /completionCondition3.2 自定义完成条件对于复杂业务规则可通过JavaDelegate实现自定义逻辑public class CustomCompletionCondition implements JavaDelegate { Override public void execute(DelegateExecution execution) { int agreeCount (int) execution.getVariable(agreeCount); int total (int) execution.getVariable(nrOfInstances); boolean isPassed agreeCount total * 0.7; execution.setVariable(signResult, isPassed); } }在流程定义中引用completionCondition${signResult true}/completionCondition4. 实战避坑指南4.1 常见配置错误变量作用域问题多实例任务内定义的变量默认只在当前实例有效需要跨实例共享时需明确设置作用域集合变量格式错误确保集合类型与预期一致List而非String表达式解析失败复杂的UEL表达式可能因环境差异导致解析异常4.2 性能优化建议避免超大参与者集合超过50人的会签建议拆分子流程使用分组代表机制如部门负责人代表全员异步化处理multiInstanceLoopCharacteristics flowable:asynctrue flowable:exclusivefalse /multiInstanceLoopCharacteristics历史数据清理定期归档已完成实例数据保持运行库轻量4.3 特殊场景处理会签中途新增参与者通过API动态扩展实例集合更新nrOfInstances计数重置完成条件判断逻辑或签中的优先级处理completionCondition !-- 优先处理人完成则立即结束 -- ${priorityCompleted || nrOfCompletedInstances 1} /completionCondition在最近的一个OA系统升级项目中我们遇到一个典型场景部门预算审批需要全体经理会签但任意副经理同意即可推进。最终通过组合条件实现了这个需求completionCondition ${(nrOfCompletedInstances nrOfInstances) || (deputyApproved nrOfCompletedInstances 1)} /completionCondition