Activiti7获取当前节点的下一个UserTask节点信息

  • 2
  • 浏览量:7,660 次
  • A+
所属分类:工作流引擎

由于项目中有获取当前节点的下一个任务节点的信息这个需求,主要思路如下:

  1. 根据传入的任务获取流程定义信息(因为获取流程图里的所有节点)
  2. 获取当前任务的activityId(为了得到任务的所在节点)
  3. 获取当前节点出线
  4. 判断出线的条线,如果出线只有一条,则直接取出线所指向的节点
  5. 如果出线有多条,说明有分支,需要判断满足哪个分支的条件,再取得分支对应的节点
  6. 取出节点后需要判断是否为网关节点,如果是网关节点,则需要重复步骤5
  7. 如果节点为任务节点,则返回

直接上代码吧

  1. /**
  2. * 获取当前任务节点的下一个任务节点
  3. *
  4. * @param task 当前任务节点
  5. * @return 下个任务节点
  6. * @throws Exception
  7. */
  8. public static FlowElement getNextUserFlowElement(org.activiti.api.task.model.Task task) throws Exception {
  9. // 取得已提交的任务
  10. HistoricTaskInstance historicTaskInstance = activitiUtil.historyService.createHistoricTaskInstanceQuery()
  11. .taskId(task.getId()).singleResult();
  12. // 获得流程定义
  13. ProcessDefinition processDefinition = activitiUtil.repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
  14. //获得当前流程的活动ID
  15. ExecutionQuery executionQuery = activitiUtil.runtimeService.createExecutionQuery();
  16. Execution execution = executionQuery.executionId(historicTaskInstance.getExecutionId()).singleResult();
  17. String activityId = execution.getActivityId();
  18. UserTask userTask = null;
  19. while (true) {
  20. //根据活动节点获取当前的组件信息
  21. FlowNode flowNode = getFlowNode(processDefinition.getId(), activityId);
  22. //获取该节点之后的流向
  23. List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows();
  24. // 获取的下个节点不一定是userTask的任务节点,所以要判断是否是任务节点
  25. if (sequenceFlowListOutGoing.size() > 1) {
  26. // 如果有1条以上的出线,表示有分支,需要判断分支的条件才能知道走哪个分支
  27. // 遍历节点的出线得到下个activityId
  28. activityId = getNextActivityId(execution.getId(),
  29. task.getProcessInstanceId(), sequenceFlowListOutGoing);
  30. } else if (sequenceFlowListOutGoing.size() == 1) {
  31. // 只有1条出线,直接取得下个节点
  32. SequenceFlow sequenceFlow = sequenceFlowListOutGoing.get(0);
  33. // 下个节点
  34. FlowElement flowElement = sequenceFlow.getTargetFlowElement();
  35. if (flowElement instanceof UserTask) {
  36. // 下个节点为UserTask时
  37. userTask = (UserTask) flowElement;
  38. System.out.println("下个任务为:" + userTask.getName());
  39. return userTask;
  40. } else if (flowElement instanceof ExclusiveGateway) {
  41. // 下个节点为排它网关时
  42. ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement;
  43. List<SequenceFlow> outgoingFlows = exclusiveGateway.getOutgoingFlows();
  44. // 遍历网关的出线得到下个activityId
  45. activityId = getNextActivityId(execution.getId(), task.getProcessInstanceId(), outgoingFlows);
  46. }
  47. } else {
  48. // 没有出线,则表明是结束节点
  49. return null;
  50. }
  51. }
  52. }
/**
     * 获取当前任务节点的下一个任务节点
     *
     * @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