|
@@ -6,6 +6,10 @@ import org.apache.commons.lang3.StringUtils;
|
|
import org.diagbot.entity.node.LIS;
|
|
import org.diagbot.entity.node.LIS;
|
|
import org.diagbot.entity.node.Symptom;
|
|
import org.diagbot.entity.node.Symptom;
|
|
import org.diagbot.mapper.KnowledgeMapper;
|
|
import org.diagbot.mapper.KnowledgeMapper;
|
|
|
|
+import org.diagbot.pub.Ciku;
|
|
|
|
+import org.diagbot.pub.Label;
|
|
|
|
+import org.diagbot.pub.Type;
|
|
|
|
+import org.diagbot.pub.jdbc.MysqlJdbc;
|
|
import org.diagbot.service.KnowledgeService;
|
|
import org.diagbot.service.KnowledgeService;
|
|
import org.diagbot.vo.*;
|
|
import org.diagbot.vo.*;
|
|
import org.diagbot.entity.node.Disease;
|
|
import org.diagbot.entity.node.Disease;
|
|
@@ -24,12 +28,16 @@ import org.springframework.data.domain.Sort;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
|
|
+import java.sql.Connection;
|
|
|
|
+import java.sql.ResultSet;
|
|
|
|
+import java.sql.SQLException;
|
|
|
|
+import java.sql.Statement;
|
|
import java.text.NumberFormat;
|
|
import java.text.NumberFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
-public class KnowledgeServiceImpl implements KnowledgeService {
|
|
|
|
|
|
+public class KnowledgeServiceImpl implements KnowledgeService {
|
|
Logger logger = LoggerFactory.getLogger(KnowledgeServiceImpl.class);
|
|
Logger logger = LoggerFactory.getLogger(KnowledgeServiceImpl.class);
|
|
@Autowired
|
|
@Autowired
|
|
private SymptomRepository symptomRepository;
|
|
private SymptomRepository symptomRepository;
|
|
@@ -47,9 +55,10 @@ public class KnowledgeServiceImpl implements KnowledgeService {
|
|
private KnowledgeMapper knowledgeMapper;
|
|
private KnowledgeMapper knowledgeMapper;
|
|
|
|
|
|
private List<BaseNode> baseNodes;
|
|
private List<BaseNode> baseNodes;
|
|
-
|
|
|
|
|
|
+ private String user = "root";
|
|
|
|
+ private String password = "lantone";
|
|
|
|
+ private String url = "jdbc:mysql://192.168.2.241:3306/med?useUnicode=true&characterEncoding=UTF-8";
|
|
private Pageable pageable;
|
|
private Pageable pageable;
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* 处理症状节点相关的申请
|
|
* 处理症状节点相关的申请
|
|
*/
|
|
*/
|
|
@@ -1397,6 +1406,794 @@ public class KnowledgeServiceImpl implements KnowledgeService {
|
|
indicators1.setDetails(detailList1);
|
|
indicators1.setDetails(detailList1);
|
|
return indicators1;
|
|
return indicators1;
|
|
}
|
|
}
|
|
|
|
+ //获取mysql链接
|
|
|
|
+ public Connection getConnect(){
|
|
|
|
+ MysqlJdbc mysqlJdbc = new MysqlJdbc(user, password, url);
|
|
|
|
+ Connection connect = mysqlJdbc.connect();
|
|
|
|
+ return connect;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新图谱
|
|
|
|
+ * @param singleDisease
|
|
|
|
+ * @return
|
|
|
|
+ * 类型(1:症状,2:体征,3:化验,4:辅检,5:鉴别诊断,6:病史,7:诱因,8:病程,9:其他,91:确诊,92:拟诊,93:警惕)
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public RespDTO updateNeoDisease(NeoParamVO singleDisease) {
|
|
|
|
+ RespDTO respDTO = RespDTO.onSuc(true);
|
|
|
|
+ RespDTO respDTO1 = null;
|
|
|
|
+ try {
|
|
|
|
+ Connection connect = getConnect();
|
|
|
|
+ Long disId = singleDisease.getId();
|
|
|
|
+ //把数据库中的所有词读进map缓存
|
|
|
|
+ Map<String, Map<String, String>> ciKu = this.allStandWord2Map(connect);
|
|
|
|
+ respDTO1 = this.updateNeo(respDTO, disId,connect,ciKu);
|
|
|
|
+ connect.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return respDTO1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public RespDTO updateNeo(RespDTO respDTO,Long disId,Connection connection, Map<String, Map<String, String>> ciKu){
|
|
|
|
+ //先删除
|
|
|
|
+ this.neo4jDelete(disId,connection);
|
|
|
|
+ String disName = this.getDisName(disId,connection);
|
|
|
|
+ if(StringUtils.isNotEmpty(disName)){
|
|
|
|
+ diseaseRepository.mergeDis(disName,disId,0);
|
|
|
|
+ }else {
|
|
|
|
+ respDTO = RespDTO.onError("在数据库中没有找到"+disId+"对应的疾病!!");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //获取每个诊断依据的全部数据
|
|
|
|
+ List<Map<String, String>> allData = this.getAllData(disId,connection);
|
|
|
|
+ //获取拟诊,确诊,警惕组合
|
|
|
|
+ Map<String, List<String>> allNiQueZhenCollection = this.getAllNiQueZhenCollection(disId,connection);
|
|
|
|
+ this.saveNiQue2Neo(allData,allNiQueZhenCollection,disName,disId);
|
|
|
|
+ this.saveData2Neo4j(allData,disId,disName,ciKu);
|
|
|
|
+ return respDTO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 把一个完整的诊断依据封装到list中,list中存的是map,一行一个map
|
|
|
|
+ * @param disId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<Map<String,String>> getAllData(Long disId,Connection connection){
|
|
|
|
+ List<Map<String,String>> contentList = new ArrayList<>();
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ try {
|
|
|
|
+ String type, code ,standard,relation,result,formula,name;
|
|
|
|
+ String sql = "SELECT diagnose_id,dis_name,`type`,`code`,standard,relation,result,formula FROM `kl_diagnose_detail` where diagnose_id = "+disId+" and is_deleted = 'N'";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ while (rs.next()){
|
|
|
|
+ Map<String,String> content = new HashMap<>();
|
|
|
|
+ type = rs.getString(3);
|
|
|
|
+ code = rs.getString("code");
|
|
|
|
+ standard = rs.getString("standard");
|
|
|
|
+ relation = rs.getString("relation");
|
|
|
|
+ result = rs.getString("result");
|
|
|
|
+ formula = rs.getString("formula");
|
|
|
|
+ name = Type.getName(Integer.parseInt(type));
|
|
|
|
+ content.put("type",type);
|
|
|
|
+ content.put("typeName",name);
|
|
|
|
+ content.put("code",code);
|
|
|
|
+ content.put("standard",standard);
|
|
|
|
+ content.put("relation",relation);
|
|
|
|
+ content.put("result",result);
|
|
|
|
+ content.put("formula",formula);
|
|
|
|
+ contentList.add(content);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return contentList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取一个诊断依据的确诊,拟诊,警惕集合
|
|
|
|
+ * @param disId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String,List<String>> getAllNiQueZhenCollection(Long disId,Connection connection) {
|
|
|
|
+ Map<String,List<String>> queNiMap = new HashMap<>();
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ List<String> queList = new ArrayList<>();
|
|
|
|
+ List<String> niList = new ArrayList<>();
|
|
|
|
+ List<String> highList = new ArrayList<>();
|
|
|
|
+ try {
|
|
|
|
+ String type, formula, label,name;
|
|
|
|
+ String sql = "SELECT type,formula FROM `kl_diagnose_detail` where diagnose_id = "+disId+" and type in (91,92,93)";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ while (rs.next()) {
|
|
|
|
+ type = rs.getString(1);
|
|
|
|
+ formula = rs.getString(2);
|
|
|
|
+ name = Type.getName(Integer.parseInt(type));
|
|
|
|
+ if ("拟诊".equals(name)) {
|
|
|
|
+ niList.add(formula);
|
|
|
|
+ } else if ("确诊".equals(name)) {
|
|
|
|
+ queList.add(formula);
|
|
|
|
+ } else if ("警惕".equals(name)) {
|
|
|
|
+ highList.add(formula);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ List<String> newQueList = new ArrayList<>();
|
|
|
|
+ if(queList.size()>0){
|
|
|
|
+ for (String que:queList) {
|
|
|
|
+ if(que.contains("拟诊")){
|
|
|
|
+ for (String ni:niList
|
|
|
|
+ ) {
|
|
|
|
+ newQueList.add(que.replaceAll("拟诊",ni));
|
|
|
|
+ }
|
|
|
|
+ }else {
|
|
|
|
+ newQueList.add(que);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ queNiMap.put("拟诊",niList);
|
|
|
|
+ queNiMap.put("确诊",newQueList);
|
|
|
|
+ queNiMap.put("警惕",highList);
|
|
|
|
+ }catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return queNiMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 加载所有词库
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String,Map<String,String>> allStandWord2Map(Connection connection){
|
|
|
|
+ Map<String,Map<String,String>> ciKu = new HashMap<>();
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ try {
|
|
|
|
+ String tongName, type, isConcept,stand;
|
|
|
|
+ String sql = "SELECT name, type_id,is_concept,IF(is_concept=1,a.name,(select lib_name from kl_concept b where b.id = a.concept_id) ) lib_name \n" +
|
|
|
|
+ "from kl_library_info a where a.is_deleted = 'N'\n" +
|
|
|
|
+ "and type_id in (1,5,12,13,14,16,17,18,35,70)";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ Map<String,String> detail =null;
|
|
|
|
+ while (rs.next()) {
|
|
|
|
+ tongName = rs.getString(1);
|
|
|
|
+ type = rs.getString(2);
|
|
|
|
+ isConcept = rs.getString(3);
|
|
|
|
+ stand = rs.getString(4);
|
|
|
|
+ detail = new HashMap<>();
|
|
|
|
+ detail.put("isConcept",isConcept);
|
|
|
|
+ detail.put("stand",stand);
|
|
|
|
+ ciKu.put(tongName+","+type,detail);
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return ciKu;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取疾病名
|
|
|
|
+ * @param disId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public String getDisName(Long disId,Connection connection){
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ String name="";
|
|
|
|
+ try {
|
|
|
|
+ String sql = "SELECT dis_name FROM `kl_diagnose_detail` where diagnose_id = "+disId+" and is_deleted = 'N'";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ while (rs.next()) {
|
|
|
|
+ name = rs.getString(1);
|
|
|
|
+ }
|
|
|
|
+ }catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return name;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 把确诊,拟诊,警惕存入图谱
|
|
|
|
+ */
|
|
|
|
+ public void saveNiQue2Neo(List<Map<String, String>> allData,Map<String, List<String>> allNiQueZhenCollection,String disName,Long disId){
|
|
|
|
+ List<String> stringList =null;
|
|
|
|
+ String[] types = {"确诊","拟诊","警惕"};
|
|
|
|
+ Integer path = 1;
|
|
|
|
+ String[] nisplits;
|
|
|
|
+ for (String type:types) {
|
|
|
|
+ if("确诊".equals(type)){
|
|
|
|
+ stringList = allNiQueZhenCollection.get(type);
|
|
|
|
+ if(stringList != null){
|
|
|
|
+ for(int i =0;i<stringList.size();i++){
|
|
|
|
+ nisplits = stringList.get(i).split("\\+");
|
|
|
|
+ path = nisplits.length;
|
|
|
|
+ diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
|
|
|
|
+ diseaseRepository.mergeQueNiHigh(disName+"-"+type+"组块"+(i+1),disId);
|
|
|
|
+ this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else if("拟诊".equals(type)){
|
|
|
|
+ stringList = allNiQueZhenCollection.get(type);
|
|
|
|
+ if(stringList != null){
|
|
|
|
+ for(int i =0;i<stringList.size();i++){
|
|
|
|
+ nisplits = stringList.get(i).split("\\+");
|
|
|
|
+ path = nisplits.length;
|
|
|
|
+ diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
|
|
|
|
+ diseaseRepository.mergeNiHigh(disName+"-"+type+"组块"+(i+1),disId);
|
|
|
|
+ this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else if("警惕".equals(type)){
|
|
|
|
+ stringList = allNiQueZhenCollection.get(type);
|
|
|
|
+ if(stringList != null){
|
|
|
|
+ for(int i =0;i<stringList.size();i++){
|
|
|
|
+ nisplits = stringList.get(i).split("\\+");
|
|
|
|
+ path = nisplits.length;
|
|
|
|
+ diseaseRepository.mergeCondition(disName+"-"+type+"组块"+(i+1),path);
|
|
|
|
+ diseaseRepository.mergeHigh(disName+"-"+type+"组块"+(i+1),disId);
|
|
|
|
+ this.splitConditionContent(nisplits,disName,disName+"-"+type+"组块"+(i+1),allData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 处理任几
|
|
|
|
+ * @param nisplits
|
|
|
|
+ * @param disName
|
|
|
|
+ * @param startNode
|
|
|
|
+ * @param allData
|
|
|
|
+ */
|
|
|
|
+ public void splitConditionContent(String[] nisplits,String disName,String startNode,List<Map<String, String>> allData){
|
|
|
|
+ Integer path = 1;
|
|
|
|
+ String rel = "";
|
|
|
|
+ for (String ni:nisplits) {
|
|
|
|
+
|
|
|
|
+ if(ni.contains("/")){
|
|
|
|
+ if(ni.contains("任一")){
|
|
|
|
+ path = 1;
|
|
|
|
+ rel = "任一";
|
|
|
|
+ }else if(ni.contains("任二")){
|
|
|
|
+ path = 2;
|
|
|
|
+ rel = "任二";
|
|
|
|
+ }else if(ni.contains("任三")){
|
|
|
|
+ path = 3;
|
|
|
|
+ rel = "任三";
|
|
|
|
+ }else if(ni.contains("任四")){
|
|
|
|
+ path = 4;
|
|
|
|
+ rel = "任四";
|
|
|
|
+ }else if(ni.contains("任五")){
|
|
|
|
+ path = 5;
|
|
|
|
+ rel = "任五";
|
|
|
|
+ }else if(ni.contains("任六")){
|
|
|
|
+ path = 6;
|
|
|
|
+ rel = "任六";
|
|
|
|
+ }else if(ni.contains("任七")){
|
|
|
|
+ path = 7;
|
|
|
|
+ rel = "任七";
|
|
|
|
+ }else {
|
|
|
|
+ path = 1;
|
|
|
|
+ rel = "任一";
|
|
|
|
+ }
|
|
|
|
+ diseaseRepository.mergeRenCondition(disName+ni,path,rel);
|
|
|
|
+ diseaseRepository.mergeRenCondition(disName+ni,startNode);
|
|
|
|
+ //获取这个任几集合的数字集合
|
|
|
|
+ List<String> numList = this.getNumList(ni);
|
|
|
|
+ if(numList != null && numList.size()>0){
|
|
|
|
+ for (String num:numList
|
|
|
|
+ ) {
|
|
|
|
+ this.processDetailNum(disName,num,disName+ni,allData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else {
|
|
|
|
+ this.processDetailNum(disName,ni,startNode,allData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取任几集合的code列表
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<String> getNumList(String renCondition){
|
|
|
|
+ List<String> numList = new ArrayList<>();
|
|
|
|
+ String[] numSplits = renCondition.split("/");
|
|
|
|
+ if(numSplits.length>0){
|
|
|
|
+ for (int i=0;i<numSplits.length;i++){
|
|
|
|
+ if(i == 0){
|
|
|
|
+ numList.add(numSplits[i].replaceAll("\\(",""));
|
|
|
|
+ }else if(i == numSplits.length-1){
|
|
|
|
+ String numSplit = numSplits[i];
|
|
|
|
+ int i1 = numSplit.indexOf(")");
|
|
|
|
+ System.out.println(numSplit+"\t"+i1);
|
|
|
|
+ if(i1 >= 0){
|
|
|
|
+ numList.add(numSplits[i].substring(0,numSplits[i].indexOf(")")));
|
|
|
|
+ }else {
|
|
|
|
+ numList.add(numSplit);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }else {
|
|
|
|
+ numList.add(numSplits[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return numList;
|
|
|
|
+ }
|
|
|
|
+ public void processDetailNum(String disName,String num,String renCondition,List<Map<String, String>> allData){
|
|
|
|
+ String[] types = {"化验","辅检","排除条件"};
|
|
|
|
+ for (Map<String, String> row:allData) {
|
|
|
|
+ String code = row.get("code");//编码
|
|
|
|
+ String type = row.get("type");//类型
|
|
|
|
+ String typeName = row.get("typeName");//类型对应的中文名
|
|
|
|
+ String relation = row.get("relation");//关联词
|
|
|
|
+ String result = row.get("result");//结果
|
|
|
|
+ if(num.equals(code)){
|
|
|
|
+ if(Arrays.asList(types).indexOf(typeName) <0){
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code);
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code,renCondition);
|
|
|
|
+ }else if("化验".equals(typeName) && !"".equals(result)){
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code);
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code,renCondition);
|
|
|
|
+ }else if("辅检".equals(typeName) && !"".equals(relation)){
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code);
|
|
|
|
+ diseaseRepository.mergeNUMCondition(disName+code,renCondition);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 保存完整的诊断依据入知识图谱
|
|
|
|
+ * @param allData
|
|
|
|
+ * @param disId
|
|
|
|
+ * @param disName
|
|
|
|
+ */
|
|
|
|
+ public void saveData2Neo4j(List<Map<String, String>> allData,Long disId,String disName,Map<String, Map<String, String>> ciKu){
|
|
|
|
+ for (Map<String,String> row:allData) {
|
|
|
|
+ String code = row.get("code");//编码
|
|
|
|
+ String type = row.get("type");//类型
|
|
|
|
+ String typeName = row.get("typeName");//类型对应的中文名
|
|
|
|
+ String standard = row.get("standard");//标准词
|
|
|
|
+ String relation = row.get("relation");//关联词
|
|
|
|
+ String result = row.get("result");//结果
|
|
|
|
+ if(StringUtils.isNotEmpty(type)){
|
|
|
|
+ String[] split =null;
|
|
|
|
+ String[] lisResultSplit =null;
|
|
|
|
+ String[] pacsResultSplit =null;
|
|
|
|
+ String standWord = null;String lisResult = null,pacsResult=null;
|
|
|
|
+ if(!"3".equals(type) && !"4".equals(type) && !"5".equals(type)){
|
|
|
|
+ //添加词语之前,要找标准词
|
|
|
|
+ //添加standard
|
|
|
|
+ switch (type){
|
|
|
|
+ case "1": //症状
|
|
|
|
+ standWord = searchStandWord(standard, type, ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardSymptom(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandard(disId,standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardSymptom(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case "2"://体征结果
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardVital(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardVital(disId,standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardVital(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case "6"://病史
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardHistory(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardHistory(disId,standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardHistory(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case "7"://诱因
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardCause(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardCause(disId,standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardCause(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case "8"://病程
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardPrognosis(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardPrognosis(disId,standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardPrognosis(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case "9"://其他
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardOther(standard);
|
|
|
|
+ diseaseRepository.mergeRelationStandardOther(disId,standard);
|
|
|
|
+ diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standard);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split!=null && split.length>0){
|
|
|
|
+ for (String ci:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(ci)){
|
|
|
|
+ //找标准词
|
|
|
|
+ standWord = searchStandWord(ci,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ diseaseRepository.mergeStandardOther(standWord);
|
|
|
|
+ diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standWord);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }else if("5".equals(type)){ //鉴别诊断
|
|
|
|
+ //找标准词
|
|
|
|
+ diseaseRepository.mergeDifferentDis(standard);
|
|
|
|
+ diseaseRepository.mergeRelationDifferentDis(disId,standard);
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ split = relation.split("、");
|
|
|
|
+ if(split !=null && split.length>0){
|
|
|
|
+ for (String dis:split) {
|
|
|
|
+ if(StringUtils.isNotEmpty(dis)){
|
|
|
|
+ //找标准词
|
|
|
|
+ diseaseRepository.mergeDifferentDis(dis);
|
|
|
|
+ diseaseRepository.mergeRelationDifferentDis(disId,dis);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if("3".equals(type)){ //处理化验
|
|
|
|
+ String lis = "";
|
|
|
|
+ //查找化验大项的标准词
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ if(StringUtils.isNotEmpty(relation) && standard.equals(relation)){
|
|
|
|
+ lis = standWord;
|
|
|
|
+ }else if(StringUtils.isNotEmpty(standard) && StringUtils.isEmpty(relation)){
|
|
|
|
+ lis = standWord;
|
|
|
|
+ }else if(StringUtils.isNotEmpty(standard)&& StringUtils.isNotEmpty(relation)&&!standard.equals(relation)){
|
|
|
|
+ type = "subLis";
|
|
|
|
+ if(StringUtils.isNotEmpty(searchStandWord(relation,type,ciKu))){
|
|
|
|
+ //查找化验小项的标准词
|
|
|
|
+ lis = standWord+"--"+searchStandWord(relation,type,ciKu);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //创建公表名
|
|
|
|
+ diseaseRepository.mergePublicLIS(lis);
|
|
|
|
+ //疾病推荐化验公表名
|
|
|
|
+ diseaseRepository.mergeRelationLIS(disId,lis);
|
|
|
|
+ //处理化验结果
|
|
|
|
+ if(StringUtils.isNotEmpty(result)){
|
|
|
|
+ lisResultSplit = result.split("、");
|
|
|
|
+ if(lisResultSplit != null && lisResultSplit.length>0){
|
|
|
|
+ //化验结果找标准词
|
|
|
|
+ for (String lisRs:lisResultSplit) {
|
|
|
|
+ if(StringUtils.isNotEmpty(lisRs)){
|
|
|
|
+ lisResult = searchStandWord(lisRs,"resultLis",ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(lisResult)){
|
|
|
|
+ //创建化验结果节点
|
|
|
|
+ diseaseRepository.mergeLISRESULT(lisResult);
|
|
|
|
+ //公表名和化验结果创建关系
|
|
|
|
+ diseaseRepository.mergeRelationPublicLIS(lis,lisResult);
|
|
|
|
+ //化验结果和对应的codeCondition创建关系
|
|
|
|
+ diseaseRepository.mergeRelationCondiLisRes(disName+code,lisResult);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else if("4".equals(type)){ //辅检
|
|
|
|
+ //查找辅检的标准词
|
|
|
|
+ standWord = searchStandWord(standard,type,ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(standWord)){
|
|
|
|
+ //创建辅检标准词的节点
|
|
|
|
+ diseaseRepository.mergePacs(standWord);
|
|
|
|
+ //疾病推荐辅检
|
|
|
|
+ diseaseRepository.mergeRelationDis2Pacs(disId,standWord);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isNotEmpty(relation)){
|
|
|
|
+ pacsResultSplit = relation.split("、");
|
|
|
|
+ if(pacsResultSplit != null && pacsResultSplit.length>0){
|
|
|
|
+ for (String pacs:pacsResultSplit) {
|
|
|
|
+ //查找辅检结果的标准词
|
|
|
|
+ if(StringUtils.isNotEmpty(pacs)){
|
|
|
|
+ pacsResult = searchStandWord(pacs,"resultPacs",ciKu);
|
|
|
|
+ if(StringUtils.isNotEmpty(pacsResult)){
|
|
|
|
+ diseaseRepository.mergePacsResult(pacsResult);
|
|
|
|
+ //创建辅检和辅检结果关系
|
|
|
|
+ diseaseRepository.mergeRelationPacsResult(standWord,pacsResult);
|
|
|
|
+ //创建辅检结果和对应的pacsCondition的关系
|
|
|
|
+ diseaseRepository.mergeRelationCondiPacsRes(disName+code,pacsResult);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查找标准词
|
|
|
|
+ * @param type
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public String searchStandWord(String word,String type,Map<String, Map<String, String>> ciKu){
|
|
|
|
+ String stand = null;
|
|
|
|
+ Map<String, String> detaiMap =null;
|
|
|
|
+ String label = Ciku.getLabel(type);
|
|
|
|
+ String[] labelSplits = label.split(",");
|
|
|
|
+ if(labelSplits.length == 1){
|
|
|
|
+ detaiMap = ciKu.get(word + "," + label);
|
|
|
|
+ if(detaiMap != null){
|
|
|
|
+ stand = detaiMap.get("stand");
|
|
|
|
+ }
|
|
|
|
+ }else if(labelSplits.length == 2){
|
|
|
|
+ detaiMap = ciKu.get(word + "," + labelSplits[0]);
|
|
|
|
+ if(detaiMap == null){
|
|
|
|
+ detaiMap = ciKu.get(word + "," + labelSplits[1]);
|
|
|
|
+ }
|
|
|
|
+ if(detaiMap != null){
|
|
|
|
+ stand = detaiMap.get("stand");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return stand;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 在图谱中删除诊断依据
|
|
|
|
+ * @param singleDisease
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public RespDTO deleteNeoDisease(NeoParamVO singleDisease) {
|
|
|
|
+ Long disId = singleDisease.getId();
|
|
|
|
+ RespDTO respDTO = null;
|
|
|
|
+ try {
|
|
|
|
+ Connection connect = getConnect();
|
|
|
|
+ if(disId != null){
|
|
|
|
+ this.neo4jDelete(disId,connect);
|
|
|
|
+ connect.close();
|
|
|
|
+ respDTO = RespDTO.onSuc(true);
|
|
|
|
+ }else {
|
|
|
|
+ respDTO = RespDTO.onError(disId +" 删除失败!!!");
|
|
|
|
+ }
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return respDTO;
|
|
|
|
+ }
|
|
|
|
+ //删除
|
|
|
|
+ public void neo4jDelete(Long disId,Connection connection) {
|
|
|
|
+ if (disId != null) {
|
|
|
|
+ diseaseRepository.deleteRelation1(disId);
|
|
|
|
+ diseaseRepository.deleteRelation2(disId);
|
|
|
|
+ diseaseRepository.deleteRelation3(disId);
|
|
|
|
+ diseaseRepository.deleteRelation4(disId);
|
|
|
|
+// diseaseRepository.deleteRelation5(disId);
|
|
|
|
+// diseaseRepository.deleteRelation6(disId);
|
|
|
|
+// diseaseRepository.deleteRelation7(disId);
|
|
|
|
+// diseaseRepository.deleteRelation8(disId);
|
|
|
|
+// diseaseRepository.deleteRelation9(disId);
|
|
|
|
+ //删除disId
|
|
|
|
+ diseaseRepository.deleteRelation11(disId);
|
|
|
|
+ List<String> allCode = this.getAllCode(disId,connection);
|
|
|
|
+ if(allCode.size()>0){
|
|
|
|
+ for (String conName:allCode) {
|
|
|
|
+ diseaseRepository.deleteRelation10(conName);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量插入
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public RespDTO<Boolean> batchInsertDis() {
|
|
|
|
+ //获取mysql链接
|
|
|
|
+ Connection connect = getConnect();
|
|
|
|
+ //把数据库中的所有词读进map缓存
|
|
|
|
+ Map<String, Map<String, String>> ciKu = this.allStandWord2Map(connect);
|
|
|
|
+ RespDTO<Boolean> respDTO = new RespDTO<>();
|
|
|
|
+ try {
|
|
|
|
+ List<Long> disList = getDisList(connect);
|
|
|
|
+ if(disList != null && disList.size()>0){
|
|
|
|
+ for (Long disId:disList) {
|
|
|
|
+ respDTO = this.updateNeo(respDTO, disId, connect, ciKu);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ connect.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return respDTO;
|
|
|
|
+ }
|
|
|
|
+ public void updateDate(Connection connection,Long disId){
|
|
|
|
+ String sql = "UPDATE `kl_diagnose` set neo_update='1970-01-01 12:00:00' where id="+disId+";";
|
|
|
|
+ }
|
|
|
|
+ public List<Long> getDisList(Connection connection){
|
|
|
|
+ List<Long> disIds = new ArrayList<>();
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ try {
|
|
|
|
+ Long id ;
|
|
|
|
+ String sql = "SELECT id FROM `kl_diagnose` where has_question=0 and is_deleted='N'";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ while (rs.next()){
|
|
|
|
+ disIds.add(rs.getLong(1));
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return disIds;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取一个诊断依据的全部code
|
|
|
|
+ * @param disId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<String> getAllCode(Long disId,Connection connection){
|
|
|
|
+ List<String> codeList = new ArrayList<>();
|
|
|
|
+ Statement st = null;
|
|
|
|
+ ResultSet rs = null;
|
|
|
|
+ try {
|
|
|
|
+ String code ,name;
|
|
|
|
+ String sql = "SELECT dis_name,code FROM `kl_diagnose_detail` where diagnose_id="+disId+" and code != \"\"";
|
|
|
|
+ st = connection.createStatement();
|
|
|
|
+ rs = st.executeQuery(sql);
|
|
|
|
+ while (rs.next()){
|
|
|
|
+ name = rs.getString("dis_name");
|
|
|
|
+ code = rs.getString("code");
|
|
|
|
+ codeList.add(name+code);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ rs.close();
|
|
|
|
+ st.close();
|
|
|
|
+ } catch (SQLException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return codeList;
|
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public List<Map<String, Object>> getRecommendItem(QueryVo queryVo) {
|
|
public List<Map<String, Object>> getRecommendItem(QueryVo queryVo) {
|