当前位置: 首页 > article >正文

别再手动点点点了!用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实现财务报销流时原本两周的开发量压缩到了两天。最让我惊喜的是——当业务方要求增加二级审批时我只在流程图上拖了个新节点就搞定了完全不用改代码。这种敏捷性正是现代开发最需要的。

相关文章:

别再手动点点点了!用Camunda Modeler + SpringBoot 5分钟搞定一个审批流程(附完整代码)

5分钟极速搭建企业级审批流:Camunda Modeler与SpringBoot实战指南 每次看到团队还在用if-else硬编码审批逻辑时,我的内心都是崩溃的。上周又有个新来的实习生问我:"为什么请假审批要改三天代码?" 今天我就用Camunda这个…...

GLM-4.1V-9B-Base实战:手把手教你做图片内容识别与场景描述

GLM-4.1V-9B-Base实战:手把手教你做图片内容识别与场景描述 1. 认识GLM-4.1V-9B-Base视觉理解模型 GLM-4.1V-9B-Base是智谱AI开源的一款强大的视觉多模态理解模型,专门用于处理图像内容识别与理解任务。这个模型的核心优势在于它能够像人类一样"看…...

Qt插件开发实战:从零构建可动态加载的自定义控件

1. 为什么需要Qt自定义控件插件 第一次用Qt设计师拖控件的时候,我就被它的便捷性惊艳到了。但用久了发现一个问题:默认控件库里的组件根本不够用啊!比如要做个十六进制输入框,或者带特殊效果的进度条,官方压根没提供现…...

从单机到云原生:基于 AgentScope Java 构建高可用实时翻译机器人的完整工程实践

从单机到云原生:基于 AgentScope Java 构建高可用实时翻译机器人的完整工程实践 一、前言:为什么“实时翻译”不是调个 API 就能上线 很多团队第一次做实时翻译机器人时,脑海里的链路通常很简单: 音频输入 -> 语音识别 -> 大模型翻译 -> 返回结果 Demo 阶段这…...

智能家居入门:用51单片机实现光照自动控制的窗帘系统(含Proteus仿真文件)

智能家居DIY实战:从零搭建51单片机光控窗帘系统 清晨的阳光透过窗帘缝隙洒进房间,你是否想过让窗帘能自动感知光线变化,为你营造最舒适的室内环境?今天我们将用最经典的51单片机,配合光照传感器和步进电机,…...

鸿蒙权限管理避坑指南:为什么你的元服务总是权限申请失败?

鸿蒙元服务权限管理实战:从原理到避坑指南 在鸿蒙生态中开发元服务时,权限管理往往是开发者遇到的第一个"拦路虎"。许多看似简单的功能调用,却因为权限配置不当而频频报错。我曾在一个智能家居控制元服务项目中,花了整整…...

从理论到实践:深入解析GNSS完好性监测中的RAIM算法家族

1. GNSS完好性监测为什么需要RAIM? 当你用手机导航时,有没有遇到过定位突然漂移几百米的情况?这就是典型的卫星导航信号异常。对于普通用户可能只是多走几步路,但对于自动驾驶汽车或民航飞机,这种误差可能造成严重后果…...

TI MSPM0G3507硬件开发实战:用SysConfig图形化工具5分钟配置GPIO点灯

TI MSPM0G3507开发实战:SysConfig图形化工具5分钟实现GPIO高效配置 在嵌入式开发领域,快速验证硬件功能是每个工程师的基本诉求。传统的手动编写寄存器配置方式不仅耗时耗力,还容易因人为疏忽导致错误。Texas Instruments推出的SysConfig工具…...

AI绘画进阶技巧:从出图到商用,避开版权坑与同质化的核心方法

