Browse Source

添加非结构化诊断、redis 批量get

kongwz 4 years ago
parent
commit
afb055c277

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

@@ -379,6 +379,16 @@ public class CommonFacade {
     }
 
     public void processPresentLisPacs(WordCrfDTO wordCrfDTO){
+        DiagLabel diagLabel = wordCrfDTO.getDiagLabel();
+        List<com.diagbot.model.entity.Diag> diags = diagLabel.getDiags();
+        if(ListUtil.isNotEmpty(diags)){
+            wordCrfDTO.getDiag().addAll(diags.stream().filter(x ->x.getStandName()!= null).map(x ->{
+                Item i = new Item();
+                i.setName(x.getName());
+                i.setUniqueName(x.getStandName());
+                return i;
+            }).collect(Collectors.toList()));
+        }
         PresentLabel presentLabel = wordCrfDTO.getPresentLabel();
         List<com.diagbot.model.entity.Lis> lises = presentLabel.getLises();
         List<Lis> lisList = new ArrayList<>();

+ 93 - 97
src/main/java/com/diagbot/facade/NeoFacade.java

@@ -110,7 +110,7 @@ public class NeoFacade {
 
         String med_type;
         String med_name;
-        String comma="::";
+        String comma = "::";
 
         List<String> medClass = nodeRepository.getMedHuaXueClass();
         medClass.addAll(nodeRepository.getMedYaoLiClass());
@@ -138,26 +138,27 @@ public class NeoFacade {
         return res;
     }
 
-    public void diseasePropertyCache(){
+    public void diseasePropertyCache() {
         List<DiseaseProperty> diseaseProperty = nodeRepository.getDiseaseProperty();
-        if(ListUtil.isNotEmpty(diseaseProperty)){
+        if (ListUtil.isNotEmpty(diseaseProperty)) {
             diseaseProperty.parallelStream().forEach(
-                    x ->{
+                    x -> {
                         String name = x.getName();
                         String sex = x.getSex();
                         String age = x.getAge();
                         String fbl = x.getFbl();
-                        Map<String,String> desc = new HashMap<>();
-                        desc.put("name",name);
-                        desc.put("sex",sex);
-                        desc.put("age",age);
-                        desc.put("fbl",fbl);
-                        redisUtil.updateValue(desc,RedisEnum.diseaseType.getName() + name);
+                        Map<String, String> desc = new HashMap<>();
+                        desc.put("name", name);
+                        desc.put("sex", sex);
+                        desc.put("age", age);
+                        desc.put("fbl", fbl);
+                        redisUtil.updateValue(desc, RedisEnum.diseaseType.getName() + name);
                     }
             );
 
         }
     }
+
     /**
      * 返回图谱中所有症状缓存信息
      *
@@ -168,13 +169,14 @@ public class NeoFacade {
         List<String> symptomClass = nodeRepository.getSymptomClass();
         return symptomClass;
     }
+
     /**
      * 返回图谱中所有疾病和性别信息
      *
      * @return
      */
     @Cacheable(value = "cache", key = "'disSexCache'")
-    public Map<String,String> getDisSexCache() {
+    public Map<String, String> getDisSexCache() {
         Map<String, String> disSexClass = Maps.newHashMap();
         List<String> disSex = nodeRepository.getDisSexClass();
         if (ListUtil.isNotEmpty(disSex)) {
@@ -185,37 +187,39 @@ public class NeoFacade {
         }
         return disSexClass;
     }
+
     /**
      * 返回图谱中所有疾病和年龄信息
      *
      * @return
      */
     @Cacheable(value = "cache", key = "'disAgeCache'")
-    public Map<String,String> getDisAgeCache() {
+    public Map<String, String> getDisAgeCache() {
         Map<String, String> disAgeClass = Maps.newHashMap();
         List<String> ageClass = nodeRepository.getDisAgeClass();
-        if(ListUtil.isNotEmpty(ageClass)){
-            ageClass.parallelStream().forEach(x ->{
+        if (ListUtil.isNotEmpty(ageClass)) {
+            ageClass.parallelStream().forEach(x -> {
                 String[] splits = x.split("&");
-                disAgeClass.put(splits[0],splits[1]);
+                disAgeClass.put(splits[0], splits[1]);
             });
         }
         return disAgeClass;
     }
+
     /**
      * 返回图谱中所有疾病和发病率信息
      *
      * @return
      */
     @Cacheable(value = "cache", key = "'disdistributionCache'")
-    public Map<String,Double> getDisdistributionCache() {
+    public Map<String, Double> getDisdistributionCache() {
         DecimalFormat df = new DecimalFormat("0.######");
-        Map<String,Double> disdistribution = new HashMap<>();
+        Map<String, Double> disdistribution = new HashMap<>();
         List<String> disdistributionClass = nodeRepository.getDisdistributionClass();
-        if(ListUtil.isNotEmpty(disdistributionClass)){
-            disdistributionClass.parallelStream().forEach(x ->{
+        if (ListUtil.isNotEmpty(disdistributionClass)) {
+            disdistributionClass.parallelStream().forEach(x -> {
                 String[] splits = x.split("&");
-                disdistribution.put(splits[0],Double.parseDouble(splits[1]));
+                disdistribution.put(splits[0], Double.parseDouble(splits[1]));
             });
         }
         return disdistribution;
@@ -232,6 +236,7 @@ public class NeoFacade {
         this.diseasePropertyCache();
 
     }
+
     /**
      * 图谱反推的数据
      *
@@ -263,16 +268,16 @@ public class NeoFacade {
         //如果化验有特异性就直接推送疾病
         List<Lis> lises = null;
         LisPushVo lisPushVo = pushVO.getLisPushVo();
-        if(lisPushVo != null){
+        if (lisPushVo != null) {
             lises = lisPushVo.getLises();
         }
-        if(ListUtil.isNotEmpty(lises)){
+        if (ListUtil.isNotEmpty(lises)) {
             List<String> lis_dis = lises.parallelStream()
-                    .map(x -> nodeRepository.getDisByLis_Special(x.getName(), x.getUniqueName()+x.getResult()))
+                    .map(x -> nodeRepository.getDisByLis_Special(x.getName(), x.getUniqueName() + x.getResult()))
                     .flatMap(List::stream).collect(Collectors.toList());
-            if(ListUtil.isNotEmpty(lis_dis)){
-                filterAndSort(neoPushDTOS,lis_dis,sex,age);
-                if(ListUtil.isNotEmpty(neoPushDTOS)){
+            if (ListUtil.isNotEmpty(lis_dis)) {
+                filterAndSort(neoPushDTOS, lis_dis, sex, age);
+                if (ListUtil.isNotEmpty(neoPushDTOS)) {
                     return neoPushDTOS;
                 }
             }
@@ -284,73 +289,69 @@ public class NeoFacade {
         List<String> symptoms = new ArrayList<>();
         List<String> symptom_chief = new ArrayList<>();
         List<String> symptom_present = new ArrayList<>();
-        if(chiefPushVo != null){
-            if (ListUtil.isNotEmpty(chiefPushVo.getSymptoms())){
+        if (chiefPushVo != null) {
+            if (ListUtil.isNotEmpty(chiefPushVo.getSymptoms())) {
                 symptom_chief = chiefPushVo.getSymptoms().stream().map(x -> x.getName()).collect(Collectors.toList());
             }
         }
-        if(presentPushVo != null){
-            if (ListUtil.isNotEmpty(presentPushVo.getSymptoms())){
+        if (presentPushVo != null) {
+            if (ListUtil.isNotEmpty(presentPushVo.getSymptoms())) {
                 symptom_present = presentPushVo.getSymptoms().stream().map(x -> x.getName()).collect(Collectors.toList());
             }
         }
-        symptoms = Stream.of(symptom_chief,symptom_present).flatMap(Collection::stream).distinct().collect(Collectors.toList());
+        symptoms = Stream.of(symptom_chief, symptom_present).flatMap(Collection::stream).distinct().collect(Collectors.toList());
         //症状、体征推疾病
-        List<String> allDis_bySymptom = getDisBySymptom(symptoms,age,sex);
+        List<String> allDis_bySymptom = getDisBySymptom(symptoms, age, sex);
         allDis.addAll(allDis_bySymptom);
         //化验推出的疾病
-
-            if(ListUtil.isNotEmpty(lises)){
-                /*List<String> lis_dis = lises.parallelStream()
-                        .map(x -> nodeRepository.getDisByLis(x.getUniqueName(), x.getDetailName()))
-                        .filter(z->z!=null && NeoUtil.matchBasic(z,sex,age)).map(z->z.getName())
-                        .collect(Collectors.toList());*/
-                List<String> lis_dis = lises.parallelStream()
-                        .map(x -> nodeRepository.getDisByLis(x.getName(), x.getUniqueName()+x.getResult()))
-                        .flatMap(List::stream).collect(Collectors.toList());
-                allDis.addAll(lis_dis);
-            }
+        if (ListUtil.isNotEmpty(lises)) {
+            List<String> lis_dis = lises.parallelStream()
+                    .map(x -> nodeRepository.getDisByLis(x.getName(), x.getUniqueName() + x.getResult()))
+                    .flatMap(List::stream).collect(Collectors.toList());
+            allDis.addAll(lis_dis);
+        }
 
         //辅检推出的疾病
         PacsPushVo pacsPushVo = pushVO.getPacsPushVo();
-        if(pacsPushVo !=null){
+        if (pacsPushVo != null) {
             List<Item> pacs = pacsPushVo.getPacs();
-            if(ListUtil.isNotEmpty(pacs)){
+            if (ListUtil.isNotEmpty(pacs)) {
                 List<String> pacsNames = pacs.stream().map(x -> x.getUniqueName()).collect(Collectors.toList());
                 List<String> allDis_byPacsResult = getDisByPacsResult(pacsNames, age, sex);
                 allDis.addAll(allDis_byPacsResult);
             }
         }
-        filterAndSort(neoPushDTOS, allDis,sex,age);
+        filterAndSort(neoPushDTOS, allDis, sex, age);
 
         return neoPushDTOS;
     }
 
     private void filterAndSort(List<NeoPushDTO> neoPushDTOS, List<String> allDis, int gender_code, double age) {
         //推送出的所有疾病进行性别和年龄的过滤
-        List<Map<String,String>> diseases = null;
-        Map<String,Double> dis_fbl = new HashMap<>();
-        if(ListUtil.isNotEmpty(allDis)){
-            diseases = redisUtil.get(allDis);
-            allDis = diseases.stream().filter(x -> NeoUtil.matchBasic(x,gender_code,age)).map(x -> x.get("name")).collect(Collectors.toList());
-            diseases.forEach(x -> dis_fbl.put(x.get("name"),Double.parseDouble(x.get("fbl"))));
+        List<Map<String, String>> diseases = null;
+        Map<String, Double> dis_fbl = new HashMap<>();
+        if (ListUtil.isNotEmpty(allDis)) {
+//            diseases = redisUtil.get(allDis);
+            diseases = redisUtil.geth(allDis);
+            allDis = diseases.stream().filter(x -> NeoUtil.matchBasic(x, gender_code, age)).map(x -> x.get("name")).collect(Collectors.toList());
+            diseases.forEach(x -> dis_fbl.put(x.get("name"), Double.parseDouble(x.get("fbl"))));
         }
 
-        Map<Long,List<String>> numberDiseasesMap = disCountSort(allDis);
+        Map<Long, List<String>> numberDiseasesMap = disCountSort(allDis);
         //根据发病率排序
 //        Map<String, Double> disdistributionCache = self.getDisdistributionCache();
-        Map<Long,Map<String,Double>> disPack = new LinkedHashMap<>();
-        numberDiseasesMap.forEach((x,y)->{
+        Map<Long, Map<String, Double>> disPack = new LinkedHashMap<>();
+        numberDiseasesMap.forEach((x, y) -> {
             Map<String, Double> collect = y.stream()
                     .collect(Collectors.toMap(v -> v, v -> dis_fbl.get(v), (e1, e2) -> e2));
-            disPack.put(x,collect);
+            disPack.put(x, collect);
         });
-        disPack.forEach((x,y)->{
+        disPack.forEach((x, y) -> {
             Map<String, Double> collect = y.entrySet().stream()
                     .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
-                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));
-            disPack.put(x,collect);
-            collect.forEach((k,n)->{
+                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
+            disPack.put(x, collect);
+            collect.forEach((k, n) -> {
                 NeoPushDTO neoPushDTO = new NeoPushDTO();
                 PushBaseDTO pushBaseDTO = new PushBaseDTO();
                 pushBaseDTO.setName(k);
@@ -360,17 +361,17 @@ public class NeoFacade {
         });
     }
 
-    public List<String> getDisBySymptom(List<String> symptoms,Double age,Integer sex){
+    public List<String> getDisBySymptom(List<String> symptoms, Double age, Integer sex) {
         List<String> symptomCache = getSymptomCache();
         //取交集
         symptoms.retainAll(symptomCache);
         long start = System.currentTimeMillis();
-        List<String> allDis_bySymptom = pushDisBySymptom(symptomNameRepository, symptoms,age,sex);
+        List<String> allDis_bySymptom = pushDisBySymptom(symptomNameRepository, symptoms, age, sex);
         long end = System.currentTimeMillis();
         return allDis_bySymptom;
-        }
+    }
 
-    public List<String> getDisByPacsResult(List<String> pacsResult,Double age,Integer sex){
+    public List<String> getDisByPacsResult(List<String> pacsResult, Double age, Integer sex) {
 
         /*List<PacsResult> byNameIn = pacsResultRepository.findByNameIn(pacsResult);
         List<String> allDis = byNameIn.stream()
@@ -381,14 +382,14 @@ public class NeoFacade {
     }
 
 
-
     /**
      * 症状、体征、化验、辅检等其他推送疾病
+     *
      * @param symptomNameRepository
      * @param symptoms
      * @return
      */
-    public List<String> pushDisBySymptom(SymptomNameRepository symptomNameRepository,List<String> symptoms,Double age,Integer sex){
+    public List<String> pushDisBySymptom(SymptomNameRepository symptomNameRepository, List<String> symptoms, Double age, Integer sex) {
         List<String> allDis = Lists.newArrayList();
         /*List<Symptom> byNameIn = symptomNameRepository.findByNameIn(symptoms);
         allDis = byNameIn.parallelStream()
@@ -401,10 +402,11 @@ public class NeoFacade {
 
     /**
      * 推送的疾病计数排序
+     *
      * @param allDis
      * @return
      */
-    public Map<Long,List<String>> disCountSort(List<String> allDis) {
+    public Map<Long, List<String>> disCountSort(List<String> allDis) {
         Map<String, Long> dis_count = allDis.stream().collect(
 
                 Collectors.groupingBy(Function.identity(), Collectors.counting())
@@ -421,16 +423,16 @@ public class NeoFacade {
                     }).get();
 
         }
-        Map<Long,List<String>> number_diseases = new LinkedHashMap<>();
-        dis_count.forEach((x,y)->{
-            if(number_diseases.containsKey(y)){
+        Map<Long, List<String>> number_diseases = new LinkedHashMap<>();
+        dis_count.forEach((x, y) -> {
+            if (number_diseases.containsKey(y)) {
                 List<String> diseases = number_diseases.get(y);
                 diseases.add(x);
-                number_diseases.put(y,diseases);
-            }else {
+                number_diseases.put(y, diseases);
+            } else {
                 List<String> diseases = Lists.newArrayList();
                 diseases.add(x);
-                number_diseases.put(y,diseases);
+                number_diseases.put(y, diseases);
             }
         });
         return number_diseases;
@@ -454,8 +456,7 @@ public class NeoFacade {
             billNeoDTOs.addAll(getOperationBill(billNeoVO.getOperationList()));
             billNeoDTOs.addAll(getCombiOpBill(billNeoVO.getCombiopList()));
             billNeoDTOs.addAll(getTransfusionBill(billNeoVO.getTransfusionList()));
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             ex.printStackTrace();
         }
 
@@ -524,21 +525,18 @@ public class NeoFacade {
                         unit = lis.getUnits();
                         for (LisRemind lisRemind : lrlist) {
                             if (lisRemind.getRange() == 0) { /*&& lisRemind.getUnit().equals(unit) &&*/
-                                if (null==lisRemind.getMinval() && val <= lisRemind.getMaxval()) {
+                                if (null == lisRemind.getMinval() && val <= lisRemind.getMaxval()) {
                                     otherTipNeoDTOS = updateTipNeoDTO(otherTipNeoDTOS, lis, lisRemind);
-                                }
-                                else if(null==lisRemind.getMaxval() && val >= lisRemind.getMinval()) {
+                                } else if (null == lisRemind.getMaxval() && val >= lisRemind.getMinval()) {
                                     otherTipNeoDTOS = updateTipNeoDTO(otherTipNeoDTOS, lis, lisRemind);
-                                }
-                                else if (null!=lisRemind.getMinval() && null!=lisRemind.getMaxval() &&
-                                  val <= lisRemind.getMaxval() && val >= lisRemind.getMinval()) {
+                                } else if (null != lisRemind.getMinval() && null != lisRemind.getMaxval() &&
+                                        val <= lisRemind.getMaxval() && val >= lisRemind.getMinval()) {
                                     otherTipNeoDTOS = updateTipNeoDTO(otherTipNeoDTOS, lis, lisRemind);
                                 }
                             } else if (lisRemind.getRange() == 1) { /*&& lisRemind.getUnit().equals(unit) &&*/
-                                if (null!=lisRemind.getMaxval() && val > lisRemind.getMaxval()) {
+                                if (null != lisRemind.getMaxval() && val > lisRemind.getMaxval()) {
                                     otherTipNeoDTOS = updateTipNeoDTO(otherTipNeoDTOS, lis, lisRemind);
-                                }
-                                else if (null!=lisRemind.getMinval() && val < lisRemind.getMinval()){
+                                } else if (null != lisRemind.getMinval() && val < lisRemind.getMinval()) {
                                     otherTipNeoDTOS = updateTipNeoDTO(otherTipNeoDTOS, lis, lisRemind);
                                 }
                             }
@@ -557,8 +555,7 @@ public class NeoFacade {
 
                 }
             }
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             ex.printStackTrace();
         }
 
@@ -672,7 +669,6 @@ public class NeoFacade {
     }
 
 
-
     /**
      * 处理手术开单合理性
      */
@@ -719,14 +715,14 @@ public class NeoFacade {
         YiBaoDiseaseNode icdDiseaseNode = new YiBaoDiseaseNode();
         String term;
         term = neoPushVO.getDiagVo().getDiags().get(0).getName();
-            List<YiBaoDiseaseName> yiBaoName = yiBaoDiseaseRepository.findByNameIs(term);
-            YiBaoDiseaseName icdDisease = null;
-            if(ListUtil.isNotEmpty(yiBaoName)){
-                icdDisease = yiBaoName.get(0);
-            }
-            if (icdDisease != null) {
-                pushDTO = icdDiseaseNode.YiBaoDiseasetoDiseaseDTO(icdDisease, neoPushVO);
-            }
+        List<YiBaoDiseaseName> yiBaoName = yiBaoDiseaseRepository.findByNameIs(term);
+        YiBaoDiseaseName icdDisease = null;
+        if (ListUtil.isNotEmpty(yiBaoName)) {
+            icdDisease = yiBaoName.get(0);
+        }
+        if (icdDisease != null) {
+            pushDTO = icdDiseaseNode.YiBaoDiseasetoDiseaseDTO(icdDisease, neoPushVO);
+        }
 
         return pushDTO;
     }
@@ -813,7 +809,7 @@ public class NeoFacade {
      * 类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 辅助检查:vital"
      *
      * @param standConvert
-     * @return Map<String   ,       Map   <   String   ,       String>> -->Map<类型, Map<原始词, 标准词>>
+     * @return Map<String, Map < String, String>> -->Map<类型, Map<原始词, 标准词>>
      */
     public Map<String, Map<String, String>> standConvertCrf(StandConvert standConvert) {
         Map<String, Map<String, String>> map = new LinkedHashMap<>();
@@ -867,7 +863,7 @@ public class NeoFacade {
 
         if (ListUtil.isNotEmpty(wordList)) {
             for (String s : wordList) {
-                String value = redisUtil.getWithString(type +  "Conv:" + s);
+                String value = redisUtil.getWithString(type + "Conv:" + s);
                 if (StringUtil.isBlank(value)) {
                     StandConvertCrfVO standConvertCrfVO = new StandConvertCrfVO();
                     standConvertCrfVO.setWord_type(type);

+ 8 - 5
src/main/java/com/diagbot/util/RedisUtil.java

@@ -10,12 +10,9 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.SessionCallback;
 import org.springframework.stereotype.Component;
 
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @description:
@@ -105,6 +102,12 @@ public class RedisUtil {
         });
     }
 
+    public List<Map<String,String>> geth(List<String> keys) {
+        keys = keys.stream().map(x ->RedisEnum.diseaseType.getName()+x).collect(Collectors.toList());
+        List<Map<String,String>> list = redisTemplate.opsForValue().multiGet(keys);
+        return list;
+    }
+
     /**
      * 根据指定key获取value
      *