别再手动点点点了!用Camunda Modeler + SpringBoot 5分钟搞定一个审批流程(附完整代码)
5分钟极速搭建企业级审批流Camunda Modeler与SpringBoot实战指南每次看到团队还在用if-else硬编码审批逻辑时我的内心都是崩溃的。上周又有个新来的实习生问我为什么请假审批要改三天代码 今天我就用Camunda这个流程引擎神器带你们体验什么叫拖拽式开发——从画流程图到上线REST API接口全程只需5分钟咖啡时间。1. 环境准备零配置启动Camunda生态在开始画流程图之前我们需要三样工具Modeler设计器、SpringBoot运行环境、以及一个能跑流程的引擎。别被吓到——实际上你只需要# 下载Camunda Modeler选对应系统版本 wget https://camunda.com/download/modeler/安装完成后打开Modeler你会看到一个清爽的界面。左边是各种流程元素用户任务、服务调用、网关等中间是画布区右边是属性配置面板——这将成为你今后最熟悉的三个区域。常见安装问题排查表问题现象解决方案启动报Java版本错误安装JDK 11并配置JAVA_HOME流程图保存失败检查文件路径是否包含中文/特殊字符元素拖拽无反应重启软件或更新显卡驱动提示Modeler默认保存的是.bpmn格式文件这是符合BPMN 2.0标准的XML文件可以用任何文本编辑器查看和修改2. 绘制第一个审批流程从请假单开始让我们用最常见的请假审批场景练手。在Modeler中新建文件按CtrlS保存为leave-request.bpmn。然后依次拖入这些元素开始事件圆形表示流程起点用户任务圆角矩形命名为提交请假申请排他网关菱形用于判断审批路径两个用户任务分别命名为部门审批和HR备案结束事件粗边圆形流程终点用连接线把它们串起来后你的流程图应该像这样开始 → 提交申请 → 网关 →3天以下→ 部门审批 → 结束 ↘3天以上→ HR备案 → 结束关键配置技巧双击网关连线设置条件表达式例如${days 3}在用户任务的Assignee属性中设置负责人可以用固定值如zhangsan或者表达式${initiator}为每个任务添加表单字段点击任务→Forms→添加days(数字)、reason(文本)等变量!-- 这是自动生成的BPMN代码片段示例 -- userTask idtask_approve name部门审批 extensionElements camunda:formData camunda:formField iddays label请假天数 typelong / /camunda:formData /extensionElements /userTask3. SpringBoot集成让流程图跑起来光有图纸不够我们需要让流程真正运转。新建一个SpringBoot项目添加这两个依赖implementation org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-webapp:7.18.0 implementation org.springframework.boot:spring-boot-starter-jdbc然后在application.yml中添加camunda.bpm: admin-user: id: demo password: demo filter: create: All tasks启动项目后你会自动获得流程引擎http://localhost:8080/engine-rest任务管理台http://localhost:8080/camunda/app/tasklist监控面板http://localhost:8080/camunda/app/cockpit把之前画的leave-request.bpmn文件复制到src/main/resources目录下——SpringBoot会自动部署它现在访问任务管理台用demo/demo登录应该能看到刚部署的请假流程。4. 编写业务逻辑ServiceTask实战审批流的核心是业务处理。我们在部门审批后添加一个ServiceTask节点用来发送通知邮件在Modeler中拖入ServiceTask命名为发送审批通知设置实现类型为Delegate Expression值为${emailSender}在Spring项目中创建处理类Component(emailSender) public class SendEmailDelegate implements JavaDelegate { private static final Logger LOG Logger.getLogger(SendEmailDelegate.class.getName()); Override public void execute(DelegateExecution execution) { String requester (String) execution.getVariable(initiator); Long days (Long) execution.getVariable(days); LOG.info(给 requester 发送邮件您的 days 天请假已审批通过); } }变量传递的三种方式启动时传入runtimeService.startProcessInstanceWithVariables()任务完成时taskService.complete(taskId, variables)在Delegate中设置execution.setVariable(key, value)注意ServiceTask是同步操作如果需要异步处理应该使用ExternalTask模式5. 流程监控与异常处理上线后难免遇到流程卡住的情况。Camunda自带的Cockpit控制台提供了强大的监控能力流程实例视图查看所有运行中的流程支持按状态筛选活动实例统计发现瓶颈节点如某个审批环节平均耗时过长历史记录审计完整的流程轨迹对于异常情况我常用的处理命令// 强制终止卡住的流程 runtimeService.deleteProcessInstance(processInstanceId, 系统超时自动终止); // 重新分配任务 taskService.setAssignee(taskId, 新的审批人); // 修复数据不一致 runtimeService.setVariable(executionId, correctValue, 123);典型故障处理流程在Cockpit中找到异常流程实例ID检查日志确认最后成功执行的节点通过REST API或Java API进行干预记录操作日志以便审计6. 进阶技巧动态路由与多级审批当基础流程跑通后可以尝试这些企业级功能条件路由增强// 在网关条件中使用更复杂的表达式 ${days 3 requester.level 3 !holidayChecker.isHoliday(startDate)}多实例审批会签/或签userTask idgroupApprove name部门会签 multiInstanceLoopCharacteristics isSequentialfalse loopCardinality3/loopCardinality !-- 需要3人审批 -- /multiInstanceLoopCharacteristics /userTaskREST API集成示例// 发起新流程 ProcessInstance instance runtimeService.startProcessInstanceByKey( leaveRequest, Variables.putValue(days, 5) ); // 查询待办任务 ListTask tasks taskService.createTaskQuery() .taskAssignee(zhangsan) .processDefinitionKey(leaveRequest) .list();在实际项目中我习惯把常用操作封装成工具类。比如这个审批历史查询方法public ListMapString, Object getApprovalHistory(String processInstanceId) { return historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .activityType(userTask) .list() .stream() .map(instance - Map.of( taskName, instance.getActivityName(), approver, instance.getAssignee(), endTime, instance.getEndTime() )) .collect(Collectors.toList()); }记得第一次用Camunda实现财务报销流时原本两周的开发量压缩到了两天。最让我惊喜的是——当业务方要求增加二级审批时我只在流程图上拖了个新节点就搞定了完全不用改代码。这种敏捷性正是现代开发最需要的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2522591.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!