Merge remote-tracking branch 'origin/dev_2.1.0' into dev_2.1.0

dev_2.1.0
xueqingkun 1 year ago
commit b25502f4e5

@ -28,7 +28,9 @@ public class GraphNebulaController {
@ApiOperation("查询图谱") @ApiOperation("查询图谱")
@GetMapping("queryGraph") @GetMapping("queryGraph")
public GraphVO queryGraph(String processId, Integer level) { public GraphVO queryGraph(String processId, Integer level) {
return graphNebulaService.queryGraph(processId, level); GraphVO graphVO = graphNebulaService.queryGraph(processId, level);
graphNebulaService.buildLegend(graphVO);
return graphVO;
} }

@ -1,41 +1,41 @@
package com.supervision.enums; package com.supervision.enums;
public enum TagEnum { public enum TagEnum {
medical_rec("病例", 1, "#2F7CFF"), medical_rec("病例", 1, "#2F7CFF", "病历", null),
process_medical("电子病历", 2, "#55CBAD"), process_medical("电子病历", 2, "#55CBAD", "电子病历", medical_rec),
self_desc("主诉", 3, "#55CBAD"), self_desc("主诉", 3, "#55CBAD", "电子病历", process_medical),
previous_history("既往病史", 3, "#55CBAD"), previous_history("既往病史", 3, "#55CBAD", "电子病历", process_medical),
illness_history("现病史", 3, "#55CBAD"), illness_history("现病史", 3, "#55CBAD", "电子病历", process_medical),
personal_history("个人史", 3, "#55CBAD"), personal_history("个人史", 3, "#55CBAD", "电子病历", process_medical),
allergy_history("过敏史", 3, "#55CBAD"), allergy_history("过敏史", 3, "#55CBAD", "电子病历", process_medical),
family_history("家族史", 3, "#55CBAD"), family_history("家族史", 3, "#55CBAD", "电子病历", process_medical),
marriage_child_history("婚育史", 3, "#55CBAD"), marriage_child_history("婚育史", 3, "#55CBAD", "电子病历", process_medical),
operation_history("手术史", 3, "#55CBAD"), operation_history("手术史", 3, "#55CBAD", "电子病历", process_medical),
symptoms("症状", 2, "#55CBAD"), symptoms("症状", 2, "#55CBAD", "电子病历", process_medical),
patient("患者信息", 2, "#55CBAD"), patient("患者信息", 2, "#55CBAD", "电子病历", process_medical),
physical("体格检查", 2, "#8D8BFF"), physical("体格检查", 2, "#8D8BFF", "体格检查", medical_rec),
physical_result("体格检查结果", 3, "#8D8BFF"), physical_result("体格检查结果", 3, "#8D8BFF", "体格检查", physical),
ancillary("辅助检查", 2, "#4E8CFF"), ancillary("辅助检查", 2, "#4E8CFF", "辅助检查", medical_rec),
ancillary_result("辅助检查结果", 3, "#4E8CFF"), ancillary_result("辅助检查结果", 3, "#4E8CFF", "辅助检查", ancillary),
treatment_plan("处置计划", 2, "#2BCCFF"), treatment_plan("处置计划", 2, "#2BCCFF", "处置计划", medical_rec),
diagnosis("诊断", 2, "#FF6667"); diagnosis("诊断", 2, "#FF6667", "诊断结果", medical_rec);
private final String type; private final String type;
@ -43,10 +43,19 @@ public enum TagEnum {
private final String colour; private final String colour;
TagEnum(String type, Integer level, String colour) { /**
*
*/
private final String legendType;
private final TagEnum parentTag;
TagEnum(String type, Integer level, String colour, String legendType, TagEnum parentTag) {
this.type = type; this.type = type;
this.level = level; this.level = level;
this.colour = colour; this.colour = colour;
this.legendType = legendType;
this.parentTag = parentTag;
} }
@ -61,4 +70,12 @@ public enum TagEnum {
public String getColour() { public String getColour() {
return colour; return colour;
} }
public String getLegendType() {
return legendType;
}
public TagEnum getParentTag() {
return parentTag;
}
} }

@ -11,6 +11,11 @@ public interface GraphNebulaService {
GraphVO queryGraph(String processId, Integer level); GraphVO queryGraph(String processId, Integer level);
/**
*
*/
void buildLegend(GraphVO graphVO);
List<TreeNodeVO> queryTreeGraph(String processId, Integer level); List<TreeNodeVO> queryTreeGraph(String processId, Integer level);
} }

@ -16,10 +16,7 @@ import com.supervision.exception.BusinessException;
import com.supervision.model.Process; import com.supervision.model.Process;
import com.supervision.model.*; import com.supervision.model.*;
import com.supervision.service.*; import com.supervision.service.*;
import com.supervision.vo.EdgeVO; import com.supervision.vo.*;
import com.supervision.vo.GraphVO;
import com.supervision.vo.NodeVO;
import com.supervision.vo.TreeNodeVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nebula.contrib.ngbatis.models.data.NgEdge; import org.nebula.contrib.ngbatis.models.data.NgEdge;
@ -102,14 +99,14 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
processMedicalVertex.setNodeValue("病历(" + DateUtil.format(processMedical.getCreateTime(), "yyyy-MM-dd") + ")"); processMedicalVertex.setNodeValue("病历(" + DateUtil.format(processMedical.getCreateTime(), "yyyy-MM-dd") + ")");
processMedicalDao.insert(processMedicalVertex); processMedicalDao.insert(processMedicalVertex);
medicalRecDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), processMedicalVertex); medicalRecDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("电子病历"), processMedicalVertex);
// 创建主诉节点 // 创建主诉节点
if (StrUtil.isNotBlank(processMedical.getPatientSelfDesc())) { if (StrUtil.isNotBlank(processMedical.getPatientSelfDesc())) {
SelfDescVertex selfDescVertex = new SelfDescVertex(); SelfDescVertex selfDescVertex = new SelfDescVertex();
selfDescVertex.setNodeValue(processMedical.getPatientSelfDesc()); selfDescVertex.setNodeValue(processMedical.getPatientSelfDesc());
selfDescDao.insert(selfDescVertex); selfDescDao.insert(selfDescVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), selfDescVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("主诉"), selfDescVertex);
} }
// 创建现病史节点 // 创建现病史节点
if (StrUtil.isNotBlank(processMedical.getIllnessHistory())) { if (StrUtil.isNotBlank(processMedical.getIllnessHistory())) {
@ -117,7 +114,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
illnessHistoryVertex.setNodeValue(processMedical.getIllnessHistory()); illnessHistoryVertex.setNodeValue(processMedical.getIllnessHistory());
illnessHistoryDao.insert(illnessHistoryVertex); illnessHistoryDao.insert(illnessHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), illnessHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("现病史"), illnessHistoryVertex);
} }
// 创建个人史节点 // 创建个人史节点
if (StrUtil.isNotBlank(processMedical.getPersonalHistory())) { if (StrUtil.isNotBlank(processMedical.getPersonalHistory())) {
@ -125,7 +122,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
personalHistoryVertex.setNodeValue(processMedical.getPersonalHistory()); personalHistoryVertex.setNodeValue(processMedical.getPersonalHistory());
personalHistoryDao.insert(personalHistoryVertex); personalHistoryDao.insert(personalHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), personalHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("个人史"), personalHistoryVertex);
} }
// 创建过敏史节点 // 创建过敏史节点
if (ObjectUtil.isNotEmpty(processMedical.getAllergyHistoryFlag()) && 1 == processMedical.getAllergyHistoryFlag() && StrUtil.isNotBlank(processMedical.getAllergyHistory())) { if (ObjectUtil.isNotEmpty(processMedical.getAllergyHistoryFlag()) && 1 == processMedical.getAllergyHistoryFlag() && StrUtil.isNotBlank(processMedical.getAllergyHistory())) {
@ -133,7 +130,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
allergyHistoryVertex.setNodeValue(processMedical.getAllergyHistory()); allergyHistoryVertex.setNodeValue(processMedical.getAllergyHistory());
allergyHistoryDao.insert(allergyHistoryVertex); allergyHistoryDao.insert(allergyHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), allergyHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("过敏史"), allergyHistoryVertex);
} }
// 创建既往史节点 // 创建既往史节点
if (ObjectUtil.isNotEmpty(processMedical.getPreviousHistoryFlag()) && 1 == processMedical.getPreviousHistoryFlag() && StrUtil.isNotBlank(processMedical.getPreviousHistory())) { if (ObjectUtil.isNotEmpty(processMedical.getPreviousHistoryFlag()) && 1 == processMedical.getPreviousHistoryFlag() && StrUtil.isNotBlank(processMedical.getPreviousHistory())) {
@ -141,7 +138,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
previousHistoryVertex.setNodeValue(processMedical.getPreviousHistory()); previousHistoryVertex.setNodeValue(processMedical.getPreviousHistory());
previousHistoryDao.insert(previousHistoryVertex); previousHistoryDao.insert(previousHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), previousHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("既往史"), previousHistoryVertex);
} }
// 创建家族史节点 // 创建家族史节点
if (ObjectUtil.isNotEmpty(processMedical.getFamilyHistoryFlag()) && 1 == processMedical.getFamilyHistoryFlag() && StrUtil.isNotBlank(processMedical.getFamilyHistory())) { if (ObjectUtil.isNotEmpty(processMedical.getFamilyHistoryFlag()) && 1 == processMedical.getFamilyHistoryFlag() && StrUtil.isNotBlank(processMedical.getFamilyHistory())) {
@ -149,7 +146,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
familyHistoryVertex.setNodeValue(processMedical.getFamilyHistory()); familyHistoryVertex.setNodeValue(processMedical.getFamilyHistory());
familyHistoryDao.insert(familyHistoryVertex); familyHistoryDao.insert(familyHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), familyHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("家族史"), familyHistoryVertex);
} }
// 创建手术史节点 // 创建手术史节点
if (ObjectUtil.isNotEmpty(processMedical.getOperationHistory()) && 1 == processMedical.getOperationHistoryFlag() && StrUtil.isNotBlank(processMedical.getOperationHistory())) { if (ObjectUtil.isNotEmpty(processMedical.getOperationHistory()) && 1 == processMedical.getOperationHistoryFlag() && StrUtil.isNotBlank(processMedical.getOperationHistory())) {
@ -157,7 +154,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
operationHistoryVertex.setNodeValue(processMedical.getOperationHistory()); operationHistoryVertex.setNodeValue(processMedical.getOperationHistory());
operationHistoryDao.insert(operationHistoryVertex); operationHistoryDao.insert(operationHistoryVertex);
// 保存节点之间的关系 // 保存节点之间的关系
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), operationHistoryVertex); processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("手术史"), operationHistoryVertex);
} }
@ -175,7 +172,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
PhysicalVertex physicalVertex = new PhysicalVertex(); PhysicalVertex physicalVertex = new PhysicalVertex();
physicalVertex.setNodeValue(tool.getToolName() + (location != null ? ("-" + location.getLocationName()) : "")); physicalVertex.setNodeValue(tool.getToolName() + (location != null ? ("-" + location.getLocationName()) : ""));
physicalDao.insert(physicalVertex); physicalDao.insert(physicalVertex);
processMedicalDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), physicalVertex); processMedicalDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("体格检查"), physicalVertex);
// 获取查询结果,增加到结果节点中 // 获取查询结果,增加到结果节点中
PhysicalResultVertex physicalResultVertex = new PhysicalResultVertex(); PhysicalResultVertex physicalResultVertex = new PhysicalResultVertex();
physicalResultVertex.setNodeValue(physicalRecord.getResult()); physicalResultVertex.setNodeValue(physicalRecord.getResult());
@ -198,7 +195,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
ancillaryVertex.setNodeValue(configAncillaryItem.getItemName()); ancillaryVertex.setNodeValue(configAncillaryItem.getItemName());
ancillaryDao.insert(ancillaryVertex); ancillaryDao.insert(ancillaryVertex);
// 保存病历和辅助检查连线 // 保存病历和辅助检查连线
medicalRecDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), ancillaryVertex); medicalRecDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("辅助检查"), ancillaryVertex);
// 结果节点 // 结果节点
AncillaryResultVertex ancillaryResultVertex = new AncillaryResultVertex(); AncillaryResultVertex ancillaryResultVertex = new AncillaryResultVertex();
ancillaryResultVertex.setNodeValue(diagnosisAncillaryRecord.getResult()); ancillaryResultVertex.setNodeValue(diagnosisAncillaryRecord.getResult());
@ -333,6 +330,24 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
return new GraphVO(nodeList, edgeList); return new GraphVO(nodeList, edgeList);
} }
@Override
public void buildLegend(GraphVO graphVO) {
// 构建图例
Map<String, String> legendMap = Arrays.stream(TagEnum.values()).collect(Collectors.toMap(TagEnum::getColour, TagEnum::getLegendType, (k1, k2) -> k1));
Map<String, List<NodeVO>> nodeGroupByColourMap = graphVO.getNodes().stream().collect(Collectors.groupingBy(NodeVO::getNodeColour));
List<GraphLegendVO> graphLegendList = new ArrayList<>();
for (Map.Entry<String, List<NodeVO>> entry : nodeGroupByColourMap.entrySet()) {
String colour = entry.getKey();
GraphLegendVO graphLegendVO = new GraphLegendVO();
graphLegendVO.setColour(colour);
graphLegendVO.setLegendType(legendMap.get(colour));
graphLegendVO.setId(entry.getValue().stream().map(NodeVO::getId).collect(Collectors.toSet()));
graphLegendList.add(graphLegendVO);
}
graphVO.setLegendList(graphLegendList);
}
@Override @Override
public List<TreeNodeVO> queryTreeGraph(String processId, Integer level) { public List<TreeNodeVO> queryTreeGraph(String processId, Integer level) {
GraphVO graphVO = queryGraph(processId, level); GraphVO graphVO = queryGraph(processId, level);
@ -374,15 +389,17 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
} }
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的节点类型,找到这个节点下面应该挂的节点
Set<String> childNodeTypeSet = Arrays.stream(TagEnum.values()).filter(e -> preNode.getNodeType().equals(Optional.ofNullable(e.getParentTag()).orElse(TagEnum.medical_rec).name())).map(TagEnum::name).collect(Collectors.toSet());
// 通过preNode的ID找到所有的子节点 // 通过preNode的ID找到所有的子节点
List<TreeNodeVO> childNode = new ArrayList<>(); List<TreeNodeVO> childNode = new ArrayList<>();
for (EdgeVO edgeVO : edgeList) { for (EdgeVO edgeVO : edgeList) {
if (StrUtil.equals(edgeVO.getSource(), preNode.getId())) { if (StrUtil.equals(edgeVO.getSource(), preNode.getId())) {
TreeNodeVO treeNodeVO = treeNodeMap.get(edgeVO.getTarget()); TreeNodeVO treeNodeVO = treeNodeMap.get(edgeVO.getTarget());
if (ObjectUtil.isNotEmpty(treeNodeVO)) { if (ObjectUtil.isNotEmpty(treeNodeVO) && childNodeTypeSet.contains(treeNodeVO.getNodeType())) {
childNode.add(treeNodeVO); childNode.add(treeNodeVO);
} }
;
} }
} }
preNode.setChildren(childNode); preNode.setChildren(childNode);

