第 5 章Workflow 進階設計第 5 章Workflow 進階設計\5-5後端處理程序

5-5後端處理程序

 

 

在流程的流動當中,除了單據會轉移到不同的角色上之外,可能有一些後端的商業邏輯處理須跟著配合,但因為無法保證流程一定會結案,所以多數的商業邏輯處理會放在結案前的一個活動來處理,以確定此單據是被確認的,但也有一些例外,是在流程的進行當中,就需處理一些商業邏輯,但後者一定需注意到該單據可能會被退回去而重覆執行,或者因為被作廢而不一致。而FLProcudure活動是專門用來設計Workflow後端處理程序或商業邏輯程序等的活動元件,可以隨著Workflow引擎執行到此活動時被觸發執行。

 

準備工作

開始下面實例之前確認是否在Customers中存在LastOrderedDate欄位若不存在請予執行如下SQL語句

Alter table Customers Add LastOrderedDate DateTime null

 

Step1SCustomers中,增加一個WriteCloseDateServer Method

 

 

首先, ServiceManagerServiceCollection 進行設定,新增一個ServerMethod就必須在ServiceManager中新增一個Service來告知系統

 

點開ServiceCollection右側按鈕,在Service Collection Editor中,新增一個ServiceServiceNameDelegateName都設為WriteCloseDate

 

 

Step2Component.cs中,增加下列程式:

public object WriteCloseDate(object[] objParam)

        {

            object[] ret = new object[] { 0, 0 };

            DataRow dr = (DataRow)objParam[0]; // 取得流程資料表的資料內容

            string Today= System.DateTime.Today.ToShortDateString(); //取得今天日期

            string CustomerId = dr["CustomerId"].ToString(); // 取得目前客戶編號

            IDbConnection conn = this.AllocateConnection("ERPS"); // 取得資料連線

            if (conn.State == ConnectionState.Closed)  conn.Open();

            try

            {

                IDbTransaction trans = conn.BeginTransaction(); // 起始交易

                string sql = "Update Customers Set LastOrderedDate='" + Today + "' Where CustomerID='" + CustomerId + "'";

                this.ExecuteCommand(sql, conn, trans); // 送出SQL語句

                trans.Commit(); // 確認交易

            }

            finally

            {

                this.ReleaseConnection("ERPS", conn) ; // 保證釋回資料連線

            }

            return ret; // 傳回值:

        }

 

注意:在完成上面的設定後,必須將已修改的Server端程式重新建置(build),使NetServer取得最新Serverdll

 

Step3回到FLDesigner.exe,在CUSTOMERS.XOML中,貼入FLProcedure活動元件,將元件Name設為「結案處理此元件用於完成調用ServerMethod的動作。

 

 

接著,我們要設定ModuleNameMethodName,在ModuleName選擇

SCustomers,表示CallMethod在那個Server程式中;MethodName設定為WriteCloseDate,表示流程當進入此處時,將執行SCustomers中的WriteCloseDate方法。

 

Step4在「Logon.aspx」中我們以003User 入,輸入如下 C017資料,輸入完畢後將資料上呈至005005入簽核後,送至007(指定客服窗口)007確認服務窗口為R04後上呈資料,此時系統將此筆資料送給004004上呈資料後流程進入結案處理,此時系統會根據Server Method中的方法,將LastOrderedDate寫入當前日期。

 

 

 

Step5我們可以透過VS所提供的Server Explorer來查看C017資料的LastOrderedDate內容,如下:

 

 

 

Step6接著,我們試著從Server Method中來了解User對流程進行往下的前進動作,還是往前退回動作,因此,我們特別將指定服務窗口下面的IfElseActivity活動刪除,並將FLProcedure活動拖拉到指定服務窗口與服務窗口確認中間,如圖:

 

為了能讓「服務窗口確認」可以退回,因此我們將「服務窗口確認」的FLNavigatorModeContinue改為Approve

 

Step7我們將上例中Component.csServer Method更改如下:

try

            {

                IDbTransaction trans = conn.BeginTransaction();

                int FlowDirection = (int)objParam[1]; // 在流程中有傳遞第二個參數代表方向

                string sql="";

                if (FlowDirection ==1)  // 1代表往下,2 代表退回

                {

                    sql = "Update Customers Set LastOrderedDate='" + Today + "' Where CustomerID='" + CustomerId + "'";

                }

                else

                {

                  // 退回時清空

   sql = "Update Customers Set LastOrderedDate=null Where CustomerID='" + CustomerId + "'";

                }

                this.ExecuteCommand(sql, conn, trans);

                trans.Commit();

            }

 

Step8003User 入「Logon.aspx」,輸入如下 C018資料,輸入完畢後將資料上呈至005005入簽核後,送至007(指定客服窗口)007確認服務窗口為R04後上呈資料,此時系統將此筆資料送給004

 

 

 

Step9此時,透過Server Explorer來查看C018LastOrderedDate為今天的日期。

 

Step10如果讓004登入,並使用「退回」功能將C018退回給007後,此時,透過Server Explorer來查看C018LastOrderedDateNULL

 

 

 

 

Top of Page