回退的具体场景:
例如请假,员工a由于某些原因需要请假,上面是组长b,假设b审核通过了,组长b上面是主管c,需要主管c审核,但c感觉a员工提出的请假理由不够充分,那么这是退回就开始发挥它的作用了,现在可以画一个简单的图a->b->c,c点发起回退退到的事b(注意不是直接退回到a)。
我们可以看上面的流程图进行具体解析:
以上流程包括了多种流程节点,如分支,并行节点,多实例任务,子流程,假设现在流程产生了B,C,E任务,而e点进行回退,则回退到A,既然回退到A了,那么是不是B,C,E任务就应该销毁(因为退回到了A任务,只要A通过就会又产生B,C,E任务);若此时产生了B,C,F任务,F回退,则应该产生E任务,B、C则正常运行,继续往下执行后,将会产生I任务,再者是J任务。若在I任务回退,则应该回退至F。
那么应该怎么具体实现回退呢,我想应该先建立一个数据结构,如下图:
有了这样的一个数据结构,记录了每个任务节点的产生顺序,我们在任何一个节点上,都能有效回退至上一任务节点,并且包括自由跳转的方式,如在I节点,若我们回退至E,就把F节点从这个记录顺序中去掉,然后产生E任务出来。
下面,我们应该着重讨论这个数据结构怎样建立,
我们可以建立一张表,将该数据结构的每条分支都记录进去,任何与流程图进行绑定,意思是这样的流程启动就会与这个表进行绑定,
流程启动,就会产生A任务,A通过就会产生B,C,E任务,任务E通过,满足一定条件就会产生F任务,进而任务I,进而产生任务J,那意思岂不是说D任务产生就一定有A->B->D,A->C->D这两条链存在,同理J任务产生,就会产生A->E->F-I-J或A->E->G->I-J(若是条件有重合的地方两条链都存在),那么怎么才能确定到底是那一条链呢,我想可以用着中方法在历史任务中查找是否存在G或F 任务,若存在就有这条链的存在,将存在的链设置一个状态,表示着这个链确实存在。
自由跳转,
自由跳转意思就是想跳到那就跳到那,当然用上面的数据结构也行,但我想既然要跳转,肯定会知道现在的任务id和要跳转到的任务id,那么可不可以将要跳转到的任务对现在的任务进行覆盖。