@ -0,0 +1,15 @@
package com.supervision.vo;
import lombok.Data;
import java.util.Set;
@Data
public class GraphLegendVO {
private String colour;
private String legendType;
private Set<String> id;
}

@ -19,4 +19,14 @@ public class GraphVO {
@ApiModelProperty("关系") @ApiModelProperty("关系")
private List<EdgeVO> edges; private List<EdgeVO> edges;
@ApiModelProperty("图例的List")
private List<GraphLegendVO> legendList;
private String graphTree;
public GraphVO(List<NodeVO> nodes, List<EdgeVO> edges) {
this.nodes = nodes;
this.edges = edges;
}
} }

@ -16,16 +16,22 @@ public class TreeNodeVO {
private String id; private String id;
@ApiModelProperty("图谱ID") @ApiModelProperty("图谱ID")
private String graphId; private String graphId;
@ApiModelProperty("节点值") @ApiModelProperty("节点值")
private String nodeValue; private String nodeValue;
@ApiModelProperty("节点颜色") @ApiModelProperty("节点颜色")
private String nodeColour; private String nodeColour;
@ApiModelProperty("节点级别") @ApiModelProperty("节点级别")
private Integer nodeLevel; private Integer nodeLevel;
@ApiModelProperty("节点类型") @ApiModelProperty("节点类型")
private String nodeType; private String nodeType;
@ApiModelProperty("节点描述") @ApiModelProperty("节点描述")
private String nodeDesc; private String nodeDesc;
@ApiModelProperty("节点的属性列表") @ApiModelProperty("节点的属性列表")
private Map<String, Object> params = new LinkedHashMap<>(); private Map<String, Object> params = new LinkedHashMap<>();

Loading…
Cancel
Save