2012年7月2日 星期一

Agentflow 開發-會簽應用篇


會簽應用類型
在企業流程的運作中,最常見的類型有兩種,一是循序,另一種是平行簽核,以名片申請流程為例,這類型流程多為一關做完後再往下一關去,
Agentflow流程管理平台中。在會簽的應用上可以採用四種方式來處理(以我們的經驗來分類)。

1. 會簽模組
利用Agentflow流程開發工具時,在流程設計時可以加入會簽模組的節點,代表在公司的流程中,有特定的關卡是一定要平行給特定人員來處理。設計者可以在這個關卡中事先設定要給那些人。這樣的設計適用於一開始就固定給特定的群組對象。

2. 動態會簽
Agentflow的動態會簽功能是相當實用的機制,在公司運作的流程中,常常會有在原本的流程關卡中,需要彈性地由負責人再詢問其他同仁或部門人員的狀況發生。這時候就可以透過Agentflow的動態會簽機制,由負責人每次設定動態加會簽給其他人。詳細的設定請自行參閱流程設計師手冊囉!

3. 動態會簽加值
如果在流程的過程中,我們已經知道某個關卡就是要會簽多人來簽核表示意見,但是這個關卡的人員是由申請人在填寫這次表單時候指定的(當然,不一定要是申請人,只要是在會簽關卡之前的關卡),而非固定的給某些人員。例如:在內部聯絡單中,申請人一開始就可以填寫後面關卡(主管審核關卡後的會簽關卡),他認為需要會簽給那些單位人員,等到主管審核通過後,就直接分送給這些人員簽核。
申請人(指派會簽各單位的人員)-->主管審核-->會簽各單位-->通知申請人。
若我們能夠由前面的人先決定會面關卡的動態會簽人員,而不用由主管審核關卡的主管來設定動態加會簽對象,不就可以達到這樣的效果嗎?這5種應用加值的方式,待會會以案例的方式分享給大家做個參考。

4. 子流程應用於會簽
另外一種會簽的應用方式,是透過子流程來達成。可以事先做好一個會簽流程,關卡數可以僅有一關就結束。當申請人在表單上填寫會簽對象後,流程的下一步就是產生子流程,將表單上的會簽人員當成子流程關卡的處理者,讓他們平行會簽(其實也就是執行子流程關卡),送出子流程後就回到母流程。這樣子的應用需考慮母流程與子流程的資料交換,但是它的彈性應該是最大的。因為是由子流程來處理會簽,它就是一隻完整的流程,可以有不同的表單畫面以及流程完整的Action可以變化。但是也由於它是完整的流程,因此在會簽的同時(使用子流程表單畫面時),是沒有原本表單在下方的(母流程)。當然,我們也可以設計與原本一樣的畫面,再將資料拋轉過來。

這種應用的方式,依我們過去開發Agentflow的經驗,我們認為有它的優點也有它的缺點,下次有空談到子流程應用時,再來跟大家聊聊。




 會簽通知應用範例
我們以業務流程中會用到的內部訂單流程為例來說明。





這個流程的需求是,業務助理除了送交單位主管審核外,還要將內部訂單送給執行單位主管來審查,執行單位主管有三種需求。一個是同時可能送多個人來處理,二是當多人來處理時,只要有一個主管不同意,整個流程就退回,最後則是執行單位主管是每一次業務助理填寫表單時決定,並非是固定的對象。



在表單中設定會簽對象
我們讓使用者在表單中可以設定要會簽的對象,點選icon後跳出一小視窗,讓使用者選擇簽核的對象。


選人的視窗
我們用e-form另外設計一個選人的視窗,用表格元件設計已選的列表,選定完成後將選好列表的資料帶回原本的表單畫面。這種做法,就像一般開視窗選資料,再將資料帶回的效果。

Form.openRoleTreeCustom(true,"" , "member", "orgAction()","", "forms[0].Sign_MemName","forms[0].Sign_MemID","1");

隱藏元件(會簽對象)
一般我們在表單中顯示的資訊,多為使用者看得懂的資訊,例如會簽對象的姓名,但是對於Agentflow系統而言,會簽對象的MemID才是唯一最正確的資訊,所以通常我們會將所需的對象資訊放在一個隱藏的表格,記錄在表單中,這樣一來可以記錄系統所需的資訊外,二來在日後的除錯或追蹤上也會有所依據。

