Activiti6.0版本流程撤回、跳轉、回退等操作
阿新 • • 發佈:2019-01-25
如題,實現思路:
1、獲取當前任務所在的節點
2、獲取所在節點的流出方向
3、記錄所在節點的流出方向,並將所在節點的流出方向清空
4、獲取目標節點
5、建立新的方向
6、將新的方向set到所在節點的流出方向
7、完成當前任務
1、獲取當前任務所在的節點
2、獲取所在節點的流出方向
3、記錄所在節點的流出方向,並將所在節點的流出方向清空
4、獲取目標節點
5、建立新的方向
6、將新的方向set到所在節點的流出方向
7、完成當前任務
8、還原所在節點的流出方向
public void revoke(String objId) throws Exception { Task task = taskService.createTaskQuery().processInstanceBusinessKey(objId).singleResult(); if(task==null) { throw new ServiceException("流程未啟動或已執行完成,無法撤回"); } LoginUser loginUser = SessionContext.getLoginUser(); List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery() .processInstanceBusinessKey(objId) .orderByTaskCreateTime() .asc() .list(); String myTaskId = null; HistoricTaskInstance myTask = null; for(HistoricTaskInstance hti : htiList) { if(loginUser.getUsername().equals(hti.getAssignee())) { myTaskId = hti.getId(); myTask = hti; break; } } if(null==myTaskId) { throw new ServiceException("該任務非當前使用者提交,無法撤回"); } String processDefinitionId = myTask.getProcessDefinitionId(); ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); //變數 // Map<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId()); String myActivityId = null; List<HistoricActivityInstance> haiList = historyService.createHistoricActivityInstanceQuery() .executionId(myTask.getExecutionId()).finished().list(); for(HistoricActivityInstance hai : haiList) { if(myTaskId.equals(hai.getTaskId())) { myActivityId = hai.getActivityId(); break; } } FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId); Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); String activityId = execution.getActivityId(); logger.warn("------->> activityId:" + activityId); FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); //記錄原活動方向 List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>(); oriSequenceFlows.addAll(flowNode.getOutgoingFlows()); //清理活動方向 flowNode.getOutgoingFlows().clear(); //建立新方向 List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>(); SequenceFlow newSequenceFlow = new SequenceFlow(); newSequenceFlow.setId("newSequenceFlowId"); newSequenceFlow.setSourceFlowElement(flowNode); newSequenceFlow.setTargetFlowElement(myFlowNode); newSequenceFlowList.add(newSequenceFlow); flowNode.setOutgoingFlows(newSequenceFlowList); Authentication.setAuthenticatedUserId(loginUser.getUsername()); taskService.addComment(task.getId(), task.getProcessInstanceId(), "撤回"); Map<String,Object> currentVariables = new HashMap<String,Object>(); currentVariables.put("applier", loginUser.getUsername()); //完成任務 taskService.complete(task.getId(),currentVariables); //恢復原方向 flowNode.setOutgoingFlows(oriSequenceFlows); }