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!