引導語:業務中一個節點可能需要多個人審批,也可能是多個人任意一個人審批即可,這塊就會用到多人審覈
一. 多人會審基本流程
- 多人並行會審,流程圖如下:
2. 流程配置
Multi instance:
- Sequence 設置流程爲串行還是並行處理。
- Loop cardinality 設置節點的循環次數。
- Collection 設置處理人集合。
- Element variable 設置一個處理人變量。
- Completion condition 設置結束條件,在這裏配置會簽結束條件
- nrOfInstances:實例總數
- nrOfActiveInstances:當前活動的,比如,還沒完成的,實例數量。 對於順序執行的多實例,值一直爲1。
- nrOfCompletedInstances:已經完成實例的數目。
可以通過execution.getVariable(x)方法獲得這些變量。
另外,每個創建的分支都會有分支級別的本地變量(比如,其他實例不可見, 不會保存到流程實例級別)
- loopCounter:表示特定實例的在循環的索引值。可以使用activiti的elementIndexVariable屬性修改loopCounter的變量名。
3.流程梳理
多人並行會審,此處根據condition配置的變量來對節點流程進行內部走向,${nrOfCompletedInstances/nrOfInstances==1}代表所有的人全部通過則纔會到下一個節點,如果是任意一個人會審通過則進入下一個節點,則修改表達式${nrOfCompletedInstances>0}
4.代碼實現
代碼其實很簡單,上一節的代碼不變,在啓動流程傳參那塊,key變成對應的userList,傳入多人id數組即可
@Override
public ProcessInstance getTask(String perid, String tempName, Map<String, Object> map){
identityService.setAuthenticatedUserId(perid);
// 開始流程 map內容set對應的審覈用戶
ProcessInstance pi = runtimeService.startProcessInstanceByKey(tempName, map);
// 查詢當前任務
return pi;
}
傳參如下:
Map<string,Object> map =Maps.newHashMap();
List<String> userList = new ArrayList();userList.add("1");userList.add("2");
map.put("userList",userList );
啓動流程則可以用set的用戶查詢對應的任務,進行審覈,代碼上一節都有.流程代碼公共方法,只是根據業務參數進行傳參
以上流程爲多人並行審覈,如果是多人順序審覈,選中sequential,順序發起流程則會根據set人的順序進行任務審覈,前一個審覈完成纔會到下一個人審覈.
二. 多很會審加排他網關
1.繪製流程圖如下
流程分析: 多人並行審覈,發起流程,所有人同意則進行到下一個節點人審覈,如果有一個人不同意則流程結束.這裏用到了排他網關,非此即彼,根據審覈結果條件來處理下個節點的流向.
2.首先一個審覈用戶,多人審覈,全部通過或者有一個不通過,則用ifPass來辨別審覈同意還是不同意,
completion condition配置如下${nrOfCompletedInstances/nrOfInstances==1|| ifPass>0},其他的配置如上,
排他網關連接線配置如下
3.配置監聽類
@Override
public void notify(DelegateTask delegateTask) {
String eventName = delegateTask.getEventName();
// ActivitiEventType.PROCESS_STARTED
if ("create".endsWith(eventName)) {
log.info("create=========");
} else if ("assignment".endsWith(eventName)) {
log.info("assignment========");
} else if ("complete".endsWith(eventName)) {
log.info("complete===========");
Map<String, Object> map = delegateTask.getVariables();
String ifPass = ObjectUtils.toString(map.get("ifPass"),"");
if(StringUtils.isNoneBlank(ifPass) && ifPass.equals("0")){
delegateTask.setVariable("ifPass",1);
}else {
delegateTask.setVariable("ifPass",0);
}
} else if ("delete".endsWith(eventName)) {
log.info("delete=============");
}
// delegateTask 可以操作activiti引擎的一些東西
}
4.流程啓動運行,接口上一節代碼不變.到此,基本業務流程也就實現了,對於項目中遇到的業務問題,可以藉助監聽類來實現複雜的業務流程,千變萬化只要瞭解代碼的編寫方式,就能去實現多類型的複雜業務流程.
歡迎評論,留下您寶貴的建議,如果對你有用請記得點贊哦