Activiti業務鍵(businessKey)


問題:如何讓業務對象和對應的流程 關聯?

  發現ProcessInstance 有個方法getBusinessKey()可以得到一個businessKey。

  ProcessInstance 對應數據庫中的表act_ru_execution有個字段BUSINESS_KEY_對應類中的businessKey,這個字段在創建表時自動被設置為unique

解決:

  1、保證流程的ID和業務對象的類名一致。例如:流程id為LeaveBill,我們的業務對象的類名也創建為LeaveBill。

  2、在流程啟動的時候獲取業務對象執行方法的時候傳入businessKey,workflowService.startProcess(key,businessKey,vars);(這里vars為一些變量根據實際情況可有可無)businessKey 產生規則: className+“.”+objId

    public void startProcess(Long id) {
        //1. 獲取業務對象
        LeaveBill bill = this.get(id);
        if(bill!=null){
            // 修改業務對象狀態
            bill.setState(1);// 請假單狀態 0初始錄入,1.開始審批,2為審批通過
            this.update(bill);
            //2. 添加流程變量(Map)
            Map<String,Object> vars = new HashMap<>();
            vars.put("inputUser", bill.getUser().getName());
            // 添加變量來描述業務對象的信息
            String classType =bill.getClass().getSimpleName();
            vars.put("classType", classType);
            vars.put("objId", bill.getId());
            //3. 啟動流程
            // 獲取流程定義key
            String key = classType;
            // 獲取業務鍵 產生規則: className+“.”+objId
            String businessKey = classType +"." + bill.getId();
            this.workflowService.startProcess(key,businessKey,vars);
        }
    }

   3、根據以下方法就可以用taskId獲取業務對象id

    public String getBusinessObjId(String taskId) {
        //1  獲取任務對象
        Task task  =  taskService.createTaskQuery().taskId(taskId).singleResult();
        
        //2  通過任務對象獲取流程實例
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
        //3 通過流程實例獲取“業務鍵”
        String businessKey = pi.getBusinessKey();
        //4 拆分業務鍵,拆分成“業務對象名稱”和“業務對象ID”的數組 
        // a=b  LeaveBill.1
        String objId = null;
        if(StringUtils.isNotBlank(businessKey)){
            objId = businessKey.split("\\.")[1];
        }
        return objId;
    }

  4、根據業務鍵獲取流程實例和任務

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey("LeaveBill.1").singleResult();
List<Task> task = taskService.createTaskQuery().processInstanceBusinessKey("LeaveBill.1").list();

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM