瀏覽代碼

Merge remote-tracking branch 'origin/push-grade' into push-test

louhr 5 年之前
父節點
當前提交
6f67259ea9

+ 41 - 0
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -2,6 +2,7 @@ package org.diagbot.bigdata.common;
 
 import org.diagbot.bigdata.dao.model.ResultMappingFilter;
 import org.diagbot.bigdata.util.BigDataConstants;
+import org.diagbot.common.javabean.Rule;
 import org.diagbot.nlp.participle.ParticipleUtil;
 import org.diagbot.nlp.participle.cfg.Configuration;
 import org.diagbot.nlp.participle.cfg.DefaultConfig;
@@ -30,6 +31,9 @@ public class ApplicationCacheUtil {
     public static Map<String, Map<String, ResultMappingFilter>> doc_result_mapping_filter_map = null;
     //诊断依据标准词
     public static Map<String, List<Map<String, String>>> kl_result_mapping_standword_map = null;
+    // 规则
+    public static Map<String, List<Rule>> rule_filter_map = null;
+
 
     public static Map<String, Map<String, String>> getStandard_info_synonym_map() {
         if (standard_info_synonym_map == null) {
@@ -214,6 +218,43 @@ public class ApplicationCacheUtil {
         return kl_result_mapping_standword_map;
     }
 
+    public static Map<String, List<Rule>> get_rule_filter_map() {
+        if (rule_filter_map == null || rule_filter_map.size() == 0) {
+            create_rule_filter_map();
+        }
+        return rule_filter_map;
+    }
+
+    public static void create_rule_filter_map() {
+        rule_filter_map = new HashMap<>();
+        List<Rule> rulelist;
+        Map<String, String> rule;
+        String key;
+
+        String[] labels = {"set_name","idx_name","min_operator","min_value","min_unit",
+                "max_operator","max_value","max_unit","remind"};
+
+        Configuration configuration = new DefaultConfig();
+        List<String> fileContents = configuration.readFileContents("rule_filter.dict");
+
+        for (String line:fileContents) {
+            rule = new HashMap<>();
+            String[] content = line.split("\\|");
+            if (labels.length == content.length) {
+//                for (int i=0; i<labels.length; i++) {
+//                    rule.put(labels[i], content[i]);
+//                }
+//                key = content[0] + "--" + content[1];
+                key = content[1];
+                if (rule_filter_map.get(key) == null) {
+                    rule_filter_map.put(key, new ArrayList<>());
+                }
+                rulelist = rule_filter_map.get(key);
+                rulelist.add(new Rule(content));
+            }
+        }
+    }
+
     public static void setProterty(Lexeme lexeme) {
         for (String featureType : lexeme.getProperty().split(",")) {
             switch (featureType) {

+ 1 - 1
bigdata-web/src/main/java/org/diagbot/bigdata/controller/AlgorithmController.java

@@ -34,7 +34,7 @@ public class AlgorithmController extends BaseController {
     public Response<ResponseData> algorithm(HttpServletRequest request, SearchData searchData) throws Exception {
         Response<ResponseData> response = new Response();
         AlgorithmCore core = new AlgorithmCore();
-        ResponseData responseData = core.algorithm(request, searchData);
+        ResponseData responseData = core.algorithm(request, searchData, null);
         response.setData(responseData);
         return response;
     }

+ 4 - 2
bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java

@@ -25,8 +25,10 @@ import java.util.*;
  **/
 public class AlgorithmCore {
     Logger logger = LoggerFactory.getLogger(AlgorithmCore.class);
-    public ResponseData algorithm(HttpServletRequest request, SearchData searchData) throws Exception {
-        ResponseData responseData = new ResponseData();
+    public ResponseData algorithm(HttpServletRequest request, SearchData searchData, ResponseData responseData) throws Exception {
+        if (responseData == null) {
+            responseData = new ResponseData();
+        }
         //录入文本处理,包括提取特征、推送类型转换等
         ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
         logger.info("页面文本信息:" + searchData.getSymptom());

+ 23 - 0
common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java

@@ -328,6 +328,29 @@ public class CacheFileManager {
                 fw.write("\n");
             }
             fw.close();
+
+            //规则过滤信息
+            sql = "SELECT set_name, idx_name, min_operator, min_value, min_unit, max_operator, " +
+                    " max_value, max_unit, remind FROM kl_rule ";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            fw = new FileWriter(path + "rule_filter.dict");
+            String r6, r7, r8, r9;
+            while (rs.next()) {
+                r1 = rs.getString(1);
+                r2 = rs.getString(2);
+                r3 = rs.getString(3);
+                r4 = rs.getString(4);
+                r5 = rs.getString(5);
+                r6 = rs.getString(6);
+                r7 = rs.getString(7);
+                r8 = rs.getString(8);
+                r9 = rs.getString(9);
+                fw.write(encrypDES.encrytor(r1+ "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5
+                        + "|" + r6 + "|" + r7 + "|" + r8 + "|" + r9));
+                fw.write("\n");
+            }
+            fw.close();
         } catch (IOException ioe) {
             ioe.printStackTrace();
         } catch (SQLException sqle) {

+ 4 - 4
common-push/src/main/java/org/diagbot/common/push/filter/ClassifyDiag.java

@@ -264,10 +264,10 @@ public class ClassifyDiag {
      * @return
      */
     public Set<String> diagProcess(List<String> disList,int sign){
-        Set<String> first = new HashSet<>();
-        Set<String> second= new HashSet<>();
-        Set<String> third= new HashSet<>();
-        Set<String> other= new HashSet<>();
+        Set<String> first = new LinkedHashSet<>();
+        Set<String> second= new LinkedHashSet<>();
+        Set<String> third= new LinkedHashSet<>();
+        Set<String> other= new LinkedHashSet<>();
 
         /**
          * 分级

+ 7 - 0
common-service/src/main/java/org/diagbot/common/javabean/MedicalIndication.java

@@ -7,6 +7,7 @@ import java.util.List;
  */
 public class MedicalIndication {
     private String name;
+    private String rule;
     private List<MedicalIndicationDetail> details;
 
     public String getName() {
@@ -17,6 +18,12 @@ public class MedicalIndication {
         this.name = name;
     }
 
+    public String getRule() {
+        return rule;
+    }
+
+    public void setRule(String rule) { this.rule = rule; }
+
     public List<MedicalIndicationDetail> getDetails() {
         return details;
     }

+ 50 - 0
common-service/src/main/java/org/diagbot/common/javabean/Rule.java

@@ -0,0 +1,50 @@
+package org.diagbot.common.javabean;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 触发规则
+ * @author Mark Huang
+ * @since 27/08/2019
+ */
+@Getter
+@Setter
+public class Rule {
+    // 套餐名称
+    private String set_name;
+    // 指标名称
+    private String idx_name;
+    // 最小值操作符
+    private String min_operator;
+    // 最小值
+    private String min_value;
+    // 最小值单位
+    private String min_unit;
+    // 最大值操作符
+    private String max_operator;
+    // 最大值
+    private String max_value;
+    // 最大值单位
+    private String max_unit;
+    // 推送名称
+    private String remind;
+
+    public Rule() { }
+
+    public Rule(String[] elements) {
+//        Rule rule = new Rule();
+
+        if (elements.length == 9) {
+            this.set_name = elements[0];
+            this.idx_name = elements[1];
+            this.min_operator = elements[2];
+            this.min_value = elements[3];
+            this.min_unit = elements[4];
+            this.max_operator = elements[5];
+            this.max_value = elements[6];
+            this.max_unit = elements[7];
+            this.remind = elements[8];
+        }
+    }
+}

+ 4 - 3
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -158,9 +158,10 @@ public class GraphCalculate {
             //查找指标
             Set<String> indSet = neo4jAPI.getInd((String[]) inputList.toArray(new String[inputList.size()]));
             logger.info("featureTypeList 包含22,走指标推送!!!,图谱推出的指标为:" + indSet);
-            List<MedicalIndication> idn = neo4jAPI.getIdn(indSet, age, sex);
-            responseData.setMedicalIndications(idn);
-
+            if(indSet.contains("肾功能不全")){
+                List<MedicalIndication> idn = neo4jAPI.getIdn(indSet, age, sex);
+                responseData.setMedicalIndications(idn);
+            }
         }
 
         //诊断推送

+ 7 - 0
pom.xml

@@ -253,6 +253,13 @@
             <artifactId>fastjson</artifactId>
             <version>1.2.46</version>
         </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.mongodb/bson -->
+        <dependency>
+            <groupId>org.mongodb</groupId>
+            <artifactId>bson</artifactId>
+            <version>3.10.1</version>
+        </dependency>
     </dependencies>
 
     <!-- .properties xml进行打包 -->

+ 19 - 3
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.diagbot.push.convert.PreProcess;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
@@ -120,10 +121,15 @@ public class AlgorithmController extends BaseController {
     }
 
     public Response<ResponseData> combine(HttpServletRequest request, SearchData searchData) throws Exception {
+        logger.info("开始规则转换......");
+        PreProcess prepro = new PreProcess();
+        searchData = prepro.processClinicalData(searchData);
+        ResponseData RuleResponseData = prepro.applyrules(searchData);
+
         logger.info("开始推送服务......");
         Response<ResponseData> response = new Response();
         AlgorithmCore core = new AlgorithmCore();
-        ResponseData bigDataResponseData = core.algorithm(request, searchData);
+        ResponseData bigDataResponseData = core.algorithm(request, searchData, RuleResponseData);
 
         GraphCalculate graphCalculate = new GraphCalculate();
         ResponseData graphResponseData = graphCalculate.calculate(request, searchData);
@@ -154,9 +160,19 @@ public class AlgorithmController extends BaseController {
         searchData.setPushDiags(pushDiags);
         bigDataResponseData.setTreat(graphResponseData.getTreat());
         //量表和指标推送
+        List<MedicalIndication> ruleMedicalIndications = RuleResponseData.getMedicalIndications();
         List<MedicalIndication> medicalIndications = graphResponseData.getMedicalIndications();
         if (medicalIndications != null && medicalIndications.size() > 0) {
             logger.info("指标推送!!!!!!!!!");
+            if(ruleMedicalIndications.size()>0){
+                for (MedicalIndication m:ruleMedicalIndications
+                     ) {
+                    MedicalIndication mI = new MedicalIndication();
+                    mI.setName(m.getName());
+                    medicalIndications.add(mI);
+                }
+            }
+
             bigDataResponseData.setMedicalIndications(medicalIndications);
         }
         //推送管理评估
@@ -172,11 +188,11 @@ public class AlgorithmController extends BaseController {
         Map<String, String> vitalCache = CacheUtil.getVitalCache();
         List<String> featureList = Arrays.asList(searchData.getFeatureTypes());
         List<FeatureRate> vitals = graphResponseData.getVitals();
-        if(featureList.contains(Constants.feature_type_vital_index)){
+        if(featureList.contains(Constants.feature_type_vital_index) && this.getVital(vitalCache,vitals).size() > 0){
             bigDataResponseData.setVitals(this.getVital(vitalCache,vitals));
 
         }
-        if(featureList.contains(Constants.feature_type_vital)){
+        if(featureList.contains(Constants.feature_type_vital) && vitals.size() > 0){
             bigDataResponseData.setVitals(vitals);
         }
 

+ 1 - 0
push-web/src/main/java/org/diagbot/push/controller/CacheFileManagerController.java

@@ -43,6 +43,7 @@ public class CacheFileManagerController extends BaseController {
         ApplicationCacheUtil.createDoc_result_mapping_diag_map();
         ApplicationCacheUtil.createDoc_result_mapping_filter_map();
         ApplicationCacheUtil.createKl_result_mapping_standword_map();
+        ApplicationCacheUtil.create_rule_filter_map();
         return response;
     }
 }

+ 285 - 0
push-web/src/main/java/org/diagbot/push/convert/PreProcess.java

@@ -0,0 +1,285 @@
+package org.diagbot.push.convert;
+
+import org.diagbot.bigdata.common.ApplicationCacheUtil;
+import org.diagbot.common.javabean.MedicalIndication;
+import org.diagbot.common.javabean.Rule;
+import org.diagbot.common.work.LisDetail;
+import org.diagbot.common.work.ResponseData;
+import org.diagbot.common.work.SearchData;
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.Constants;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class PreProcess {
+
+    private static String up = "升高";
+    private static String down = "降低";
+    private static String normal = "正常";
+
+    private static String pos = "阳性";
+    private static String neg = "阴性";
+
+    private List<Map<String, Object>> vitlist = new ArrayList<>();
+    private String[] vitkeyset = {"index", "value", "unit"};
+    private String[] bptype = {"血压","收缩压","舒张压","/"};
+
+    /**
+     * 处理临床数据
+     *
+     * @param searchdata
+     * @return ResponseData
+     */
+    public SearchData processClinicalData(SearchData searchdata) {
+        SearchData sData = searchdata;
+
+        sData.setLisArr(processLis(sData.getLisArr()));
+
+        if (sData.getLisArr().size() > 0) {
+            List<String> otherVal = sData.getLisArr().stream().map(lisArr -> lisArr.getOtherValue()).collect(Collectors.toList());
+            sData.setLis(String.join(",", otherVal));
+        }
+
+        return sData;
+    }
+
+    public ResponseData applyrules(SearchData sData) {
+
+        ResponseData ruleResponse = new ResponseData();
+
+        List<MedicalIndication> reminder;
+        try {
+            Map<String, List<Rule>> rule = ApplicationCacheUtil.get_rule_filter_map();
+
+            reminder = applytolis(sData.getLisArr(), rule);
+
+            reminder.addAll(applytovital(sData.getVital(), rule));
+
+            ruleResponse.setMedicalIndications(reminder);
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return ruleResponse;
+        }
+    }
+
+    private List<MedicalIndication> applytolis(List<LisDetail> lisarr, Map<String, List<Rule>> rule) {
+
+        List<MedicalIndication> reminder = new ArrayList<>();
+        try {
+            String name;
+            String detail;
+
+            for (LisDetail lis : lisarr) {
+                detail = lis.getDetailName();
+//                name = lis.getName();
+                String key = detail;
+                if (rule.get(key) != null) {
+                    reminder.addAll(comparelis(rule.get(key), lis));
+                }
+            }
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+    private List<MedicalIndication> applytovital(String vital, Map<String, List<Rule>> rule) {
+
+        List<MedicalIndication> reminder = new ArrayList<>();
+
+        try {
+            Map<String, Object> vitobj = new HashMap<>();
+            Lexeme lexeme;
+            LexemePath<Lexeme> lexemes = ParticipleUtil.participle(vital);
+            for (int i=0; i<lexemes.size(); i++) {
+                lexeme = lexemes.get(i);
+                if (lexeme.getText().trim().length() > 0) {
+                    if (lexeme.getProperty().equals(Constants.word_property_vital_idx)) {
+                        vitobj = new HashMap<>();
+                        vitobj.put(vitkeyset[0], lexeme.getText());
+                    } else if (lexeme.getProperty().equals(Constants.word_property_number) &&
+                            vitobj.get(vitkeyset[0]) != null) {
+                        vitobj.put(vitkeyset[1], lexeme.getText());
+                    } else if (lexeme.getProperty().equals(Constants.word_property_unit) &&
+                            vitobj.get(vitkeyset[1]) != null) {
+                        vitobj.put(vitkeyset[2], lexeme.getText());
+
+                        if (vitobj.get(vitkeyset[0]).toString().equals(bptype[0]) &&
+                                vitobj.get(vitkeyset[1]).toString().contains(bptype[3])) {
+                            String[] idx = Arrays.asList(bptype).subList(1,3).toArray(new String[2]);
+                            String[] vals = vitobj.get(vitkeyset[1]).toString().split(bptype[3]);
+                            String unit = vitobj.get(vitkeyset[2]).toString();
+
+                            if (idx.length == vals.length) {
+                                for (int j=0; j<idx.length; j++) {
+                                    vitobj = new HashMap<>();
+                                    vitobj.put(vitkeyset[0], idx[j]);
+                                    vitobj.put(vitkeyset[1], vals[j]);
+                                    vitobj.put(vitkeyset[2], unit);
+                                    vitlist.add(vitobj);
+                                }
+                            }
+                        } else {
+                            vitlist.add(vitobj);
+                        }
+                    }
+                }
+//                System.out.println(lexeme.getText() + ": " + lexeme.getProperty());
+            }
+
+            for (Map<String, Object> obj : vitlist) {
+                String idx = obj.get(vitkeyset[0]).toString();
+                if (rule.get(idx) != null) {
+                    reminder.addAll(comparevit(rule.get(idx), obj));
+                }
+            }
+            System.out.println("\n");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+
+    private List<MedicalIndication> comparelis(List<Rule> rules, LisDetail lis) {
+        List<MedicalIndication> reminder = new ArrayList<>();
+
+        try {
+            String detailname = lis.getDetailName();
+            Double numval = lis.getValue();
+            String unit = lis.getUnits();
+            String otherval = lis.getOtherValue();
+
+            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+    private List<MedicalIndication> comparevit(List<Rule> rules, Map<String, Object> vit) {
+        List<MedicalIndication> reminder = new ArrayList<>();
+
+        try {
+            String detailname = vit.get(vitkeyset[0]).toString();
+            Double numval = Double.valueOf(vit.get(vitkeyset[1]).toString());
+            String unit = vit.get(vitkeyset[2]).toString();
+            String otherval = "";
+
+            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+    private List<MedicalIndication> compare(List<Rule> rules, List<MedicalIndication> reminder,
+                                            String detailname, Double numval, String unit, String otherval) {
+        boolean minmatch, maxmatch;
+        Double minval, maxval;
+        String minop, maxop, minunit, maxunit;
+
+        try {
+            if (null == numval && otherval.trim().length() > 0) {
+                for (Rule rule : rules) {
+                    if (rule.getMin_operator().equals("=") && otherval.contains(rule.getMin_value())) {
+                        MedicalIndication medind = new MedicalIndication();
+                        medind.setName(rule.getRemind());
+                        medind.setRule(detailname + ": " + otherval);
+                        reminder.add(medind);
+
+                        System.out.println(medind.getRule() + " -> " + medind.getName());
+                    }
+                }
+            } else if (String.valueOf(numval).trim().length() > 0 && unit.length() > 0){
+                for (Rule rule : rules) {
+                    minmatch = maxmatch = false;
+                    minval = (rule.getMin_value().length()==0)?0:Double.valueOf(rule.getMin_value());
+                    maxval = (rule.getMax_value().length()==0)?0:Double.valueOf(rule.getMax_value());
+                    minunit = rule.getMin_unit();
+                    maxunit = rule.getMax_unit();
+                    minop = rule.getMin_operator();
+                    maxop = rule.getMax_operator();
+
+                    if ( String.valueOf(minval).trim().length() > 0 && minunit.equals(unit) ) {
+                        switch (minop) {
+                            case ">":
+                                if (numval > minval) { minmatch = true; }
+                                break;
+                            case ">=":
+                                if (numval >= minval) { minmatch = true; }
+                                break;
+                        }
+                    } else { minmatch = true; }
+
+                    if (String.valueOf(maxval).trim().length() > 0 && maxunit.equals(unit) ) {
+                        switch (maxop) {
+                            case "<":
+                                if (numval < maxval) { maxmatch = true; }
+                                break;
+                            case "<=":
+                                if (numval <= maxval) { maxmatch = true; }
+                                break;
+                        }
+                    } else { maxmatch = true; }
+
+                    if (minmatch && maxmatch) {
+                        MedicalIndication medind = new MedicalIndication();
+                        medind.setName(rule.getRemind());
+                        medind.setRule(detailname + ": " + numval + " " + unit);
+                        reminder.add(medind);
+
+                        System.out.println(medind.getRule() + " -> " + medind.getName());
+                    }
+                }
+            }
+
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+    private List<LisDetail> processLis(List<LisDetail> lisArr) {
+        if (lisArr.size() == 0) {
+            return lisArr;
+        }
+
+        String Otherval = "";
+
+        for (int i = 0; i < lisArr.size(); i++) {
+            LisDetail lisres = lisArr.get(i);
+
+//            Otherval = (lisres.getOtherValue().trim().length() > 0) ? lisres.getOtherValue().trim() + "\n" : "";
+            Otherval = lisres.getOtherValue();
+
+            if (Otherval.indexOf(pos) >= 0 || Otherval.indexOf(neg) >= 0) {
+                lisres.setOtherValue(lisres.getDetailName() + Otherval);
+            } else {
+                Otherval = (Otherval.trim().length() > 0) ? Otherval.trim() + "\n" : "";
+                if (lisres.getValue() == null) {
+                    continue;
+                } else if (lisres.getMaxValue() != null && lisres.getValue() > lisres.getMaxValue()) {
+                    lisres.setOtherValue(Otherval + lisres.getDetailName() + up);
+                } else if (lisres.getMinValue() != null && lisres.getValue() < lisres.getMinValue()) {
+                    lisres.setOtherValue(Otherval + lisres.getDetailName() + down);
+                } else {
+                    lisres.setOtherValue(Otherval + lisres.getDetailName() + normal);
+                }
+            }
+        }
+
+        return lisArr;
+    }
+}