目录

  • 前言
  • 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的修复工作。

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

  1. 工作流-flowable 之驳回 多实例驳回 并行网关驳回 普通节点驳回到多实例

    6.4.0 新增加了驳回的方式,真是对中国式流程的一种福音呀,感谢flowable创始人. 再也不为开发驳回流程发愁了,网上那些视频和修改源码真的是demo级别的,不能商业用. 只有心如流水的学习才是 ...

  2. Activiti工作流并行网关驳回在发起问题

    1. 问题描述 第一次发起: 流程从发起人走到并行节点 -> 人员3,和人员4,人员5,人员6是并行.人员3(同意),人员4(同意),人员5(同意),人员6(不同意)回到发起人节点. 第二次发起 ...

  3. activiti7 关于并行网关,一个人审核通过,一个人审核不通过,如何走流程

    目录 问题 实现 问题 我现在有这样一个场景,使用并行网关进行两人审核,如果其中一个人审核不通过则回退给发起人,同时并行网关中另外一个审核人的任务也消失.这种场景使用并行网关如何实现, 实现 任务是不 ...

  4. flowable并行审批_Flowable6.4 – 并行网关和包容网关 | 字痕随行

    这个春节的节奏就是:吃喝睡.吃喝睡,手机都懒的刷了.今天开始提振一下心情,整理一下思路,开始缓慢更新. 这次补完一下之前的一篇<Flowable6.4-排他网关>,简单介绍一下并行网关和包 ...

  5. 【activiti 入门】activiti6.0之并行网关

    首先是环境搭建可参考之前的博客,而且有具体demo提供下载  https://download.csdn.net/download/qq_33333654/11790823 demo中仅涵盖了排他网关 ...

  6. activiti实战系列 并行网关(parallelGateWay)

    流程图 13.2:部署流程定义+启动流程实例 13.3:查询我的个人任务 13.4:完成我的个人任务 说明: 1) 一个流程中流程实例只有1个,执行对象有多个 2)  并行网关的功能是基于进入和外出的 ...

  7. activiti并行网关

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  8. 【Activiti工作流】11.并行网关

    上一节我们讲解了排他网关,本节我们来讲解与排他网关类似的模式的一种网关---并行网关. 通过上一篇我们了解,排他网关是对一个事件流向线的分支决策节点,决定着任务的流向.而并行网关除了有分支以外,还有聚 ...

  9. vue路由跳转回退后页面不刷新处理

    vue路由跳转回退后页面不刷新处理 ·利用keep-alive 缓存需要缓存的页面 具体实现流程 1.在app.vue中改写router-view <keep-alive><rout ...

最新文章

  1. MySQL 创建数据表
  2. C语言-一维数组与指针
  3. 批处理文件检测windows系统是32位还是64位
  4. em模型补缺失值_模型对缺失值的处理
  5. Unity3D 之UGUI 滑动条(Slider)
  6. 文本框内容改变触发事件
  7. Altium Designer(一):SCH
  8. wince6.0 OK6410 启动NandFlash路径下的程序快捷键
  9. SPSS T检验(图文+数据集)【SPSS 017期】
  10. oracle11g数据库登录01017,windows oracle11g数据库使用sqlplus登录的时候出现ora-01017报错...
  11. 城市场景车路协同网络需求研究
  12. 高速公路自动驾驶测试场景库
  13. 攻防世界逆向高手题之crazy
  14. 3g无线图传点到点模式与服务器模式比较,4G网络的几个关键技术指标 - 3G和4G LTE网络架构之间的区别...
  15. Multi-catches are not supported at language level ‘6‘ 不支持多捕获
  16. 基于 Springboot 和 Mybatis 的后台管理系统 BootDo | 软件推介
  17. 微信小程序开发之表单验证(WxValidate使用)
  18. vue3+vant开发微信公众号网页爬坑不完全指北
  19. 基于安卓的高校程序设计类课程考核平台的设计与实现
  20. 高斯牛顿法----MATLAB实现

热门文章

  1. 计算机视觉结合深度学习项目-智能停车场空车位实时识别
  2. 查看进程及结束进程命令
  3. LaTex(windet及miktex)安装教程
  4. MySQL 之高级命令
  5. TCP创建多人聊天室
  6. Java基础学习(2)---Java基础语法
  7. zip直链生成网站_调优-WEB资讯专栏-DMOZ中文网站分类目录
  8. echarts画出特殊形状的柱状图
  9. 一个典型的微型计算机绘图系统,机械制图考试理论知识练习题
  10. Using Memory Efficiently(Pro Android Apps Performance Optimization)