2012年4月5日 星期四

[Oracle BPM/SOA 實務] 彈性欄位(Flex Field)的應用

最近一些合作夥伴遇到一個開發的問題,我想應該蠻多人實務上會遇到這樣的情形的,請注意,閱讀這一篇內容時請先確定你做過【客制化前端應用程式】

問題是這樣的:
在應用程式前端進行人工單取件時,通常使用下列的API進行

// 指定查詢條件 -- 此處只抓出已經ASSIGNED給特定角色的工作
Predicate pred = new Predicate(TableConstants.WFTASK_STATE_COLUMN, Predicate.OP_EQ, "ASSIGNED");


// 執行查詢
result = querySvc.queryTasks(bpmCtx, 
                             queryColumns, 
                             optionalInfo,                                    ITaskQueryService.AssignmentFilter.MY_AND_GROUP, // 抓出指定給該使用
                                                 //者本人或其所屬群組
                             null, // 不使用keywords
                             pred, 
                             null, // 沒有指定查詢排序
                             0,    // 不paging查詢結果
                             0);




在這樣的設計之下,前端應用查詢出來的是我們在指定查詢條件中,Predicate物件所設定的【已經在ASSIGNED狀態下的所有工作,但是在某些情形之下,如果人工單案件很多,我們會希望可以增加一些查詢條件,根據流程中所帶入給此人工單的變數來查詢,以增加查詢的效能,這個時候我們就會需要應用到彈性欄位(Flex Field)的使用。

彈性欄位的概念是,基本上,在Oracle BPM Server後端資料庫表格的欄位設計上,我們有一些預留一些欄位,作為讓開發人員儲存變數資料所用。簡單來說:在資料庫中,我們預先有設計了一個TABLE:WFTASK用以記錄所有的人工單資料,此WFTASK TABLE中包括:TEXTATTRIBUTE1...TEXTATTRIBUTE10NUMBERATTRIBUTE1...NUMBERATTRIBUTE5以及DATEATTRIBUTE1...DATEATTRIBUTE5等欄位,這些欄位基本上在預設的應用模式上面是不會被使用到的,是被預留給彈性查詢來使用的。我們就來看一些怎麼使用這些欄位吧!

首先,使用weblogic帳號登入BPM Workspace,並且選擇右上角的【管理】選項,接下來的畫面你可以在左手邊看到彈性欄位的選項:



首先,你可以為一個你需要使用到的欄位(如:TEXTATTRIBUTE1)指定它的標籤,舉例來說,我們在流程之中會帶入一個資料儲存上一個人工單關卡執行人員的ID,我們可以按下綠色的【加號】按鈕,增加一個名為【requestID】的文字屬性欄位,並且把他對應到【TextAttribute1】的資料庫欄位:





















完成標籤建立之後,接下來我們需要指定哪一個流程的那一個人工關卡要把那一個資料傳進來給這個標籤使用:

選擇【按工作型態編輯對應】,並按下右手邊的【放大鏡】按鈕,如下圖畫面中,你可以打入你的人工關卡名稱,如:【Approve】,下方會列出所有滿足條件的人工關卡,接下來可以根據你要的流程名稱來去選擇正確的關卡。






















選擇之後,接下來會選擇此關卡中哪一個帶入的資料會被存入此標籤:






















在畫面中間有對應的Payload屬性可選擇,此Payload屬性即是你人工關卡中所訂定義傳入的變數資料,這裡我們使用的是一個叫做【requestId】的變數為例,對應到剛才所完成的【requestID】標籤。特別注意的是,我們可以選擇的變數只有Simple Type,如文字、數字或日期的變數,假設你所傳入的是一整個XSD所定義的Business Object,基本上是沒辦法選擇的,唯一的做法是,你要把你需要做彈性欄位的資料,設計成一個Simple Type的變數傳入。

完成之後,按下儲存即可。

之後,所有執行到【Approve】關卡的流程實例,都會把他傳入給【requestId】變數存一份給【requestID】標籤,然後儲存到TEXTATTRIBUTE1資料庫欄位之中。

未來,在前端應用程式的 Predicate 物件設計就可以多一個查詢條件,來加快查詢的效能:

// 指定查詢條件 -- 此處只抓出已經ASSIGNED給特定角色的工作
Predicate pred = new Predicate(TableConstants.WFTASK_STATE_COLUMN, Predicate.OP_EQ, "ASSIGNED");


// 增加查詢條件 -- TEXTATTRIBUTE1欄位等於某字串
pred.addClause(Predicate.AND, TableConstants.WFTASK_TEXTATTRIBUTE1_COLUMN, Predicate.OP_EQ, "searchString");


Enjoy!


2012年1月11日 星期三

BPM11g PS4FP新功能介紹 -- 參數式角色

