详解SpringCloud集成Camunda7.19实现工作流审批(二)
本章将分享的是camunda流程设计器--Camunda Modeler的基本使用(对应camunda版本是7.19),包括bpmn流程图画法,各种控件使用以及一些日常业务场景的流程图的实现
参考资料:
Camunda BPMN 基础组件-CSDN博客
Camunda: ExecutionListener执行监听器和TaskListener任务监听器-CSDN博客
snail-camunda: Camunda二次封装以及相关功能使用介绍。 中国式工作流解决方案。
文章目录
- 一、常用控件
- 1.事件(Event)
- 2.任务(Task)
- 3.网关(Gateway)
- 二、流程设计器使用
- 1.新建模型
- 2.命名流程图
- 3.拖拽控件画图
- 4.监听器配置
- 5.网关配置
- 6.子流程
- 1.内部子流程
- 2.外部子流程(活动调用)
- 三、实战演示
一、常用控件
1.事件(Event)
事件是BPMN2.0中一个非常重要的概念,是流程运行过程中发生的事情,而这些事情的发生会影响到流程的流转。对每个事件而言,一般会包含两个要素,分别是触发这个事件的原因,以及由此导致的结果。
以下是一些常用的事件类型
-
(空白)开始事件
如下图所示,开始事件是流程图里必须要有的元素,同时一个流程图只能有且仅有一个空白开始事件
-
结束事件
标志流程的一个实例或一个分支走向结束,在一个流程图里可以存在多个结束事件节点;结束事件不会影响其他并行路径的执行,只是结束它所在的特定路径。
-
终止事件
终止事件是 BPMN 2.0 引入的一种特殊类型的结束事件。它会导致整个流程(包括所有并行路径)立即终止。
-
流程立即终止:终止事件会导致整个流程立即终止,无论是否有其他并行路径正在执行。
-
单一实例:一个流程中只能有一个终止事件。如果有多个终止事件,流程引擎将不知道该执行哪个。
-
影响所有路径:终止事件会影响整个流程的所有并行路径,不仅仅是一个分支。
-
计时器事件
计时器事件可以用作启动事件、中间事件或边界事件。边界事件可以中断,也可以不中断。
下图里的是边界中断事件,表示的是10秒后还在该节点则判定超时,会中断流程走向下面的路线
-
错误事件
错误事件分为 错误启动事件 和 错误边界事件
-
错误启动事件
如下图,错误结束节点后会触发下面的事件子流程,由事件子流程中的错误启动事件进行处理
只能用于触发事件子流程,而不能用于启动流程实例。错误启动事件始终处于中断状态
-
注意选择相同的错误定义,这样才能被捕获
-
错误边界事件
边界事件可以捕获中间错误,中断流程并重新控制流程走向,如下图所示,由于系统任务执行主动抛出了BpmnError异常,然后就被错误边界事件捕获处理了。
2.任务(Task)
任务表示流程中的工作单位,需要人工或系统执行特定的动作。
-
系统任务
即不需要人工处理,而是由系统自动处理的任务。通常调用外部服务或脚本。可以配置 Java 类、表达式或外部任务来实现任务逻辑。
由于项目中我用到系统任务的不多,这里只展示配置java类的方式。
如下图,type选择java class,然后配置java类的全路径
java类如下,实现JavaDelegate接口
execution对象里可以获取到流程实例的各种信息,也可以对流程实例进行操作,如下面的设置流程变量等
public class TestCalculateErrorDelegate implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {Integer numerator = 0;Integer denominator = 0;try {int result = numerator / denominator;execution.setVariable("result", result);} catch (Exception e) {execution.setVariable("calculateErrorCode", "4098");execution.setVariable("calculateErrorMsg", "除数不能为0");throw new BpmnError("4098", "除数不能为0");}}
}
-
用户任务
用户任务即需要人工参与者完成的任务。当流程执行到用户任务节点时,将会给这个节点分配的用户创建待办任务。
如下图所示,分配该用户任务节点给了admin
这里的assignee在真实业务场景中,一般会设置成流程变量,进行动态的赋值,如下图
${assignee}代表这里取值是取流程实例中的assignee变量,这样就可以结合具体业务动态地给这个地方赋值了
多实例用户任务
一个用户任务节点也可以是多个参与者,同时又分为 并行 和 串行 2种类型
如下图,通过点击修改属性按钮,可以看到右上角有两个类型选项,第一个是并行,第二个串行
-
并行
并行又分为或签(一个人通过即通过)、比例签(通过人数达到总人数XX比例即通过)还有会签(需要全部人都通过才通过)
如下图是或签,配置与单实例任务有所不同
第一行是固定写法,同理的还有:
//比例签,需要满足0.3比例通过 ${nrOfCompletedInstances/nrOfInstances > 0.3 } //会签,需要全部通过 ${nrOfCompletedInstances == nrOfInstances}
-
串行
串行即多个人依次审批,待办任务也是只有当到自己审批的时候才会创建。配置逻辑和并行的基本同理。
3.网关(Gateway)
在流程中,需要根据条件分叉或合并路线的时候,就需要用到网关。
-
排他网关
会依次判断所有的路径,然后走符合条件的第一条路径
如下图所示
-
并行网关
允许同时走多个分叉路径,都走完后合并后再走后面的节点
并行网关是没有条件限制的
如下图所示
-
包含网关
与并行网关类似,区别在于可以设置条件限制,满足条件的路径就会走
如下图所示的请假流程,当请假天数大于3天,既会走经理审批,同时也会走老板审批,两个都审批好后再汇集走下个节点
二、流程设计器使用
这里我们以camunda7.19为例,讲解流程设计器的基本使用
1.新建模型
如下图所示,新建的时候选择camunda 7版本,并且左下角再选择小版本号为7.19
2.命名流程图
创建新文件后,默认会有一个开始节点,然后我们需要先点击下空白处,然后在右边的窗口里输入流程的名字和流程的ID(流程定义key)
Name可以在后面作为流程名称(流程类型)来使用,而流程定义key(表里是PROC_DEF_KEY_ ) 则是该流程图的唯一标识
区别于流程定义id,即表里的PROC_INST_ID_, 每次修改了图重新部署都会变,对应的是这个图的某个版本;流程定义key则图修改重新部署后不会变
3.拖拽控件画图
从左边的控件栏选择后拖拽到画板即可,这里常用的控件上面已经介绍过。
4.监听器配置
在流程中,我们经常要在节点前或节点后去做一些操作,这时候我们就可以使用监听器来实现。
执行监听器 ExecutionListener触发事件有:start、end、take;
其中节点有start、end两种事件,而连线则有take事件。
任务监听器TaskListener触发事件有:create, assignment, update, complete, delete or timeout。
-
执行监听器 ExecutionListener
如下图,就是在开始节点配置了执行监听器,start时触发
监听器类型是java类,即会执行下面的java方法
这里的java类实现ExecutionListener接口,如下所示
public class ProcessStartExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution execution) throws Exception {//初始化状态为审批中execution.setVariable("approveState", 0);log.info("初始化状态为审批中---------------approveState=0");}}
监听器除了用java类,常用的还有脚本片段,如下图所示
注意:
脚本使用的是groovy语言,需要先在springboot项目中引入groovy依赖,否则会报错找不到引擎
<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-jsr223</artifactId><version>3.0.15</version><scope>runtime</scope>
</dependency>
-
任务监听器 TaskListener
如下图,任务节点create的时候,会执行监听器逻辑,同样可以配置java类或脚本片段
java类参考下面,实现TaskListener接口
public class ProcessReturnTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {// 设置变量variable1值为1delegateTask.setVariable("variable1", 1);log.info("流程退回变量初始化值为1成功, taskId:{}, variableName:{}", delegateTask.getId(), variableName);}}
}
-
监听器执行顺序
下图为例
执行顺序:1. 开始节点:start -》 end2. 连线:take3. 任务节点ExecutionListener: start4. 任务节点TaskListener:create -》 assignment -》 complete5. 任务节点ExecutionListener: end6. 连线:take7. 结束节点:start - 》 end
5.网关配置
当我们的业务需要根据条件来判断不同走向的时候,就需要配置网关
如下图,实现的是流程变量t0等于1则走向admin审批,t0等于0时则直接走向结束
需要在网关后的两条连线配置条件,如下
也可以使用groovy脚本,如下
6.子流程
有的时候某个节点需要走一套流程来实现业务,例如某个多实例并行节点,在节点中有需要有自己的审批、退回等操作,这个时候就可以用到子流程来实现。子流程又分为 内部子流程和外部子流程(活动调用)
1.内部子流程
如下图所示
要注意的是,图里子流程的t1变量是针对整个(父)流程的,也就是如果其中一个子流程赋值了t1变量,其他子流程里的t1变量也会受影响,在真实业务中需要注意这点。
2.外部子流程(活动调用)
如下图所示
外部子流程即触发另一个流程图的流程,在数据表里也是会新增另一个流程定义key的数据(内部子流程不会,还是只是父流程定义key的数据)
下图右边栏里的called element配置的就是子流程图的定义key
父流程
子流程
采用外部子流程,则子流程里的变量是针对子流程实例的,所以不同子流程的变量不会互相影响
三、实战演示
关于流程图的示例,可以学习:
snail-camunda: Camunda二次封装以及相关功能使用介绍。 中国式工作流解决方案。
相关文章:

详解SpringCloud集成Camunda7.19实现工作流审批(二)
本章将分享的是camunda流程设计器--Camunda Modeler的基本使用(对应camunda版本是7.19),包括bpmn流程图画法,各种控件使用以及一些日常业务场景的流程图的实现 参考资料: Camunda BPMN 基础组件-CSDN博客 Camunda: Exe…...
Matlab学习笔记
Magic Traits 文件读取 fid fopen(fn,rt);out fscanf(fid,spec,inf);fclose(fid);2. 读取数据 fid fopen(fn,rt); out textscan(fid,spec);运算篇 fprintf(" xxx %d",a),当a为数组时,会输出数组数目行,每行是一个元素相关文…...
Hexo博客在多个设备同步
title: ‘Hexo博客在多个设备同步’ date: 2024-11-28 19:08:08 categories: Hexo教程 cover: /img/cover4.jpg description: ‘实现Hexo博客在不同的设备上都可以使用和上传’ 博客链接1 :Hexo搭建博客的多终端同步问题 博客链接2:Hexo博客多台电脑设备同步管理 …...

淘宝Vision Pro:革新购物体验的沉浸式未来
引言 简要介绍淘宝Vision Pro版的背景,包括它在美区AppStore的发布及WWDC上的展示。阐述本文的目的:为读者提供一个全面的功能概览与设计背后的思考。设计原则 列出并简要解释5条设计原则(熟悉、直观、真实、实用、易用)。说明这些原则如何指导整个产品设计过程。核心功能详…...

公链开发中的技术实现路径:构建高效、安全的去中心化网络
区块链技术作为数字经济的重要组成部分,公链(Public Chain)是其核心架构之一。公链作为去中心化的数字账本,不仅承载着去中心化应用(DApp)的运行,还确保了交易的透明、安全性。随着区块链技术的…...

mac上的建议xftp 工具
mac上的建议xftp 工具 最近使用mac比较频繁了,但是第一次重度使用mac里面有很多的工具都是新的,有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的,但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…...
Android 使用Charles抓包显示Unknown
最近开发的一个功能需要抓包验证一下网络请求的结果。 但是在配置完Charles的证书代理等设置后,抓包时显示Unknown。 在网上查了半天资料和文章,最终解决了问题。 以下是在调试抓包环境中遇到的一些问题和解决方法。 1、手机证书的安装 Charles在Mac…...
C++设计模式:桥接模式(Bridge)
什么是桥接模式? 桥接模式(Bridge Pattern)是一个用来解耦的设计模式,它将抽象层和实现层分离开,让它们可以独立变化。用最简单的话来说,就是让你能够改变抽象的功能和具体的实现,而不需要修改…...
spark3.x之后时间格式数据偶发报错org.apache.spark.SparkUpgradeException
3.x之后如果你去处理2.x生成的时间字符串数据,很容易遇到一个问题 Error operating ExecuteStatement: org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: Fail to parse 20200725__cb90fcc3_8006_46…...

spring boot框架漏洞复现
spring - java开源框架有五种 Spring MVC、SpringBoot、SpringFramework、SpringSecurity、SpringCloud spring boot版本 版本1: 直接就在根下 / 版本2:根下的必须目录 /actuator/ 端口:9093 spring boot搭建 1:直接下载源码打包 2:运行编译好的jar包:actuator-testb…...

下载安装Android Studio
(一)Android Studio下载地址 https://developer.android.google.cn/studio 滑动到 点击下载文档 打开新网页 切换到english 
三、计算机视觉_08YOLO目标检测
0、前言 YOLO作为目前CV领域的扛把子,分类、检测等任务样样精通,本文将基于两个小案例,用YOLO做检测任务,看看效果如何 1、对图片内容做检测 假设我有一张名为picture.jpeg的图片,其内容如下 我将图片和代码放到了同…...

uniapp关闭sourceMap的生成,提高编译、生产打包速度
警告信息:[警告⚠] packageF\components\mpvue-echarts\echarts.min.js 文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理,手机端使用过大的js库影响性能。 遇到问题:由于微信小程序引入了mpvue-echarts\echarts.min.js&…...

uniapp首页样式,实现菜单导航结构
实现菜单导航结构 1.导入字体图标库需要的文件 2.修改引用路径iconfont.css 3.导入到App.vue中 <style>import url(./static/font/iconfont.css); </style>导航区域代码 VUE代码 <template><view class"home"><!-- 导航区域 --><…...

uniapp-vue2引用了vue-inset-loader插件编译小程序报错
报错信息 Error: Vue packages version mismatch: - vue3.2.45 (D:\qjy-myApp\admin-app\node_modules\vue\index.js) - vue-template-compiler2.7.16 (D:\qjy-myApp\admin-app\node_modules\vue-template-compiler\package.json) This may cause things to work incorrectly.…...
Git命令大全(超详细)
Git 是一个分布式版本控制系统,用于跟踪计算机文件的更改,并协调多个用户之间的工作。下面是一份较为详细的 Git 命令大全,涵盖了从初始化仓库到日常使用中常见的操作。 1. 初始化与配置 设置用户信息: git config --global user.name &quo…...
【机器学习】机器学习学习笔记 - 监督学习 - 逻辑回归分类朴素贝叶斯分类支持向量机 SVM (可分类、可回归) - 04
逻辑回归分类 import numpy as np from sklearn import linear_modelX np.array([[4, 7], [3.5, 8], [3.1, 6.2], [0.5, 1], [1, 2], [1.2, 1.9], [6, 2], [5.7, 1.5], [5.4, 2.2]]) y np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])# 逻辑回归分类器 # solver:求解器&a…...

常见的数据结构---数组、链表、栈的深入剖析
目录 一、数组(Array) 二、链表(Linked List) 三、栈(Stack) 四、总结 数据结构是算法的基石,是程序设计的核心基础。不同的数据结构适用于不同的场景和需求,选择合适的数据结构能…...
前端开发:构建高质量用户体验的全方位指南(含实际案例与示例)
前端开发:构建高质量用户体验的全方位指南(含实际案例与示例) 在当今数字化时代,前端技术不仅是网页和应用的门面,更是连接用户与数字世界的桥梁。一个高质量的前端开发项目不仅能够提升用户体验(UX&#…...

Istio_05_Istio架构
Istio_05_Istio架构 ArchitectureControl PlanePilotCitadelGalley Data PlaneSidecarIstio-proxyPilot-agentMetadta Exchange Ambient Architecture 如: Istio的架构(控制面、数据面) Gateway: Istio数据面的出/入口网关 Gateway分为: Ingress-gateway、Egress-gateway外部访…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...