springboot+activiti6,多人會審流程的實現(無序,有序)

引導語:業務中一個節點可能需要多個人審批,也可能是多個人任意一個人審批即可,這塊就會用到多人審覈

一. 多人會審基本流程

  1. 多人並行會審,流程圖如下: 

   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.流程啓動運行,接口上一節代碼不變.到此,基本業務流程也就實現了,對於項目中遇到的業務問題,可以藉助監聽類來實現複雜的業務流程,千變萬化只要瞭解代碼的編寫方式,就能去實現多類型的複雜業務流程.

歡迎評論,留下您寶貴的建議,如果對你有用請記得點贊哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章