Flowable 快速入門教程:TaskListener 任務監聽器設置審覈人等參數案例

前言

具體功能實現需參考各自項目設計,這裏主要提供一個實現思路,請勿照搬硬套

關於這個的實現,其實並不難,關鍵在於如何設計的更加通用化。

任務監聽器類型

  1. create:在任務創建且所有任務屬性設置完成之後才觸發。
  2. assignment:在任務被分配給某個班裏人之後觸發,它是在create事件觸發前被觸發。
  3. complete:在配置了監聽器的任務完成時觸發,也就是說運行期任務刪除之前觸發。
  4. delete:任務刪除觸發

思路

結構

業務系統微服務
流程引擎微服務
參數配置表:配置節點需要設置的參數,包含審覈人等
PS:這裏參數配置表我放在業務系統

邏輯

  1. 任務節點設置統一的任務監聽器 TaskListener
  2. 任務節點開始,初始化完參數後進入任務監聽器
  3. 任務監聽器去請求配置表獲取需要配置的參數
  4. 循環獲取的參數,根據配置設置變量

配置表設計

整體

配置表的設計僅作參考

參數需配置到具體的流程定義節點
在這裏插入圖片描述

類別

用於區分是普通參數,審覈人,或者候選人

這裏沒有候選組,因爲流程設計器原來設置組後,IDM 也會自動轉化爲候選人,只是在字段上做了下區分,因此這裏只提供到候選人
在這裏插入圖片描述
在這裏插入圖片描述

類型

用於區分值的類型與獲取方式
List 集合:需要特殊轉化,主要在 多實例 使用
鉤子函數:通過請求的方式,在業務系統端,自行通過接口設置參數,這個主要考慮再怎麼設計參數也不可能盡善盡美,因此這裏可以通過鉤子函數方式,自行設置參數,當然我會帶基本數據去請求,這樣的配置也更加自由化
在這裏插入圖片描述

整體流程圖

在這裏插入圖片描述

流程節點說明

第一審覈人節點:審覈人蔘數設置

在這裏插入圖片描述

流程設計器配置

在這裏插入圖片描述
在這裏插入圖片描述

配置表參數

配置審覈人爲 admin
在這裏插入圖片描述

任務步驟

發起流程

按照監聽事件 create,監聽器會在任務屬性設置完成後觸發,因此設計器上面審覈人字段是直接設空的,因爲如果設爲變量會因找不到變量報錯

獲取節點參數

參數配置用的是流程定義 key,是爲了流程版本迭代不需要重新配置參數
在這裏插入圖片描述
返回的參數,另一個參數是下個會籤流程的,後面再說
在這裏插入圖片描述

設置參數

根據參數配置信息,能知道配置的這個是審覈人蔘數,因此直接設置爲節點審覈人
在這裏插入圖片描述

結果

第一個節點完成
在這裏插入圖片描述

會籤節點:多實例參數設置

在這裏插入圖片描述

流程設計器配置

基本的多實例配置,完成條件簡單點一個人審覈就通過

監聽器都是同一個監聽器
在這裏插入圖片描述
在這裏插入圖片描述

配置表參數

你會發現,參數的設置節點選擇的是前一個節點

根據任務監聽器 create 會在參數初始化結束才調用監聽器

因此設計器上設置的 assigneeList 多實例變量也會初始化,因此肯定會報錯

因此,多實例這種只能在之前節點提前設置參數

如果第一個節點就是會籤怎麼辦?

我會選擇在前面放個自動節點設置會籤參數
在這裏插入圖片描述

任務步驟

設置參數

基本上的邏輯和之前都是一樣的,因此直接來看設置參數

雖然是多實例,但是本質就是普通參數而已

由於是集合類型,因此需要轉換爲集合

所以我在參數配置特意分了一個 List 集合類別
在這裏插入圖片描述
在這裏插入圖片描述

結果

這是正在進行的任務,由於設置了兩個用戶,因此生成兩個任務實例
在這裏插入圖片描述
來看下身份信息關聯表
在這裏插入圖片描述

參考代碼

關於代碼中用到的 SpringUtilConfig,看下面這個文章
Flowable 監聽器獲取不到 Bean 問題

/**
 * 節點監聽器設置參數
 * @author: linjinp
 * @create: 2019-12-16 14:02
 **/
@Component
public class ParamTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
    
        // 通過業務系統的接口獲取數據
        // bean 獲取
        RequsetFunctionService requsetFunctionService = SpringUtilConfig.getBean(RequsetFunctionService.class);
        FeignFlowParamService feignFlowParamService = SpringUtilConfig.getBean(FeignFlowParamService.class);
        // 獲取流程定義 Key
        String processDefKey = (String) delegateTask.getVariable("processDefKey");
        // 請求獲取配置參數列表
        String json = feignFlowParamService.getFlowTaskParam(processDefKey, delegateTask.getTaskDefinitionKey());
        ErrorMsg errorMsg = JSON.parseObject(json, ErrorMsg.class);
        // 請求沒成功後面不繼續執行
        if (!errorMsg.getErrorCode().equals(ErrorMsg.SUCCESS.getErrorCode())) {
            return;
        }
        
        // 鉤子函數的參數
        Map<String, Object> data = new HashMap<>();
        data.put("processDefId", delegateTask.getProcessDefinitionId());
        data.put("processDefKey", processDefKey);
        data.put("processInstanceId", delegateTask.getProcessInstanceId());
        data.put("category", delegateTask.getCategory());
        data.put("taskId", delegateTask.getId());
        data.put("taskDefKey", delegateTask.getTaskDefinitionKey());
        // 循環設置參數
        if (errorMsg.getData() != null && !"".equals(errorMsg.getData())) {
            List<Map<String, Object>> flowParamList = (List<Map<String, Object>>) errorMsg.getData();
            flowParamList.forEach(flowParam -> {
                if ("1".equals(flowParam.get("style"))) {
                    // List 類型參數需特殊處理
                    String[] arr = ((String) flowParam.get("value")).split(",");
                    delegateTask.setVariable((String) flowParam.get("name"), Arrays.asList(arr));
                } else if ("2".equals(flowParam.get("style"))) {
                    // 鉤子請求,不接收返回值,用戶自行設置參數
                    requsetFunctionService.requestHook((String) flowParam.get("value"), JsonUtil.toJSON(data));
                } else {
                    if ("0".equals(flowParam.get("category"))) {
                        // 參數
                        delegateTask.setVariable((String) flowParam.get("name"), flowParam.get("value"));
                    } else if ("1".equals(flowParam.get("category"))) {
                        // 審覈人
                        delegateTask.setAssignee((String) flowParam.get("value"));
                    } else {
                        // 候選人
                        String[] candicateUsers = ((String) flowParam.get("value")).split(",");
                        delegateTask.addCandidateUsers(Arrays.asList(candicateUsers));
                    }

                }
            });
        }
    }
}
發佈了103 篇原創文章 · 獲贊 387 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章