6.4.0 新增加了駁回的方式,真是對中國式流程的一種福音呀,感謝flowable創始人。
再也不為開發駁回流程發愁了,網上那些視頻和修改源碼真的是demo級別的,不能商業用。
只有心如流水的學習才是永遠的發電機,不要幻想別人能給把系統都給你做好了。
任何節點都可以跳轉
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveActivityIdsToSingleActivityId("當前的任務的節點id", "需要跳轉的目標節點")
.changeState();
當然有很多方法,大家可以去找一下ChangeActivityStateBuilder這里類。
1. 直接上代碼吧,從來都是干貨,不隱藏,哈哈。
public ReturnVo<String> backToStep(BackVo backVo) throws Exception { ReturnVo<String> returnVo = new ReturnVo<>(FlowConstant.SUCCESS, "OK"); Task task = taskService.createTaskQuery().taskId(backVo.getTaskId()).singleResult(); String processInstanceId = task.getProcessInstanceId(); FlowElement distActivity = processDefinitionUtils.findFlowElementById(task.getProcessDefinitionId(), backVo.getDistFlowElementId()); //1. 保存任務信息 task.setAssignee(backVo.getUserCode()); taskService.saveTask(task); //2. 如果上一個節點是提交者的話要處理一下 if (FlowConstant.FLOW_SUBMITTER.equals(distActivity.getName())) { //查找發起人 設置到變量中,以便駁回到提起人的時候能留在提交人這個節點 ExtendProcinst extendProcinst = this.extendProcinstService.findExtendProcinstByProcessInstanceId(processInstanceId); String creator = null; if (extendProcinst != null) { creator = extendProcinst.getCreator(); if (StringUtils.isBlank(creator)) { creator = extendProcinst.getCurrentUserCode(); } } else { ExtendHisprocinst extendHisprocinst = extendHisprocinstService.getExtendHisprocinstByProcessInstanceId(processInstanceId); creator = extendHisprocinst.getCreator(); if (StringUtils.isBlank(creator)) { creator = extendHisprocinst.getCurrentUserCode(); } } if (StringUtils.isNotBlank(creator)) { runtimeService.setVariable(processInstanceId, FlowConstant.FLOW_SUBMITTER_VAR, creator); } } List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); List<String> currentActivityIds = new ArrayList<>(); tasks.forEach(t -> currentActivityIds.add(t.getTaskDefinitionKey())); //3. 刪除節點信息 if (!(distActivity instanceof EndEvent)) { this.deleteHisActivities((Activity) distActivity, processInstanceId); } //4. 添加審批意見和修改流程狀態 this.addCommentAndUpdateProcessStatus(backVo, processInstanceId); //5.執行駁回操作 runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdsToSingleActivityId(currentActivityIds, backVo.getDistFlowElementId()) .changeState(); return returnVo; }
2. 經測試 多實例節點,並行網關,判斷網關都沒有問題,甚至是子流程的一種節點跳轉都有相應的方法
具體怎么使用可以去看官方的測試用例