Browse Source

Merge remote-tracking branch 'origin/dev/diagnose20210315' into dev/diagnose20210315

wangfeng 4 years ago
parent
commit
7643806099

+ 1 - 1
pom.xml

@@ -279,7 +279,7 @@
                     <forceTags>true</forceTags>
                     <!--镜像的FROM,使用压缩的小镜像-->
                     <baseImage>frolvlad/alpine-oraclejre8:slim</baseImage>
-                    <entryPoint>["java", "-jar", "-Xms256m", "-Xmx3072m", "-Duser.timezone=GMT+8", "/${project.build.finalName}.jar"]</entryPoint>
+                    <entryPoint>["java", "-jar", "-Xms256m", "-Xmx4096m", "-Duser.timezone=GMT+8", "/${project.build.finalName}.jar"]</entryPoint>
                     <resources>
                         <resource>
                             <targetPath>/</targetPath>

+ 54 - 28
src/main/java/com/diagbot/facade/PushFacade.java

@@ -8,6 +8,7 @@ import com.diagbot.dto.PushPlanDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.enums.DiagnoseTypeEnum;
 import com.diagbot.enums.DiseasePushTypeEnum;
+import com.diagbot.enums.DiseaseTypeEnum;
 import com.diagbot.enums.RedisEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
@@ -149,10 +150,11 @@ public class PushFacade {
             } catch (Exception e) {
                 throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "推送服务出错" + e.getMessage());
             }
-            // 诊断去重、合并处理
-            dealDisease(pushDTO);
         }
 
+        // 诊断去重、合并处理、过滤
+        dealDisease(pushDTO, wordCrfDTO, pushVo.getLength(), hasDiseaseFlag);
+
         // 通过诊断反推
         long reverseStart = System.currentTimeMillis();
         pushProcess.process(pushDTO, pushVo, wordCrfDTO);