介紹一個重要BPM11g PS4FP的新功能 - 參數式角色 (Parametric Role)。

話說,在BPM 的世界裡,大家都很習慣使用角色來去定義參與特定工作的人員,因此,假設有一個【IT障礙處理】流程,其中至少會有兩種角色 - 一個是【一般使用者】 (也就是會申告發生障礙的人)、另外一個就是【IT人員】 (處理障礙的人員)。若使用BPMN進行設計時,設計人員會將設計兩個水道(Swing Lane)放置不同的人工作業。

然而,實際情形往往不是那麼美好的,實務上,客戶有可能會告訴你:【沒錯啊,我們是有這兩種角色,但是因為我們的公司有分台北與高雄兩地,IT人員也分在這兩個地方,所以你的指定工作人員的時候,必需要根據申告的人員所在位置來指派這地點裡面的角色人員。】。當沒有參數化角色功能的時候,你可能就需要在設計的時候將【IT人員】這樣的角色切割成為【台北IT人員】與【高雄IT人員】,另外增加水道與判斷條件來實作流程。這種做法會讓流程的設計看起來更加不直覺,同時也更加難以維護。

參數式角色的設計在BPM中就是用以解決這樣的問題。做法就是在使用者除了原本LDAP內的基本資訊之外,根據需求增加【擴充的使用者特性】,然後在流程指定角色的時候,可以另外選定【參數式角色】 - 而此【參數式角色】可根據這些【擴充的使用者特性】增加某些規則來限制角色的人員。舉例來說,剛才的【IT障礙處理】流程,我們就可以增加一個【LOCATION】的【擴充的使用者特性】來記錄每一位員工的所在位置 (例如:TAIPEI或KAOHSIUNG),另外增加一個【Local Person】的【參數式角色】,並指定一個規則是被指定的使用者,其【LOCATION】特性需要符合申告障礙人員所在的位置。

來看看這在BPM 11g中怎麼達成:

首先,使用管理者的角色(如:weblogic)登入BPM Workspace,並選擇右上角的管理功能:


請注意左方功能區有兩個這次會用到的功能:【參數式角色】與【擴充的使用者特性】。請先點選【擴充的使用者特性】:


如上圖所示,我新建了一個叫做【LOCATION】的字串特性,其可能的值只有【TAIPEI】與【KAOHSIUNG】兩種。請注意,目前Oracle BPM只支援字串與數字兩種種類的特性,而字串必須是事前被定義好的幾種可能的值。

畫面下方【對應特性】部分,則是讓管理人員指定系統所有使用者相關特性資料的地方,如上圖所示,我指定了tim、user1與user2三個使用者資料,其LOCATION特性分別為TAIPEI、TAIPEI與KAOHSIUNG。特別注意的是,你不需要為系統中所有的人員指定所有的【擴充的使用者特性】,只需要指定有需要的即可。

這次,點選【參數式角色】功能:


你將會在畫面中間【參數式角色】部分新增、修改或刪除一個你所欲設定的角色,如上圖所示,我已設計了一個【Local Person】的參數角色,此角色的詳細資訊列是出現在上圖所示的右方畫面。

在這裡我設計了兩個字串參數 - 【roleName】與【location】,分別是用來帶入流程中被指派的角色以及流程中所指定的所在位置。而下方的條件部分,我指定了:

  1. 受權者:【應用程式角色】 --> 【OracleBPMProceessRolesApp】 --> 【$roleName】,特別注意$roleName代表的是,被授權的角色是透過roleName這個參數由流程實例之中帶入的。
  2. 【LOCATION】 【等於】 【$location】,代表了另外一個條件是,符合該角色的人員在   【LOCATION】這個擴充的使用者特性,需要與location這個參數傳入的值一致。

至此,我們已經完成了server端的環境準備,接下來進行流程的設計:

首先,假設你已經依照使用者需求完成了上述的流程,如下圖所示:


此流程之中會有一個流程變數 -- location,記錄障礙所發生的地點,此location變數會傳遞進入【IT人員處理】的人工作業。

接下來編輯【IT人員處理】此Human Task,並點選其Assignment:


在Participant List之中,下拉選單有一個新的【Parametric Role】選項,在你選擇後,可以按下右方放大鏡按鍵選擇要執行的參數式角色,此處我們選擇之前所設定好的【Local Person】。選擇完成後下方會自動帶出此參數式角色所需傳遞的參數 -- 【roleName】與【location】。我們分別為其指定:

  • roleName:使用bpm:getPerformer(),抓出此人工作業所位於的水道角色資訊。
  • location:使用/task:task/task:payload/task:location,指定由流程傳入的location變數。

接下來,你就可以將此流程deploy上server試試看囉,你將可以觀察到,流程在執行過程中,被指定的IT角色人員將是特定符合location位置所在的使用者。

Enjoy!