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

Step1>在SCustomers中,增加一個WriteCloseDate的Server Method:

Step2>首先在ServiceManager的ServiceCollection 屬性進行設定,新增一個ServerMethod必須在ServiceManager中新增一個Service來告知系統。

Step3>點開ServiceCollection右側按鈕,在Service Collection Editor中,新增一個Service,將ServiceName與DelegateName都設為WriteCloseDate。

Step4>在SCustomer的Server檔的Code頁面中,增加下列程式(紅字部分請修改成自己建立的Database名稱):
public
object WriteCloseDate(object[] objParam)
        {
            object[] ret = new object[] { 0, 0
};
            System.Data.DataRow dr =
(System.Data.DataRow)objParam[0]; 
// 取得流程資料表的資料內容
            string Today= System.DateTime.Today.ToShortDateString();
//取得今天日期
            string CustomerId =
dr["CustomerId"].ToString(); 
// 取得目前客戶編號
            System.Data.IDbConnection conn =
this.AllocateConnection("DB1"); 
// 取得資料連線
            if (conn.State ==
System.Data.ConnectionState.Closed) 
conn.Open();
            try
            {
                System.Data.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("DB1", conn) ; // 保證釋回資料連線
            }
            return ret; // 傳回值: 無
        }
Step5>回到CustomerFL中,貼入FLProcedure活動元件,將元件Name設為「結案處理」,此元件用於完成調用ServerMethod的動作。

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

Step7>003為User 登入,輸入如下 2506資料,輸入完畢後將資料上呈至005,005登入簽核後,送至004(指定客服窗口),004確認服務窗口為R03後上呈資料,此時系統將此筆資料送給002,002上呈資料後流程進入結案處理,此時系統會根據Server
Method中的方法,將LastOrderedDate寫入當前日期。

Step8>我們可以回到Customer資料表中來查看2506資料的LastOrderedDate內容,可以看到流程結束後LastOrderDate的日期已被寫入。

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

Step10>為了能讓「服務窗口確認」可以退回,因此我們將「服務窗口確認」的FLNavigatorMode由Continue改為Approve。

Step11>我們將上例中的Server Method更改如下(紅字部分請修改成自己建立的Database名稱):
public
object WriteCloseDate(object[] objParam)
        {
            object[] ret = new object[] { 0, 0
};
            System.Data.DataRow dr =
(System.Data.DataRow)objParam[0]; 
// 取得流程資料表的資料內容
            string Today=
System.DateTime.Today.ToShortDateString(); //取得今天日期
            string CustomerId =
dr["CustomerId"].ToString(); // 取得目前客戶編號
            System.Data.IDbConnection conn =
this.AllocateConnection("DB1"); 
// 取得資料連線
            if (conn.State ==
System.Data.ConnectionState.Closed) 
conn.Open();
            try
            {
                System.Data.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();
            }
            finally
            {
                this.ReleaseConnection("DB1", conn) ; // 保證釋回資料連線
            }
            return ret; // 傳回值: 無
        }
Step12>以003為User 登入,輸入如下 2507資料,輸入完畢後將資料上呈至005,005登入簽核後,送至004(指定客服窗口),004確認服務窗口為R03後上呈資料,此時系統將此筆資料送給002。

Step13>此時打開Customer資料表來查看2507的LastOrderedDate為今天的日期。

Step14>如果讓002登入,並使用「退回」功能將2507退回給004後,此時打開Customer資料表來查看2507的LastOrderedDate為NULL。


Related Topics