@@ -168,38 +170,62 @@ public class PushFacade {
      * 诊断去重、合并处理
      * @param pushDTO
      */
-    public void dealDisease(PushDTO pushDTO) {
+    public void dealDisease(PushDTO pushDTO, WordCrfDTO wordCrfDTO, int length, boolean hasDiseaseFlag) {
         Map<String, List<PushBaseDTO>> dis = pushDTO.getDis();
         List<PushBaseDTO> possibleUnion = Lists.newArrayList(); // 可能诊断 = 确诊 + 拟诊 + 大数据推送诊断
-        List<PushBaseDTO> definite = dis.get(DiagnoseTypeEnum.definite.getName()); // 确诊
-        List<PushBaseDTO> protocol = dis.get(DiagnoseTypeEnum.protocol.getName()); // 拟诊
-        List<PushBaseDTO> bigDataPush = dis.get(DiagnoseTypeEnum.bigDataPush.getName()); // 大数据推送诊断
-        // 合并可能诊断
-        if (ListUtil.isNotEmpty(definite)) {
-            possibleUnion.addAll(definite);
+        // 无界面诊断
+        if (!hasDiseaseFlag) {
+            List<PushBaseDTO> definite = dis.get(DiagnoseTypeEnum.definite.getName()); // 确诊
+            List<PushBaseDTO> protocol = dis.get(DiagnoseTypeEnum.protocol.getName()); // 拟诊
+            List<PushBaseDTO> bigDataPush = dis.get(DiagnoseTypeEnum.bigDataPush.getName()); // 大数据推送诊断
+            // 合并可能诊断
+            if (ListUtil.isNotEmpty(definite)) {
+                possibleUnion.addAll(definite);
+            }
+            if (ListUtil.isNotEmpty(protocol)) {
+                possibleUnion.addAll(protocol);
+            }
+            if (ListUtil.isNotEmpty(bigDataPush)) {
+                possibleUnion.addAll(bigDataPush);
+            }
+            // 去重
+            CoreUtil.removeByRepeatProperty(possibleUnion, "name");
         }
-        if (ListUtil.isNotEmpty(protocol)) {
-            possibleUnion.addAll(protocol);
+        // 获取既往史否定诊断
+        List<String> negativeDis = CoreUtil.getPropertyWithFilter(wordCrfDTO.getPastLabel().getDiags(),
+                "standName", "negative");
+        if (ListUtil.isNotEmpty(negativeDis)) { // 添加既往史否定诊断
+            pushDTO.getDis().put("既往史否定诊断", pushProcess.generatePushBaseDTO(negativeDis, -1));
+            // 可能诊断——剔除既往否定诊断
+            filterDisease(dis.get(DiagnoseTypeEnum.possibleUnion.getName()), negativeDis);
+            // 鉴别诊断——剔除既往否定诊断
+            filterDisease(dis.get(DiseaseTypeEnum.identify.getName()), negativeDis);
+            // 警惕——剔除既往否定诊断
+            filterDisease(dis.get(DiagnoseTypeEnum.vigilant.getName()), negativeDis);
         }
-        if (ListUtil.isNotEmpty(bigDataPush)) {
-            possibleUnion.addAll(bigDataPush);
+        // 可能诊断根据长度截取
+        possibleUnion = possibleUnion.size() > length ? possibleUnion.subList(0, length) : possibleUnion;
+        // 添加可能诊断
+        dis.put(DiagnoseTypeEnum.possibleUnion.getName(), possibleUnion);
+    }
+
+    /**
+     * 剔除既往否定诊断
+     *
+     * @param pushBaseDTOList
+     * @param negativeDis
+     */
+    public void filterDisease(List<PushBaseDTO> pushBaseDTOList, List<String> negativeDis) {
+        if (ListUtil.isEmpty(pushBaseDTOList) || ListUtil.isEmpty(negativeDis)) {
+            return;
         }
-        // 去重
-        if (ListUtil.isNotEmpty(possibleUnion)) {
-            List<String> diseaseNameList = Lists.newArrayList();
-            Iterator<PushBaseDTO> it = possibleUnion.iterator();
-            while (it.hasNext()) {
-                PushBaseDTO bean = it.next();
-                if (diseaseNameList.contains(bean.getName())) {
-                    it.remove();
-                } else {
-                    diseaseNameList.add(bean.getName());
-                }
+        Iterator<PushBaseDTO> it = pushBaseDTOList.iterator();
+        while (it.hasNext()) {
+            PushBaseDTO bean = it.next();
+            // 剔除既往否定诊断
+            if (negativeDis.contains(bean.getName())) {
+                it.remove();
             }
-            // 添加可能诊断
-            dis.put(DiagnoseTypeEnum.possibleUnion.getName(), possibleUnion);
-            // 如果需要删除诊断,就用以下代码
-            // dis.put(DiagnoseTypeEnum.possibleUnion.getName(), BeanUtil.listCopyTo(possibleUnion, PushDTO.class));
         }
     }
 

+ 11 - 11
src/main/java/com/diagbot/process/PushProcess.java

@@ -575,7 +575,7 @@ public class PushProcess {
      * @param key
      * @param filteString
      */
-    public void  dealFilter(Map<String, List<String>> map, String key, List<String> filteString) {
+    public void dealFilter(Map<String, List<String>> map, String key, List<String> filteString) {
         if (ListUtil.isEmpty(filteString)) {
             return;
         }
@@ -602,7 +602,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.Symptom.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.Symptom.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.symptom.toString())); // 过滤界面已有
-                pushDTO.setSymptom(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setSymptom(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
         // 查体结果
@@ -610,7 +610,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.VitalResult.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.VitalResult.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.vital.toString())); // 过滤界面已有
-                pushDTO.setVital(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setVital(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
         // 化验套餐
@@ -618,7 +618,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.LisName.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.LisName.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.lis.toString())); // 过滤界面已有
-                pushDTO.setLis(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setLis(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
         // 辅检项目
@@ -626,7 +626,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.PacsName.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.PacsName.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.pacs.toString())); // 过滤界面已有
-                pushDTO.setPacs(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setPacs(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
         // 鉴别诊断, 注意这个类型与其他类型不一样
@@ -634,7 +634,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.Disease.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.Disease.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.disease.toString())); // 过滤界面已有
-                List<PushBaseDTO> pushBaseDTO = getPushBaseDTO(list, length);
+                List<PushBaseDTO> pushBaseDTO = generatePushBaseDTO(list, length);
                 if (ListUtil.isNotEmpty(pushBaseDTO)) {
                     dis.put(DiseaseTypeEnum.identify.getName(), pushBaseDTO);
                 }
@@ -645,7 +645,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.Medicine.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.Medicine.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.drug.toString())); // 过滤界面已有
-                pushDTO.setMedicines(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setMedicines(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
         // 手术
@@ -653,7 +653,7 @@ public class PushProcess {
             if (map.get(LexiconEnum.Operation.getKey()) != null) {
                 List<String> list = map.get(LexiconEnum.Operation.getKey()).stream().map(r -> r.getSonName()).collect(Collectors.toList());
                 CoreUtil.removeRepeat(list, filterMap.get(StandConvertEnum.operation.toString())); // 过滤界面已有
-                pushDTO.setOperations(getPushBaseDTO(list, length)); // 放入对象返回
+                pushDTO.setOperations(generatePushBaseDTO(list, length)); // 放入对象返回
             }
         }
     }
@@ -662,14 +662,14 @@ public class PushProcess {
      * 将名称列表生成推送返回类型
      *
      * @param nameList
-     * @param length   最长个数
+     * @param length   最长个数, -1:无限制
      * @return
      */
-    public List<PushBaseDTO> getPushBaseDTO(List<String> nameList, int length) {
+    public List<PushBaseDTO> generatePushBaseDTO(List<String> nameList, int length) {
         List<PushBaseDTO> pushBaseDTOList = Lists.newArrayList();
         if (ListUtil.isNotEmpty(nameList)) {
             for (int i = 0; i < nameList.size(); i++) {
-                if (pushBaseDTOList.size() >= length) {
+                 if (length != -1 && pushBaseDTOList.size() >= length) {
                     break;
                 }
                 PushBaseDTO pushBaseDTO = new PushBaseDTO();

+ 98 - 31
src/main/java/com/diagbot/util/CoreUtil.java

@@ -2,6 +2,7 @@ package com.diagbot.util;
 
 import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
+import com.diagbot.dto.PushBaseDTO;
 import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.enums.LexiconEnum;
 import com.diagbot.model.entity.BodyPart;
@@ -161,16 +162,13 @@ public class CoreUtil {
      * @return : 父类中的属性值
      */
     public static Object getFieldValue(Object object, String fieldName) {
-        //根据 对象和属性名通过反射 调用上面的方法获取 Field对象
-        Field field = getDeclaredField(object, fieldName);
-
-        //抑制Java对其的检查
-        field.setAccessible(true);
-
         try {
+            //根据 对象和属性名通过反射 调用上面的方法获取 Field对象
+            Field field = getDeclaredField(object, fieldName);
+            //抑制Java对其的检查
+            field.setAccessible(true);
             //获取 object 中 field 所代表的属性值
             return field.get(object);
-
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -969,36 +967,105 @@ public class CoreUtil {
      *
      * @param list
      */
-    public static List<String> removeRepeat(List<String> list) {
+    public static <T> List<T> removeRepeat(List<T> list) {
         if (ListUtil.isNotEmpty(list) && list.size() > 1) {
             list = list.stream().distinct().collect(Collectors.toList());
         }
         return list;
     }
 
+    /**
+     * 根据属性去除重复元素
+     *
+     * @param source
+     * @param property
+     * @param <T>
+     */
+    public static <T> void removeByRepeatProperty(List<T> source, String property) {
+        if (ListUtil.isEmpty(source)) {
+            return ;
+        }
+        List<Object> list = Lists.newArrayList();
+        Iterator<T> iterator = source.iterator();
+        T t = null;
+        Object object = null;
+        while(iterator.hasNext()) {
+            t = iterator.next();
+            object = getFieldValue(t, property);
+            if (list.contains(object)) {
+                iterator.remove();
+            } else {
+                list.add(object);
+            }
+        }
+    }
+
+    /**
+     * 获取指定属性且过滤属性的名称列表,例如:获取对象negative不为null的uniqueName字段值
+     *
+     * @param input
+     * @param propertyName
+     * @param filterProperty
+     * @param <T>
+     * @return
+     */
+    public static <T> List<String> getPropertyWithFilter(List<T> input, String propertyName, String filterProperty) {
+        List<String> res = Lists.newArrayList();
+        if (ListUtil.isNotEmpty(input)) {
+            for (T d : input) {
+                Negative val = (Negative) CoreUtil.getFieldValue(d, filterProperty);
+                if (val != null) {
+                    String name = (String) CoreUtil.getFieldValue(d, propertyName);
+                    if (StringUtil.isNotBlank(name)) {
+                        res.add(name);
+                    }
+                }
+            }
+        }
+        return res;
+    }
+
     public static void main(String[] args) {
-        List<Item> list = new ArrayList<>();
-        Item item = new Item();
-        item.setUniqueName("test1");
-        item.setName("test");
-        list.add(item);
-
-        Item item2 = new Item();
-        item2.setUniqueName("test2");
-        item2.setName("test");
-        list.add(item2);
-
-        Item item3 = new Item();
-        item3.setUniqueName("test1");
-        item3.setName("test");
-        list.add(item3);
-
-        Item item4 = new Item();
-        item4.setUniqueName("test2");
-        item4.setName("test");
-        list.add(item4);
-        Map<String, List<Item>> map = makeEntityListMap(list, "name", "uniqueName");
-
-        System.out.println(map);
+        List<PushBaseDTO> pushBaseDTOList = ListUtil.newArrayList();
+        PushBaseDTO pushBaseDTO = new PushBaseDTO();
+        pushBaseDTO.setName("a1");
+        pushBaseDTOList.add(pushBaseDTO);
+
+        PushBaseDTO pushBaseDTO1 = new PushBaseDTO();
+        pushBaseDTO1.setName("a1");
+        pushBaseDTOList.add(pushBaseDTO1);
+
+        removeByRepeatProperty(pushBaseDTOList, "name");
+        System.out.println(pushBaseDTOList);
+
+        // List<String> list = Lists.newArrayList("a","b","a");
+        // list = removeRepeat(list);
+        // System.out.println(list);
+        // System.out.println(pushBaseDTOList);
+
+
+        // List<Item> list = new ArrayList<>();
+        // Item item = new Item();
+        // item.setUniqueName("test1");
+        // item.setName("test");
+        // list.add(item);
+        //
+        // Item item2 = new Item();
+        // item2.setUniqueName("test2");
+        // item2.setName("test");
+        // list.add(item2);
+        //
+        // Item item3 = new Item();
+        // item3.setUniqueName("test1");
+        // item3.setName("test");
+        // list.add(item3);
+        //
+        // Item item4 = new Item();
+        // item4.setUniqueName("test2");
+        // item4.setName("test");
+        // list.add(item4);
+        // Map<String, List<Item>> map = makeEntityListMap(list, "name", "uniqueName");
+        //
+        // System.out.println(map);
     }
 }