Activiti里使用自定义命令实现任务的回退、跳转

简介

一个完善的任务流程不仅需要正常往下走,有时也需要有回退或驳回的功能。本文旨在解决这个需求。

环境

SpringBoot2.X + activiti6

准备bpmn流程文件

一个简单的流程,两个任务节点,原始任务A的assignee是zhangsan,原始任务B的assignee是lisi。

实现任务回退、驳回、跳转的思路

针对上面这个流程,假设当流程走到原始任务B节点的时候,需要回退到原始任务A节点,该如何操作呢?

思路1:在流程图里配置分支连线,正常流转

就像下图,因为这个思路很简单,我就不写代码演示了。它有个缺点是,每次有新的回退跳转任务节点需求都要改动流程图然后重新部署才能生效。

思路2:利用activiti里的命令和拦截器来动态实现任务节点的自由跳转

在介绍这个思路之前,有必要先介绍下activiti里的命令和拦截器,可以参看这篇博文《activiti里的命令、拦截器原理介绍和源码分析》。

代码示例

本文的代码是在前文 《SpringBoot2.0整合activiti6示例》 的基础上实现,所以本篇只展示了本文需要的核心代码,其它代码可以到之前的博文里去看。

代码逻辑

1.根据当前任务节点的taskId获取到当前任务,然后执行删除命令删除该任务。
2.根据任务里关联的流程定义id获取到流程,然后在该流程里找到跳转目标节点,然后执行跳转命令进行跳转或回退。

提示:这两步要放在同一事务里。

流程部署接口

DeploymentDTO.java

启动流程实例接口

查询某人的待办任务接口

完成任务接口

任务回退跳转接口

删除任务的自定义命令

任务跳转的自定义命令

演示

演示目标是,让任务走到“原始任务B”节点,然后执行跳转回退接口,回到“原始任务A”节点。

1.部署流程

2.启动一个流程实例

3.完成原始任务A

还记得流程图里我们指定的assignee吗?原始任务A的assignee是zhangsan,原始任务B的assignee是lisi。

所以这一步我们就是查看zhangsan的待办任务。

让zhangsan完成这个任务。

4.流程流转到原始任务B

理所当然,这一步就是查看lisi的待办任务。

说明流程确实已经走到“原始任务B”了。

或者为了更直观的查看,可以调用《Activiti6生成实时流程图并高亮已执行流程节点和连接线》这篇博文里介绍的功能接口,查看流程图。

5.执行回退跳转接口

这时,我们需要把流程回退、跳转到“原始任务B”之前的“原始任务A”。

5036是任务id,sid-27CF0EA7-3281-450C-B988-16348678EBFE是流程图里 “原始任务A” 的id,这边就是我们要跳转的目标id。

6.验证是否跳转成功。

再调一次zhangsan的待办任务。

可以看到任务确实是回退了。

或者可以直接查看数据库,查看act_hi_taskinst表。

jumpReason就是我们代码里设置的跳转原因。

activiti5的跳转实现

其实网上比较多的代码示例是activiti5的实现,但是activiti6中因为pvm下的包都删了,执行计划的代码也进行了改造,原来的方法就不可用了。

总结

虽然我们可以在代码里实现所谓的任务节点自由跳转,但是要注意到一个问题,实际使用中,流程里我们每走到一个任务节点都是要执行相应的业务操作的,activiti的流程节点我们可以随便跳,但是已经走完的实际业务是无法轻易回退的。

就比如,员工申请报销,领导审批通过了,财务也都把钱打了,这时发现发票不对,软件可以有N种方法再回到员工申报填写发票的那步,但是实际的钱已经打出去了却是实际发生不可逆的。

+1

发表评论

邮箱地址不会被公开。