1. 程式人生 > >Slickflow.NET 開源工作流引擎快速入門之三: 簡單或分支流程程式碼編寫示例

Slickflow.NET 開源工作流引擎快速入門之三: 簡單或分支流程程式碼編寫示例

前言:對於急切想了解引擎功能的開發人員,在下載版本後,就想嘗試編寫程式碼,完成一個流程的開發和測試。本文試圖從請假流程,或分支模式來快速瞭解引擎程式碼的編寫。

1. 建立或分支流程圖形

        或分支流程是常見的決策類的流程,用於處理不同決策場景出現的業務處理,其中每個分支又可以看成是一個序列流程的片段。下面是請假流程的建立程式碼:

var pmb = ProcessModelBuilder.CreateProcess("LeaveRequest", "LeaveRequestCode");
var process = pmb.Start("Start")
				 .Task("Fill Leave Days")
				 .OrSplit("OrSplit")
				 .Parallels(
					   () => pmb.Branch(
						   () => pmb.Task(
							   VertexBuilder.CreateTask("CEO Evaluate"),
							   LinkBuilder.CreateTransition("days>=3")
										  .AddCondition(ConditionTypeEnum.Expression, "days>=3")
							   )
					   )
					   , () => pmb.Branch(
						   () => pmb.Task(
							   VertexBuilder.CreateTask("Manager Evaluate"),
							   LinkBuilder.CreateTransition("days<3")
										  .AddCondition(ConditionTypeEnum.Expression, "days<3")
							   )
						)
				 )
				 .OrJoin("OrJoin")
				 .Task("HR Notify")
				 .End("End")
				 .Store();

  上述程式碼建立了一個並行分支流程,有兩個分支,而且分支是或分支(Orplit-OrJoin),流程圖示例如下:

         或分支是兩個伴隨條件表示式的轉移(Transition),在或分支閘道器節點時候,流程會根據傳入的條件變數days的數值來判斷是走哪條分支,此流程可以看做是請假流程中的請假天數的分支選擇一樣。比如,請假天數在3天以內,由部門經理來審批,當請假天數超過(包含)3天時,則需要總經理來審批。通過或分支模式,來實現審批決策。

 2. 流程啟動和執行

      流程的啟動和執行是最為常用的兩個API介面。

2.1 流程啟動

      啟動需要處理的是流程例項的建立,還有開始節點和開始節點之後任務節點的建立,示例程式碼如下:

IWorkflowService wfService = new WorkflowService();
var wfResult = wfService.CreateRunner("10", "jack")
             .UseApp("DS-100", "Leave-Request", "DS-100-LX")
             .UseProcess("LeaveRequestCode")
.Start();

      活動例項記錄表如下:

 

        同樣按照請假流程為例進行說明,第一個任務節點可以視為“提交請假單”,當員工填寫完請假單,提交後,則可以視為啟動流程。

 2.2 流程執行

      流程執行是由當前待辦任務開始辦理,並且執行到下一步的過程。因為是或分支閘道器,所以需要明確指定條件變數的名稱和數值,用於確定下一步的分支路徑。此處,請假天數days作為條件變數,需要傳入。程式碼示例如下:

            IWorkflowService wfService = new WorkflowService();
            var wfResult = wfService.CreateRunner("10", "jack")
                     .UseApp("DS-100", "Leave-Request", "DS-100-LX")
                     .UseProcess("LeaveRequestCode")
                     .OnTask(8017)
                     .IfCondition("days", "3")
                     .NextStepInt("20", "Alice")
                     .Run();

  活動例項記錄表如下:

 

 3. 流程的撤銷和退回  

3.1 流程撤銷

       如果使用者在完成自己的待辦任務,並且發出給下一步辦理人時,發現有錯誤資訊,需要撤銷時,可以由自己發起,將當前流程撤銷回來。

            IWorkflowService wfService = new WorkflowService();
            var wfResult = wfService.CreateRunner("10", "Jack")
                     .UseApp("DS-100", "Leave-Request", "DS-100-LX")
                     .UseProcess("LeaveRequestCode")
                     .OnTask(id)             //TaskID
                     .Withdraw();

   活動例項記錄表如下:

    3.2 流程退回

       流程退回是由當前待辦任務的辦理人發起,退回到流程的上一步。假如對並行分支中的其中一個分支進行退回處理,這個時候,預設只退回當前分支到閘道器之前的任務節點,並不會影響另外一個分支。

            IWorkflowService wfService = new WorkflowService();
            var wfResult = wfService.CreateRunner("20", "Alice")
                     .UseApp("DS-100", "Leave-Request", "DS-100-LX")
                     .UseProcess("LeaveRequestCode")
                     .PrevStepInt()
                     .OnTask(8020)             //TaskID
                     .SendBack();

  活動例項記錄表如下:

 

   4. 總結

      以上程式碼,可以幫助開發人員快速熟悉引擎元件的介面和簡單分支的實用功能,完整功能需要在企業版以上版本獲取。並行分支的撤銷和退回因為要考慮相鄰分支的處理,所以在引擎內部的處理也是比較特殊。此處,只描述退回後的結果記錄,退回的內部處理邏輯今後也會安排另外的文章專門再去介