天天看点

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

目录

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

前言

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

为什么要用工作流?

主要是应对:

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

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

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

flowable6.4.2 不足之处

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

你会遇到下面的业务需求:

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

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

甚至还会遇到特事特办,提前跳转下面的步骤

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

还有遇到 并行网关 和 多实例综合场景, 某一步骤跳转至串行多实例场景。

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

虽然flowable 相较于Activity已经有很多改进之处,flowable的作者也意识到中国的特色工作流需求,也提供了不少跳转之类的接口。

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

但一般用过的应该发现,针对并行网关的跳转,实际上是有BUG的

例如下面的场景:

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

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 
      
flowable6.4 并行网关 驳回 跳转 回退 多实例加签减签

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

还有更加复杂的嵌套并行网关驳回处理:

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

请问 T7 驳回至T5 要怎么跳转 ????

如何在act_ru_execution 补齐所有的并行网关的分支execution记录??

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

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

flowable 提供了人性化的多实例任务 减签加签接口

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

网上也有很多博客例子,但你会发现他们大多数测试的是并行多实例下的业务场景,而且大多数只是测试了加签,并没有测试减签。

当你测试串行多实例加签减签时,你会遇到一些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: true
    database-schema-update: true
    async-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 {
// 用户任务相关接口
@Resource
private BpmUserTaskService bpmUserTaskService;

// 流程部署查询操作接口
@Resource
private 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:[email protected]">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);

      
上一篇: web试题
下一篇: react

继续阅读