别再手动跑审批了用Flowable工作流5分钟搞定发薪流程每到发薪日财务部门的同事总是忙得焦头烂额——纸质审批单在各部门间来回传递一不小心就可能丢失审批进度全靠人工跟进效率低下还容易出错。作为技术负责人你完全可以用Flowable工作流引擎在一个下午内搭建出自动化发薪流程的原型。下面我们就从零开始用最精简的代码实现申请-审批-打款-通知全流程自动化。1. 五分钟搭建发薪流程骨架1.1 绘制BPMN流程图首先在Flowable Modeler中创建新模型使用以下核心节点用户任务(User Task)用于财务审批环节服务任务(Service Task)对接银行打款系统中间信号捕获事件(Intermediate Catch Event)等待银行回调排他网关(Exclusive Gateway)根据条件分流流程图结构如下process idpayrollProcess name薪资发放流程 startEvent idstart/ userTask idfinanceApproval name财务审批/ serviceTask idbankTransfer name银行打款/ intermediateCatchEvent idwaitCallback name等待银行回调 signalEventDefinition signalRefbankSignal/ /intermediateCatchEvent endEvent idend/ !-- 省略序列流和网关细节 -- /process1.2 关键配置速查表配置项值作用流程标识payrollProcess流程唯一标识审批变量${approval}存储审批结果打款变量${payment}存储银行返回状态审批人变量${assignee}动态指定审批人信号引用bankSignal银行回调信号2. 核心代码实现2.1 动态审批人指派启动流程时注入审批人变量public String startPayrollProcess(String applicantId, String financeApprover) { MapString, Object variables new HashMap(); variables.put(assignee, financeApprover); // 动态指定审批人 variables.put(applicant, applicantId); ProcessInstance instance runtimeService .startProcessInstanceByKey(payrollProcess, variables); return instance.getId(); }2.2 银行打款服务任务实现JavaDelegate接口处理打款逻辑public class BankTransferDelegate implements JavaDelegate { Override public void execute(DelegateExecution execution) { String businessKey execution.getProcessInstanceBusinessKey(); // 模拟调用银行API PaymentResult result mockBankAPI(businessKey); // 暂存交易流水号 execution.setVariable(transactionId, result.getTransactionId()); } private PaymentResult mockBankAPI(String businessKey) { // 实际项目替换为真实银行接口调用 return new PaymentResult(UUID.randomUUID().toString()); } }2.3 银行回调处理银行处理完成后触发信号事件public void handleBankCallback(String businessKey, boolean success) { ProcessInstance instance runtimeService .createProcessInstanceQuery() .processInstanceBusinessKey(businessKey) .singleResult(); if (instance ! null) { runtimeService.signalEventReceived( bankSignal, instance.getId(), Collections.singletonMap(payment, success ? success : fail) ); } }3. 实战优化技巧3.1 审批自动超时处理在BPMN中添加定时边界事件boundaryEvent idtimeoutEvent attachedToReffinanceApproval timerEventDefinition timeDurationPT24H/timeDuration /timerEventDefinition /boundaryEvent3.2 多级审批配置使用监听器动态设置审批链public class MultiLevelApprovalListener implements TaskListener { Override public void notify(DelegateTask task) { if (financeApproval.equals(task.getTaskDefinitionKey())) { // 根据金额决定审批层级 Double amount (Double) task.getVariable(amount); if (amount 100000) { task.addCandidateGroup(seniorFinance); } else { task.setAssignee((String) task.getVariable(assignee)); } } } }4. 生产环境注意事项事务管理服务任务中涉及数据库操作时添加Transactional注解异常处理实现FlowableExceptionHandler统一处理流程异常性能优化高频流程建议启用异步执行serviceTask idasyncTask flowable:asynctrue flowable:exclusivefalse/实际项目中我们曾用这套方案将某企业发薪流程从平均3天缩短到4小时内完成。关键在于保持流程模型的简洁把复杂逻辑放到外部服务中实现。