flowable6.4 并行网关 驳回 跳转 回退 多实例加签减签

article/2025/10/7 11:20:31

目录

  • 前言
  • flowable6.4.2 不足之处
    • 并行网关跳转驳回BUG
    • 多实例加签减签BUG
  • 解决之法
    • 说明
    • 用法

前言

flowable 优秀的工作流流程引擎框架,前身Activity

为什么要用工作流?
主要是应对:

  • 流程可能随时变更
  • 步骤处理人可能变更
  • 并行任务处理
  • 分支任务处理
  • 驳回处理
  • 等等

如果你不用类似于flowable工作流,久而久之你要么自己创建一套工作流框架,要么用flowable,这是必然发展之路。

有现车的成熟工作流框架为何不用?

flowable6.4.2 不足之处

并行网关跳转驳回BUG

即便如 flowable这样优秀的框架,也比较难对付中国的特色工作流。

你会遇到下面的业务需求:
在这里插入图片描述

【任务3】的处理人审核不通过后 要驳回给 【并行任务2-1-1】和【并行任务2-3-3】有可能就这两步处理人填写的内容有问题。

甚至还会遇到特事特办,提前跳转下面的步骤
在这里插入图片描述
还有遇到 并行网关 和 多实例综合场景, 某一步骤跳转至串行多实例场景。
在这里插入图片描述
虽然flowable 相较于Activity已经有很多改进之处,flowable的作者也意识到中国的特色工作流需求,也提供了不少跳转之类的接口。
在这里插入图片描述
但一般用过的应该发现,针对并行网关的跳转,实际上是有BUG的
例如下面的场景:
在这里插入图片描述
T5 要驳回给T2-2 和 T4-2 , 发现最后怎么也没办法流转到T5, 原因就是少了一条 T3-2的提交完成记录。
查看 act_ru_execution 表中记录

	SELECT a.* FROM  act_ru_execution a WHERE a.PROC_INST_ID_ = @PROC_INST_ID_ORDER BY a.START_TIME_ DESC 

在这里插入图片描述
首先表act_ru_execution 记录中必须存在三条记录,表示并行网关的三条分支,其次走完条,字段 IS_ACTIVE_ 的值为0,然后flowable6.4.2版本跳转后并没有为并行网关生成所有的分支execution。

还有更加复杂的嵌套并行网关驳回处理:
在这里插入图片描述
请问 T7 驳回至T5 要怎么跳转 ????
如何在act_ru_execution 补齐所有的并行网关的分支execution记录??

在业务需求上 T7 作为审核员,他发现就T5提交的有问题,难不成要全部驳回至其实任务步骤? 因此不能说这样的需求是变态需求,无法实现。

解决诸如上面所述的各类并行网关的需求,一个看下流程是否可以变通,通过分支网关+表达式来优化,另外只能扩展flowable的接口业务逻辑了

多实例加签减签BUG

flowable 提供了人性化的多实例任务 减签加签接口
在这里插入图片描述
网上也有很多博客例子,但你会发现他们大多数测试的是并行多实例下的业务场景,而且大多数只是测试了加签,并没有测试减签。

当你测试串行多实例加签减签时,你会遇到一些BUG,总之你会发现多实例核心变量数值一直有问题,而且串行多实例减签会变成两个任务等异常BUG发生。

  • nrOfInstances 当前任务总数
  • nrOfCompletedInstances 已完成任务总数 串行多实例BUG
  • nrOfActiveInstances 当前活动任务总数 该值加签后并未更新

解决之法

自定义flowable BPM2流程引擎接口封装组件
bpm2-spring-boot-starter

里面包含了跳转、加减签、输出流程图自定义高亮节点颜色等方法。

由于代码过多,无法在博客里面贴出,请移步下面的github或码云

码云
https://gitee.com/banana6/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter

github
https://github.com/dwhgygzt/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter

说明

  1. 该组件专门针对BPM流程引擎常用接口进行封装
  2. 目标是为了开发团队统一使用规范
  3. 封装整理了常用的流程操作接口(查看流程定义、启动流程)
  4. 封装整理常用的任务操作接口(提交、跳转、驳回到并行网关中的某几条分支)
  5. 暂不支持子流程相关操作,一般没有涉及这方面的业务场景

用法

  1. pom.xml 文件引入如下配置
<!-- 对象存储通用接口 -->
<dependency><groupId>com.middol</groupId><artifactId>bpm2-spring-boot-starter</artifactId><version>最新版本号</version>
</dependency>
  1. application.yml 增加如下配置,假设简单配置如下:

##########################redisclent##############################
middol:bpm2:new-process-engine-config: truedatabase-schema-update: trueasync-executor-activate: false
##################################################################

说明

  • 参数 new-process-engine-config
true: 业务系统当前没有任何flowable相关的配置,引入本配置将新配置一个流程引擎false: 业务系统本身已经有flowable相关的配置(例如:flowable-spring-boot-starter),不想重复配置流程引擎
  • 当 new-process-engine-config 为 fasle
async-executor-activate 和 database-schema-update 无需配置这两个参数意思:
database-schema-update: true = flowable引擎自动创建表
async-executor-activate: true =在流程引擎启动就激活AsyncExecutor
  1. 业务代码中引入service

@Service
public class MyBusinessServiceImpl {// 用户任务相关接口@Resourceprivate BpmUserTaskService bpmUserTaskService;// 流程部署查询操作接口@Resourceprivate BpmProcessService bpmProcessService;}
  1. 针对驳回到并行网关上的某几个分支节点
  • 先调用bpmUserTaskService查询当前任务之前流转过的任务节点
    /*** 【本任务节点】的上一步【历史任务节点】列表** @param query ignore* @return ignore*/List<BpmTaskModelEntity> listBackTaskModel(BpmBackTaskModelQuery query);/*** 【本任务节点】之前的【历史任务节点】列表** @param query ignore* @return ignore*/List<BpmTaskModelEntity> listAllBackTaskModel(BpmBackTaskModelQuery query);

到底调用哪一个,根据自身业务需求决定。
另外查看 BpmTaskModelEntity 类可以看出,里面有标志位:是否多实例,是否并行网关上节点,归属的并行网关id

这里查询的列表没有做排序,业务系统可根据节点编号进行自行排序,另外可以将相同并行网关id的 归属到一个集合里面。

  • 调用bpmUserTaskService跳转接口
void jump(BpmJumpForm form);

查看 BpmJumpForm 参数对象如下:

/*** 流程跳转(适用于选择历史任务步骤驳回场景,跳转指定任务,并行网关跳转)** @author <a href="mailto:guzhongtao@middol.com">guzhongtao</a>*/
public class BpmJumpForm extends BpmBaseParam {private static final long serialVersionUID = 1L;/*** 当前任务节点*/private String taskId;/*** 目标任务节点key*/private List<String> targetTaskDefineKes;/*** 需要设置的全局相关参数,全局变量*/private Map<String, Object> variables;// ......  省略部分代码.......
}
  • taskId : 当前执行驳回跳转的任务id

  • targetTaskDefineKes: 表示你要跳转到的任务节点,该值是你在画流程图时指定的任务ID编号, 该值从BpmTaskModelEntity 对象中可以取到。 说明: 如果为多个,则里面的任务必须全部都是并行网关上的任务节点。

  1. 针对多实例加签减签
    调用 bpmUserTaskService
/*** 多实例-加签** @param form ignore*/void addMultiInstanceExecution(BpmMultInstAddForm form);/*** 多实例-减签** @param form ignore*/void deleteMultiInstanceExecution(BpmMultInstDeleteForm form);

这里说明一下,加签减签是 多实例里面的任务处理者进行操作的,如果还没有到达多实例任务节点,则不存在多实例加签减签业务。
因此请看 BpmMultInstAddForm 和 BpmMultInstDeleteForm
里面有一个共同参数: multiInstanceTaskId(当前操作的任务id)

在减签的时候,需要调用查询接口,查询可以减签的人员列表,当然不包含自己。

