由于项目中有获取当前节点的下一个任务节点的信息这个需求,主要思路如下:
- 根据传入的任务获取流程定义信息(因为获取流程图里的所有节点)
- 获取当前任务的activityId(为了得到任务的所在节点)
- 获取当前节点的出线
- 判断出线的条线,如果出线只有一条,则直接取出线所指向的节点
- 如果出线有多条,说明有分支,需要判断满足哪个分支的条件,再取得分支对应的节点
- 取出节点后需要判断是否为网关节点,如果是网关节点,则需要重复步骤5
- 如果节点为任务节点,则返回
直接上代码吧
/** * 获取当前任务节点的下一个任务节点 * * @param task 当前任务节点 * @return 下个任务节点 * @throws Exception */ public static FlowElement getNextUserFlowElement(org.activiti.api.task.model.Task task) throws Exception { // 取得已提交的任务 HistoricTaskInstance historicTaskInstance = activitiUtil.historyService.createHistoricTaskInstanceQuery() .taskId(task.getId()).singleResult(); // 获得流程定义 ProcessDefinition processDefinition = activitiUtil.repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId()); //获得当前流程的活动ID ExecutionQuery executionQuery = activitiUtil.runtimeService.createExecutionQuery(); Execution execution = executionQuery.executionId(historicTaskInstance.getExecutionId()).singleResult(); String activityId = execution.getActivityId(); UserTask userTask = null; while (true) { //根据活动节点获取当前的组件信息 FlowNode flowNode = getFlowNode(processDefinition.getId(), activityId); //获取该节点之后的流向 List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows(); // 获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点 if (sequenceFlowListOutGoing.size() > 1) { // 如果有1条以上的出线,表示有分支,需要判断分支的条件才能知道走哪个分支 // 遍历节点的出线得到下个activityId activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), sequenceFlowListOutGoing); } else if (sequenceFlowListOutGoing.size() == 1) { // 只有1条出线,直接取得下个节点 SequenceFlow sequenceFlow = sequenceFlowListOutGoing.get(0); // 下个节点 FlowElement flowElement = sequenceFlow.getTargetFlowElement(); if (flowElement instanceof UserTask) { // 下个节点为UserTask时 userTask = (UserTask) flowElement; System.out.println("下个任务为:" + userTask.getName()); return userTask; } else if (flowElement instanceof ExclusiveGateway) { // 下个节点为排它网关时 ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement; List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows(); // 遍历网关的出线得到下个activityId activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), outgoingFlows); } } else { // 没有出线,则表明是结束节点 return null; } } }
配合代码里的注释应该不难理解整个过程,完整代码可以参照我的github地址
https://github.com/zhoupeng20188/activitispringboot/blob/master/src/main/java/com/zp/activitispringboot/utils/ActivitiUtil.java