新闻详情

新闻详情

首页 / 资讯中心 / 详情

别再手动传审批单了!用Activiti7的会签功能,5分钟搞定多人审批流程

发布时间:2026/6/8 5:29:34
别再手动传审批单了!用Activiti7的会签功能,5分钟搞定多人审批流程
告别审批低效Activiti7多实例任务实战指南每次看到同事抱着一叠纸质审批单在办公室来回奔波或是收到十几封关于同一份报销单的审批邮件时你是否想过——数字时代的审批流程为什么还停留在石器时代传统审批方式不仅消耗大量时间还容易出现单据丢失、审批状态不透明等问题。本文将带你用Activiti7的工作流引擎彻底解决这些痛点。1. 为什么需要多实例任务在大多数组织中审批流程往往不是简单的直线型。一份采购申请可能需要财务、法务和部门主管三方共同审批一个项目立项书可能需要至少两位技术专家的评审意见而一个简单的请假申请可能只需要任意一位值班经理签字即可。这些场景对应着两种典型的多实例任务模式会签所有审批人都需同意和或签任一审批人同意即可。传统解决方案通常采用以下三种方式但都存在明显缺陷串行审批按固定顺序逐个审批效率低下且容易形成瓶颈邮件抄送审批状态难以追踪容易漏审或重复审批人工汇总需要专人收集整理审批结果工作量大且易出错Activiti7的多实例任务功能通过以下核心优势解决了这些问题并行处理所有审批人可同时收到任务审批过程互不阻塞自动聚合系统自动统计审批结果无需人工干预状态透明实时查看每个审批人的处理状态和整体进度灵活规则支持按人数、比例或自定义条件判断审批结果// 典型的多实例任务配置参数 multiInstanceLoopCharacteristics { isSequential: false // 是否顺序执行false表示并行 collection: approveUserList // 审批人列表变量名 elementVariable: approver // 当前审批人变量名 completionCondition: ${nrOfCompletedInstances/nrOfInstances 0.5} // 完成条件 }2. 会签实战从业务流程到技术实现2.1 业务流程建模假设我们有一个项目预算审批流程需要财务总监、技术总监和产品总监三方会签。在BPMN设计器中我们需要创建UserTask并设置为多实例配置关键属性Collectionapprovers审批人列表变量Element variablecurrentApprover当前审批人Completion condition${nrOfCompletedInstances nrOfInstances}全部同意属性值说明isSequentialfalse并行审批loopCardinality空由collection决定实例数completionCondition${nrOfCompletedInstances nrOfInstances}需全部完成2.2 Spring Boot集成实现在Spring Boot项目中启动一个会签流程RestController RequestMapping(/approval) public class ApprovalController { Autowired private RuntimeService runtimeService; PostMapping(/startBudgetApproval) public String startBudgetApproval(RequestBody ApprovalRequest request) { MapString, Object variables new HashMap(); variables.put(approvers, Arrays.asList(finance_mgr, tech_mgr, product_mgr)); variables.put(budgetAmount, request.getAmount()); ProcessInstance instance runtimeService.startProcessInstanceByKey( budgetApproval, variables ); return 流程已启动ID instance.getId(); } }审批人完成任务时PostMapping(/completeApproval/{taskId}) public String completeApproval(PathVariable String taskId, RequestBody ApprovalResult result) { MapString, Object variables new HashMap(); variables.put(approved, result.isApproved()); variables.put(comment, result.getComment()); taskService.complete(taskId, variables); return 审批结果已提交; }提示实际项目中应考虑添加事务管理和异常处理确保流程状态一致性3. 或签场景与高级配置3.1 基础或签实现对于值班经理审批这类或签场景配置要点在于完成条件userTask idmanagerApproval name值班经理审批 multiInstanceLoopCharacteristics isSequentialfalse collectionmanagers elementVariablemanager completionCondition${nrOfCompletedInstances 1}/completionCondition /multiInstanceLoopCharacteristics /userTask启动流程时传入审批人列表ListString managers shiftService.getAvailableManagers(); variables.put(managers, managers);3.2 动态审批人策略实际业务中审批人列表往往需要动态确定。可以通过实现AssignmentProvider接口实现public class DynamicApproverProvider implements AssignmentProvider { Override public CollectionString getAssignments(DelegateExecution execution) { String department (String) execution.getVariable(department); String requestType (String) execution.getVariable(requestType); return approvalRuleService.findApprovers(department, requestType); } }然后在流程定义中引用userTask iddynamicApproval name动态审批 extensionElements activiti:assignmentProvider classcom.example.DynamicApproverProvider/ /extensionElements /userTask4. 调试与性能优化4.1 数据库状态分析了解多实例任务在数据库中的表示有助于调试ACT_RU_TASK表每个审批人对应一条任务记录当完成条件满足时所有相关记录会被清除ACT_HI_TASKINST表记录历史任务实例被跳过的或签任务会有特殊标记DELETE_REASON_字段4.2 性能优化建议批量操作当审批人较多时使用批量查询接口ListTask tasks taskService.createTaskQuery() .processInstanceId(processInstanceId) .listPage(0, 100);异步处理对非关键操作配置异步属性serviceTask idarchiveTask activiti:asynctrue/缓存策略对频繁访问的流程定义启用缓存activiti.process-definition-cache-limit100索引优化确保ACT_RU_TASK表上的PROC_INST_ID_和ASSIGNEE_字段有索引在实际项目中引入多实例任务后某企业的采购审批周期从平均3.5天缩短至6小时审批相关的人工操作时间减少了82%。更重要的是所有审批记录现在都可追溯、可审计大大降低了合规风险。
网站建设 高端定制 企业官网