Browse Source

Merge remote-tracking branch 'origin/master'

MarkHuang 4 years ago
parent
commit
b9ba1c0d03

+ 21 - 0
src/main/java/com/diagbot/facade/CommonFacade.java

@@ -104,6 +104,9 @@ public class CommonFacade {
 
         // 处理现病史中的化验和辅检,放入结构化
         processPresentLisPacs(wordCrfDTO);
+
+        // 现病史中体征内容放入体征标签
+        processPresentVital(wordCrfDTO);
         return wordCrfDTO;
     }
 
@@ -211,6 +214,7 @@ public class CommonFacade {
         List<String> vitalList = new ArrayList<>();
         VitalLabel vitalLabel = wordCrfDTO.getVitalLabel();
         vitalList.addAll(CoreUtil.getPropertyList(vitalLabel.getVitals()));
+        vitalList.addAll(CoreUtil.getPropertyList(vitalLabel.getClinicals()));
         standConvert.setVitalList(vitalList);
 
         // 输血
@@ -256,6 +260,7 @@ public class CommonFacade {
         CoreUtil.setPropertyList(wordCrfDTO.getPacsOrder(), "name", "uniqueName", map.get(StandConvertEnum.pacs.getName()));
         //体征回填
         CoreUtil.setPropertyList(vitalLabel.getVitals(), map.get(StandConvertEnum.vital.getName()));
+        CoreUtil.setPropertyList(vitalLabel.getClinicals(), map.get(StandConvertEnum.vital.getName()));
         //手术回填
         CoreUtil.setPropertyList(presentLabel.getOperations(), map.get(StandConvertEnum.operation.getName()));
         CoreUtil.setPropertyList(pastLabel.getOperations(), map.get(StandConvertEnum.operation.getName()));
@@ -354,6 +359,22 @@ public class CommonFacade {
         return pushVO;
     }
 
+    /**
+     * 将现病史中提取的体征内容放入体征标签中
+     *
+     * @param wordCrfDTO
+     */
+    public void processPresentVital(WordCrfDTO wordCrfDTO){
+        PresentLabel presentLabel = wordCrfDTO.getPresentLabel();
+        VitalLabel vitalLabel = wordCrfDTO.getVitalLabel();
+        if (ListUtil.isNotEmpty(presentLabel.getVitals())) {
+            vitalLabel.getVitals().addAll(presentLabel.getVitals());
+        }
+        if (ListUtil.isNotEmpty(presentLabel.getClinicals())) {
+            vitalLabel.getClinicals().addAll(presentLabel.getClinicals());
+        }
+    }
+
     public void processPresentLisPacs(WordCrfDTO wordCrfDTO){
         PresentLabel presentLabel = wordCrfDTO.getPresentLabel();
         List<com.diagbot.model.entity.Lis> lises = presentLabel.getLises();

+ 12 - 0
src/main/java/com/diagbot/facade/ConceptFacade.java

@@ -1,11 +1,13 @@
 package com.diagbot.facade;
 
+import com.diagbot.entity.node.Dept;
 import com.diagbot.entity.node.LisName;
 import com.diagbot.entity.node.LisSet;
 import com.diagbot.entity.node.Medicine;
 import com.diagbot.entity.node.PacsName;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoOperationName;
+import com.diagbot.repository.DeptRepository;
 import com.diagbot.repository.LisNameRepository;
 import com.diagbot.repository.LisSetRepository;
 import com.diagbot.repository.MedicineRepository;
@@ -48,6 +50,9 @@ public class ConceptFacade {
     @Autowired
     YiBaoOperationNameRepository yiBaoOperationNameRepository;
 
+    @Autowired
+    DeptRepository deptRepository;
+
     @Autowired
     TransfusionRemindRepository transfusionRemindRepository;
 
@@ -113,6 +118,13 @@ public class ConceptFacade {
                 }
                 break;
             case 7:
+                List<Dept> deptList = deptRepository.findByNameIn(conceptVO.getNames());
+                if (ListUtil.isNotEmpty(deptList)) {
+                    retList = deptList.stream()
+                            .map(i -> i.getName())
+                            .distinct()
+                            .collect(Collectors.toList());
+                }
                 break;
             case 8:
                 List<String> transfusionNames = transfusionRemindRepository.findTransfusionByTypeIn(conceptVO.getNames());

+ 9 - 5
src/main/java/com/diagbot/facade/NeoFacade.java

@@ -888,13 +888,17 @@ public class NeoFacade {
                         redisUtil.updateValue(type + "Conv:" + s, s);
                     } else {
                         String rateStr = standConvertCrfDTO.getStandard_words().get(0).get("rate");
-                        BigDecimal rate = new BigDecimal(rateStr);
-                        int flag = rate.compareTo(new BigDecimal(standConvertRate));
-                        if (flag < 0) {
+                        if (StringUtil.isBlank(rateStr)) {
                             redisUtil.updateValue(type + "Conv:" + s, s);
                         } else {
-                            redisUtil.updateValue(type + "Conv:" + s, standConvertCrfDTO.getStandard_words().get(0).get("standard_word"));
-                            lastS = standConvertCrfDTO.getStandard_words().get(0).get("standard_word");
+                            BigDecimal rate = new BigDecimal(rateStr);
+                            int flag = rate.compareTo(new BigDecimal(standConvertRate));
+                            if (flag < 0) {
+                                redisUtil.updateValue(type + "Conv:" + s, s);
+                            } else {
+                                redisUtil.updateValue(type + "Conv:" + s, standConvertCrfDTO.getStandard_words().get(0).get("standard_word"));
+                                lastS = standConvertCrfDTO.getStandard_words().get(0).get("standard_word");
+                            }
                         }
                     }
                 } else {

+ 22 - 1
src/main/java/com/diagbot/model/ai/process/EntityProcessClinic.java

@@ -4,7 +4,24 @@ package com.diagbot.model.ai.process;
 import com.alibaba.fastjson.JSONObject;
 import com.diagbot.model.ai.model.EntityEnum;
 import com.diagbot.model.ai.model.Lemma;
-import com.diagbot.model.entity.*;
+import com.diagbot.model.entity.Aggravate;
+import com.diagbot.model.entity.BeHospitalizedWay;
+import com.diagbot.model.entity.BodyPart;
+import com.diagbot.model.entity.Cause;
+import com.diagbot.model.entity.Clinical;
+import com.diagbot.model.entity.Degree;
+import com.diagbot.model.entity.Diag;
+import com.diagbot.model.entity.General;
+import com.diagbot.model.entity.GeneralDesc;
+import com.diagbot.model.entity.Medicine;
+import com.diagbot.model.entity.Modification;
+import com.diagbot.model.entity.Operation;
+import com.diagbot.model.entity.PD;
+import com.diagbot.model.entity.Property;
+import com.diagbot.model.entity.Relief;
+import com.diagbot.model.entity.Treat;
+import com.diagbot.model.entity.Trend;
+import com.diagbot.model.entity.Vital;
 import com.diagbot.model.label.PresentLabel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -157,6 +174,10 @@ public class EntityProcessClinic extends EntityProcess {
             }
             presentLabel.setPds(pds);
 
+            EntityProcessVital vital = new EntityProcessVital();
+            List<Vital> vitals = vital.extractEntityClinic(aiOut);
+            presentLabel.setVitals(vitals);
+
         } catch (Exception e) {
             e.printStackTrace();
             logger.error(e.getMessage(), e);

+ 96 - 0
src/main/java/com/diagbot/model/ai/process/EntityProcessVital.java

@@ -12,6 +12,8 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class EntityProcessVital extends EntityProcess {
     public VitalLabel extractEntity(JSONObject outputs) {
@@ -108,4 +110,98 @@ public class EntityProcessVital extends EntityProcess {
         }
         return vitalLabel;
     }
+
+
+    /**
+     * 只获取体征内容
+     * @param outputs
+     * @return
+     */
+    public List<Vital> extractEntityClinic(JSONObject outputs) {
+        List<Vital> vitals = new ArrayList<>();
+        Vital vital =null;
+        List<Map<String, String>> vitalEntityList = processJson(outputs, EntityEnum.SIGN.toString());
+        for (Map<String, String> vitalEntityMap : vitalEntityList) {
+            if (StringUtils.isEmpty(vitalEntityMap.get(EntityEnum.SIGN.toString()))) {
+                continue;
+            }
+            vital = new Vital();
+            for (String key:vitalEntityMap.keySet()) {
+                String entity = vitalEntityMap.get(key);
+                switch (EntityEnum.parseOfValue(key)) {
+                    case SIGN:
+                        vital.setName(entity);
+                        vital.setStandName(entity);
+                        break;
+                    case NEGATIVE:
+                        Negative negative = new Negative();
+                        negative.setName(entity);
+                        vital.setNegative(negative);
+                        break;
+                    case BODY:
+                        BodyPart bodyPart = new BodyPart();
+                        bodyPart.setName(entity);
+                        vital.setBodyPart(bodyPart);
+                        break;
+                    case INDEX_VALUE:
+                        PD pd = new PD();
+                        String[] val_unit = new String[2];
+                        if (StringUtil.isNotBlank(entity)) {
+                            val_unit = extract_digit_new(entity);
+                            pd.setValue(val_unit[0]);
+                            pd.setUnit(val_unit[1]);
+                        }
+                        pd.setName(entity);
+                        vital.setPd(pd);
+                        break;
+                    case MODIFICATION:
+                        if(entity.contains("度")){
+                            Degree degree = new Degree();
+                            degree.setName(entity);
+                            vital.setDegree(degree);
+                        }
+                        break;
+                }
+            }
+            vitals.add(vital);
+        }
+
+        // 生命体征特殊处理
+        for (Vital vi : vitals) {
+            if ("T".equals(vi.getName().toUpperCase())) {
+                vi.setStandName("体温");
+            } else if ("P".equals(vi.getName().toUpperCase())) {
+                vi.setStandName("脉搏");
+            } else if ("R".equals(vi.getName().toUpperCase())) {
+                vi.setStandName("呼吸");
+            } else if ("血压".equals(vi.getName()) || "BP".equals(vi.getName().toUpperCase())) {
+                String bpName = vi.getPd().getName();
+                Pattern pattern = Pattern.compile("\\d+/\\d+"); // 示例:血压80/44mmHg
+                Matcher matcher = pattern.matcher(bpName);
+
+                if (matcher.find()) {
+                    String val = matcher.group();
+                    vi.getPd().setValue(val);  // 重新赋值血压的数值
+                    vi.getPd().setUnit(bpName.substring(bpName.indexOf(val) + 1));   // 重新赋值血压的单位
+
+                    String[] bp = val.split("/");
+
+                    List<Usual> usualList = new ArrayList<>();
+                    Usual usualSbp = new Usual();
+                    usualSbp.setName(vi.getName());
+                    usualSbp.setStandName("收缩压");
+                    usualSbp.setValue(bp[0]);
+                    usualList.add(usualSbp);
+                    vi.setUsualList(usualList);
+
+                    Usual usualDbp = new Usual();
+                    usualDbp.setName(vi.getName());
+                    usualDbp.setStandName("舒张压");
+                    usualDbp.setValue(bp[1]);
+                    usualList.add(usualDbp);
+                }
+            }
+        }
+        return vitals;
+    }
 }

+ 2 - 0
src/main/java/com/diagbot/model/label/PresentLabel.java

@@ -42,6 +42,8 @@ public class PresentLabel extends GeneralLabel {
     private List<PD> pds = new ArrayList<>();
     //现病史一般情况之后的服用药品
     List<Medicine> takeMedicine = new ArrayList<>();
+    //体征内容
+    private List<Vital> vitals = new ArrayList<>();
 
     public <T> void add(List<T> list, T obj) {
         list.add(obj);

+ 10 - 6
src/main/java/com/diagbot/repository/DeptRepository.java

@@ -16,18 +16,22 @@ public interface DeptRepository extends Neo4jRepository<Dept, Long> {
 
     List<Dept> findByNameIs(String name);
 
+    List<Dept> findByNameIn(List<String> names);
+
     Page<Dept> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`科室`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`科室`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`科室`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`科室`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`科室`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`科室`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<Dept> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }

+ 17 - 13
src/main/java/com/diagbot/repository/LisNameRepository.java

@@ -20,29 +20,33 @@ public interface LisNameRepository extends Neo4jRepository<LisName, Long> {
 
     Page<LisName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`实验室检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`实验室检查名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`实验室检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`实验室检查名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`实验室检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`实验室检查名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<LisName> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`实验室检查名称`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`实验室检查名称`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`实验室检查名称`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`实验室检查名称`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`实验室检查名称`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`实验室检查名称`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<LisName> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
-}
+}

+ 16 - 12
src/main/java/com/diagbot/repository/LisSetRepository.java

@@ -20,30 +20,34 @@ public interface LisSetRepository extends Neo4jRepository<LisSet, Long> {
 
     Page<LisSet> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`实验室检查套餐名`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`实验室检查套餐名`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`实验室检查套餐名`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<LisSet> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`实验室检查套餐名`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`实验室检查套餐名`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`实验室检查套餐名`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<LisSet> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }
 

+ 17 - 13
src/main/java/com/diagbot/repository/MedicineRepository.java

@@ -22,32 +22,36 @@ public interface MedicineRepository extends Neo4jRepository<Medicine, Long> {
 
     @Query("match (n:药品通用名称)<-[r1:药品相关药品通用名称]-(m:药品代码通用名)-[r2:药品相关药品注册名称]->(o:药品注册名称) where n.name={name} return distinct o.name")
     List<String> findMedRegNamebyMedicine(@Param("name") String name);
+
     Page<Medicine> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`药品通用名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`药品通用名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`药品通用名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`药品通用名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`药品通用名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`药品通用名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<Medicine> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`药品通用名称`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`药品通用名称`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`药品通用名称`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`药品通用名称`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`药品通用名称`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`药品通用名称`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<Medicine> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }
-

+ 17 - 13
src/main/java/com/diagbot/repository/PacsNameRepository.java

@@ -20,29 +20,33 @@ public interface PacsNameRepository extends Neo4jRepository<PacsName, Long> {
 
     Page<PacsName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`辅助检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`辅助检查名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`辅助检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`辅助检查名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`辅助检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`辅助检查名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<PacsName> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`辅助检查名称`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`辅助检查名称`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`辅助检查名称`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`辅助检查名称`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`辅助检查名称`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`辅助检查名称`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<PacsName> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
-}
+}

+ 16 - 12
src/main/java/com/diagbot/repository/YiBaoDiseaseRepository.java

@@ -20,30 +20,34 @@ public interface YiBaoDiseaseRepository extends Neo4jRepository<YiBaoDiseaseName
 
     Page<YiBaoDiseaseName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`医保疾病名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`医保疾病名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`医保疾病名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`医保疾病名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`医保疾病名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`医保疾病名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<YiBaoDiseaseName> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`医保疾病名称`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`医保疾病名称`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`医保疾病名称`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`医保疾病名称`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`医保疾病名称`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`医保疾病名称`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<YiBaoDiseaseName> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }
 

+ 16 - 12
src/main/java/com/diagbot/repository/YiBaoOperationNameRepository.java

@@ -20,29 +20,33 @@ public interface YiBaoOperationNameRepository extends Neo4jRepository<YiBaoOpera
 
     Page<YiBaoOperationName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
-    @Query("MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+    @Query("MATCH (n:`医保手术和操作名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
-            "MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL \n" +
+            "MATCH (n:`医保手术和操作名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
-            "RETURN n, collect(r), collect(m) limit $size\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
-            "MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  \n" +
+            "MATCH (n:`医保手术和操作名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<YiBaoOperationName> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 
-    @Query("MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE toLower(n.`name`) = toLower($name) \n" +
+    @Query("MATCH (n:`医保手术和操作名称`) WHERE toLower(n.`name`) = toLower($name) \n" +
             "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "MATCH (n:`医保手术和操作名称`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
             "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit 100\n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "union\n" +
-            "MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "MATCH (n:`医保手术和操作名称`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
             "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
-            "RETURN n, collect(r), collect(m) limit $size")
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<YiBaoOperationName> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }

+ 63 - 0
src/main/java/com/diagbot/util/CoreUtil.java

@@ -329,6 +329,7 @@ public class CoreUtil {
                 if (nodeNeoDTO.getName().contains(clinical.getStandName())) {
                     map.put("msg", clinical.getName());
                     flag = true;
+                    break;
                 }
             }
         } else {
@@ -340,6 +341,7 @@ public class CoreUtil {
                     flag = compareNum(nodeNeoDTO, Double.parseDouble(vital.getPd().getValue()));
                     if (flag) {
                         map.put("msg", vital.getName() + subZeroAndDot(String.valueOf(vital.getPd().getValue())));
+                        break;
                     }
                 } else if (ListUtil.isNotEmpty(usualList)) {
                     for (Usual usual : usualList) {
@@ -623,4 +625,65 @@ public class CoreUtil {
     public static void getDebugStr(String msg, Object error, Map<String, Object> debugMap) {
         debugMap.put(msg,  error);
     }
+
+    /**
+     * 年龄字符串转换成double类型
+     *
+     * @param ageStr
+     * @return
+     */
+    public static Double convertAge(String ageStr) {
+        try {
+            if (StringUtil.isEmpty(ageStr)) {
+                return 0.0;
+            }
+            // 全是整形数字,当成年龄处理
+            if (CatalogueUtil.numbersOnly(ageStr)) {
+                return Double.parseDouble(ageStr);
+            }
+            // 20日
+            if (ageStr.endsWith("日")) {
+                return getHalfUp((Double.parseDouble(ageStr.substring(0, ageStr.length() - 1))) / 365);
+            }
+            // 3岁
+            if (ageStr.endsWith("岁")) {
+                return Double.parseDouble(ageStr.substring(0, ageStr.length() - 1));
+            }
+            // 1.08月 | .11月 | 3月
+            if (ageStr.endsWith("月")) {
+                String noUnit = ageStr.substring(0, ageStr.length() - 1);
+                String[] ageArr = new String[2];
+                String[] splitArr = noUnit.split("\\.");
+                if (splitArr.length == 1) {
+                    ageArr[0] = splitArr[0];
+                } else if (splitArr.length == 2) {
+                    ageArr[0] = splitArr[0];
+                    ageArr[1] = splitArr[1];
+                }
+                Double daySum = 0.0D;
+                if (StringUtil.isNotBlank(ageArr[0])) {
+                    daySum += Double.parseDouble(ageArr[0]) * 30;
+                }
+                if (StringUtil.isNotBlank(ageArr[1])) {
+                    daySum += Double.parseDouble(ageArr[1]);
+                }
+                return getHalfUp(daySum / 365);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0.0;
+        }
+        return 0.0;
+    }
+
+    /**
+     * 四舍五入保留2位小数
+     *
+     * @param ageStr
+     * @return
+     */
+    public static Double getHalfUp(Double ageStr) {
+        BigDecimal bg = new BigDecimal(String.valueOf(ageStr));
+        return bg.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
 }

+ 1 - 1
src/main/java/com/diagbot/web/TestController.java

@@ -112,7 +112,7 @@ public class TestController {
         return RespDTO.onSuc(testFacade.testStandConvert(standConvertCrfVO));
     }
 
-    @ApiOperation(value = "标准词批量转换API[zhoutg]", notes = "类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 辅助检查:vital")
+    @ApiOperation(value = "标准词批量转换API[zhoutg]", notes = "类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 查:vital")
     @PostMapping("/testStandConvertBatch")
     public RespDTO<StandConvertCrfBatchDTO> testStandConvertBatch(@RequestBody List<StandConvertCrfVO> standConvertCrfVOList) {
         return RespDTO.onSuc(testFacade.testStandConvertBatch(standConvertCrfVOList));

+ 1 - 1
src/main/resources/application-dev.yml

@@ -153,7 +153,7 @@ ChiefPresentSimilarity:
   url: http://192.168.2.234:3456
 
 StandConvert:
-  url: http://192.168.3.150:23232
+  url: http://192.168.2.234:23232
   rate: 0.9
 
 debugFlag: true

+ 1 - 1
src/main/resources/application-local.yml

@@ -153,7 +153,7 @@ ChiefPresentSimilarity:
   url: http://192.168.2.234:3456
 
 StandConvert:
-  url: http://192.168.3.150:23232
+  url: http://192.168.2.234:23232
   rate: 0.9
 
 debugFlag: true

+ 1 - 1
src/main/resources/application-pre.yml

@@ -153,7 +153,7 @@ ChiefPresentSimilarity:
   url: http://192.168.2.234:3456
 
 StandConvert:
-  url: http://192.168.3.150:23232
+  url: http://192.168.2.234:23232
   rate: 0.9
 
 debugFlag: true

+ 1 - 1
src/main/resources/application-pro.yml

@@ -155,7 +155,7 @@ ChiefPresentSimilarity:
   url: http://192.168.2.234:3456
 
 StandConvert:
-  url: http://192.168.3.150:23232
+  url: http://192.168.2.234:23232
   rate: 0.9
 
 debugFlag: true

+ 1 - 1
src/main/resources/application-test.yml

@@ -153,7 +153,7 @@ ChiefPresentSimilarity:
   url: http://192.168.2.234:3456
 
 StandConvert:
-  url: http://192.168.3.150:23232
+  url: http://192.168.2.234:23232
   rate: 0.9
 
 debugFlag: true