|
|
|
@ -16,10 +16,7 @@ import com.supervision.exception.BusinessException;
|
|
|
|
|
import com.supervision.model.Process;
|
|
|
|
|
import com.supervision.model.*;
|
|
|
|
|
import com.supervision.service.*;
|
|
|
|
|
import com.supervision.vo.EdgeVO;
|
|
|
|
|
import com.supervision.vo.GraphVO;
|
|
|
|
|
import com.supervision.vo.NodeVO;
|
|
|
|
|
import com.supervision.vo.TreeNodeVO;
|
|
|
|
|
import com.supervision.vo.*;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
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") + ")");
|
|
|
|
|
processMedicalDao.insert(processMedicalVertex);
|
|
|
|
|
|
|
|
|
|
medicalRecDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), processMedicalVertex);
|
|
|
|
|
medicalRecDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("电子病历"), processMedicalVertex);
|
|
|
|
|
// 创建主诉节点
|
|
|
|
|
if (StrUtil.isNotBlank(processMedical.getPatientSelfDesc())) {
|
|
|
|
|
SelfDescVertex selfDescVertex = new SelfDescVertex();
|
|
|
|
|
selfDescVertex.setNodeValue(processMedical.getPatientSelfDesc());
|
|
|
|
|
selfDescDao.insert(selfDescVertex);
|
|
|
|
|
// 保存节点之间的关系
|
|
|
|
|
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), selfDescVertex);
|
|
|
|
|
processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("主诉"), selfDescVertex);
|
|
|
|
|
}
|
|
|
|
|
// 创建现病史节点
|
|
|
|
|
if (StrUtil.isNotBlank(processMedical.getIllnessHistory())) {
|
|
|
|
@ -117,7 +114,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
illnessHistoryVertex.setNodeValue(processMedical.getIllnessHistory());
|
|
|
|
|
illnessHistoryDao.insert(illnessHistoryVertex);
|
|
|
|
|
// 保存节点之间的关系
|
|
|
|
|
processMedicalDao.insertEdge(processMedicalVertex, new NoPropertyEdge(), illnessHistoryVertex);
|
|
|
|
|
processMedicalDao.insertEdge(processMedicalVertex, new SinglePropertyEdge("现病史"), illnessHistoryVertex);
|
|
|
|
|
}
|
|
|
|
|
// 创建个人史节点
|
|
|
|
|
if (StrUtil.isNotBlank(processMedical.getPersonalHistory())) {
|
|
|
|
@ -125,7 +122,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
personalHistoryVertex.setNodeValue(processMedical.getPersonalHistory());
|
|
|
|
|
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())) {
|
|
|
|
@ -133,7 +130,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
allergyHistoryVertex.setNodeValue(processMedical.getAllergyHistory());
|
|
|
|
|
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())) {
|
|
|
|
@ -141,7 +138,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
previousHistoryVertex.setNodeValue(processMedical.getPreviousHistory());
|
|
|
|
|
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())) {
|
|
|
|
@ -149,7 +146,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
familyHistoryVertex.setNodeValue(processMedical.getFamilyHistory());
|
|
|
|
|
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())) {
|
|
|
|
@ -157,7 +154,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
operationHistoryVertex.setNodeValue(processMedical.getOperationHistory());
|
|
|
|
|
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.setNodeValue(tool.getToolName() + (location != null ? ("-" + location.getLocationName()) : ""));
|
|
|
|
|
physicalDao.insert(physicalVertex);
|
|
|
|
|
processMedicalDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), physicalVertex);
|
|
|
|
|
processMedicalDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("体格检查"), physicalVertex);
|
|
|
|
|
// 获取查询结果,增加到结果节点中
|
|
|
|
|
PhysicalResultVertex physicalResultVertex = new PhysicalResultVertex();
|
|
|
|
|
physicalResultVertex.setNodeValue(physicalRecord.getResult());
|
|
|
|
@ -198,7 +195,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
ancillaryVertex.setNodeValue(configAncillaryItem.getItemName());
|
|
|
|
|
ancillaryDao.insert(ancillaryVertex);
|
|
|
|
|
// 保存病历和辅助检查连线
|
|
|
|
|
medicalRecDao.insertEdge(medicalRecVertex, new NoPropertyEdge(), ancillaryVertex);
|
|
|
|
|
medicalRecDao.insertEdge(medicalRecVertex, new SinglePropertyEdge("辅助检查"), ancillaryVertex);
|
|
|
|
|
// 结果节点
|
|
|
|
|
AncillaryResultVertex ancillaryResultVertex = new AncillaryResultVertex();
|
|
|
|
|
ancillaryResultVertex.setNodeValue(diagnosisAncillaryRecord.getResult());
|
|
|
|
@ -333,6 +330,24 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
|
|
|
|
|
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
|
|
|
|
|
public List<TreeNodeVO> queryTreeGraph(String processId, Integer 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) {
|
|
|
|
|
// 通过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找到所有的子节点
|
|
|
|
|
List<TreeNodeVO> childNode = new ArrayList<>();
|
|
|
|
|
for (EdgeVO edgeVO : edgeList) {
|
|
|
|
|
if (StrUtil.equals(edgeVO.getSource(), preNode.getId())) {
|
|
|
|
|
TreeNodeVO treeNodeVO = treeNodeMap.get(edgeVO.getTarget());
|
|
|
|
|
if (ObjectUtil.isNotEmpty(treeNodeVO)) {
|
|
|
|
|
if (ObjectUtil.isNotEmpty(treeNodeVO) && childNodeTypeSet.contains(treeNodeVO.getNodeType())) {
|
|
|
|
|
childNode.add(treeNodeVO);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
preNode.setChildren(childNode);
|
|
|
|
|