老闆要我開發一個簡單的工作流引擎
阿新 • • 發佈:2021-03-03
第1關
一天,老闆找到我,說要做個簡單的工作流引擎。
我查了一天啥是工作流,然後做出瞭如下版本:
- 按順序新增任意個審批人組成一個連結串列,最後加一個結束節點
- 記錄當前審批人,當審批完後,審批人向後移動一位
- 當審批人對應結束節點時,流程結束
老闆:簡陋了點。
第2關
老闆又來了:要支援會籤節點。
我又查了一天啥是會籤節點,發現會籤節點就是一個大節點,裡面有很多審批人,當這個大節點裡的所有人都審批通過後,才能進入下一個節點。
我想了一個星期,推翻了原來的連結串列式設計:
結構上我做了如下調整:
- 把節點分為兩大類:簡單節點(上圖中長方形)和複雜節點(上圖中圓形)。
- 用一棵樹表示整個流程,其中葉子節點都是簡單節點,簡單節點都是葉子節點。
- 每個簡單節點裡都有且僅有有一個審批人。
- 複雜節點包含若干個子節點。
- 加入會籤節點: 會籤節點啟用後,所有的子節點都可以審批,當所有的子節點都審批完畢後,會籤節點完成。
- 加入序列節點:子節點只能從左到右依次進行審批,當最後一個子節點審批完成後,序列節點完成。
- 所有的工作流最外層都是一個序列節點,該節點完成後代表整個工作流完成。
為了控制審批流程,我設計了一些節點狀態:
- Ready: 可以進行審批操作的簡單節點是Ready狀態。
- Complete: 已經審批完成的節點狀態。
- Future: 現在還沒有走到的節點狀態。
- Waiting: 只有複雜節點有該狀態,表示在等待子節點審批。
藉助上述規則,一次帶會籤節點的工作流審批過程如下:
老闆:有點意思。
第3關
老闆來了:要支援並行節點。
我查了一下午啥是並行節點,發現並行節點是一個包含很多審批人的大節點,這個大節點裡任何一個人審批通過,則該節點就完成。
然後很快就加入了並行節點:
- 並行節點是一個複雜節點,該節點啟用時,任何一個子節點都可以進行審批,且任何一個子節點是完成狀態時,該節點完成。
加入新狀態 Skip:
- 當一個並行節點的子節點狀態為非(Ready, Waiting)時,其它兄弟節點及其子節點的狀態被置為Skip。
舉個栗子