Activiti7多实例会签实战从比例条件到自定义逻辑的深度解析在复杂业务流程中会签机制是确保决策民主性和科学性的关键技术手段。Activiti7作为业界领先的工作流引擎其多实例特性为会签场景提供了强大支持。本文将带您超越基础的任务分配深入探索如何利用Activiti7的多实例机制实现灵活多样的会签逻辑。1. 多实例会签的核心概念与配置会签本质上是一种分布式决策机制它允许一个任务节点由多个参与者共同处理。与简单的任务分配不同会签需要解决三个核心问题参与者如何确定、执行顺序如何安排以及完成条件如何判定。在Activiti7中多实例会签通过BPMN XML中的multiInstanceLoopCharacteristics元素实现。以下是一个典型的配置示例userTask idreviewTask name立项评审 multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${approveUserList} activiti:elementVariableapprover completionCondition${nrOfCompletedInstances/nrOfInstances 0.67}/completionCondition /multiInstanceLoopCharacteristics /userTask关键配置参数说明参数类型说明示例值isSequentialBoolean是否顺序执行false并行collectionExpression参与者集合${approveUserList}elementVariableString元素变量名approvercompletionConditionExpression完成条件${nrOfCompletedInstances1}实际应用建议并行执行isSequentialfalse适合无依赖关系的评审场景顺序执行适合需要前序意见参考的场景如层级审批元素变量名应与任务处理人的赋值表达式一致2. 比例条件会签的实现与优化比例条件是最常见的会签完成标准它通过数学表达式定义通过阈值。Activiti提供了三个内置变量用于条件判断nrOfInstances总实例数参与者总数nrOfCompletedInstances已完成审批的实例数nrOfActiveInstances尚未完成的实例数2.1 典型比例条件表达式// 简单多数通过超过50% ${nrOfCompletedInstances/nrOfInstances 0.5} // 三分之二多数通过 ${nrOfCompletedInstances/nrOfInstances 0.6667} // 一票否决制任一拒绝即终止 ${rejectCount 0}2.2 Spring Boot集成实践在Spring环境中启动带会签的流程实例RestController RequestMapping(/process) public class ProcessController { Autowired private RuntimeService runtimeService; PostMapping(/start) public String startProcess(RequestBody ApproveRequest request) { MapString, Object variables new HashMap(); variables.put(approveUserList, request.getApprovers()); variables.put(businessKey, request.getProjectId()); ProcessInstance instance runtimeService.startProcessInstanceByKey( projectApproval, request.getProjectId(), variables ); return instance.getId(); } }性能优化技巧对于大规模会签50人考虑分批加载参与者列表使用异步执行器async executor减轻系统负载高频查询时添加processInstanceId索引3. 自定义Java条件类的进阶应用当业务规则超出表达式能力范围时可以通过实现JavaDelegate或ActivityBehavior接口创建自定义条件类。3.1 实现自定义完成条件Component public class RoleBasedCompleteCondition implements JavaDelegate { Override public void execute(DelegateExecution execution) { ListString approvedRoles (ListString) execution.getVariable(requiredRoles); ListString approvers (ListString) execution.getVariable(approveUserList); MapString, String approvals (MapString, String) execution.getVariable(approvalResults); long requiredApprovals approvedRoles.stream() .filter(role - approvers.contains(role) approve.equals(approvals.get(role))) .count(); execution.setVariable( meetsCondition, requiredApprovals approvedRoles.size() ); } }对应的BPMN配置serviceTask idcompleteCondition activiti:classcom.example.RoleBasedCompleteCondition multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${approveUserList} completionCondition${meetsCondition}/completionCondition /multiInstanceLoopCharacteristics /serviceTask3.2 复杂业务场景处理在实际项目中我们可能需要处理更复杂的规则public class AdvancedCompleteCondition implements JavaDelegate { Override public void execute(DelegateExecution execution) { // 获取审批历史 ListComment comments taskService.getProcessInstanceComments( execution.getProcessInstanceId()); // 检查关键角色审批情况 boolean hasCEOApproval checkApprovalByRole(comments, CEO); boolean hasCFOApproval checkApprovalByRole(comments, CFO); // 计算总体通过率 double approvalRate calculateApprovalRate(comments); // 综合判断条件 boolean isComplete (hasCEOApproval hasCFOApproval) || approvalRate 0.75; execution.setVariable(completionFlag, isComplete); } private boolean checkApprovalByRole(ListComment comments, String role) { return comments.stream() .anyMatch(c - c.getType().equals(role) c.getMessage().contains(APPROVED)); } private double calculateApprovalRate(ListComment comments) { long total comments.size(); long approved comments.stream() .filter(c - c.getMessage().contains(APPROVED)) .count(); return (double)approved/total; } }4. 会签与或签的对比与选型虽然会签和或签都基于多实例机制但它们的适用场景和实现方式有显著差异特性会签或签完成条件自定义复杂条件任意一人完成即可执行顺序可顺序可并行通常并行业务场景需要集体决策快速响应场景数据一致性需要额外处理天然一致性能影响较高较低或签的典型配置userTask idquickApprove name快速审批 multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${candidates} completionCondition${nrOfCompletedInstances 1}/completionCondition /multiInstanceLoopCharacteristics /userTask在实际项目架构中建议将会签任务与其他服务解耦[客户端] → [API网关] → [流程服务] ←→ [审批服务] ↓ [规则引擎] ←→ [角色服务]这种架构允许审批服务专注于业务逻辑处理流程服务维护流程状态规则引擎处理复杂决策逻辑各服务可独立扩展和演进
别再只会用Assignee了!Activiti7多实例会签实战:从按比例通过到自定义Java类条件
发布时间:2026/6/8 20:39:15
Activiti7多实例会签实战从比例条件到自定义逻辑的深度解析在复杂业务流程中会签机制是确保决策民主性和科学性的关键技术手段。Activiti7作为业界领先的工作流引擎其多实例特性为会签场景提供了强大支持。本文将带您超越基础的任务分配深入探索如何利用Activiti7的多实例机制实现灵活多样的会签逻辑。1. 多实例会签的核心概念与配置会签本质上是一种分布式决策机制它允许一个任务节点由多个参与者共同处理。与简单的任务分配不同会签需要解决三个核心问题参与者如何确定、执行顺序如何安排以及完成条件如何判定。在Activiti7中多实例会签通过BPMN XML中的multiInstanceLoopCharacteristics元素实现。以下是一个典型的配置示例userTask idreviewTask name立项评审 multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${approveUserList} activiti:elementVariableapprover completionCondition${nrOfCompletedInstances/nrOfInstances 0.67}/completionCondition /multiInstanceLoopCharacteristics /userTask关键配置参数说明参数类型说明示例值isSequentialBoolean是否顺序执行false并行collectionExpression参与者集合${approveUserList}elementVariableString元素变量名approvercompletionConditionExpression完成条件${nrOfCompletedInstances1}实际应用建议并行执行isSequentialfalse适合无依赖关系的评审场景顺序执行适合需要前序意见参考的场景如层级审批元素变量名应与任务处理人的赋值表达式一致2. 比例条件会签的实现与优化比例条件是最常见的会签完成标准它通过数学表达式定义通过阈值。Activiti提供了三个内置变量用于条件判断nrOfInstances总实例数参与者总数nrOfCompletedInstances已完成审批的实例数nrOfActiveInstances尚未完成的实例数2.1 典型比例条件表达式// 简单多数通过超过50% ${nrOfCompletedInstances/nrOfInstances 0.5} // 三分之二多数通过 ${nrOfCompletedInstances/nrOfInstances 0.6667} // 一票否决制任一拒绝即终止 ${rejectCount 0}2.2 Spring Boot集成实践在Spring环境中启动带会签的流程实例RestController RequestMapping(/process) public class ProcessController { Autowired private RuntimeService runtimeService; PostMapping(/start) public String startProcess(RequestBody ApproveRequest request) { MapString, Object variables new HashMap(); variables.put(approveUserList, request.getApprovers()); variables.put(businessKey, request.getProjectId()); ProcessInstance instance runtimeService.startProcessInstanceByKey( projectApproval, request.getProjectId(), variables ); return instance.getId(); } }性能优化技巧对于大规模会签50人考虑分批加载参与者列表使用异步执行器async executor减轻系统负载高频查询时添加processInstanceId索引3. 自定义Java条件类的进阶应用当业务规则超出表达式能力范围时可以通过实现JavaDelegate或ActivityBehavior接口创建自定义条件类。3.1 实现自定义完成条件Component public class RoleBasedCompleteCondition implements JavaDelegate { Override public void execute(DelegateExecution execution) { ListString approvedRoles (ListString) execution.getVariable(requiredRoles); ListString approvers (ListString) execution.getVariable(approveUserList); MapString, String approvals (MapString, String) execution.getVariable(approvalResults); long requiredApprovals approvedRoles.stream() .filter(role - approvers.contains(role) approve.equals(approvals.get(role))) .count(); execution.setVariable( meetsCondition, requiredApprovals approvedRoles.size() ); } }对应的BPMN配置serviceTask idcompleteCondition activiti:classcom.example.RoleBasedCompleteCondition multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${approveUserList} completionCondition${meetsCondition}/completionCondition /multiInstanceLoopCharacteristics /serviceTask3.2 复杂业务场景处理在实际项目中我们可能需要处理更复杂的规则public class AdvancedCompleteCondition implements JavaDelegate { Override public void execute(DelegateExecution execution) { // 获取审批历史 ListComment comments taskService.getProcessInstanceComments( execution.getProcessInstanceId()); // 检查关键角色审批情况 boolean hasCEOApproval checkApprovalByRole(comments, CEO); boolean hasCFOApproval checkApprovalByRole(comments, CFO); // 计算总体通过率 double approvalRate calculateApprovalRate(comments); // 综合判断条件 boolean isComplete (hasCEOApproval hasCFOApproval) || approvalRate 0.75; execution.setVariable(completionFlag, isComplete); } private boolean checkApprovalByRole(ListComment comments, String role) { return comments.stream() .anyMatch(c - c.getType().equals(role) c.getMessage().contains(APPROVED)); } private double calculateApprovalRate(ListComment comments) { long total comments.size(); long approved comments.stream() .filter(c - c.getMessage().contains(APPROVED)) .count(); return (double)approved/total; } }4. 会签与或签的对比与选型虽然会签和或签都基于多实例机制但它们的适用场景和实现方式有显著差异特性会签或签完成条件自定义复杂条件任意一人完成即可执行顺序可顺序可并行通常并行业务场景需要集体决策快速响应场景数据一致性需要额外处理天然一致性能影响较高较低或签的典型配置userTask idquickApprove name快速审批 multiInstanceLoopCharacteristics isSequentialfalse activiti:collection${candidates} completionCondition${nrOfCompletedInstances 1}/completionCondition /multiInstanceLoopCharacteristics /userTask在实际项目架构中建议将会签任务与其他服务解耦[客户端] → [API网关] → [流程服务] ←→ [审批服务] ↓ [规则引擎] ←→ [角色服务]这种架构允许审批服务专注于业务逻辑处理流程服务维护流程状态规则引擎处理复杂决策逻辑各服务可独立扩展和演进