從幾年前做OA時接觸過工作流的概念,那時還比較模糊,現在覺得清晰一些了,想把自己一些理解寫出來,與大家分享!
工作流最簡單的就是京東的訂單處理,它其實就是個簡單的工作流,每個節點可能有前驅節點(prev node)和后繼節點(next node),如圖:
而這個結構讓我們想起了數據結構里的“鏈表”(鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。),更多鏈表的基礎可以看我這篇文章。
而反映到C#中,我們可以把鏈接結構設計成這樣的類,而對於數據表來說也是這樣的數據結構:
反映到類中,是這樣定義的:
1 public partial class WorkFlow_Info 2 { 3 public int ID { get; set; } 4 public Nullable<int> PrevNode { get; set; } 5 public Nullable<int> NextNode { get; set; } 6 public string Name { get; set; } 7 public string Info { get; set; } 8 }
它有一些導航屬性,用來得到每個節點的前驅和后繼節點信息:
1 /// <summary> 2 /// 工作流實體 3 /// </summary> 4 [MetadataType(typeof(WorkFlow_Info_Meta))] 5 public partial class WorkFlow_Info 6 { 7 #region 導航屬性 8 /// <summary> 9 /// 是否為首結點 10 /// </summary> 11 public bool IsFirstNode 12 { 13 get 14 { 15 return this.PrevNode == null; 16 } 17 } 18 /// <summary> 19 /// 是否為尾結點 20 /// </summary> 21 public bool IsEndNode 22 { 23 get 24 { 25 return this.NextNode == null; 26 } 27 } 28 /// <summary> 29 /// 前驅節點 30 /// </summary> 31 public WorkFlow_Info PrevNodeEntity { get; set; } 32 /// <summary> 33 /// 后繼節點 34 /// </summary> 35 public WorkFlow_Info NextNodeEntity { get; set; } 36 #endregion 37 }
好了,有了上面的基礎,我們把這個結構體現到實際項目中,如一個產品從建立到最后的上架,可能就是一個工作流,它的流程如:
建立產品=》審核產品信息=》產品訂價=》產品上架
而我們再結合之前的鏈表結果,可以很容易的得到下面的結果了:
A產品是剛剛被建立,還沒有進行審核(被建立)
B產品已經經過了審核(被審核)
C產品當前已經處於上價狀態了(被上架)