2011年2月11日 星期五

[Oracle BPM/SOA 實務] Muli-Tier 審核流程的設計

來看看在人工簽核作業中常常遇到的情境吧,我們該怎麼設計一個需要兩階層簽核的流程:


假設有上圖所示的組織架構,Tim與Leon的直屬長官是Kenneth;而Kenneth的直屬長官是Gary,由Tim所完成的工作在流程中需要由上面兩層的長官審核才能繼續往下走。首先,你的BPM使用者要有這樣的組織架構在內,你可以參考這篇【如何增加使用者至BPM Server中】先把你所需要的使用者建立起來。

但是,明眼的你應該會發現,在這裡LDAP tree中的使用者是看不出階層關係的,我們該怎麼指定上圖那樣的關係哩?


其實在LDAP tree中每一個使用者都會存在一個attribute叫做"manager",你可以在此attribute中填入該使用者主管的DN,例如:Tim的manager attribute中,你應該要填入:uid=kenneth,ou=people,ou=myrealm,dc=bpm_domain (請注意:你的dc會根據domain name不同而改變,基本上你如果是用JXplorer的話,你可以右鍵該使用者主管並選取 "複製DN",再把它貼到manager attribute之中即可)。藉由上述步驟,你可以在BPM Server的使用者中建立起你的組織架構關係。

請使用JDeveloper開一個新的BPM Project -- "MultiTierApproval",並指定一個Asynchronous BPMN Process叫做 "MultiTierApproval"。

首先,最簡單的方式是使用一種叫做Management的Interactive Activity,你可以在右邊的Component Palette中找到他,就常用的User Activity上方。


這種方是你可以用"一個"Activity來實踐多層的審核,特別注意的是,在產生Human Task的時候,請一定要將Pattern選項選為"Management"。



打開你的MultiTierTask.task檔案,現在你的assignment頁應該是長成這樣:


請double-click圖中的default.DefaultPerformer,打開對話框:



這裡有許多重要的資訊:

  • Starting Participant:這是代表這個human task的第一個執行者,預設你可以看到Identification Type為Application Role且Value為bpm:getPerformer()的一行,這代表了第一個使用者將是根據你swim lane所指定的角色人員。
  • Top Participant:指定最高層級人員,你可以指定這個向上escalation的步驟最高到哪一位使用者就會停止,例如,我們可以手動指定最高層級到gary就停止。
  • Number of Levels:指定向上escalation層級數,代表往上走幾層之後會停止。
注意:Top Participant與Number of Levels是 "OR" 的關係,其中一個條件達成就會停止往上走。

將流程部署測試看看吧,你會需要透過BPM WorkSpace先後由tim、kenneth與gary來登入並且核可人工作業。接下來在Enterprise Manager的Audit Trail中,點選MultiTierTask,你會看到下列得資訊,仔細看看內容,你會發現這單一Task中經過了三個作業:



到這裡一定會有人問到,要是我要的是這樣的流程:

在第一個人工作業完成後,需要執行一個自動作業才能交給主管去覆核,這種流程我們便不能夠使用Management Human Task在單一一個Task中完成所有作業。

來介紹第二種作法:

這種作法中,我們將需要在流程中動些手腳,第一,在流程中需要新增一個String變數,用來紀錄第一個人工作業UserTask到底是誰完成的;第二,在MgrTask中,需要指定一個payload,並將流程變數中所記錄第一個作業完成的人帶入,並且assignment中找到該使用者的直屬長官。

指定一個type為String的Process Data Object,叫做 "taskUser"。

在 "UserTask" --> "Implementation" --> "Data Association" 中,將 "execData" --> "systemAttributes" --> "updatedBy" --> "id" 指定為"taskUser"。


指定此Data Association將會把完成該"UserTask"的使用者ID寫入"taskUser"變數。

在產生 "MgrTask" 時,記得給一個String payload,我這邊也叫他taskUser吧:


記得也把在 "MgrTask" --> "Implementation" --> "Data Association" 中,將 "taskUser" 指定為"taskUser",如此會把第一關的執行人員ID存放在task payload中,以便於等一下我們要找到他的主管。


打開 "MgrTask.task"檔案,並double-click assignment中的default.DefaultPerformer,打開對話框,這次會比較tricky一點,我們將指定

  • Identification Type:User
  • Data Type:By Expression
  • Value:ids:getManager(/task:task/task:payload/task:taskUser)

特別要注意的是Value,這是一個標準的XPath表示式,你不需要手動編輯此資料,你可以按下旁邊的按鍵打開Expression Builder用對話框來選取資料。嘗試看看,我們是要找到Schema中 "task" --> "payload" --> "taskUser" 的資料,並且透過 "Identity Service Function" --> "getManager()" 此function取找到其主管資料。

完成之後部署測試看看吧!



沒有留言: