Bladeren bron

规则做统一过滤

louhr 5 jaren geleden
bovenliggende
commit
7302380d0f

+ 6 - 0
bigdata-web/pom.xml

@@ -43,6 +43,12 @@
             <version>1.0.0</version>
         </dependency>
 
+		<dependency>
+			<groupId>org.diagbot</groupId>
+			<artifactId>common-push</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+
         <dependency>
             <groupId>org.diagbot</groupId>
             <artifactId>common-service</artifactId>

+ 30 - 34
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -219,41 +219,11 @@ 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 Map<String, List<Rule>> getKl_rule_filter_map() {
+        if (kl_rule_filter_map == null) {
+            create_kl_rule_filter_map();
         }
+        return kl_rule_filter_map;
     }
 
     public static void create_kl_rule_filter_map() {
@@ -261,8 +231,34 @@ public class ApplicationCacheUtil {
 
         Configuration configuration = new DefaultConfig();
         List<String> fileContents = configuration.readFileContents("bigdata_rule_filter.dict");
+
+        List<Rule> rules = null;
         for (String line:fileContents) {
             String[] content = line.split("\\|");
+            Rule rule = new Rule();
+            if (content.length == 10) {
+                rule.setIdx_name(content[0]);
+                rule.setSet_name(content[1]);
+                rule.setSet_status(content[2]);
+                rule.setMin_value(content[3]);
+                rule.setMin_concept_text(content[4]);
+                rule.setMax_value(content[5]);
+                rule.setMax_concept_text(content[6]);
+                rule.setSet_value(content[7]);
+                rule.setSet_concept_text(content[8]);
+                rule.setUnit(content[9]);
+                rule.setType_value(content[10]);
+                rule.setMinRemind(content[11]);
+                rule.setMaxRemind(content[12]);
+                rule.setSetRemind(content[13]);
+                if (kl_rule_filter_map.get(rule.getIdx_name()) == null) {
+                    rules = new ArrayList<>();
+                } else {
+                    rules = kl_rule_filter_map.get(rule.getIdx_name());
+                }
+                rules.add(rule);
+                kl_rule_filter_map.put(rule.getIdx_name(), rules);
+            }
         }
     }
 

+ 163 - 0
bigdata-web/src/main/java/org/diagbot/bigdata/work/PretreatmentFilter.java

@@ -0,0 +1,163 @@
+package org.diagbot.bigdata.work;
+
+
+import org.diagbot.bigdata.common.ApplicationCacheUtil;
+import org.diagbot.common.javabean.Rule;
+import org.diagbot.common.push.filter.PreResult;
+import org.diagbot.common.push.filter.pretreat.Pretreatment;
+import org.diagbot.common.push.filter.pretreat.PretreatmentSymptom;
+import org.diagbot.common.push.filter.pretreat.PretreatmentVital;
+import org.diagbot.common.work.CrisisDetail;
+import org.diagbot.common.work.LisDetail;
+import org.diagbot.common.work.ResponseData;
+import org.diagbot.common.work.SearchData;
+import org.diagbot.pub.Constants;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class PretreatmentFilter {
+    public void crisisFilter(SearchData searchData, ResponseData responseData) throws java.io.IOException {
+        //将数值类型内容全部转换为标准术语  依据kl_rule提供规则
+
+        List<CrisisDetail> allCrisisDetailList = new ArrayList<>();
+        //症状数据
+        if (!StringUtils.isEmpty(searchData.getSymptom())) {
+            searchData.setSymptom(add2PreResultList(new PretreatmentSymptom(), searchData.getSymptom(), allCrisisDetailList));
+        }
+        //体征数据
+        if (!StringUtils.isEmpty(searchData.getVital())) {
+            searchData.setVital(add2PreResultList(new PretreatmentVital(), searchData.getVital(), allCrisisDetailList));
+        }
+        //lis文本非结构化数据
+        if (!StringUtils.isEmpty(searchData.getLis())) {
+            searchData.setLis(add2PreResultList(new PretreatmentVital(), searchData.getLis(), allCrisisDetailList));
+        }
+        //lis结构化信息
+        if (searchData.getLisArr() != null && searchData.getLisArr().size() > 0) {
+            List<PreResult> preResultList = new ArrayList<>();
+            for (LisDetail detail : searchData.getLisArr()) {
+                PreResult result = new PreResult();
+                result.setName(detail.getName());
+                result.setDetailName(detail.getDetailName());
+                result.setUnits(detail.getUnits());
+                result.setMaxValue(String.valueOf(detail.getMaxValue()));
+                result.setMinValue(String.valueOf(detail.getMinValue()));
+                result.setOtherValue(detail.getOtherValue());
+                result.setUniqueName(detail.getUniqueName());
+                result.setValue(String.valueOf(detail.getValue()));
+                preResultList.add(result);
+            }
+            searchData.setLis(add2PreResultList(preResultList, searchData.getLis(), allCrisisDetailList));
+        }
+        //pacs数据
+        if (!StringUtils.isEmpty(searchData.getPacs())) {
+            searchData.setPacs(add2PreResultList(new PretreatmentVital(), searchData.getPacs(), allCrisisDetailList));
+        }
+        responseData.setCrisisDetails(allCrisisDetailList);
+    }
+
+    private String add2PreResultList(Pretreatment pretreatment, String content, List<CrisisDetail> allCrisisDetailList) throws java.io.IOException {
+        List<PreResult> preResultList = pretreatment.analyze(content);
+        return add2PreResultList(preResultList, content, allCrisisDetailList);
+    }
+
+    private String add2PreResultList(List<PreResult> preResultList, String content, List<CrisisDetail> allCrisisDetailList) throws java.io.IOException {
+        Map<String, List<Rule>> kl_rule_filter_map = ApplicationCacheUtil.getKl_rule_filter_map();
+        if (preResultList != null) {
+            for (PreResult result : preResultList) {
+                //规则库中匹配
+                if (kl_rule_filter_map.get(result.getDetailName()) != null) {
+                    List<Rule> rules = kl_rule_filter_map.get(result.getDetailName());
+                    if (rules == null) {
+                        continue;
+                    }
+                    for (Rule rule : rules) {
+                        if (Constants.COMMON_STRING_1.equals(rule.getSet_status())) {   //需要匹配大类
+                            if (StringUtils.isEmpty(rule.getSet_name()) || !result.getName().equals(rule.getSet_name())) {
+                                continue;
+                            }
+                        }
+                        content = conceptConvert(result, rule, content);
+                        //危急值提醒
+                        if (Constants.COMMON_STRING_1.equals(rule.getType_value())) {
+                            conceptCrisis(result, rule, allCrisisDetailList);
+                        }
+                    }
+                }
+            }
+
+        }
+        return content;
+    }
+
+    private String conceptConvert(PreResult result, Rule rule, String content) {
+        //标准值最优先匹配 暂时忽略单位
+        if (compareEqual(result.getValue(), rule.getSet_value())) {
+            content = content + rule.getSet_concept_text();
+        }
+        if (compareMin(rule.getMin_value(), result.getValue())) {
+            content = content + rule.getMin_concept_text();
+        }
+        if (compareMax(rule.getMax_value(), result.getValue())) {
+            content = content + rule.getMax_concept_text();
+        }
+        return content;
+    }
+
+    private void conceptCrisis(PreResult result, Rule rule, List<CrisisDetail> allCrisisDetailList) {
+        boolean crisis = false;
+        CrisisDetail crisisDetail = new CrisisDetail();
+        crisisDetail.setOriginText(result.getDetailName() + " = " + result.getValue() + result.getUnits());
+        if (compareEqual(result.getValue(), rule.getSet_value())) {
+            crisisDetail.setStandardText(result.getDetailName() + " = " + rule.getSet_value() + rule.getUnit());
+            crisisDetail.setRemindText(rule.getSetRemind());
+            crisis = true;
+        }
+        if (compareMin(rule.getMin_value(), result.getValue())) {
+            crisisDetail.setStandardText(result.getDetailName() + " <= " + rule.getMin_value() + rule.getUnit());
+            crisisDetail.setRemindText(rule.getMinRemind());
+            crisis = true;
+        }
+        if (compareMax(rule.getMax_value(), result.getValue())) {
+            crisisDetail.setStandardText(result.getDetailName() + " >= " + rule.getMax_value() + rule.getUnit());
+            crisisDetail.setRemindText(rule.getMaxRemind());
+            crisis = true;
+        }
+        if (crisis) {
+            allCrisisDetailList.add(crisisDetail);
+        }
+    }
+
+    private boolean compareEqual(String c1, String c2) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2)
+                && c1.equals(c2)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean compareMin(String c1, String c2) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2)) {
+            try {
+                return Double.valueOf(c1) < Double.valueOf(c2);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    private boolean compareMax(String c1, String c2) {
+        if (!StringUtils.isEmpty(c1) && !StringUtils.isEmpty(c2)) {
+            try {
+                return Double.valueOf(c1) > Double.valueOf(c2);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+}

+ 12 - 27
common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java

@@ -331,35 +331,12 @@ public class CacheFileManager {
             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();
-
-            //规则过滤信息
-            sql = "SELECT idx_name, set_name, set_status, min_value, max_value, standard_value, " +
-                    " , unit, concept_text, crisis_status, remind FROM kl_rule_new ";
+            sql = "SELECT idx_name, set_name, set_status, min_value, min_concept_text, max_value, max_concept_text, set_value, " +
+                    " , set_concept_text, unit, type_value, min_remind, max_remind, set_remind FROM kl_rule_new ";
             st = conn.createStatement();
             rs = st.executeQuery(sql);
             fw = new FileWriter(path + "bigdata_rule_filter.dict");
-            String r10;
+            String r6, r7, r8, r9, r10, r11, r12, r13, r14;
             while (rs.next()) {
                 r1 = rs.getString(1);
                 r2 = rs.getString(2);
@@ -371,6 +348,10 @@ public class CacheFileManager {
                 r8 = rs.getString(8);
                 r9 = rs.getString(9);
                 r10 = rs.getString(10);
+                r11 = rs.getString(11);
+                r12 = rs.getString(12);
+                r13 = rs.getString(13);
+                r14 = rs.getString(14);
                 r1 = StringUtils.isEmpty(r1)?"":r1;
                 r2 = StringUtils.isEmpty(r1)?"":r2;
                 r3 = StringUtils.isEmpty(r1)?"":r3;
@@ -381,8 +362,12 @@ public class CacheFileManager {
                 r8 = StringUtils.isEmpty(r1)?"":r8;
                 r9 = StringUtils.isEmpty(r1)?"":r9;
                 r10 = StringUtils.isEmpty(r1)?"":r10;
+                r11 = StringUtils.isEmpty(r1)?"":r11;
+                r12 = StringUtils.isEmpty(r1)?"":r12;
+                r13 = StringUtils.isEmpty(r1)?"":r13;
+                r14 = StringUtils.isEmpty(r1)?"":r14;
                 fw.write(encrypDES.encrytor(r1+ "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5
-                        + "|" + r6 + "|" + r7 + "|" + r8 + "|" + r9 + "|" + r10));
+                        + "|" + r6 + "|" + r7 + "|" + r8 + "|" + r9 + "|" + r10 + "|" + r11 + "|" + r12 + "|" + r13 + "|" + r14));
                 fw.write("\n");
             }
             fw.close();

+ 9 - 9
common-push/src/main/java/org/diagbot/common/push/filter/PreResult.java

@@ -6,12 +6,12 @@ package org.diagbot.common.push.filter;
 public class PreResult {
     private String detailName;
     private String uniqueName;
-    private Double maxValue;
-    private Double minValue;
+    private String maxValue;
+    private String minValue;
     private String name;
     private String otherValue;
     private String units;
-    private Double value;
+    private String value;
 
     public String getDetailName() {
         return detailName;
@@ -29,19 +29,19 @@ public class PreResult {
         this.uniqueName = uniqueName;
     }
 
-    public Double getMaxValue() {
+    public String getMaxValue() {
         return maxValue;
     }
 
-    public void setMaxValue(Double maxValue) {
+    public void setMaxValue(String maxValue) {
         this.maxValue = maxValue;
     }
 
-    public Double getMinValue() {
+    public String getMinValue() {
         return minValue;
     }
 
-    public void setMinValue(Double minValue) {
+    public void setMinValue(String minValue) {
         this.minValue = minValue;
     }
 
@@ -69,11 +69,11 @@ public class PreResult {
         this.units = units;
     }
 
-    public Double getValue() {
+    public String getValue() {
         return value;
     }
 
-    public void setValue(Double value) {
+    public void setValue(String value) {
         this.value = value;
     }
 }

+ 0 - 45
common-push/src/main/java/org/diagbot/common/push/filter/PretreatmentFilter.java

@@ -1,45 +0,0 @@
-package org.diagbot.common.push.filter;
-
-
-import org.diagbot.common.push.filter.pretreat.Pretreatment;
-import org.diagbot.common.push.filter.pretreat.PretreatmentSymptom;
-import org.diagbot.common.push.filter.pretreat.PretreatmentVital;
-import org.diagbot.common.work.SearchData;
-import org.springframework.util.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PretreatmentFilter {
-    public void crisisFilter(SearchData searchData) throws java.io.IOException {
-        //将数值类型内容全部转换为标准术语  依据kl_rule提供规则
-
-        List<PreResult> allPreResultList = new ArrayList<>();
-        //症状数据
-        if (!StringUtils.isEmpty(searchData.getSymptom())) {
-            searchData.setSymptom(add2PreResultList(new PretreatmentSymptom(), searchData.getSymptom(), allPreResultList));
-        }
-        //体征数据
-        if (!StringUtils.isEmpty(searchData.getVital())) {
-            searchData.setVital(add2PreResultList(new PretreatmentVital(), searchData.getVital(), allPreResultList));
-        }
-        //lis文本非结构化数据
-        if (!StringUtils.isEmpty(searchData.getLis())) {
-            searchData.setLis(add2PreResultList(new PretreatmentVital(), searchData.getLis(), allPreResultList));
-        }
-        //pacs数据
-        if (!StringUtils.isEmpty(searchData.getPacs())) {
-            searchData.setPacs(add2PreResultList(new PretreatmentVital(), searchData.getPacs(), allPreResultList));
-        }
-    }
-
-    private String add2PreResultList(Pretreatment pretreatment, String content, List<PreResult> allPreResultList) throws java.io.IOException {
-        List<PreResult> preResultList = pretreatment.analyze(content);
-        if (preResultList != null) {
-            allPreResultList.addAll(preResultList);
-
-
-        }
-        return content;
-    }
-}

+ 1 - 1
common-push/src/main/java/org/diagbot/common/push/filter/pretreat/Pretreatment.java

@@ -55,7 +55,7 @@ public abstract class Pretreatment {
             return null;
         }
         PreResult result = new PreResult();
-        result.setValue(value);
+        result.setValue(String.valueOf(value));
         result.setUnits(lexeme.getText());
         result.setDetailName(text);
         return result;

+ 133 - 29
common-service/src/main/java/org/diagbot/common/javabean/Rule.java

@@ -11,40 +11,144 @@ import lombok.Setter;
 @Getter
 @Setter
 public class Rule {
-    // 套餐名称
+    // 大类名称
     private String set_name;
-    // 指标名称
+    // 小类名称
     private String idx_name;
-    // 最小值操作符
-    private String min_operator;
+    // 大类名称是否参与比较 1-参与
+    private String set_status;
     // 最小值
     private String min_value;
-    // 最小值单位
-    private String min_unit;
-    // 最大值操作符
-    private String max_operator;
+    // 最小值对应的标准文本
+    private String min_concept_text;
     // 最大值
     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];
-        }
+    // 最小值对应的标准文本
+    private String max_concept_text;
+    // 标准值 用作等于
+    private String set_value;
+    //转后标准术语
+    private String set_concept_text;
+    // 单位
+    private String unit;
+    //危机标识 用作危机值提醒
+    private String type_value;
+    //提醒信息
+    private String minRemind;
+    //提醒信息
+    private String maxRemind;
+    //提醒信息
+    private String setRemind;
+
+    public String getSet_name() {
+        return set_name;
+    }
+
+    public void setSet_name(String set_name) {
+        this.set_name = set_name;
+    }
+
+    public String getIdx_name() {
+        return idx_name;
+    }
+
+    public void setIdx_name(String idx_name) {
+        this.idx_name = idx_name;
+    }
+
+    public String getSet_status() {
+        return set_status;
+    }
+
+    public void setSet_status(String set_status) {
+        this.set_status = set_status;
+    }
+
+    public String getMin_value() {
+        return min_value;
+    }
+
+    public void setMin_value(String min_value) {
+        this.min_value = min_value;
+    }
+
+    public String getMin_concept_text() {
+        return min_concept_text;
+    }
+
+    public void setMin_concept_text(String min_concept_text) {
+        this.min_concept_text = min_concept_text;
+    }
+
+    public String getMax_value() {
+        return max_value;
+    }
+
+    public void setMax_value(String max_value) {
+        this.max_value = max_value;
+    }
+
+    public String getMax_concept_text() {
+        return max_concept_text;
+    }
+
+    public void setMax_concept_text(String max_concept_text) {
+        this.max_concept_text = max_concept_text;
+    }
+
+    public String getSet_value() {
+        return set_value;
+    }
+
+    public void setSet_value(String set_value) {
+        this.set_value = set_value;
+    }
+
+    public String getSet_concept_text() {
+        return set_concept_text;
+    }
+
+    public void setSet_concept_text(String set_concept_text) {
+        this.set_concept_text = set_concept_text;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getType_value() {
+        return type_value;
+    }
+
+    public void setType_value(String type_value) {
+        this.type_value = type_value;
+    }
+
+    public String getMinRemind() {
+        return minRemind;
+    }
+
+    public void setMinRemind(String minRemind) {
+        this.minRemind = minRemind;
+    }
+
+    public String getMaxRemind() {
+        return maxRemind;
+    }
+
+    public void setMaxRemind(String maxRemind) {
+        this.maxRemind = maxRemind;
+    }
+
+    public String getSetRemind() {
+        return setRemind;
+    }
+
+    public void setSetRemind(String setRemind) {
+        this.setRemind = setRemind;
     }
 }

+ 34 - 0
common-service/src/main/java/org/diagbot/common/work/CrisisDetail.java

@@ -0,0 +1,34 @@
+package org.diagbot.common.work;
+
+/**
+ * Created by louhr on 2019/8/31.
+ */
+public class CrisisDetail {
+    private String remindText;
+    private String standardText;
+    private String originText;
+
+    public String getRemindText() {
+        return remindText;
+    }
+
+    public void setRemindText(String remindText) {
+        this.remindText = remindText;
+    }
+
+    public String getStandardText() {
+        return standardText;
+    }
+
+    public void setStandardText(String standardText) {
+        this.standardText = standardText;
+    }
+
+    public String getOriginText() {
+        return originText;
+    }
+
+    public void setOriginText(String originText) {
+        this.originText = originText;
+    }
+}

+ 10 - 0
common-service/src/main/java/org/diagbot/common/work/ResponseData.java

@@ -31,6 +31,8 @@ public class ResponseData {
     private List<String> diffDiag;//鉴别诊断
     private List<String> excludeDiag; //排除诊断
 
+    private List<CrisisDetail> crisisDetails = new ArrayList<>();
+
     public List<String> getDiffDiag() {
         return diffDiag;
     }
@@ -160,4 +162,12 @@ public class ResponseData {
     public void setBeforeCombineDis(List<FeatureRate> beforeCombineDis) {
         this.beforeCombineDis = beforeCombineDis;
     }
+
+    public List<CrisisDetail> getCrisisDetails() {
+        return crisisDetails;
+    }
+
+    public void setCrisisDetails(List<CrisisDetail> crisisDetails) {
+        this.crisisDetails = crisisDetails;
+    }
 }

+ 5 - 0
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -2,6 +2,7 @@ package org.diagbot.push.controller;
 
 import org.apache.commons.lang3.StringUtils;
 import org.diagbot.bigdata.work.AlgorithmCore;
+import org.diagbot.bigdata.work.PretreatmentFilter;
 import org.diagbot.common.javabean.Drugs;
 import org.diagbot.common.javabean.Filnlly;
 import org.diagbot.common.javabean.MedicalIndication;
@@ -121,6 +122,10 @@ public class AlgorithmController extends BaseController {
     }
 
     public Response<ResponseData> combine(HttpServletRequest request, SearchData searchData) throws Exception {
+
+        PretreatmentFilter pretreatmentFilter = new PretreatmentFilter();
+        pretreatmentFilter.crisisFilter(searchData, new ResponseData());
+
         logger.info("开始规则转换......");
         PreProcess prepro = new PreProcess();
         searchData = prepro.processClinicalData(searchData);