    /*** 获取当前多实例任务除自己外的其他用户信息列表,* 用于 减签 业务场景** @param multiInstanceTaskId 当前多实例用户任务id* @return List*/List<MultiInstanceUserDTO> getOtherMultiInstanceUsers(String multiInstanceTaskId);

本方法的加减签操作均在原flowable的基础上做了很多处理BUG的修复工作。


http://chatgpt.dhexx.cn/article/vsOuildM.shtml

相关文章

工作流后加签实现

1、流程重新定义 动态改变流程指向&#xff0c;创建新的节点 2、后加签环节及后加签属性设置 流程持久化、克隆活动、独立CMD 3、原始流程操作及后加签环节操作 4、流程场景遍历 5、流程图元体现 BPM后加签V1.0版说明。 效果图示&#xff1a; 功能说明&#xff1a; 1、…

前后端RSA互相加解密、加签验签、密钥对生成(Java)

目录 一、序言二、关于PKCS#1和PKCS#8格式密钥1、简介2、区别 二、关于JSEncrypt三、关于jsrsasign四、前端RSA加解密、加验签示例1、相关依赖2、cryptoUtils工具类封装3、测试用例 五、Java后端RSA加解密、加验签1、CryptoUtils工具类封装2、测试用例 六、前后端加解密、加验签…

国密:SM2公私钥加签验签

一、工具类 POM中增加hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.6.5</version></dependency> package cn.test.encrypt.utils.sm2; /*** SM2签名所计算的值 可以根据…

RSA加签解签方法

一、RSA签名的过程 &#xff08;1&#xff09;A生成一对密钥&#xff08;公钥和私钥&#xff09;&#xff0c;私钥不公开&#xff0c;A自己保留。公钥为公开的&#xff0c;任何人可以获取。 &#xff08;2&#xff09;A用自己的私钥对消息加签&#xff0c;形成签名&#xff0…

安全对外的接口--加签验签

前言 我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全。接下来,本文将和大家一起来学习加签和验签。从理论到实战,加油哦~ 密码学相关概念加签验签概念为什么需要加签、验签加密算法简介加签验签…

程序员必备基础:加签验签

来源&#xff1a;捡田螺的小男孩 我们在求职面试中&#xff0c;经常会被问到&#xff0c;如何设计一个安全对外的接口呢? 其实可以回答这一点&#xff0c;加签和验签&#xff0c;这将让你的接口更加有安全。接下来&#xff0c;本文将和大家一起来学习加签和验签。从理论到实战…

RSA公私钥加密加签顺序

RSA是一种非对称加密的机制&#xff0c;是一对密钥对&#xff08;公钥和私钥&#xff09;。 一、加密&#xff1a; 1.公钥加密&#xff0c;私钥解密。可以多人持有公钥进行数据加密&#xff0c;仅一人持有私钥进行数据解密&#xff1b; 2.可以确保数据传输的安全性。 二、加签…

【flowable】十一、flowable加签和转签

flowable加签和转签 加签 同时让多人处理任务&#xff0c;但是不同于网关操作。 1、向前加签 任务在A这里&#xff0c;A这个时候需要BCD核对一下&#xff0c;等BCD核对之后又回到A这里 2、向后加签 任务在A这里&#xff0c;A这个时候需要BCD处理这个事情&#xff0c;处理完毕…

加解密,加签、验签也就这肥事

前言&#xff1a; ps:上图有一处错误&#xff0c;右下角有一条线是N&#xff0c;指向的是不读取内容 上图省略了CA认证过程&#xff0c;直接提取到了密钥对&#xff0c;Base64的过程已省略(关于Base64的底层原理&#xff0c;可参考标题3)。全文1.6w字&#xff0c;如果想全部…

前后端分离技术之加签,验签,防篡改

上一篇讲解了加密解密&#xff0c;这次来个加签验签&#xff0c;实际项目里&#xff0c;我们采用的是react 和nodejs 来进行加签验签&#xff0c;用的jsrsasign库&#xff0c;下面贴点核心代码 react加签 nodejs验签 实际应用在nodejs层可以将时间戳和sign签名验证通过剔除掉&…

深入探究Camunda加签问题

开源项目介绍&#xff1a;点击直达 前言 这里我们先抛出两个大问题&#xff0c;整篇文章针对这两个大问题再详细解析。 首先我们在设计流程定义时&#xff0c;流程节点可能是或签也可能是会签 会签&#xff1a;指同一个审批节点设置多个人&#xff0c;如ABC三人&#xff0c…

activity多实例任务加签

前言 加签是减签的相反的操作,加签与减签的思路刚好相反,减签是删数据;加签则是添加数据。在一些特殊场景下,需要在某个多实例节点上面动态新增一个审批人员或任务时,就需使用到activity多实例任务加签的功能 加签思路1 根据一级流程实例查找二级流程执行实例判断二级执…

Activiti7工作流引擎:进阶篇(十二) 加签和转签

知识传送门 》》》》》》》》》》》》》》》》》》》 加签就是委派任务delegateTask&#xff0c;然后去解决任务resolveTask&#xff08;并不是去真正的去完成任务&#xff09;。转签完成后才能完成任务complete。 一&#xff1a;委派任务 A由于某些原因不能处理该任务可以把任…

必备基础:加签验签

必备基础&#xff1a;加签验签 1 密码学相关概念1.1 明文、密文、密钥、加密、解密1.2 对称加密、非对称加密1.3 什么是公钥私钥&#xff1f; 2 加签验签概念3 为什么需要加签验签4 常见加密相关算法简介4.1 消息摘要算法4.1.1 MD家族算法4.1.2 ShA家族算法4.1.3 MAC算法家族 4…

Flowable工作流之加签(委派)、转签(转办)

目录 1. 加签1.1. 向前加签1.2. 向后加签 2. 或签3. 委派和转办的区别2.1. 委派2.2. 转办 4. 向前加签4.1. 流程图4.2. 部署并启动4.3. 完成任务4.4. 向前加签实现4.4.1. 添加加签&#xff08;委派&#xff09;功能任务4.4.1. 加签&#xff08;委派&#xff09;任务的完成 5. 转…

加密、解密、加签、验签专题

首先明确几个名词&#xff1a; 加密&#xff1a;发送方利用接收方的公钥对要发送的明文进行加密。 解密&#xff1a;接受方利用自己的私钥进行解密。 公钥和私钥配对的&#xff0c;用公钥加密的文件&#xff0c;只有对应的私钥才能解密。当然也可以反过来&#xff0c;用私钥…

@ControllerAdvice 之 @InitBinder和@ModelAttribute

InitBinder 准备 InitBinder 在整个 HandlerAdapter 调用过程中所处的位置 收获&#x1f4a1; RequestMappingHandlerAdapter 初始化时会解析 ControllerAdvice 中的 InitBinder 方法&#xff08;可以定义个性化数据转化器&#xff09;RequestMappingHandlerAdapter 会以类…

SpringBoot @InitBinder注解实现Bean国际化校验

参考资料 参考&#xff1a; 妥当性チェックのエラーメッセージ出力方法 (需翻墙)springMVC之InitBinder的用法1springMVC之InitBinder的用法2springMVC之InitBinder 和 ValidatorSpring MVCにおけるフォームバリデーションの適用事例【後編】 目录 一. 前期准备1.1 自定义校验…

SpringMVC之@InitBinder注解(日期转换)

InitBinder注解的作用&#xff1a; springmvc并不是能对所有类型的参数进行绑定的&#xff0c;如果对日期Date类型参数进行绑定&#xff0c;就会报错IllegalStateException错误。所以需要注册一些类型绑定器用于对参数进行绑定。InitBinder注解就有这个作用。 程序代码示例&am…

initbinder对ajax不起作用,Spring MVC InitBinder验证方法

使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的&#xff0c;也即比较复杂的验证情况下才会使用。大部份简单的表单验证&#xff0c;使用annotation验证即可以解决。 这里需要注意的一点&#xff1a;InitBinder和Annotation两种验证只能二选…