activiti5 工作流的回退功能

        activiti5 工作流 本身不提供回退,按网络的说法,外国人的回退也是要在流程图设计里面画出来的,可惜在中国各种各样的需求,肯定是需要实现的。在实现回退的功能上看了网络上面的方法,都是直接修改分支表的节点ID或者通过设置节点的下节点来实现回退和跳跃等需求,可惜都只支持单线流程,一旦有并行,包容网关,外嵌,内嵌子流程就无法成功了,还会出现不可控的错误。

        为了实现这些情况,只好自己实现一个CMD来做回退,先分析引擎是怎么处理并发,子流程的。通过模拟,查看表act_ru_execution,里面的IS_ACTIVE_:是否存活,IS_CONCURRENT_:是否有并发,PARENT_ID_:父节点ID,SUPER_EXEC:父分支ID出现在并发分支,出现在调用外部子流程。(这里提一点,activiti5的一个小问题,在多级并发的情况下,记录规则有所不同,从2级开始记录的分支和1级的分支的规则不一样,至于如何大家去看数据库)

        制定回退规则:先查找回退的节点,开始删除分支,根据回退节点创建分支以及任务,对子流程等几种特殊节点做处理。首先是查找回退的节点,在遍历的时候要注意子流程的情况,然后开始删除分支,在删除分支的时候注意多级并发的情况(上面说到了),直接用递归删除即可。(分支表总会保持一个主干即ID与流程实例ID相同那个,这个保留住,在这个里面做文章),最后开始创建分支,根据主干以及发现的规则创建分支和任务即可。(其中在删除任务的时候记得历史表也保存一下)

在创建分支的情况分析:

* 处理分支,分支就是流程的指针
* 情况:
* 1.回退节点多个,聚合节点退回到并行
* 2.回退节点一个,同时有并行的运行节点,并行节点退回到聚合
* 3.内嵌子流程回退,分支要删除
* 4.回退节点是子流程,创建分支
* 5.外嵌子流程回退,子流程要删除,
* 6.回退节点是外嵌子流程
* 7.没有分支的回退,最基本

根据上面的规则现在是没问题了,不过由于在开发的时候没有考虑到多实例的情况,后续再加入进去,这里只能先不回退多实例的情况。还有在操作的过程中,没必要自己写jdbc来直接操作数据库,activiti的api很丰富,特别是在cmd模式里面,很多manager可以使用,完全足够大家用了。先说到这里,代码由于是公司的项目我就不贴了。给大家一个思路。不一定是最好的,最少是中办法。

你可能感兴趣的:(activiti5 工作流的回退功能)