工作流系统的回退流,是指流程实例运行到一定阶段后,可以主动的选择回退到曾经运行过的任意轨迹上。回退流的发起方是当前步骤的任务执行人,选择主动的回退,上面有一篇 回退流的实现,主要说明了回退流的实现过程。
工作流系统的撤回,是指流程实例运行了一定的轨迹后,上一步的任务执行人,选择撤回刚刚提交的任务,使得流程再次流转到此步骤。撤回的发起方是当前步骤的上一步任务的执行人,选择主动撤回。
如上图:红色圈为当前运行到的轨迹,当上一步审核步骤的任务执行人,选择主动撤回时,则将回退到审核步骤,再次执行。
撤回与回退的两个区别:
1. 撤回只能撤回到当前步骤的上一步,不能跨多个步骤的撤回。回退是可以任意的回退。
2. 撤回的发起方是上一步的任务执行人。回退的发起方是当前步骤的可执行人。
撤回与回退的相同点:
1. 撤回和回退都是指回到曾经的轨迹;
2. 撤回和回退回到曾经运行的轨迹后,再次生成此轨迹的任务,并且辅助业务补偿类,将环境或业务数据恢复成原来的,持久化变量可以忽略,临时变量则需要重新赋值。
3. 撤回和回退都不是按照流程定义的正常轨迹流转,需要配置有权限的用户去操作。
撤回功能的实现:
既然撤回与回退都是回到曾经运行的轨迹,只是发起方不一样,所以在实现的时候,只需调用同一流程引擎的实现自由回退的api函数。
串行路由,实现撤回,查找当前撤回步骤的下一步是否为当前步骤,是则强行关闭当前的任务,回退到此步骤,重新生成此步骤的任务。
条件路由,实现撤回,查找当前撤回步骤的下一步是否为当前步骤,需要查找有条件结果和无条件结果,有则实现回退。
分支路由,实现撤回,主要是查找当前撤回步骤的下一步是否为当前步骤,需要略过分支节点来查找,查找到了,则实现回退。撤回的过程与回退流的实现过程一样。
分支路由的撤回,分为在分支上面的撤回,与,分支到主干上的撤回
分支--分支的撤回
如下图:
在分支上面的撤回,则只撤回本分支的任务,其它分支不受影响。
分支--主干的撤回
如下图:
分支撤回到主干,则将关闭所有的分支,撤回到主干。如果分支上面嵌套分支,也将关闭所有的嵌套分支,回到主干。
聚合路由,实现撤回,当一个分支提交了,其它分支还未执行,即未满足聚合的条件时,则实现不了撤回,因为当前步骤还在另一个分支,还未执行到聚合后面的节点。当分支条件均满足后,流转到聚合节点后面的步骤,则可以实现撤回,撤回与回退一样,只撤回此分支的轨迹,其它分支不撤回。
撤回与回退的功能均是不按流程定义的轨迹去任意执行,因此在操作的时候不能给所有的用户都分配此功能。撤回与回退在流程引擎中的实现是一样的,撤回只是对回退的一个补充。