Activiti框架(7)——流程撤回

Activiti框架常用-流程节点撤回

在工作中会用到Activiti框架来走流程,会有一些信息填写异常等状况,我们可以将节点撤回到指定节点。

创建测试类,引入测试用到的配置文件

    private final String key = "groupTaskDelegate";//key值
    private final int version = 1;//版本号

    //Service接口的父类,可以直接获取下边的Service
    private ProcessEngine processEngine;
    //Activiti的七大Service类
    private RepositoryService repositoryService;
    private RuntimeService runtimeService;
    private HistoryService historyService;
    private ManagementService managementService;
    private TaskService taskService;
    private IdentityService identityService;
    private FormService formService;

    @Before
    public void init() {
    
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-activiti.xml");
        processEngine = ProcessEngines.getDefaultProcessEngine();
        repositoryService = (RepositoryService) context.getBean("repositoryService");
        runtimeService = (RuntimeService) context.getBean("runtimeService");
        historyService = (HistoryService) context.getBean("historyService");
        managementService = (ManagementService) context.getBean("managementService");
        identityService = (IdentityService) context.getBean("identityService");
        formService = (FormService) context.getBean("formService");
        taskService = processEngine.getTaskService();
        System.out.println("========== 初始化完成 ==========");
    }

撤回到指定节点

	@Test
    public void test(){
    
    
        rollBackToAssignWoekFlow("5001","usertask2");
    }

    /**
     * 撤回
     * @param processInstanceId
     * @param destTaskkey
     */
    public void rollBackToAssignWoekFlow(String processInstanceId,String destTaskkey){
    
    
        // 取得当前任务.当前任务节点
        destTaskkey ="usertask2";
       // HistoricTaskInstance currTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
        Map<String, Object> variables;
        ExecutionEntity entity = (ExecutionEntity) runtimeService.createExecutionQuery().executionId(processInstanceId).singleResult();
        ProcessDefinitionEntity definition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService)
          .getDeployedProcessDefinition(entity.getProcessDefinitionId());
        variables = entity.getProcessVariables();
        //当前活动环节
        ActivityImpl currActivityImpl = definition.findActivity(entity.getActivityId());
        //目标活动节点
        ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition).findActivity(destTaskkey);
        if(currActivityImpl !=null){
    
    
            //所有的出口集合
            List<PvmTransition> pvmTransitions = currActivityImpl.getOutgoingTransitions();
            List<PvmTransition> oriPvmTransitions = new ArrayList<PvmTransition>();
            for(PvmTransition transition : pvmTransitions){
    
    
                oriPvmTransitions.add(transition);
            }
            //清除所有出口
            pvmTransitions.clear();
            //建立新的出口
            List<TransitionImpl> transitionImpls = new ArrayList<TransitionImpl>();
            TransitionImpl tImpl = currActivityImpl.createOutgoingTransition();
            tImpl.setDestination(nextActivityImpl);
            transitionImpls.add(tImpl);

            List<Task> list = taskService.createTaskQuery().processInstanceId(entity.getProcessInstanceId())
                    .taskDefinitionKey(entity.getActivityId()).list();
            for(Task task:list){
    
    
                taskService.complete(task.getId(), variables);
                historyService.deleteHistoricTaskInstance(task.getId());
            }

            for(TransitionImpl transitionImpl:transitionImpls){
    
    
                currActivityImpl.getOutgoingTransitions().remove(transitionImpl);
            }

            for(PvmTransition pvmTransition:oriPvmTransitions){
    
    
                pvmTransitions.add(pvmTransition);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_28249857/article/details/106210214
今日推荐