在流程的流動當中,除了單據會轉移到不同的角色上之外,可能有一些後端的商業邏輯處理須跟著配合,但因為無法保證流程一定會結案,所以多數的商業邏輯處理會放在結案前的一個活動來處理,以確定此單據是被確認的,但也有一些例外,是在流程的進行當中,就需處理一些商業邏輯,但後者一定需注意到該單據可能會被退回去而重覆執行,或者因為被作廢而不一致。而FLProcudure活動是專門用來設計Workflow後端處理程序或商業邏輯程序等的活動元件,可以隨著Workflow引擎執行到此活動時被觸發執行。
準備工作:
開始下面實例之前請確認Customers資料表中是否存在LastOrderedDate欄位,若不存在請予執行如下SQL語句,在Customers資料表加入此欄位:
Alter table
Customers Add LastOrderedDate DateTime null
Step1>
在sCustomers中,增加一個WriteCloseDate的Server Method:
首先,對 ServiceManager的ServiceCollection 進行設定,新增一個ServerMethod就必須在ServiceManager中新增一個Service來告知系統。
點開ServiceCollection右側按鈕,在Service Collection Editor中,新增一個Service,將ServiceName與DelegateName都設為WriteCloseDate。
Step2>
在Component.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取得最新Server的dll。
Step3>
回到FLDesigner.exe,在Custom.xoml中,貼入FLProcedure活動元件,將元件Name設為「結案處理」。此元件用於完成調用ServerMethod的動作。
接著,我們要設定ModuleName與MethodName,在ModuleName選擇sCustomers,表示CallMethod在那個Server程式中;MethodName設定為WriteCloseDate,表示流程當進入此處時,將執行sCustomers中的WriteCloseDate方法。
Step4>
我們以003為User 登入,輸入如下 0014資料,輸入完畢後將資料上呈至005,005登入簽核後,送至007(指定客服窗口),007確認服務窗口為R04後上呈資料,此時系統將此筆資料送給004,004上呈資料後流程進入結案處理,此時系統會根據Server Method中的方法,將LastOrderedDate寫入當前日期。
下圖分別為005審閱,然後007審閱,最後004確認。
Step5>
我們可以透過SQL Server來查看0014資料的LastOrderedDate內容,如下:
Step6>
接著,我們試著從Server Method中來了解User對流程是進行往下的前進動作,還是往前退回動作,因此,我們特別將指定服務窗口下面的IfElseActivity活動刪除,並將FLProcedure活動拖拉到指定服務窗口與服務窗口確認中間,如圖:
為了能讓「服務窗口確認」可以退回,因此我們將「服務窗口確認」的FLNavigatorMode由Continue改為Approve。
Step7>
我們將上例中Component.cs中的Server 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();
}
Step8>
以003為User 登入,輸入如下 0015資料,輸入完畢後將資料上呈至005,005登入簽核後,送至007(指定客服窗口),007確認服務窗口為R04後上呈資料,此時系統將此筆資料送給004。
Step9>
此時,透過SQL Server來查看0015的LastOrderedDate為今天的日期。
Step10>
如果讓004登入,並使用「退回」功能將0015退回給007後,此時,透過Server Explorer來查看0018的LastOrderedDate為NULL。
Related Topics