數據結(jie)構~工作流的(de)設(she)計(鏈表結(jie)構)
從幾(ji)年前做OA時(shi)接(jie)觸過工作(zuo)流的概念,那時(shi)還比較模糊(hu),現(xian)在覺得清晰一些(xie)了,想把自己一些(xie)理解寫出來,與大家分(fen)享!
工作(zuo)流最(zui)簡(jian)單的(de)就(jiu)是京東的(de)訂單處(chu)理,它其實就(jiu)是個簡(jian)單的(de)工作(zuo)流,每(mei)個節點可能有前驅節點(prev node)和(he)后繼節點(next node),如圖:
而這個結構讓我們想起了數據結構里的“鏈表”(鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。),更多鏈表的基礎可以看我這篇文章。
而反映到C#中,我們可以把(ba)鏈接(jie)結構設計成這樣(yang)的類,而對于數(shu)據表來說也(ye)是這樣(yang)的數(shu)據結構:
反映到類中,是這樣定義的:
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 }
它有一(yi)些導航(hang)屬(shu)性(xing),用來(lai)得到每(mei)個節(jie)點的(de)前驅和后繼節(jie)點信息:
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 /// 是否(fou)為尾結點(dian) 20 /// </summary> 21 public bool IsEndNode 22 { 23 get 24 { 25 return this.NextNode == null; 26 } 27 } 28 /// <summary> 29 /// 前驅(qu)節點 30 /// </summary> 31 public WorkFlow_Info PrevNodeEntity { get; set; } 32 /// <summary> 33 /// 后(hou)繼節點 34 /// </summary> 35 public WorkFlow_Info NextNodeEntity { get; set; } 36 #endregion 37 }
好了,有(you)了上面的(de)基礎,我們把這個(ge)(ge)結(jie)構體(ti)現到(dao)實際(ji)項目中(zhong),如一個(ge)(ge)產品從建立到(dao)最后(hou)的(de)上架,可能就(jiu)是一個(ge)(ge)工作(zuo)流,它的(de)流程如:
建立產(chan)品(pin)(pin)=》審核產(chan)品(pin)(pin)信(xin)息=》產(chan)品(pin)(pin)訂價=》產(chan)品(pin)(pin)上(shang)架
而我(wo)們再結合之(zhi)前的鏈表結果(guo),可(ke)以很容易(yi)的得到下面的結果(guo)了:
A產品是(shi)剛剛被(bei)建(jian)立(li),還沒有進行審核(被(bei)建(jian)立(li))
B產品已經(jing)(jing)經(jing)(jing)過了審核(被審核)
C產(chan)品(pin)當前已經(jing)處于上價(jia)狀態了(被上架)