记一次递归的使用(流程平台)

/**
   * 获取流程节点数据,用于页面图形展示
   *
   * @param param
   * @return
   */
  private ProcessInfoVo getFlowNodeInfo(QueryNodeInfoParam param) {

    // 获取流程实例ID
    String processInstanceId = processHistoryBiz.getLatestProcessInstanceId(param);

    param.setProcessInstanceId(processInstanceId);

    //获取流程图元素信息
    ProcessInfoVo vo = processMethodsFeign.getNodeInfo(param).getData();

    String fJsonData = processHistoryBiz.getFJsonDataByProcessDefinitionId(param.getProcessDefinitionId()).getJsonData();
    JSONArray jsonArray = JSONObject.parseObject(fJsonData).getJSONArray("nodes");
    Map<String, String> nodeClzMap = new HashMap<>();
    Map<String, String> dataSourceIdMap = new HashMap<>();
    Map<String, String> contrastFlagMap = new HashMap<>();
    for (int i = 0; i < jsonArray.size(); i++) {
      String key = jsonArray.getJSONObject(i).getString("id");
      String clazz = jsonArray.getJSONObject(i).getString("clazz");
      String monitorTask = jsonArray.getJSONObject(i).getString("monitorTask");
      String contrastFlag = jsonArray.getJSONObject(i).getString("contrastFlag");
      nodeClzMap.put(key, clazz);
      dataSourceIdMap.put(key, monitorTask);
      contrastFlagMap.put(key, contrastFlag);
    }

    String firstNodeId = vo.getFirstNode().getId();

    for (NodeInfoVo item : vo.getNodes()) {
      item.setClazz(nodeClzMap.get(item.getId()));
      item.setContrastFlag(contrastFlagMap.get(item.getId()));

      //获取数据源
      //DataSourceDO dataSourceDO = dataSourceBiz.queryDataSourceByTaskId(taskId)
      DataSourceDO dataSourceDO = null;
      if (null != (dataSourceIdMap.get(item.getId()))) {
        dataSourceDO = dataSourceBiz.getOne(new QueryWrapper<DataSourceDO>().eq("id", dataSourceIdMap.get(item.getId())));
      }
      if (dataSourceDO == null) {
        continue;
      }

      item.setNodeDataType("service".equals(dataSourceDO.getType()) ? "0" : "1");

      String taskId = item.getTaskId();
      if (StringUtils.isBlank(taskId)) {
        continue;
      }

      item.setClickFlag(true);

      //获取判定标准
      ComplateFlag complateFlag = complateFlagBiz.queryComplateFlagByDataSourceId(dataSourceDO.getId());

      //没有设置判定标准,则查看节点状态
      if (complateFlag == null) {
        continue;
      }

      //获取变量结果
      String resultVariable = dataSourceDO.getResultVariable();
      Object data = processMethodsFeign.getHistoryVariable(taskId, resultVariable).getData();

      int finished = 0;
      int unfinished = 0;
      if ("0".equals(item.getContrastFlag())) {
        if (data instanceof Collection) {
          Map[] resultMaps = JSON.parseObject(JSON.toJSONString(data), Map[].class);
          for (Map visiable : resultMaps) {
            String visiableValue = (String) visiable.get(complateFlag.getField());

            //判断字段值是否符合预设值
            if (complateFlag.getValue().equals(visiableValue)) {
              finished++;
            } else {
              unfinished++;
            }
          }
        } else {
          Map resultMap = JSON.parseObject(JSON.toJSONString(data), Map.class);

          String visiableValue = (String) resultMap.get(complateFlag.getField());

          //判断字段值是否符合预设值
          if (complateFlag.getValue().equals(visiableValue)) {
            finished++;
          } else {
            unfinished++;
          }
        }
      }

      item.setFinished(finished);
      item.setUnfinished(unfinished);

      if (item.getId().equals(firstNodeId)) {
        vo.setFirstNode(item);
      }
    }

    // 解析分离主子流程图
    Map<String, NodeInfoVo> nodesMap = new HashMap<>();
    List<String> startNodeList = new ArrayList<>();
    for (NodeInfoVo nodeInfoVo : vo.getNodes()) {
      if (nodeInfoVo.getId().startsWith("start") || nodeInfoVo.getId().startsWith("signalStart")) {
        startNodeList.add(nodeInfoVo.getId());
      }
      nodesMap.put(nodeInfoVo.getId(), nodeInfoVo);
    }

    List<ProcessInfoVo> voList = new ArrayList<>();
    for (String startNodeId : startNodeList) {
      ProcessInfoVo processInfoVo = new ProcessInfoVo();
      List<NodeInfoVo> nodesList = new ArrayList<>();
      List<EdgesInfoVo> edgesList = new ArrayList<>();
      nodesList.add(nodesMap.get(startNodeId));
      processInfoVo.setNodes(nodesList);
      processInfoVo.setEdges(edgesList);

      processInfoVo = getProcessInfoVo(startNodeId, vo, processInfoVo);

//      NodeInfoVo firstNode = new NodeInfoVo();
//      boolean existFirstNode = false;
//      for(NodeInfoVo o : processInfoVo.getNodes()){
//        if("monitorTask".equals(o.getClazz())){
//          existFirstNode = true;
//          break;
//        }
//      }
//      if(existFirstNode){
//        firstNode = getFirstNode(startNodeId, vo, firstNode);
//      }
//      processInfoVo.setFirstNode(firstNode);

      // 获取首节点,判断紧跟着起点后的节点,若该节点类型为monitorTask,则直接返回,否则返回空对象,此时前端不在初始化查询首节点的数据
      List<EdgesInfoVo> edgeList = nodeToEdgeList(startNodeId, vo.getEdges());
      NodeInfoVo node = edgeToNode(edgeList.get(0), vo.getNodes());
      processInfoVo.setFirstNode("monitorTask".equals(node.getClazz()) ? node : new NodeInfoVo());


      List<NodeInfoVo> nodeInfoVos = processInfoVo.getNodes().stream().distinct().collect(Collectors.toList());
      List<EdgesInfoVo> edgesInfoVos = processInfoVo.getEdges().stream().distinct().collect(Collectors.toList());

      processInfoVo.setNodes(nodeInfoVos);
      processInfoVo.setEdges(edgesInfoVos);
      voList.add(processInfoVo);
    }

    ProcessInfoVo returnVo = new ProcessInfoVo();
    for (ProcessInfoVo processInfoVo : voList) {
      for (NodeInfoVo nodeInfoVo : processInfoVo.getNodes()) {
        if (nodeInfoVo.getId().equals(param.getStartActId())) {
          returnVo = processInfoVo;
        }
      }
    }

    return returnVo;
  }

  private ProcessInfoVo getProcessInfoVo(String nodeId, ProcessInfoVo sumVo, ProcessInfoVo vo) {
    List<EdgesInfoVo> edgeList = nodeToEdgeList(nodeId, sumVo.getEdges());
    if (edgeList.size() == 0) return vo;
    vo.getEdges().addAll(edgeList);
    for (EdgesInfoVo o : edgeList) {
      NodeInfoVo node = edgeToNode(o, sumVo.getNodes());
      vo.getNodes().add(node);
      vo = getProcessInfoVo(node.getId(), sumVo, vo);
    }
    return vo;
  }

  private NodeInfoVo getFirstNode(String startNodeId, ProcessInfoVo sumVo, NodeInfoVo vo) {
    List<EdgesInfoVo> edgeList = nodeToEdgeList(startNodeId, sumVo.getEdges());
    for (EdgesInfoVo edge : edgeList) {
      NodeInfoVo node = edgeToNode(edge, sumVo.getNodes());
      if ("end".equals(node.getClazz())) continue;
      if ("monitorTask".equals(node.getClazz())) {
        vo = node;
        break;
      } else {
        vo = getFirstNode(node.getId(), sumVo, vo);
      }
    }
    return vo;
  }

  private List<EdgesInfoVo> nodeToEdgeList(String nodeId, List<EdgesInfoVo> edgesInfoVos) {
    List<EdgesInfoVo> edgeList = new ArrayList<>();
    for (EdgesInfoVo temp : edgesInfoVos) {
      if (temp.getSource().equals(nodeId)) {
        edgeList.add(temp);
      }
    }
    return edgeList;
  }

  private NodeInfoVo edgeToNode(EdgesInfoVo edge, List<NodeInfoVo> nodeInfoVos) {
    NodeInfoVo node = new NodeInfoVo();
    for (NodeInfoVo temp : nodeInfoVos) {
      if (StringUtils.isNotBlank(edge.getTarget()) && edge.getTarget().equals(temp.getId())) {
        node = temp;
      }
    }
    return node;
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值