會簽應用類型
在企業流程的運作中,最常見的類型有兩種,一是循序,另一種是平行簽核,以名片申請流程為例,這類型流程多為一關做完後再往下一關去,
在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);
}



