1. 程式人生 > >老闆要我開發一個簡單的工作流引擎

老闆要我開發一個簡單的工作流引擎

第1關

一天,老闆找到我,說要做個簡單的工作流引擎。

我查了一天啥是工作流,然後做出瞭如下版本:

  • 按順序新增任意個審批人組成一個連結串列,最後加一個結束節點
  • 記錄當前審批人,當審批完後,審批人向後移動一位
  • 當審批人對應結束節點時,流程結束

老闆:簡陋了點。

第2關

老闆又來了:要支援會籤節點。

我又查了一天啥是會籤節點,發現會籤節點就是一個大節點,裡面有很多審批人,當這個大節點裡的所有人都審批通過後,才能進入下一個節點。

我想了一個星期,推翻了原來的連結串列式設計:

 

結構上我做了如下調整:

  • 把節點分為兩大類:簡單節點(上圖中長方形)和複雜節點(上圖中圓形)。
  • 用一棵樹表示整個流程,其中葉子節點都是簡單節點,簡單節點都是葉子節點。
  • 每個簡單節點裡都有且僅有有一個審批人。
  • 複雜節點包含若干個子節點。
  • 加入會籤節點: 會籤節點啟用後,所有的子節點都可以審批,當所有的子節點都審批完畢後,會籤節點完成。
  • 加入序列節點:子節點只能從左到右依次進行審批,當最後一個子節點審批完成後,序列節點完成。
  • 所有的工作流最外層都是一個序列節點,該節點完成後代表整個工作流完成。

為了控制審批流程,我設計了一些節點狀態:

  • Ready: 可以進行審批操作的簡單節點是Ready狀態。
  • Complete: 已經審批完成的節點狀態。 
  • Future: 現在還沒有走到的節點狀態。
  • Waiting: 只有複雜節點有該狀態,表示在等待子節點審批。

藉助上述規則,一次帶會籤節點的工作流審批過程如下:


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

老闆:有點意思。

第3關

老闆來了:要支援並行節點。

我查了一下午啥是並行節點,發現並行節點是一個包含很多審批人的大節點,這個大節點裡任何一個人審批通過,則該節點就完成。

然後很快就加入了並行節點:

  • 並行節點是一個複雜節點,該節點啟用時,任何一個子節點都可以進行審批,且任何一個子節點是完成狀態時,該節點完成。

加入新狀態 Skip:

  • 當一個並行節點的子節點狀態為非(Ready, Waiting)時,其它兄弟節點及其子節點的狀態被置為Skip。

舉個栗子