如何提升AI绘画作品质量选择适合的模型和工具:Stable Diffusion、MidJourney等工具各有特点,针对不同风格需求选择合适模型。例如,写实风格可使用RealESRGAN增强细节,动漫风格可尝试NovelAI模型。优化提示词(Prompt&am…...

基于Qt6.4的PDF阅读器开发:实现高效章节目录与预览图功能

1. Qt6.4 PDF模块开发环境搭建 第一次接触Qt6.4的PDF模块时,我着实被它的便捷性惊艳到了。相比之前用Qt5.9时折腾第三方库的痛苦经历,现在只需要在安装时勾选一个选项就能获得完整的PDF处理能力,这感觉就像从手动挡升级到了自动驾驶。 开发环…...

Zig命令行开发实战:用zigcli库实现参数解析与表格输出的完整指南

Zig命令行开发实战:用zigcli库实现参数解析与表格输出的完整指南 最近在重构团队内部工具链时,我尝试用Zig重写几个常用CLI工具。相比传统方案,Zig的编译时特性和轻量级运行时特别适合这类场景。今天重点分享如何用zigcli库快速构建带参数解析…...

MogFace-large实战教程:结合OpenCV后处理实现人脸关键点对齐

MogFace-large实战教程:结合OpenCV后处理实现人脸关键点对齐 1. 引言:从人脸检测到关键点对齐 人脸检测是计算机视觉领域最基础也最经典的任务之一。无论是手机解锁、美颜相机,还是视频会议里的虚拟背景,背后都离不开一个精准、…...

C++实战笔记(2): 栈

1. 基础知识 栈(Stack)是一种非常经典的线性数据结构,它最核心的特点是 后进先出(Last In First Out, LIFO)。也就是说,最后进入栈的元素,会最先被取出;而最早进入的数据&#x…...

实测AI人脸隐私卫士:远距离小脸也能精准识别并打码

实测AI人脸隐私卫士:远距离小脸也能精准识别并打码 关键词:AI人脸检测、隐私保护、MediaPipe、自动打码、图像脱敏、本地离线处理、远距离识别 1. 背景与需求分析 1.1 远距离人脸识别的技术挑战 在集体活动拍摄、监控安防等场景中,人脸识…...

Pixel Couplet Gen 算法解析:LSTM网络在序列文本生成中的应用

Pixel Couplet Gen 算法解析:LSTM网络在序列文本生成中的应用 1. 传统对联遇上现代AI 春节贴对联是中国延续千年的文化传统,一副好对联讲究平仄相对、对仗工整、意境相合。传统上,这需要深厚的文学功底才能创作。而今天,Pixel C…...

告别环境冲突!用Docker在Ubuntu 22.04上5分钟搞定ROS2 Humble和rviz2

容器化ROS2开发实战:Ubuntu 22.04Docker高效环境搭建指南 在机器人操作系统(ROS)开发中,环境配置一直是开发者面临的棘手问题。不同ROS版本间的依赖冲突、系统库版本不兼容、开发环境污染等问题常常让开发者陷入无休止的调试循环。…...

U9C与钉钉集成,选‘谁发起’很重要!从系统设计角度聊聊两种对接方案的优劣与选型建议

U9C与钉钉集成:从系统设计视角解析发起方选择的关键逻辑 当企业资源计划(ERP)系统与协同办公平台需要深度整合时,"谁作为数据发起方"这个看似简单的决策,往往成为影响整个系统稳定性的关键因素。作为经历过多…...

OpenCASCADE法向获取避坑指南:为什么你的法线方向总是不对?

OpenCASCADE法向获取避坑指南:为什么你的法线方向总是不对? 在三维建模领域,法线方向的重要性不言而喻。它不仅影响着光照计算、碰撞检测等基础功能,更直接关系到后续的有限元分析、数控加工等高级应用的准确性。作为一款开源的几…...

基于海康SDK+YOLOv8n-pose的智能监控开发:如何用Python实现跌倒检测报警系统

基于海康SDK与YOLOv8n-pose的智能跌倒检测系统开发实战 在养老院、医院病房等特殊场所,跌倒事件往往意味着高风险。传统监控系统只能被动记录画面,而结合计算机视觉的智能分析技术,我们可以实现主动预警。本文将手把手教你如何用Python整合海…...

多模态家居系统崩溃频发?3类隐性跨模态对齐失效正在吞噬你的AIoT稳定性

第一章:多模态家居系统崩溃频发的奇点警讯 2026奇点智能技术大会(https://ml-summit.org) 当语音指令未被响应、视觉传感器突然黑屏、温控模块在零下15℃自动切换至制冷模式——这些并非孤立故障,而是多模态家居系统在跨模态语义对齐失效后集体退化的表…...

【仅限本届参会者解密】:SITS2026圆桌闭门纪要流出——多模态→AGI的3个非线性跃迁窗口期(含时间坐标)

第一章:SITS2026圆桌:多模态与AGI路径 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中,来自DeepMind、OpenAI、中科院自动化所及斯坦福HAI的七位研究者围绕“多模态表征统一性”与“AGI涌现临界条件”展开深度交锋。核…...

BetterGI:5大核心功能彻底解放你的原神双手![特殊字符]

BetterGI:5大核心功能彻底解放你的原神双手!🎮 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…...

2026年3月亲测:GEO优化厂家实操分享

行业痛点分析在AI搜索流量占比超65%的2026年,全国GEO优化领域正面临三大核心挑战:地域精准度不足导致无效流量占比高达38%(数据来源:中国互联网协会2026年Q1报告),平台适配滞后使企业错失72%的算法更新红利…...

【AI入门系列】车市先知:二手车价格预测学习赛507

深度学习方案...

技术书籍速读:年度Top 5推荐

——软件测试从业者的专业进阶指南在AI与云原生技术深度重塑软件测试行业的2026年,高效阅读技术书籍已成为测试工程师的核心竞争力。面对自动化测试框架的快速迭代、DevSecOps的全面普及以及AI测试工具的爆发式增长,测试从业者亟需通过科学速读掌握前沿知…...

优化EFI引导配置:实现WIN10与UBUNTU20.04双系统无缝切换

1. 双系统引导的痛点与EFI解决方案 每次开机都要狂按F12选择系统?两个系统互相找不到对方?删除一个系统导致另一个也无法启动?这些困扰我多年的双系统问题,终于在一次重装系统时找到了完美解决方案。传统BIOSMBR的方式确实可以实现…...

RK3588 AI开发选型指南:RKNN-Toolkit-Lite2 vs. RKNPU2 SDK,C接口和Python接口到底怎么选?

RK3588 AI开发选型指南:RKNN-Toolkit-Lite2与RKNPU2 SDK深度对比 当项目进入部署阶段,RK3588开发者常面临一个关键抉择:选择Python生态的RKNN-Toolkit-Lite2还是C语言的RKNPU2 SDK?这个选择直接影响开发效率、运行性能和后期维护成…...

测试左移与右移平衡:工作流优化

在快速迭代的软件交付环境中,测试左移(Shift-Left Testing)和测试右移(Shift-Right Testing)已成为提升质量与效率的核心策略。测试左移强调在开发生命周期早期介入测试,而测试右移聚焦于生产环境的持续验证…...

C# winform 自制分页功能

一个精简的分页类&#xff0c;配合现有的界面按钮使用&#xff1a;分页类&#xff08;Pagination.cs&#xff09; using System; using System.Collections.Generic;/// <summary> /// 分页管理类 /// </summary> public class Pagination {private int _pageIndex…...

STM32上FreeRTOS和LVGL一起跑,显示不出来?试试这两个配置(附CubeMX工程)

STM32上FreeRTOS与LVGL整合实战&#xff1a;从黑屏到流畅显示的配置秘籍 第一次在STM32上同时跑FreeRTOS和LVGL的经历&#xff0c;就像试图让两个固执的舞者配合跳探戈——明明各自都跳得很好&#xff0c;凑在一起却总是踩脚。我盯着那块毫无反应的LCD屏幕&#xff0c;仿佛能听…...