详解SpringCloud集成Camunda7.19实现工作流审批(二)

server/2024/12/26 18:37:18/

本章将分享的是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对象里可以获取到流程实例的各种信息,也可以对流程实例进行操作,如下面的设置流程变量等

java">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接口,如下所示

java">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接口

java">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二次封装以及相关功能使用介绍。 中国式工作流解决方案。

在这里插入图片描述


http://www.ppmy.cn/server/146255.html

相关文章

【PX4_Autopolite飞控源码】中飞控板初始化过程中的引脚IO控制(拉低/拉高)

先选择自己飞控板支持的硬件平台 打开对应的路径我的是Desktop/px4/PX4-Autopilot/boards/zhty/nora 找到board_config.h文件&#xff0c;打开nora后再往下去找Desktop/px4/PX4-Autopilot/boards/zhty/nora/src/borad_config.h 打开后可以看到有很多GPIO引脚的定义&#xff0c…

UPLOAD LABS | PASS 01 - 绕过前端 JS 限制

关注这个靶场的其它相关笔记&#xff1a;UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 本关的目标是上传一个 WebShell 到目标服务器上&#xff0c;并成功访问&#xff1a; 我们直接尝试上传后缀为 .php 的一句话木马&#xff1a; 如上&#xff0c;靶场弹…

鲜花销售管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…

Day48 | 动态规划 :线性DP 编辑距离

Day48 | 动态规划 &#xff1a;线性DP 编辑距离 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 最长公共子序列 编辑距离_哔哩哔哩_bilibili 动态规划学习&#xff1a; 1.思考回溯法&#xff08;深度优先遍历…

【青牛科技】电动工具电流反馈型相位控制电路D2010

概述&#xff1a; D2010是一块相位控制集成电路&#xff0c;采用双级工艺。具有负载电流保护、软启动等功能。广泛应用于机床马达的控制。 主要特点: 全波电流感应 主电源可调软启动 防止过流及过高输出程控电流大小&#xff0c; 电压与电流同步 自动触发开关内部电压监控申流…

电机瞬态分析基础(3):空间矢量

1. 空间矢量 空间矢量的概念在交流电机分析与控制中具有非常重要的作用。将各相的电压、电流、磁链等电磁量用空间矢量表达&#xff0c;可以使三相感应电机的动态方程表达更简洁&#xff0c;为电机的分析与控制带来方便&#xff0c;并有助于对交流电机的矢量控制、直接转矩控制…

【Python爬虫五十个小案例】爬取中国天气网城市天气

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 引言 天气数据在很多领域都非常重要&#xff0c;比如天气预报、旅游、健康等。通过爬取天气网站的公开数据&#xff0c;可以方便地获取各地的天气情…

GPT分区、格式化与自动挂载

GPT分区、格式化与自动挂载 操作场景前提条件操作步骤 操作场景 云硬盘容量大于2TiB时&#xff0c;只能使用parted工具为磁盘新建GPT分区。 前提条件 云硬盘已挂载到云服务器上。 操作步骤 使用root用户登录进入云服务器&#xff1b;安装parted工具&#xff1b; # 检查pa…