Activiti工作流几种驳回方式的实现与比较

  • 时间:2017-06-10
  • 分类:数据库/系统
  • 2678 人浏览
[导读]最近公司做的一个项目要实现工作流程的收回,驳回等操作,而采用的工作流引擎并不支持驳回功能,这个项目恰好就我和一个实习生一块做,所以这个问题就落到我的头上来解决了

最近公司做的一个项目要实现工作流程的收回,驳回等操作,而采用的工作流引擎并不支持驳回功能,这个项目恰好就我和一个实习生一块做,所以这个问题就落到我的头上来解决了。。。

客户提出的要求是驳回时要记录日志,但是审批意见之类的需要清除掉,收回时不记录日志,审批意见同样清除。

百度了一下,总结了5个解决方案:

第一种是清除当前任务的出口,实现回到上一步的功能。

根据任务ID获取当前的任务节点,进而获取流程实例,然后取到流程的定义,找到当前活动的节点与上一步活动的节点,然后清除当前活动的出口,将上一步活动的出口作为最新的活动节点。

第二种是直接将当前的activiti引擎更换为第三方的支持退会驳回的引擎。

第三种是自己编译activiti引擎,加入退回,驳回功能。

第四种是直接操作数据库,使用历史任务替换正在进行的任务。

第五种是直接实现Command接口,实现工作流程可以任意跳转。

因为时间紧急所以直接将3.编译activiti引擎给pass掉了,本来项目是接手的离职员工的项目,更换流程引擎可能会引起其他的问题,此计划暂放。

最后在1、4、5之间决定了采用第一种,代码如下

View Code

原本一切按计划进行着,但不知为什么在taskService.complete(task.getId(), variables);完成任务这一步,一直报错误,debug了好久也没有找到错误,无奈之下,采用4、5两种方式结合先将流程跳转到上一个人,然后在操作数据库清除掉一些不必要的数据。代码如下

View Code

重写的Command接口

View Code

最后手动清除流程细节信息

中间一边写一边调试,终于可以实现驳回功能了。但是这样在实现方式上可能会出问题,因为自己操作数据代码,与activiti操作数据的代码,不在一个事物中,很可能出现流程退回去了,签字信息没有被擦除掉。

以后再使用工作流时尽量根据需求选用合适的流程引擎。

来源:本文为线上采编,如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除!