1. 程式人生 > >工作流系統之三十三 撤回的實現

工作流系統之三十三 撤回的實現

工作流系統的回退流,是指流程例項執行到一定階段後,可以主動的選擇回退到曾經執行過的任意軌跡上。回退流的發起方是當前步驟的任務執行人,選擇主動的回退,上面有一篇 回退流的實現,主要說明了回退流的實現過程。

工作流系統的撤回,是指流程例項運行了一定的軌跡後,上一步的任務執行人,選擇撤回剛剛提交的任務,使得流程再次流轉到此步驟。撤回的發起方是當前步驟的上一步任務的執行人,選擇主動撤回。


如上圖:紅色圈為當前執行到的軌跡,當上一步稽核步驟的任務執行人,選擇主動撤回時,則將回退到稽核步驟,再次執行。

撤回與回退的兩個區別:
1. 撤回只能撤回到當前步驟的上一步,不能跨多個步驟的撤回。回退是可以任意的回退。
2. 撤回的發起方是上一步的任務執行人。回退的發起方是當前步驟的可執行人。

撤回與回退的相同點:
1. 撤回和回退都是指回到曾經的軌跡;
2. 撤回和回退回到曾經執行的軌跡後,再次生成此軌跡的任務,並且輔助業務補償類,將環境或業務資料恢復成原來的,持久化變數可以忽略,臨時變數則需要重新賦值。
3. 撤回和回退都不是按照流程定義的正常軌跡流轉,需要配置有許可權的使用者去操作。


撤回功能的實現:
既然撤回與回退都是回到曾經執行的軌跡,只是發起方不一樣,所以在實現的時候,只需呼叫同一流程引擎的實現自由回退的api函式。

序列路由,實現撤回,查詢當前撤回步驟的下一步是否為當前步驟,是則強行關閉當前的任務,回退到此步驟,重新生成此步驟的任務。

條件路由,實現撤回,查詢當前撤回步驟的下一步是否為當前步驟,需要查詢有條件結果和無條件結果,有則實現回退。

分支路由,實現撤回,主要是查詢當前撤回步驟的下一步是否為當前步驟,需要略過分支節點來查詢,查詢到了,則實現回退。撤回的過程與回退流的實現過程一樣。
   分支路由的撤回,分為在分支上面的撤回,與,分支到主幹上的撤回
   分支--分支的撤回
   如下圖:
   
   在分支上面的撤回,則只撤回本分支的任務,其它分支不受影響。
   
   分支--主幹的撤回
   如下圖:
   
   分支撤回到主幹,則將關閉所有的分支,撤回到主幹。如果分支上面巢狀分支,也將關閉所有的巢狀分支,回到主幹。
   
 
聚合路由,實現撤回,當一個分支提交了,其它分支還未執行,即未滿足聚合的條件時,則實現不了撤回,因為當前步驟還在另一個分支,還未執行到聚合後面的節點。當分支條件均滿足後,流轉到聚合節點後面的步驟,則可以實現撤回,撤回與回退一樣,只撤回此分支的軌跡,其它分支不撤回。

撤回與回退的功能均是不按流程定義的軌跡去任意執行,因此在操作的時候不能給所有的使用者都分配此功能。撤回與回退在流程引擎中的實現是一樣的,撤回只是對回退的一個補充。