如何讓業務對象和對應的流程 關聯?
發現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();
Task task =taskService.createTaskQuery().processInstanceBusinessKey("LeaveBill.1").singleResult();