Activiti 回退任意节点

3,361 阅读1分钟

这是一个能够直接使用的方法可能之后会用到记录下

参数:
taskId:流程id
destTaskKey:目标节点taskName是由流程图中节点的taskName定义的

使用到的activiti服务:
historyService
runtimeService
taskService

    /**
     * @param taskId act_ru_task.id
     * @param destTaskkey 要回退到的目标taskName
     */
    private void rollbackMoreLeader(String taskId, String destTaskkey) {
        try {
            Map<String, Object> variables;
            HistoricTaskInstance currTask = historyService
                    .createHistoricTaskInstanceQuery()
                    .taskId(taskId).singleResult();
            if (currTask != null) {
                ProcessInstance instance = runtimeService.createProcessInstanceQuery()
                        .processInstanceId(currTask.getProcessInstanceId()).singleResult();
                if (instance == null) {
                    System.out.println("流程结束!");

                } else {
                    variables = instance.getProcessVariables();
                    ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                            .getDeployedProcessDefinition(currTask.getProcessDefinitionId());
                    if (definition == null) {
                        System.out.println("流程定义未找到!");
                    } else {
                        //获取当前节点
                        ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
                                .findActivity(currTask.getTaskDefinitionKey());
                        System.out.println("currentActivity: " + currActivity);

                        //取得上一个节点的activity
                        List<PvmTransition> nextTransitionList = currActivity.getIncomingTransitions();

                        //清空当前activity的出口
                        List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();

                        //新建节点连线关系集合
                        List<PvmTransition> pvmTransitionList = currActivity.getOutgoingTransitions();

                        for (PvmTransition pvmTransition : pvmTransitionList) {
                            oriPvmTransitionList.add(pvmTransition);
                        }
                        pvmTransitionList.clear();

                        //建立新出口
                        List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
                        for (PvmTransition nextTransition : nextTransitionList) {
                            PvmActivity nextActivity = nextTransition.getSource();
                            System.out.println("nextActivity: " + nextActivity);
                            System.out.println("ProcessDefinition" + nextActivity.getProcessDefinition());
                            if (nextActivity.toString().contains(destTaskkey)) {
                                ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
                                        .findActivity(destTaskkey);
                                TransitionImpl newTranstion = currActivity.createOutgoingTransition();
                                newTranstion.setDestination(nextActivityImpl);
                                newTransitions.add(newTranstion);
                            } else {
                                continue;
                            }

                        }

                        //完成任务
                        List<Task> tasks = taskService.createTaskQuery()
                                .processInstanceId(instance.getId())
                                .taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
                        for (Task task : tasks) {
                            taskService.complete(task.getId(), variables);
                            historyService.deleteHistoricTaskInstance(task.getId());
                        }

                        //恢复方向
                        for (TransitionImpl transitionImpl : newTransitions) {
                            currActivity.getOutgoingTransitions().remove(transitionImpl);
                        }

                        for (PvmTransition pvmTransition : oriPvmTransitionList) {
                            pvmTransitionList.add(pvmTransition);
                        }

                        System.out.println("撤回到" + destTaskkey);
                    }
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
        }
    }