优化图谱

dev_2.1.0
liu 1 year ago
parent ebfa898b2a
commit 4379813aaf

@ -27,15 +27,15 @@ public class GraphNebulaController {
@ApiOperation("查询图谱") @ApiOperation("查询图谱")
@GetMapping("queryGraph") @GetMapping("queryGraph")
public GraphVO queryGraph(String processId) { public GraphVO queryGraph(String processId, Integer level) {
return graphNebulaService.queryGraph(processId); return graphNebulaService.queryGraph(processId, level);
} }
@ApiOperation("查询树形结构图") @ApiOperation("查询树形结构图")
@GetMapping("queryTreeGraph") @GetMapping("queryTreeGraph")
public List<TreeNodeVO> queryTreeGraph(String processId) { public List<TreeNodeVO> queryTreeGraph(String processId, Integer level) {
return graphNebulaService.queryTreeGraph(processId); return graphNebulaService.queryTreeGraph(processId, level);
} }

@ -9,8 +9,8 @@ public interface GraphNebulaService {
void creatGraphByNebula(String processId); void creatGraphByNebula(String processId);
GraphVO queryGraph(String processId); GraphVO queryGraph(String processId, Integer level);
List<TreeNodeVO> queryTreeGraph(String processId); List<TreeNodeVO> queryTreeGraph(String processId, Integer level);
} }

@ -7,6 +7,7 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.supervision.dao.*; import com.supervision.dao.*;
import com.supervision.domain.*; import com.supervision.domain.*;
import com.supervision.enums.TagEnum; import com.supervision.enums.TagEnum;
@ -245,7 +246,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
@Override @Override
public GraphVO queryGraph(String processId) { public GraphVO queryGraph(String processId, Integer level) {
Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程")); Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程"));
// 如果图谱ID为空,则创建图谱 // 如果图谱ID为空,则创建图谱
if (StrUtil.isEmpty(process.getGraphId())) { if (StrUtil.isEmpty(process.getGraphId())) {
@ -287,29 +288,43 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
}); });
} }
} }
// 校验级别(根据参数的级别来进行判断)
if (ObjectUtil.isNotEmpty(level)) {
if (level >= nodeVO.getNodeLevel()) {
nodeList.add(nodeVO); nodeList.add(nodeVO);
} }
} else {
nodeList.add(nodeVO);
}
}
// 构建边 // 构建边
List<NgEdge<String>> edges = subgraph.getEdges(); List<NgEdge<String>> edges = subgraph.getEdges();
for (NgEdge<String> edge : edges) { for (NgEdge<String> edge : edges) {
EdgeVO edgeVO = new EdgeVO(); EdgeVO edgeVO = new EdgeVO();
edgeVO.setSource(edge.getSrcID()); edgeVO.setSource(edge.getSrcID());
edgeVO.setTarget(edge.getDstID()); edgeVO.setTarget(edge.getDstID());
Map<String, Object> properties = edge.getProperties(); Map<String, Object> properties = edge.getProperties();
Object nameObject = properties.get("edgeValue"); Object nameObject = properties.get("edgeValue");
if (ObjectUtil.isNotEmpty(nameObject)) { if (ObjectUtil.isNotEmpty(nameObject)) {
edgeVO.setName(String.valueOf(nameObject)); edgeVO.setName(String.valueOf(nameObject));
edgeVO.setLabel(edgeVO.getName());
} }
edgeVO.setParams(properties); edgeVO.setParams(properties);
edgeList.add(edgeVO); edgeList.add(edgeVO);
} }
} }
// 这里,需要遍历,把重点不存在的节点连线给删掉
Set<String> nodeIdSet = nodeList.stream().map(NodeVO::getId).collect(Collectors.toSet());
// 如果指向的节点不存在,那么这个边也不存在
edgeList.removeIf(edgeVO -> !nodeIdSet.contains(edgeVO.getTarget()));
return new GraphVO(nodeList, edgeList); return new GraphVO(nodeList, edgeList);
} }
@Override @Override
public List<TreeNodeVO> queryTreeGraph(String processId) { public List<TreeNodeVO> queryTreeGraph(String processId, Integer level) {
GraphVO graphVO = queryGraph(processId); GraphVO graphVO = queryGraph(processId, level);
List<TreeNodeVO> treeNodeList = graphVO.getNodes().stream().map(node -> BeanUtil.toBean(node, TreeNodeVO.class)).collect(Collectors.toList()); List<TreeNodeVO> treeNodeList = graphVO.getNodes().stream().map(node -> BeanUtil.toBean(node, TreeNodeVO.class)).collect(Collectors.toList());
// 首先找到第一级节点 // 首先找到第一级节点
List<TreeNodeVO> firstNodeList = treeNodeList.stream().filter(node -> node.getNodeLevel() == 1).collect(Collectors.toList()); List<TreeNodeVO> firstNodeList = treeNodeList.stream().filter(node -> node.getNodeLevel() == 1).collect(Collectors.toList());
@ -321,9 +336,25 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
for (TreeNodeVO nodeVO : firstNodeList) { for (TreeNodeVO nodeVO : firstNodeList) {
recursionBuildTree(nodeVO, treeNodeMap, graphVO.getEdges()); recursionBuildTree(nodeVO, treeNodeMap, graphVO.getEdges());
} }
// 为所有节点分配新的唯一ID(前端需要ID字段为唯一ID)
recursionGenerateSingleId(firstNodeList);
return firstNodeList; return firstNodeList;
} }
/**
* ID,IDGraphId
*/
private void recursionGenerateSingleId(List<TreeNodeVO> firstNodeList) {
for (TreeNodeVO treeNodeVO : firstNodeList) {
String uuid = UuidUtils.generateUuid();
treeNodeVO.setGraphId(treeNodeVO.getId());
treeNodeVO.setId(uuid);
if (CollUtil.isNotEmpty(treeNodeVO.getChildren())) {
recursionGenerateSingleId(treeNodeVO.getChildren());
}
}
}
private void recursionBuildTree(TreeNodeVO preNode, Map<String, TreeNodeVO> treeNodeMap, List<EdgeVO> edgeList) { private void recursionBuildTree(TreeNodeVO preNode, Map<String, TreeNodeVO> treeNodeMap, List<EdgeVO> edgeList) {
// 通过preNode的ID找到所有的子节点 // 通过preNode的ID找到所有的子节点
List<TreeNodeVO> childNode = new ArrayList<>(); List<TreeNodeVO> childNode = new ArrayList<>();

@ -16,6 +16,8 @@ public class EdgeVO {
@ApiModelProperty("连线展示的名称,可能为空") @ApiModelProperty("连线展示的名称,可能为空")
private String name; private String name;
@ApiModelProperty("连线展示的名称,=name,前端需要")
private String label;
@ApiModelProperty("连线所拥有的属性") @ApiModelProperty("连线所拥有的属性")
private Map<String, Object> params; private Map<String, Object> params;

@ -12,8 +12,10 @@ import java.util.Map;
@ApiModel @ApiModel
public class TreeNodeVO { public class TreeNodeVO {
@ApiModelProperty("ID") @ApiModelProperty("重新分配的唯一ID")
private String id; private String id;
@ApiModelProperty("图谱ID")
private String graphId;
@ApiModelProperty("节点值") @ApiModelProperty("节点值")
private String nodeValue; private String nodeValue;
@ApiModelProperty("节点颜色") @ApiModelProperty("节点颜色")

Loading…
Cancel
Save