新项目中存在一个这样的业务逻辑,工作流节点任务的任意跳转。比如说一条流程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理解到位了,也能快速使用。自己也还在探索阶段,一起加油吧。