新项目中存在一个这样的业务逻辑,工作流节点任务的任意跳转。比如说一条流程A-B-C,现在A任务执行完了,按道理来说到B任务了,可是我不想经过B了,直接跳C节点任务执行。自己对工作流这块也不是很熟悉,在网上查阅了一些资料,修改了一下,也就实现了。现在记录分享一下。

先附上参考链接吧:https://www.jianshu.com/p/3e3087b2213b  (还有一篇参考链接,恕我实在忘记了)

 

复制代码

/**
 * 跳转至指定活动节点
 * @param processId  流程Id
 * @param targetTaskDefinitionKey  目标节点任务的id */public void jump(String processId,String targetTaskDefinitionKey){    //获取当前节点任务
    TaskEntity currentTask = (TaskEntity) taskService.createTaskQuery()
            .processInstanceId(processId).singleResult();
    jump(processId,currentTask,targetTaskDefinitionKey);
}    
    
/**
 * @param currentTaskEntity 当前任务节点
 * @param targetTaskDefinitionKey  目标任务节点(在模型定义里面的节点任务Id) */private void jump(String processInstanceId,final TaskEntity currentTaskEntity, String targetTaskDefinitionKey){
    ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
    TaskEntity taskEntity=(TaskEntity) taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();  
   
    //获取流程定义
    ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId());  
    //当前正在执行任务的节点  ActivityImpl currentActivity = (ActivityImpl)processDefinitionEntity.findActivity(processInstance.getActivityId());//跳转的目标节点  ActivityImpl targetActivity = (ActivityImpl) processDefinitionEntity.findActivity(targetTaskDefinitionKey); 
          
((RuntimeServiceImpl)runtimeService).getCommandExecutor()
        .execute(new Command<java.lang.Void>() {            public Void execute(CommandContext commandContext) {
                ExecutionEntity executionEntity = (ExecutionEntity) runtimeService
                         .createExecutionQuery().executionId(currentTaskEntity.getExecutionId()).singleResult();
                executionEntity.setActivity(currentActivity);
                executionEntity.setEventSource(currentActivity);                //根据executionId 获取Task
                Iterator<TaskEntity> localIterator = Context.getCommandContext().getTaskEntityManager().findTasksByExecutionId(taskEntity.getExecutionId()).iterator();                while (localIterator.hasNext()) {
                    TaskEntity taskEntity = (TaskEntity) localIterator.next();                    //删除任务
                    Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "跳转节点", true);
                }
                executionEntity.executeActivity(targetActivity);  //设置任务 执行对象                return null;
            }
        });
}

复制代码

 

说明: (1)阅读了网上的资料,在processEngine初始化的时候,也会初始化CommandExcutor对象,execute方法中执行了真正的命令,将流程的当前节点任务,替换成目标节点任务对象。   

    (2) Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "跳转节点", true);这里如果传值是false的话,那么就会保留原有的历史任务信息,比如说A-B-C,A完成之后,正常走是到B,倘若我们A走完,直接跳到C的话,那么C做完之后,查询该流程的全过程节点任务就是A,B,C三条数据,如果写true,那么查询出来的数据就是A,B。所以这里根据场景决定传值吧。

 

最后说下自己的想法吧,感觉工作流还是蛮强大的,帮助解决了不少问题,如果对bpmn理解到位了,也能快速使用。自己也还在探索阶段,一起加油吧。

 转自:https://www.cnblogs.com/wei-cy/p/13020865.html