如何利用動態會簽機制
我們前面已經設定了要會簽的對象,接下來就是讓流程關卡可以拿著這些會簽對象,產生動態會簽並且判斷會簽的結果。在這裡我們用了兩個自動執行的節點。
執行會簽
addAddASAudit();

//設定會簽人員 from table
function addAddASAudit(){
var aInstance = MyTask.getArtInstance();
var dataMap = aInstance.getAppDataMap();
var vac = dataMap.get("Sign_Table");
//有設會簽人員才設會簽
if(vac.size()>0  ){
     MyTask.setExecuteAddAS(true);
     MyTask.setAddASType(MyTask.ADD_PARALLEL_ANNOUNCE);
     for(var i = 0;i< vac.size();i++){
         var memid = vac.get(i).get("ITEM2");
         member = Server.getMember(memid);
     MyTask.addAddASAudit(member.getID(),member.getMainRoleID(),member.getMemberDR(member.getMainRoleID()).getDepartmentID());
     }
    
}else{
             Server.flowTo(MyTask,"執行單位主管會簽完成");
}
}
判斷簽核結果與彙整簽核意見

mergeAddAsInfo();
var aInstance = MyTask.getArtInstance();
var dataMap = aInstance.getAppDataMap();
if("true" == dataMap.get("Add_Sign_Reject")){
     Server.flowTo(MyTask,"主管退回");
}else{
     Server.flowTo(MyTask,"執行單位主管同意");
}

//   取出彙整的會簽內容
function mergeAddAsInfo() {
var aInstance = MyTask.getArtInstance();
var dataMap = aInstance.getAppDataMap();
//將會簽結果放入審核意見裡面
var taskmemberlist  = MyTask.getAddASAuditList() ;
var totalResult     = MyTask.getAddASResultString();                //取得加會簽結果的字串
var detailResult    = Server.parseAddASResultString(totalResult);   //將加會簽結果的字串解析成個別的物件形式
var flg_rejcet = false;
var tag = "========================================================";
       var msgarray = SplitString(totalResult,tag);
       var resultarray = SplitResultString(totalResult,tag);
  for(var i = 0; i< detailResult.size(); i++){
     var aCSResultData = detailResult.get(i);
     insertTableByAddAs(aCSResultData,resultarray[i],msgarray[i],"Process_Table");
     if("不同意" == resultarray[i]){
         flg_rejcet = true;
     }
}
if(flg_rejcet){
     //會簽中只要有一人駁回就是要駁回
     dataMap.put("Add_Sign_Reject","true");
}
}

// 把簽核結果加至簽核紀錄表格中
function insertTableByAddAs(aCSResultData,addasResult,msg,tableName) {
var aInstance = MyTask.getArtInstance();
// 整理會簽資料
var addasDep    = aCSResultData.getDep();
var addasRole   = aCSResultData.getRole();
var tmpName     = aCSResultData.getName();
var addasTime   = aCSResultData.getTime("yyyy/MM/dd HH:mm");
var addasName   = tmpName.substring(0,tmpName.indexOf("(")); //只能拿到姓名,沒有工號可用
//var addasMsg    = aCSResultData.getMsg(); //簽核意見
var addasMsg    = msg; //簽核意見

// 將會簽結果放入審核意見裡面
var appDataMap = aInstance.getAppDataMap();
var records = appDataMap.get(tableName);
var row = new Packages.java.util.HashMap();
row.put("ITEM7", records.size() + 1 + "");
row.put("ITEM5", addasTime);
row.put("ITEM8", "會簽單位");
row.put("ITEM6", addasDep);
row.put("ITEM9", addasRole);
row.put("ITEM4", addasName);
var l_member = Server.getMemberByCName(addasName);
var l_id = l_member.getMyID();             
row.put("ITEM2", l_id); //工號
row.put("ITEM3", addasResult);
row.put("ITEM1", addasMsg);
row.put("ITEM10", MyTask.getID());  //TaskID
records.add(records.size(), row);
appDataMap.put(tableName, records);
aInstance.setAppDataMap(appDataMap);
}    






2 則留言: