Browse Source

Merge branch 'push-186server' of http://223.93.170.82:10080/louhr/push into his/shaoyifu-yuwenzhen

lipc 5 years ago
parent
commit
383dfea2e4
35 changed files with 1769 additions and 495 deletions
  1. 3 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java
  2. 1 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataParamsProxy.java
  3. 2 2
      bigdata-web/src/main/java/org/diagbot/bigdata/work/ResultDataProxy.java
  4. 16 12
      bigdata-web/src/test/java/org/diagbot/RuleTest.java
  5. 0 9
      common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java
  6. 9 0
      common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java
  7. 231 66
      common-push/src/main/java/org/diagbot/common/push/bean/SearchData.java
  8. 80 0
      common-push/src/main/java/org/diagbot/common/push/filter/rule/CalcFormula.java
  9. 177 35
      common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java
  10. 9 0
      common-push/src/main/java/org/diagbot/common/push/util/PushConstants.java
  11. 40 23
      common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java
  12. 1 1
      common-push/src/main/java/org/diagbot/common/push/work/RelationExtractionUtil.java
  13. 105 14
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  14. 92 83
      graph-web/src/main/java/org/diagbot/graphWeb/work/ScaleCalculate.java
  15. 24 7
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  16. 372 73
      graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java
  17. 6 4
      graph/src/main/resources/pushTreat.properties
  18. 36 18
      nlp/src/main/java/org/diagbot/nlp/rule/module/PreResult.java
  19. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentAllergy.java
  20. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentDrug.java
  21. 39 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentFamily.java
  22. 27 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentInfectious.java
  23. 7 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentNormal.java
  24. 41 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentOperation.java
  25. 6 1
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPacs.java
  26. 1 36
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPast.java
  27. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPersonal.java
  28. 39 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVaccination.java
  29. 17 3
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java
  30. 27 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentWound.java
  31. 1 1
      nlp/src/main/java/org/diagbot/nlp/util/Constants.java
  32. 13 1
      nlp/src/main/java/org/diagbot/nlp/util/NegativeEnum.java
  33. 21 16
      push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java
  34. 161 86
      push-web/src/main/resources/static/pages/algorithm/list.html
  35. 39 2
      rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

+ 3 - 1
bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java

@@ -67,7 +67,9 @@ public class AlgorithmCore {
             }
 
             if (executor != null) {
-                featuresMap = executor.execute(bigDataSearchData.getInputs());;
+                if (bigDataSearchData.getInputs().get("sentence") != null) {
+                    featuresMap = executor.execute(bigDataSearchData.getInputs());
+                }
             } else {
                 continue;
             }

+ 1 - 1
bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataParamsProxy.java

@@ -33,7 +33,7 @@ public class BigDataParamsProxy {
     public AlgorithmClassify[] createAlgorithmClassify(String sysCode, String[] featureTypes, SearchData searchData) {
         AlgorithmClassify[] classifies = new AlgorithmClassify[featureTypes.length];
         //下了诊断且其他信息全为空 反推标识
-        boolean reverse = !StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom());
+        boolean reverse = searchData.getDiagOrder() != null && searchData.getDiagOrder().size() > 0 && StringUtils.isEmpty(searchData.getSymptom());
         for (int i = 0; i < featureTypes.length; i++) {
             if (featureTypes[i] != null) {
                 //模型

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

@@ -186,12 +186,12 @@ public class ResultDataProxy {
                         isFirst = false;
                     }
                     //年龄过滤
-                    if (filter.getAgeStart() > -1 && searchData.getAge() != 0 && searchData.getAge() < filter.getAgeEnd()) {
+                    if (isFirst && filter.getAgeStart() > -1 && searchData.getAge() != 0 && searchData.getAge() < filter.getAgeEnd()) {
                         isFirst = true;
                     } else {
                         isFirst = false;
                     }
-                    if (filter.getAgeEnd() > -1 && searchData.getAge() != 0 && searchData.getAge() > filter.getAgeStart()) {
+                    if (isFirst && filter.getAgeEnd() > -1 && searchData.getAge() != 0 && searchData.getAge() > filter.getAgeStart()) {
                         isFirst = true;
                     } else {
                         isFirst = false;

+ 16 - 12
bigdata-web/src/test/java/org/diagbot/RuleTest.java

@@ -26,7 +26,7 @@ public class RuleTest {
     }
 
     private void validatePub() throws Exception {
-        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "lantone", "jdbc:mysql://192.168.2.236:3306/med?useUnicode=true&characterEncoding=UTF-8");
         List<Map<String, String>> data = nlpJdbc.query("kl_rule_pub",
                 new String[]{"id", "pub_name", "min_operator", "min_value", "min_unit",
                         "max_operator", "max_value", "max_unit", "eq_operator", "eq_value", "eq_unit", "remind", "suffix_info"}, "");
@@ -64,7 +64,7 @@ public class RuleTest {
         MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
         List<Map<String, String>> data = nlpJdbc.query("kl_rule_pub",
                 new String[]{"id", "pub_name", "min_operator", "min_value", "min_unit",
-                        "max_operator", "max_value", "max_unit", "eq_operator", "eq_value", "eq_unit", "remind", "suffix_info"}, "");
+                        "max_operator", "max_value", "max_unit", "eq_operator", "eq_value", "eq_unit", "remind", "suffix_info"}, " where pub_name like '%体征%'");
 
         Map<String, Map<String, String>> rulesMap = new HashMap<>();
         for (Map<String, String> map : data) {
@@ -84,32 +84,36 @@ public class RuleTest {
         double value = 0.0;
         if (!StringUtils.isEmpty(map.get("eq_operator")) && "=".equals(map.get("eq_operator"))) {
             if ("诊断--".equals(map.get("pub_name"))) {
-                searchData.setDiag(map.get("eq_value"));
+                searchData.setDiagString(map.get("eq_value"));
             }
             if ("体征--".equals(map.get("pub_name"))) {
                 searchData.setVital(map.get("eq_value"));
             }
             if ("开单--".equals(map.get("pub_name"))) {
-                searchData.setLisOrder(map.get("eq_value"));
-                searchData.setPacsOrder(map.get("eq_value"));
+                List<PreResult> results = new ArrayList<>();
+                PreResult preResult = new PreResult();
+                preResult.setValue(map.get("eq_value"));
+                results.add(preResult);
+                searchData.setLisOrder(results);
+                searchData.setPacsOrder(results);
             }
             if ("症状--".equals(map.get("pub_name"))) {
-                searchData.setSymptom(map.get("eq_value"));
+                searchData.setChief(map.get("eq_value"));
             }
             if ("药品--".equals(map.get("pub_name"))) {
-                searchData.setPasts(map.get("eq_value"));
+                searchData.setDrugString(map.get("eq_value"));
             }
             if ("既往--".equals(map.get("pub_name"))) {
                 searchData.setPasts(map.get("eq_value"));
             }
             if ("过敏--".equals(map.get("pub_name"))) {
-                searchData.setPasts(map.get("eq_value"));
+                searchData.setAllergy(map.get("eq_value"));
             }
             if (map.get("pub_name").indexOf("其他--") > -1) {
                 searchData.setOther(map.get("pub_name") + map.get("eq_value"));
             }
             if (map.get("pub_name").indexOf("检查--") > -1) {
-                searchData.setPacs(map.get("pub_name") + map.get("eq_value"));
+                searchData.setPacsString(map.get("pub_name") + map.get("eq_value"));
             }
         } else if (!StringUtils.isEmpty(map.get("min_operator")) && !StringUtils.isEmpty(map.get("max_operator"))) {
             if (map.get("pub_name").indexOf("体征--") > -1) {
@@ -128,7 +132,7 @@ public class RuleTest {
                 preResult.setValue(String.valueOf(value));
                 preResult.setUnits(map.get("min_unit"));
                 list.add(preResult);
-                searchData.setLisArr(list);
+                searchData.setLis(list);
             }
             if (map.get("pub_name").indexOf("年龄--") > -1) {
                 int v = Integer.valueOf(map.get("min_value")) + 1;
@@ -151,7 +155,7 @@ public class RuleTest {
                 preResult.setValue(String.valueOf(value));
                 preResult.setUnits(map.get("min_unit"));
                 list.add(preResult);
-                searchData.setLisArr(list);
+                searchData.setLis(list);
             }
             if (map.get("pub_name").indexOf("年龄--") > -1) {
                 int v = Integer.valueOf(map.get("min_value")) - 1;
@@ -174,7 +178,7 @@ public class RuleTest {
                 preResult.setValue(String.valueOf(value));
                 preResult.setUnits(map.get("max_unit"));
                 list.add(preResult);
-                searchData.setLisArr(list);
+                searchData.setLis(list);
             }
             if (map.get("pub_name").indexOf("年龄--") > -1) {
                 int v = Integer.valueOf(map.get("max_value")) + 1;

+ 0 - 9
common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java

@@ -5,7 +5,6 @@ package org.diagbot.common.push.bean;
  */
 public class CrisisDetail {
     private String remindText;
-    private String standardText = "";
     private String originText = "";
     private String typeId;
 
@@ -17,14 +16,6 @@ public class CrisisDetail {
         this.remindText = remindText;
     }
 
-    public String getStandardText() {
-        return standardText;
-    }
-
-    public void setStandardText(String standardText) {
-        this.standardText = standardText;
-    }
-
     public String getOriginText() {
         return originText;
     }

+ 9 - 0
common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java

@@ -32,6 +32,7 @@ public class ResponseData {
     private Map managementEvaluation;
     private List<String> diffDiag;//鉴别诊断
     private List<String> excludeDiag; //排除诊断
+    private String hasIndications = "0";  //是否有病情提示标识 包括危急值 开单合理项 默认无
 
     private Map<String, List<CrisisDetail>> crisisDetails = new HashMap<>();
 
@@ -180,4 +181,12 @@ public class ResponseData {
     public void setCrisisDetails(Map<String, List<CrisisDetail>> crisisDetails) {
         this.crisisDetails = crisisDetails;
     }
+
+    public String getHasIndications() {
+        return hasIndications;
+    }
+
+    public void setHasIndications(String hasIndications) {
+        this.hasIndications = hasIndications;
+    }
 }

+ 231 - 66
common-push/src/main/java/org/diagbot/common/push/bean/SearchData.java

@@ -13,6 +13,8 @@ public class SearchData {
     protected int age_end = 200;
     protected int age = 0;
     protected String sex;
+    //婚姻
+    protected String marriage;
     // 搜索结果的贝叶斯阈值
     protected String threshold = "0";
     //特征类别
@@ -25,26 +27,61 @@ public class SearchData {
     protected String resourceType;
     //外部系统编码 用于返回映射数据,如果sysCode为空或null,则返回kl_standard_info标准名称
     protected String sysCode;
-    private List<PreResult> lisArr = new ArrayList<>();
+
     protected String normal  = "";
     protected String chief  = "";
     protected String symptom = "";
     protected String vital = "";
-    protected String lis = "";
-    protected String pacs = "";
-    protected String diag = "";
-    private String diseaseName;
     protected String pasts = "";
     protected String other = "";
+    //传染病史
+    protected String infectious = "";
+    //手术外伤史
+    protected String operation = "";
+    //过敏史
+    protected String allergy = "";
+    //接种史
+    protected String vaccination = "";
+    //个人史
+    protected String personal = "";
+    //婚育史
+    protected String marital = "";
+    //家族史
+    protected String family = "";
+    //月经史
+    protected String menstrual = "";
+    //化验文本输入
+    protected String lisString = "";
+    //pacs文本输入
+    protected String pacsString = "";
+    //疾病文本输入
+    protected String diagString = "";
+    //药品文本输入
+    protected String drugString = "";
+    //lis结构化数据
+    private List<PreResult> lis = new ArrayList<>();
+    //pacs结构化数据
+    private List<PreResult> pacs = new ArrayList<>();
+    //diag结构化数据
+    private List<PreResult> diag = new ArrayList<>();
+    //drug结构化数据
+    private List<PreResult> drug = new ArrayList<>();
     //当前开单lis项目
-    protected String lisOrder = "";
+    protected List<PreResult> lisOrder = new ArrayList<>();
     //当前开单pacs项目
-    protected String pacsOrder = "";
+    protected List<PreResult> pacsOrder = new ArrayList<>();
+    //当前开单诊断项目
+    protected List<PreResult> diagOrder = new ArrayList<>();
+    //当前开单药品项目
+    protected List<PreResult> drugOrder = new ArrayList<>();
+    //当前开单手术项目
+    protected List<PreResult> operationOrder = new ArrayList<>();
     //当前开单其他 预留
-    protected String otherOrder = "";
+    protected List<PreResult> otherOrder = new ArrayList<>();
     //大数据推送诊断结果信息
     protected List<FeatureRate> pushDiags = new ArrayList<>();
-
+    //选中诊断
+    private PreResult diseaseName = new PreResult();;
     //量表
     protected String scaleName = "";
     //指标结果
@@ -61,7 +98,7 @@ public class SearchData {
     private Map<String, List<Rule>> rules = new HashMap<>();
     //特征推送走的模型 1:机器学习 2:朴素贝叶斯
     private Integer algorithmType;
-    //规则类型
+    //规则类型 1:危机值提醒,2:开单合理性,3:管理评估,4:不良反应,5:药物推荐,6:异常值
     private String ruleType;
 
     public Integer getDisType() {
@@ -72,14 +109,6 @@ public class SearchData {
         this.disType = disType;
     }
 
-    public List<PreResult> getLisArr() {
-        return lisArr;
-    }
-
-    public void setLisArr(List<PreResult> lisArr) {
-        this.lisArr = lisArr;
-    }
-
     public int getLength() {
         return length;
     }
@@ -198,30 +227,6 @@ public class SearchData {
         this.vital = vital;
     }
 
-    public String getLis() {
-        return lis;
-    }
-
-    public void setLis(String lis) {
-        this.lis = lis;
-    }
-
-    public String getPacs() {
-        return pacs;
-    }
-
-    public void setPacs(String pacs) {
-        this.pacs = pacs;
-    }
-
-    public String getDiag() {
-        return diag;
-    }
-
-    public void setDiag(String diag) {
-        this.diag = diag;
-    }
-
     public String getPasts() {
         return pasts;
     }
@@ -286,59 +291,219 @@ public class SearchData {
         this.graphInputs = graphInputs;
     }
 
-    public String getLisOrder() {
+    public Map<String, List<Rule>> getRules() {
+        return rules;
+    }
+
+    public void setRules(Map<String, List<Rule>> rules) {
+        this.rules = rules;
+    }
+
+    public Integer getAlgorithmType() {
+        return algorithmType;
+    }
+
+    public void setAlgorithmType(Integer algorithmType) {
+        this.algorithmType = algorithmType;
+    }
+
+    public String getRuleType() {
+        return ruleType;
+    }
+
+    public void setRuleType(String ruleType) {
+        this.ruleType = ruleType;
+    }
+
+    public String getMarriage() {
+        return marriage;
+    }
+
+    public void setMarriage(String marriage) {
+        this.marriage = marriage;
+    }
+
+    public String getInfectious() {
+        return infectious;
+    }
+
+    public void setInfectious(String infectious) {
+        this.infectious = infectious;
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    public String getAllergy() {
+        return allergy;
+    }
+
+    public void setAllergy(String allergy) {
+        this.allergy = allergy;
+    }
+
+    public String getVaccination() {
+        return vaccination;
+    }
+
+    public void setVaccination(String vaccination) {
+        this.vaccination = vaccination;
+    }
+
+    public String getPersonal() {
+        return personal;
+    }
+
+    public void setPersonal(String personal) {
+        this.personal = personal;
+    }
+
+    public String getMarital() {
+        return marital;
+    }
+
+    public void setMarital(String marital) {
+        this.marital = marital;
+    }
+
+    public String getFamily() {
+        return family;
+    }
+
+    public void setFamily(String family) {
+        this.family = family;
+    }
+
+    public String getMenstrual() {
+        return menstrual;
+    }
+
+    public void setMenstrual(String menstrual) {
+        this.menstrual = menstrual;
+    }
+
+    public String getLisString() {
+        return lisString;
+    }
+
+    public void setLisString(String lisString) {
+        this.lisString = lisString;
+    }
+
+    public String getPacsString() {
+        return pacsString;
+    }
+
+    public void setPacsString(String pacsString) {
+        this.pacsString = pacsString;
+    }
+
+    public List<PreResult> getLis() {
+        return lis;
+    }
+
+    public void setLis(List<PreResult> lis) {
+        this.lis = lis;
+    }
+
+    public List<PreResult> getPacs() {
+        return pacs;
+    }
+
+    public void setPacs(List<PreResult> pacs) {
+        this.pacs = pacs;
+    }
+
+    public List<PreResult> getDiag() {
+        return diag;
+    }
+
+    public void setDiag(List<PreResult> diag) {
+        this.diag = diag;
+    }
+
+    public List<PreResult> getDrug() {
+        return drug;
+    }
+
+    public void setDrug(List<PreResult> drug) {
+        this.drug = drug;
+    }
+
+    public String getDiagString() {
+        return diagString;
+    }
+
+    public void setDiagString(String diagString) {
+        this.diagString = diagString;
+    }
+
+    public String getDrugString() {
+        return drugString;
+    }
+
+    public void setDrugString(String drugString) {
+        this.drugString = drugString;
+    }
+
+    public List<PreResult> getLisOrder() {
         return lisOrder;
     }
 
-    public void setLisOrder(String lisOrder) {
+    public void setLisOrder(List<PreResult> lisOrder) {
         this.lisOrder = lisOrder;
     }
 
-    public String getPacsOrder() {
+    public List<PreResult> getPacsOrder() {
         return pacsOrder;
     }
 
-    public void setPacsOrder(String pacsOrder) {
+    public void setPacsOrder(List<PreResult> pacsOrder) {
         this.pacsOrder = pacsOrder;
     }
 
-    public String getOtherOrder() {
-        return otherOrder;
+    public List<PreResult> getDiagOrder() {
+        return diagOrder;
     }
 
-    public void setOtherOrder(String otherOrder) {
-        this.otherOrder = otherOrder;
+    public void setDiagOrder(List<PreResult> diagOrder) {
+        this.diagOrder = diagOrder;
     }
 
-    public Map<String, List<Rule>> getRules() {
-        return rules;
+    public List<PreResult> getDrugOrder() {
+        return drugOrder;
     }
 
-    public void setRules(Map<String, List<Rule>> rules) {
-        this.rules = rules;
+    public void setDrugOrder(List<PreResult> drugOrder) {
+        this.drugOrder = drugOrder;
     }
 
-    public Integer getAlgorithmType() {
-        return algorithmType;
+    public List<PreResult> getOperationOrder() {
+        return operationOrder;
     }
 
-    public void setAlgorithmType(Integer algorithmType) {
-        this.algorithmType = algorithmType;
+    public void setOperationOrder(List<PreResult> operationOrder) {
+        this.operationOrder = operationOrder;
     }
 
-    public String getDiseaseName() {
-        return diseaseName;
+    public List<PreResult> getOtherOrder() {
+        return otherOrder;
     }
 
-    public void setDiseaseName(String diseaseName) {
-        this.diseaseName = diseaseName;
+    public void setOtherOrder(List<PreResult> otherOrder) {
+        this.otherOrder = otherOrder;
     }
 
-    public String getRuleType() {
-        return ruleType;
+    public PreResult getDiseaseName() {
+        return diseaseName;
     }
 
-    public void setRuleType(String ruleType) {
-        this.ruleType = ruleType;
+    public void setDiseaseName(PreResult diseaseName) {
+        this.diseaseName = diseaseName;
     }
 }

+ 80 - 0
common-push/src/main/java/org/diagbot/common/push/filter/rule/CalcFormula.java

@@ -0,0 +1,80 @@
+package org.diagbot.common.push.filter.rule;
+
+import org.apache.commons.lang3.StringUtils;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.nlp.rule.module.PreResult;
+
+import java.util.List;
+
+/**
+ * @Description: 需要走规则的计算公式
+ * @Author: HUJING
+ * @Date: 2019/12/31 14:10
+ */
+public class CalcFormula {
+    public String gfrCalcMethod(SearchData searchData) {
+        String text = "";
+        List<PreResult> lis = searchData.getLis();
+        String crValue = "";
+        String units = "";
+        boolean hasCr = false;
+        for (PreResult preResult : lis) {
+            if ("肌酐(Cr)".equals(preResult.getDetailName()) && StringUtils.isNotEmpty(preResult.getValue())) {
+                crValue = preResult.getValue();
+                units = preResult.getUnits();
+                hasCr = true;
+            }
+        }
+        if (!hasCr) {
+            return text;
+        }
+
+        int age = searchData.getAge();
+        double scr = 0d;
+        float k = 0f;
+        double a = 0d;
+        double denger = 0d;
+
+        if ("umol/L".equals(units)) {
+            scr = Double.parseDouble(crValue) / 88.41;
+        } else if ("mg/dL".equals(units)) {
+            scr = Double.parseDouble(crValue);
+        }
+
+        String sex = searchData.getSex();
+        if ("1".equals(sex) || "M".equals(sex)) {
+            k = 0.9f;
+            denger = 1d;
+            if (scr <= 0.90) {
+                a = -0.411;
+            } else {
+                a = -1.209;
+            }
+        } else if ("2".equals(sex) || "F".equals(sex)) {
+            k = 0.7f;
+            denger = 1.018;
+            if (scr <= 0.70) {
+                a = -0.329;
+            } else {
+                a = -1.209;
+            }
+        }
+
+        double eGFR3 = 141 * Math.pow((scr / k), a) * Math.pow(0.993, age) * denger;
+
+        if (eGFR3 <= 0 || Double.POSITIVE_INFINITY == eGFR3) {
+            return text;
+        }
+
+        if (eGFR3 > 0 && eGFR3 <= 29) {
+            text = "重度肾功能不全";
+        } else if (eGFR3 > 29 && eGFR3 < 60) {
+            text = "中度肾功能不全";
+        } else if (eGFR3 >= 60 && eGFR3 <= 89) {
+            text = "轻度肾功能不全";
+        } else if (eGFR3 > 89) {
+            text = "肾功能正常";
+        }
+        return text;
+    }
+}

+ 177 - 35
common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java

@@ -6,11 +6,10 @@ import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.common.push.cache.ApplicationCacheUtil;
 import org.diagbot.nlp.rule.module.PreResult;
 import org.diagbot.nlp.rule.pretreat.*;
+import org.diagbot.nlp.util.NlpUtil;
 import org.springframework.util.StringUtils;
 
-import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -18,50 +17,163 @@ public class PretreatmentRule {
     public void rule(SearchData searchData) throws java.io.IOException {
         //患者基本信息 性别 年龄
         if (!StringUtils.isEmpty(searchData.getNormal())) {
-            searchData.setNormal(add2PreResultList(new PretreatmentNormal(), searchData.getNormal(), "normal", searchData));
+            add2PreResultList(new PretreatmentNormal(), searchData.getNormal(), "normal", searchData);
         }
-        //症状数据
+        //患者基本信息 婚姻
+        if (!StringUtils.isEmpty(searchData.getMarriage())) {
+            add2PreResultList(new PretreatmentNormal(), searchData.getMarriage(), "normal", searchData);
+        }
+        //症状规则 主诉、现病史提取
+        if (!StringUtils.isEmpty(searchData.getChief())) {
+            searchData.setChief(add2PreResultList(new PretreatmentSymptom(), searchData.getChief(), "symptom", searchData));
+        }
+        //现病史 提取手术史和过敏史
         if (!StringUtils.isEmpty(searchData.getSymptom())) {
-            searchData.setSymptom(add2PreResultList(new PretreatmentSymptom(), searchData.getSymptom(), "symptom", searchData));
+            add2PreResultList(new PretreatmentOperation(), searchData.getSymptom(), "operation", searchData);   //手术史
+            add2PreResultList(new PretreatmentAllergy(), searchData.getSymptom(), "allergy", searchData);       //过敏史
+            add2PreResultList(new PretreatmentSymptom(), searchData.getSymptom(), "symptom", searchData);       //症状
+            add2PreResultList(new PretreatmentInfectious(), searchData.getSymptom(), "infectious", searchData);     //传染病史
+            add2PreResultList(new PretreatmentPacs(), searchData.getSymptom(), "pacs", searchData);         //检查
         }
-        //体征数据
+        //体征数据 体征、现病史提取
         if (!StringUtils.isEmpty(searchData.getVital())) {
             searchData.setVital(add2PreResultList(new PretreatmentVital(), searchData.getVital(), "vital", searchData));
         }
-        //lis结构化信息
-        if (searchData.getLisArr() != null && searchData.getLisArr().size() > 0) {
-            List<PreResult> preResults = searchData.getLisArr();
+        //历史诊断数据  诊断信息(历史)、现病史、既往史(重要疾病史)
+        if (searchData.getDiag() != null && searchData.getDiag().size() > 0) {
+            List<PreResult> preResults = searchData.getDiag();
             for (PreResult result : preResults) {
-                result.setUniqueName("化验--" + result.getUniqueName());
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("诊断--");
             }
-            searchData.setLis(add2PreResultList(searchData.getLisArr(), searchData.getLis(), "lis", searchData));
-        } else if (!StringUtils.isEmpty(searchData.getLis())) {
-            searchData.setLis(add2PreResultList(new PretreatmentLis(), searchData.getLis(), "lis", searchData));
+            searchData.setDiagString(add2PreResultList(searchData.getDiag(), searchData.getDiagString(), "diag", searchData));
+        } else if (!StringUtils.isEmpty(searchData.getDiagString())) {
+            searchData.setDiagString(add2PreResultList(new PretreatmentDiag(), searchData.getDiagString(), "diag", searchData));
         }
-        //pacs数据
-        if (!StringUtils.isEmpty(searchData.getPacs())) {
-            searchData.setPacs(add2PreResultList(new PretreatmentPacs(), searchData.getPacs(), "pacs", searchData));
+        //药品数据  药品信息(历史)、现病史、既往史
+        if (searchData.getDrug() != null && searchData.getDrug().size() > 0) {
+            List<PreResult> preResults = searchData.getDrug();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("药品--");
+            }
+            searchData.setDrugString(add2PreResultList(searchData.getDrug(), searchData.getDrugString(), "drug", searchData));
+        } else if (!StringUtils.isEmpty(searchData.getDrugString())) {
+            searchData.setDrugString(add2PreResultList(new PretreatmentDrug(), searchData.getDrugString(), "drug", searchData));
         }
         //既往史
         if (!StringUtils.isEmpty(searchData.getPasts())) {
-            searchData.setPasts(add2PreResultList(new PretreatmentPast(), searchData.getPasts(), "past", searchData));
+            add2PreResultList(new PretreatmentPast(), searchData.getPasts(), "pasts", searchData);
+            add2PreResultList(new PretreatmentOperation(), searchData.getPasts(), "operation", searchData);
+            add2PreResultList(new PretreatmentAllergy(), searchData.getPasts(), "allergy", searchData);
+            add2PreResultList(new PretreatmentDrug(), searchData.getPasts(), "drug", searchData);
+            add2PreResultList(new PretreatmentDiag(), searchData.getPasts(), "diag", searchData);
+            add2PreResultList(new PretreatmentInfectious(), searchData.getPasts(), "infectious", searchData);
+        }
+        //手术外伤史 现病史、手术史
+        if (!StringUtils.isEmpty(searchData.getOperation())) {
+            add2PreResultList(new PretreatmentOperation(), searchData.getOperation(), "operation", searchData);
+            add2PreResultList(new PretreatmentWound(), searchData.getOperation(), "wound", searchData);
+        }
+        //过敏 现病史、过敏史
+        if (!StringUtils.isEmpty(searchData.getAllergy())) {
+            add2PreResultList(new PretreatmentAllergy(), searchData.getAllergy(), "allergy", searchData);
+        }
+        //传染病   现病史、传染病史
+        if (!StringUtils.isEmpty(searchData.getInfectious())) {
+            add2PreResultList(new PretreatmentInfectious(), searchData.getInfectious(), "infectious", searchData);
+        }
+        //个人史
+        if (!StringUtils.isEmpty(searchData.getPersonal())) {
+            add2PreResultList(new PretreatmentPersonal(), searchData.getPersonal(), "personal", searchData);
+        }
+        //家族史
+        if (!StringUtils.isEmpty(searchData.getFamily())) {
+            add2PreResultList(new PretreatmentFamily(), searchData.getFamily(), "family", searchData);
+        }
+        //接种史
+        if (!StringUtils.isEmpty(searchData.getVaccination())) {
+            add2PreResultList(new PretreatmentVaccination(), searchData.getVaccination(), "vaccination", searchData);
         }
         //其他史
         if (!StringUtils.isEmpty(searchData.getOther())) {
-            add2PreResultList(new PretreatmentOther(), searchData.getSymptom(), "symptom-other", searchData);
-            searchData.setOther(add2PreResultList(new PretreatmentOther(), searchData.getOther(), "other", searchData));
+            add2PreResultList(new PretreatmentPast(), searchData.getOther(), "pasts", searchData);
+            add2PreResultList(new PretreatmentOperation(), searchData.getOther(), "operation", searchData);
+            add2PreResultList(new PretreatmentAllergy(), searchData.getOther(), "allergy", searchData);
+            add2PreResultList(new PretreatmentWound(), searchData.getOther(), "wound", searchData);
+            add2PreResultList(new PretreatmentInfectious(), searchData.getOther(), "infectious", searchData);
+            add2PreResultList(new PretreatmentPersonal(), searchData.getOther(), "personal", searchData);
+            add2PreResultList(new PretreatmentFamily(), searchData.getOther(), "family", searchData);
+            add2PreResultList(new PretreatmentVaccination(), searchData.getOther(), "vaccination", searchData);
+            add2PreResultList(new PretreatmentDrug(), searchData.getOther(), "drug", searchData);
+            add2PreResultList(new PretreatmentDiag(), searchData.getOther(), "diag", searchData);
         }
-        //开具诊断
-        if (!StringUtils.isEmpty(searchData.getDiag())) {
-            add2PreResultList(new PretreatmentDiag(), searchData.getDiag(), "diag", searchData);
+        //lis结构化信息
+        if (searchData.getLis() != null && searchData.getLis().size() > 0) {
+            List<PreResult> preResults = searchData.getLis();
+            for (PreResult result : preResults) {
+                result.setUniqueName("化验--" + result.getUniqueName());
+            }
+            searchData.setLisString(add2PreResultList(searchData.getLis(), searchData.getLisString(), "lis", searchData));
+        } else if (!StringUtils.isEmpty(searchData.getLisString())) {
+            searchData.setLisString(add2PreResultList(new PretreatmentLis(), searchData.getLisString(), "lis", searchData));
         }
-        //开具辅检化验
-        if (!StringUtils.isEmpty(searchData.getLisOrder())) {
-            add2PreResultList(new PretreatmentMakeList(), searchData.getLisOrder(), "lisOrder", searchData);
+        //pacs结构化信息
+        if (searchData.getPacs() != null && searchData.getPacs().size() > 0) {
+            List<PreResult> preResults = searchData.getPacs();
+            for (PreResult result : preResults) {
+                result.setValue(result.getResult());
+                result.setUniqueName("检查--");
+            }
+            searchData.setPacsString(add2PreResultList(searchData.getPacs(), searchData.getPacsString(), "pacs", searchData));
+        } else if (!StringUtils.isEmpty(searchData.getPacsString())) {
+            searchData.setPacsString(add2PreResultList(new PretreatmentPacs(), searchData.getPacsString(), "pacs", searchData));
         }
-        //开具辅检化验
+
+        //开具 化验
+        if (searchData.getLisOrder() != null && searchData.getLisOrder().size() > 0) {
+            List<PreResult> preResults = searchData.getLisOrder();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("开单--");
+            }
+            add2PreResultList(searchData.getLisOrder(), "", "lisOrder", searchData);
+        }
+        //开具 检查
         if (!StringUtils.isEmpty(searchData.getPacsOrder())) {
-            add2PreResultList(new PretreatmentMakeList(), searchData.getPacsOrder(), "pacsOrder", searchData);
+            List<PreResult> preResults = searchData.getPacsOrder();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("开单--");
+            }
+            add2PreResultList(searchData.getPacsOrder(), "", "pacsOrder", searchData);
+        }
+        //开具 诊断
+        if (!StringUtils.isEmpty(searchData.getDiagOrder())) {
+            List<PreResult> preResults = searchData.getDiagOrder();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("开单--");
+            }
+            add2PreResultList(searchData.getDiagOrder(), "", "diagOrder", searchData);
+        }
+        //开具 药品
+        if (!StringUtils.isEmpty(searchData.getDrugOrder())) {
+            List<PreResult> preResults = searchData.getDrugOrder();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("开单--");
+            }
+            add2PreResultList(searchData.getDrugOrder(), "", "drugOrder", searchData);
+        }
+        //开具 手术
+        if (!StringUtils.isEmpty(searchData.getOperationOrder())) {
+            List<PreResult> preResults = searchData.getOperationOrder();
+            for (PreResult result : preResults) {
+                result.setValue(result.getUniqueName());
+                result.setUniqueName("开单--");
+            }
+            add2PreResultList(searchData.getOperationOrder(), "", "operationOrder", searchData);
         }
 
 //        Map<String, List<Rule>> ruleMap = searchData.getRules();
@@ -70,14 +182,26 @@ public class PretreatmentRule {
 //                System.out.println("id:" + rule.getId() + "; pub_name: " + rule.getPub_name());
 //            }
 //        }
+        if (searchData.getLis() != null && searchData.getLis().size() > 0) {
+            //计算GFR值
+            CalcFormula calcFormula = new CalcFormula();
+            String gfrResult = calcFormula.gfrCalcMethod(searchData);
+            if (!StringUtils.isEmpty(gfrResult)) {
+                PreResult preResult = new PreResult();
+                preResult.setValue(gfrResult);
+                preResult.setUniqueName("检查--");
+                searchData.getPacs().add(preResult);
+                searchData.setPacsString(add2PreResultList(searchData.getPacs(), searchData.getPacsString(), "pacs", searchData));
+            }
+        }
     }
 
-    private String add2PreResultList(Pretreatment pretreatment, String content, String ruleType, SearchData searchData) throws java.io.IOException {
+    private String add2PreResultList(Pretreatment pretreatment, String content, String inputType, SearchData searchData) throws java.io.IOException {
         List<PreResult> preResultList = pretreatment.analyze(content);
-        return add2PreResultList(preResultList, content, ruleType, searchData);
+        return add2PreResultList(preResultList, content, inputType, searchData);
     }
 
-    private String add2PreResultList(List<PreResult> preResultList, String content, String ruleType, SearchData searchData) throws java.io.IOException {
+    private String add2PreResultList(List<PreResult> preResultList, String content, String inputType, SearchData searchData) throws java.io.IOException {
         Map<String, List<Rule>> kl_rule_filter_map = ApplicationCacheUtil.getKl_rule_filter_map();
         //符合条件的规则
         Map<String, List<Rule>> accord_rule_map = searchData.getRules();
@@ -93,17 +217,35 @@ public class PretreatmentRule {
                     for (Rule rule : rules) {
                         boolean isSuit = suitRule(result, rule, content);
                         if (isSuit) {
-                            rule.setOriginText(result.getUniqueName() + ":" + result.getValue() + result.getUnits());
-                            if (accord_rule_map.get(ruleType) == null) {
+                            if (!StringUtils.isEmpty(rule.getOriginText())) {
+                                rule.setOriginText("");
+                            }
+                            if (!StringUtils.isEmpty(result.getDateValue())) {
+                                rule.setOriginText(result.getDateValue());
+                            }
+                            if (NlpUtil.isNumberString(result.getValue())) {
+                                if (StringUtils.isEmpty(rule.getOriginText())) {
+                                    rule.setOriginText(result.getName() + "--" + result.getDetailName() + ":" + result.getValue() + result.getUnits());
+                                } else {
+                                    rule.setOriginText(rule.getOriginText() + " " + result.getName() + "--" + result.getDetailName() + ":" + result.getValue() + result.getUnits());
+                                }
+                            } else {
+                                if (StringUtils.isEmpty(rule.getOriginText())) {
+                                    rule.setOriginText(result.getValue());
+                                } else {
+                                    rule.setOriginText(rule.getOriginText() + " " + result.getValue());
+                                }
+                            }
+                            if (accord_rule_map.get(inputType) == null) {
                                 accord_rules = new ArrayList<>();
                             } else {
-                                accord_rules = accord_rule_map.get(ruleType);
+                                accord_rules = accord_rule_map.get(inputType);
                             }
                             accord_rules.add(rule);
-                            accord_rule_map.put(ruleType, accord_rules);
+                            accord_rule_map.put(inputType, accord_rules);
                             searchData.setRules(accord_rule_map);
 
-                            content = content + (rule.getRemind() == null ? "" : rule.getSuffixInfo());
+                            content = content + (rule.getSuffixInfo() == null ? "" : rule.getSuffixInfo());
                         }
                     }
                 }

+ 9 - 0
common-push/src/main/java/org/diagbot/common/push/util/PushConstants.java

@@ -38,6 +38,15 @@ public class PushConstants {
     public final static String standard_info_relation_type_2 = "2";    //同义词
     public final static String standard_info_relation_type_3 = "3";    //大小类
 
+    //规则类型1:危急值提醒  2:开单合理性  3:管理评估  4:不良反应  5:药物推荐  6:病情提示
+    public final static String rule_app_type_id_1   = "1";
+    public final static String rule_app_type_id_2   = "2";
+    public final static String rule_app_type_id_3   = "3";
+    public final static String rule_app_type_id_4   = "4";
+    public final static String rule_app_type_id_5   = "5";
+    public final static String rule_app_type_id_6   = "6";
+
+
     public final static String result_mapping_vital = "resultMappingVitalMap";          //推送体征结果名称映射
     public final static String result_mapping_diag = "resultMappingDiagMap";          //推送疾病科室名称映射
     public final static String result_mapping_filter = "resultMappingFilterMap";          //推送结果年龄 性别过滤

+ 40 - 23
common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java

@@ -1,22 +1,17 @@
 package org.diagbot.common.push.work;
 
-import org.algorithm.core.cnn.AlgorithmCNNExecutorPacs;
-import org.algorithm.factory.RelationExtractionFactory;
 import org.apache.commons.lang3.StringUtils;
 import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.common.push.util.PushConstants;
 import org.diagbot.nlp.feature.FeatureAnalyze;
 import org.diagbot.nlp.feature.FeatureType;
+import org.diagbot.nlp.rule.module.PreResult;
 import org.diagbot.nlp.util.Constants;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @ClassName org.diagbot.bigdata.work.ParamsDataProxy
@@ -52,6 +47,15 @@ public class ParamsDataProxy {
         } else {
             searchData.setSex("3");
         }
+        //婚姻情况
+        if (!StringUtils.isEmpty(searchData.getMarriage())) {
+            if ("1".equals(searchData.getMarriage())) {
+                searchData.setNormal(searchData.getNormal() + "婚姻己婚");
+            }
+            if ("2".equals(searchData.getMarriage())) {
+                searchData.setNormal(searchData.getNormal() + "婚姻未婚");
+            }
+        }
     }
 
     public void createSearchData(SearchData searchData) throws Exception {
@@ -59,9 +63,6 @@ public class ParamsDataProxy {
         if (searchData.getSymptom() != null) {
             searchData.setSymptom(searchData.getSymptom().trim());
         }
-        if (searchData.getDiag() != null) {
-            searchData.setDiag(searchData.getDiag().trim());
-        }
         //默认查询门诊数据
         if (StringUtils.isEmpty(searchData.getResourceType())) {
             searchData.setResourceType(PushConstants.resource_type_o);
@@ -86,6 +87,11 @@ public class ParamsDataProxy {
         PropertiesUtil propertiesUtil = new PropertiesUtil("nlp.properties");
         featureNum = propertiesUtil.getProperty("push.feature.num");
         fa.setFeatureNum(featureNum);
+        if (!StringUtils.isEmpty(searchData.getChief())) {
+            //提取主诉
+            featuresList = fa.start(searchData.getChief(), FeatureType.FEATURE);
+            paramFeatureInit(searchData, featuresList);
+        }
         if (!StringUtils.isEmpty(searchData.getSymptom())) {
             //提取现病史
             featuresList = fa.start(searchData.getSymptom(), FeatureType.FEATURE);
@@ -109,23 +115,27 @@ public class ParamsDataProxy {
             featuresList = fa.start((searchData.getOther() == null ? "" : searchData.getOther()) + (searchData.getIndications() == null ? "" : searchData.getIndications()), FeatureType.FEATURE);
             paramFeatureInit(searchData, featuresList);
         }
-        if (!StringUtils.isEmpty(searchData.getPacs())) {
-            featuresList = fa.start(searchData.getPacs(), FeatureType.PACS);
+        if (!StringUtils.isEmpty(searchData.getPacsString())) {
+            featuresList = fa.start(searchData.getPacsString(), FeatureType.PACS);
             paramFeatureInit(searchData, featuresList);
         }
-        if (!StringUtils.isEmpty(searchData.getLis())) {
-            featuresList = fa.start(searchData.getLis(), FeatureType.LIS);
+        if (!StringUtils.isEmpty(searchData.getLisString())) {
+            featuresList = fa.start(searchData.getLisString(), FeatureType.LIS);
             paramFeatureInit(searchData, featuresList);
         }
         // 清洗特征词,去除词性不匹配的词
         searchData = cleanFeature(featuresList, fa, searchData);
-        if (!StringUtils.isEmpty(searchData.getOther())) {
+        if (!StringUtils.isEmpty(searchData.getPasts())) {
             //如果既往史中诊断信息,需要提取这个特征
-            featuresList = fa.start(searchData.getOther(), FeatureType.DIAG);
+            featuresList = fa.start(searchData.getPasts(), FeatureType.DIAG);
             paramFeatureInit(searchData, featuresList);
         }
-        if (!StringUtils.isEmpty(searchData.getDiag()) && StringUtils.isEmpty(searchData.getSymptom())) {
-            featuresList = fa.start(searchData.getDiag(), FeatureType.DIAG);
+        if (searchData.getDiagOrder() != null && searchData.getDiagOrder().size() > 0 && StringUtils.isEmpty(searchData.getSymptom())) {
+            String d = "";
+            for (PreResult preResult : searchData.getDiagOrder()) {
+                d = preResult.getUniqueName() + "," + d;
+            }
+            featuresList = fa.start(d, FeatureType.DIAG);
             paramFeatureInit(searchData, featuresList);
         }
 //        if (!StringUtils.isEmpty(searchData.getPacs())) {
@@ -140,9 +150,16 @@ public class ParamsDataProxy {
 //        }
         //模型需要病历文本信息传入
         Map<String, String> map = new HashMap<>();
-        map.put("sentence", searchData.getSymptom());
-        searchData.getInputs().put("sentence", map);
-
+        if (!StringUtils.isEmpty(searchData.getChief()) && !StringUtils.isEmpty(searchData.getSymptom())) {
+            map.put("sentence", searchData.getChief() + searchData.getSymptom());
+        } else if (!StringUtils.isEmpty(searchData.getChief())) {
+            map.put("sentence", searchData.getChief());
+        } else if (!StringUtils.isEmpty(searchData.getSymptom())) {
+            map.put("sentence", searchData.getSymptom());
+        }
+        if (map.get("sentence") != null) {
+            searchData.getInputs().put("sentence", map);
+        }
     }
 
     /**
@@ -194,12 +211,12 @@ public class ParamsDataProxy {
         // 在输入的辅检文本中,只提取辅检信息
         String[] PACS_Feature = { Constants.word_property_PACS,
                 Constants.word_property_PACS_Detail, Constants.word_property_PACS_Result };
-        searchData = removeFeature(searchData.getLis(), fa, searchData, PACS_Feature, FeatureType.PACS);
+        searchData = removeFeature(searchData.getLisString(), fa, searchData, PACS_Feature, FeatureType.PACS);
 
         // 在输入的化验文本中,只提取化验信息
         String[] LIS_Feature = { Constants.word_property_LIS,
                 Constants.word_property_LIS_Detail, Constants.word_property_LIS_Result };
-        searchData = removeFeature(searchData.getPacs(), fa, searchData, LIS_Feature, FeatureType.LIS);
+        searchData = removeFeature(searchData.getPacsString(), fa, searchData, LIS_Feature, FeatureType.LIS);
 
         return searchData;
     }

+ 1 - 1
common-push/src/main/java/org/diagbot/common/push/work/RelationExtractionUtil.java

@@ -24,7 +24,7 @@ import java.util.Map;
 public class RelationExtractionUtil {
     public List<Triad> createTriad(SearchData searchData) throws IOException {
         List<Triad> triads = new ArrayList<>();
-        String[] pacsSplits = searchData.getPacs().trim().split("。|\n");
+        String[] pacsSplits = searchData.getPacsString().trim().split("。|\n");
         List<Lemma> lemmaList = new ArrayList<>();
         Lemma lemma = null;
         for (String pacsSplit : pacsSplits) {

+ 105 - 14
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -34,6 +34,7 @@ public class GraphCalculate {
         }
     }
     private static Neo4jAPI neo4jAPI ;
+    private static Map<String,List<String>> mergeMap;
 
     /**
      * 返回诊断和治疗
@@ -51,11 +52,14 @@ public class GraphCalculate {
         List<String> inputList = new ArrayList<>();
         int age = searchData.getAge();
         String sex = searchData.getSex();
-        String diseaseName = searchData.getDiseaseName();
+        String diseaseName = "";
+        if (searchData.getDiseaseName() != null) {
+            diseaseName = searchData.getDiseaseName().getUniqueName();
+        }
         logger.info("前端传来的年龄为 :"+age+" 前端传来的性别为 :"+sex);
         Map<String, Map<String, String>> sexAgeCache = CacheUtil.getSexAgeCache();
         Map<String, Map<String, String>> inputs = searchData.getGraphInputs();
-        List<String> exculdDiagFilds = this.exculdDiagFilds(inputs);
+
         //从大数据解析分词
         Set<String> ss = processParticiple(inputs);
         logger.info("从分词系统接收到的词 :" + ss);
@@ -68,11 +72,22 @@ public class GraphCalculate {
             neo4jAPI = new Neo4jAPI(driver);
         }
         logger.info("图谱开始推送诊断!!!!!!!!!!!");
-        String webDiag = searchData.getDiag();
+        String webDiag = "";
+        if(searchData.getDiagOrder() !=null){
+            for (PreResult preResult : searchData.getDiagOrder()) {
+                if (StringUtils.isEmpty(webDiag)) {
+                    webDiag = preResult.getValue();
+                } else {
+                    webDiag = webDiag + "," + preResult.getValue();
+                }
+            }
+        }
+
         logger.info("页面诊断为 :"+webDiag);
         String[] webDiagList = webDiag.split(",|,|、|;|:|;");
+        List<String> exculdDiagFilds = this.exculdDiagFilds(inputs,webDiagList,diseaseName);
         //处理血肌酐
-        List<PreResult> lisArr = searchData.getLisArr();
+        List<PreResult> lisArr = searchData.getLis();
         String serumCreatinine = processSerumcreatinine(lisArr);
 
         //计算诊断
@@ -98,12 +113,6 @@ public class GraphCalculate {
         if (StringUtils.isNotEmpty(diseaseName) && featureTypeList.contains(Constants.feature_type_treat)) {
             PushTreat pushTreat = new PushTreat();
             Treat treat = pushTreat.processTreat(diseaseName,webDiag,diseaseType, driver, (String[]) inputList.toArray(new String[inputList.size()]),exculdDiagFilds, crisisDetails);
-//            Map<String, List<String>> disUE = pushTreat.getDisUE(diseaseName,1,driver);
-//            Map<String,String> ue = pushTreat.getUe((String[]) inputList.toArray(new String[inputList.size()]),driver);
-            //走平常诊断治疗
-//            Map<String, Filnlly> mulDiseaseTreat = neo4jAPI.getMulDiseaseTreat_2(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
-//            Map<String, Filnlly> mulDiseaseTreat_new = neo4jAPI.getMulDiseaseTreat_new(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList),crisisDetails);
-//            System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
             responseData.setTreat(treat);
         }
         //管理评估(慢病才有)
@@ -148,9 +157,10 @@ public class GraphCalculate {
                     idns.addAll(idn);
                 }
             }
+            newindSet1 = mergerIndex(newindSet1, mergeMap);
             if(newindSet1 != null && newindSet1.size()>0){
                 for (String ind:newindSet1
-                     ) {
+                        ) {
                     MedicalIndication medicalIndication= new MedicalIndication();
                     medicalIndication.setName(ind);
                     List<MedicalIndicationDetail> ds = new ArrayList<>();
@@ -158,7 +168,7 @@ public class GraphCalculate {
                     medicalIndicationDetail.setType(1);
                     JSONObject jsonObject = new JSONObject();
                     if(indLiang != null){
-                        jsonObject.put("name",indLiang.get(ind)); 
+                        jsonObject.put("name",indLiang.get(ind));
                     }
                     medicalIndicationDetail.setContent(jsonObject);
                     ds.add(medicalIndicationDetail);
@@ -176,6 +186,69 @@ public class GraphCalculate {
         return responseData;
     }
 
+    /**
+     * 合并指标
+     * @param newindSet
+     * @return
+     */
+    private Set<String> mergerIndex(Set<String> newindSet,Map<String,List<String>> merge){
+        Map<String,List<String>> disColl = new HashMap<>();
+        Set<String> newindSetResult = new HashSet<>();
+        Map<String, List<String>> mergeInit = mergeInit(merge);
+        if(newindSet != null && newindSet.size()>0){
+            for (Map.Entry<String, List<String>> ds:mergeInit.entrySet()) {
+                String key = ds.getKey();
+                if(newindSet.contains(key)){
+                    Iterator<String> iterator = newindSet.iterator();
+                    while (iterator.hasNext()){
+                        String next = iterator.next();
+                        // values   ["2型糖尿病","1型糖尿病","成人迟发性自身免疫糖尿病"]
+                        // newindSet ["糖尿病","糖尿病足"]
+                        if(key.equals(next)){
+                            List<String> disList = new ArrayList<>();
+                            for (String dis:newindSet) {
+                                if(!dis.equals(key)){
+                                    disList.add(dis);
+                                }
+                            }
+                            disColl.put(key,disList);
+                        }
+                    }
+                    if(disColl != null && disColl.size()>0){
+                        for (Map.Entry<String,List<String>> disList:disColl.entrySet()) {
+                            String key1 = disList.getKey();
+                            List<String> value = disList.getValue();
+                            if(value.size() == 0){
+                                newindSetResult.add(key1);
+                            }else {
+                                for (String dis:value
+                                        ) {
+                                    if(!dis.equals(key1)){
+                                        newindSetResult.add(dis);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }else {
+                    newindSetResult = newindSet;
+                }
+            }
+        }
+        return newindSetResult;
+    }
+    private Map<String,List<String>> mergeInit(Map<String,List<String>> merge){
+        if(merge == null){
+            merge = new HashMap<>();
+            List<String> otherIn = new ArrayList<>();
+            otherIn.add("2型糖尿病");
+            otherIn.add("1型糖尿病");
+            otherIn.add("成人迟发性自身免疫糖尿病");
+            merge.put("糖尿病",otherIn);
+        }
+        return merge;
+    }
+
     private Set<String> getQueNiDiagnose(Map<String, Object> condition) {
         Set<String> diseaseSet =new HashSet<>();
         if(condition != null){
@@ -269,10 +342,11 @@ public class GraphCalculate {
         }
         return sc;
     }
-    private List<String> exculdDiagFilds(Map<String, Map<String, String>> inputs){
+    private List<String> exculdDiagFilds(Map<String, Map<String, String>> inputs,String[] webDiagList,String disName){
         List<String> exculdDiagFilds = new ArrayList<>();
+        String fildName ="";
         if(inputs != null && inputs.size()>0){
-            String fildName ="";
+
             for (Map.Entry<String, Map<String, String>> fild:inputs.entrySet()) {
                 fildName = fild.getKey();
                 Map<String, String> value = fild.getValue();
@@ -288,6 +362,23 @@ public class GraphCalculate {
                 }
             }
         }
+        try{
+            if(webDiagList!=null && webDiagList.length>0){
+                for (String wd:webDiagList) {
+                    if(wd != null && !disName.equals(wd)){
+                        fildName = "'"+wd+"'";
+                        if(!exculdDiagFilds.contains(fildName)){
+                            exculdDiagFilds.add(fildName);
+                        }
+                    }
+
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
         return exculdDiagFilds;
     }
 }
+

+ 92 - 83
graph-web/src/main/java/org/diagbot/graphWeb/work/ScaleCalculate.java

@@ -2,6 +2,7 @@ package org.diagbot.graphWeb.work;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
@@ -154,95 +155,103 @@ public class ScaleCalculate {
     public Map<String, Object> scaleCalcMethod(JSONObject jsonObject) throws Exception {
         Map<String, Object> scaleCalcResult = new HashMap<>();
         Map<String, Object> data = (Map<String, Object>) jsonObject.get("data");
+        JSONObject valueResult = new JSONObject();
+        JSONObject nameResult = new JSONObject();
         int type = (int) data.get("type");
-        if (type == 2) {
-            Map<String, Object> content = (Map<String, Object>) data.get("content");
-            List<Map<String, Object>> mapList = (List<Map<String, Object>>) content.get("details");
-            if ("肾小球滤过率".equals(content.get("name"))) {
-                int age = 0;
-                double scr = 0.00;
-                float k = 0.0f;
-                double a = 0.00;
-                double denger = 0.00;
-                for (int i = 0; i < mapList.size(); i++) {
-                    Map<String, Object> detailSub = mapList.get(i);
-                    if ("年龄".equals(detailSub.get("name"))) {
-                        if ("".equals(detailSub.get("value"))) {
-                            //如果拿到的年龄为空,
-                            break;
-                        } else {
-                            age = Integer.valueOf(detailSub.get("value").toString());
-                        }
-                    } else if ("血肌酐".equals(detailSub.get("name"))) {
-                        if ("".equals(detailSub.get("value"))) {
-                            //如果给的value是空,给的2.2621是假数据
-                            break;
-                        } else {
-                            if ("umol/L".equals(detailSub.get("uint"))) {
-                                scr = Double.valueOf(detailSub.get("value").toString()) / 88.41;
-                            } else if ("mg/dL".equals(detailSub.get("uint"))) {
-                                scr = Double.valueOf(detailSub.get("value").toString());
-                            }
-                        }
-                    } else if ("性别".equals(detailSub.get("name"))) {
-                        List<Map<String, Object>> genderDetails = (List<Map<String, Object>>) detailSub.get("details");
-                        for (int j = 0; j < genderDetails.size(); j++) {
-                            Map<String, Object> genderDetail = genderDetails.get(j);
-                            //返回的数据结构性别暂时是写死(默认女性)
-                            if ((int) genderDetail.get("state") == 1) {
-                                if ("男".equals(genderDetail.get("detailName"))) {
-                                    k = 0.9f;
-                                    denger = Double.valueOf(genderDetail.get("value").toString());
-                                    if (scr <= 0.90) {
-                                        a = -0.411;
-                                    } else {
-                                        a = -1.209;
-                                    }
-                                } else if ("女".equals(genderDetail.get("detailName"))) {
-                                    k = 0.7f;
-                                    denger = Double.valueOf(genderDetail.get("value").toString());
-                                    if (scr <= 0.70) {
-                                        a = -0.329;
-                                    } else {
-                                        a = -1.209;
-                                    }
-                                }
-                            }
-                        }
+        if (type != 2) {
+            return scaleCalcResult;
+        }
+        Map<String, Object> content = (Map<String, Object>) data.get("content");
+        List<Map<String, Object>> mapList = (List<Map<String, Object>>) content.get("details");
+        if (!"肾小球滤过率".equals(content.get("name"))) {
+            return scaleCalcResult;
+        }
+        int age = 0;
+        double scr = 0d;
+        float k = 0f;
+        double a = 0d;
+        double denger = 0d;
+        int sex = 0; //1:男性 2:女性
+        for (int i = 0; i < mapList.size(); i++) {
+            Map<String, Object> detailSub = mapList.get(i);
+            if ("年龄".equals(detailSub.get("name"))) {
+                if (StringUtils.isEmpty(detailSub.get("value").toString())) {
+                    break;
+                } else {
+                    age = Integer.valueOf(detailSub.get("value").toString());
+                }
+            } else if ("血肌酐".equals(detailSub.get("name"))) {
+                if ("".equals(detailSub.get("value"))) {
+                    break;
+                } else {
+                    if ("umol/L".equals(detailSub.get("uint"))) {
+                        scr = Double.parseDouble(detailSub.get("value").toString()) / 88.41;
+                    } else if ("mg/dL".equals(detailSub.get("uint"))) {
+                        scr = Double.parseDouble(detailSub.get("value").toString());
                     }
                 }
-                double eGFR3 = 141 * Math.pow((scr / k), a) * Math.pow(0.993, age) * denger;
-                String unit = "ml/min•1.73m2";
-                String text = null;
-                if (eGFR3 <= 0) {
-                    text = "指标值缺少";
-                } else if (eGFR3 > 0 && eGFR3 < 15) {
-                    text = "肾功能衰竭";
-                } else if (eGFR3 >= 15 && eGFR3 <= 29) {
-                    text = "重度下降";
-                } else if (eGFR3 > 29 && eGFR3 < 60) {
-                    text = "中度下降";
-                } else if (eGFR3 >= 60 && eGFR3 <= 89) {
-                    text = "轻度下降";
-                } else if (eGFR3 > 89) {
-                    text = "正常或肾损伤代偿期";
+
+            } else if ("性别".equals(detailSub.get("name"))) {
+                List<Map<String, Object>> genderDetails = (List<Map<String, Object>>) detailSub.get("details");
+                for (int j = 0; j < genderDetails.size(); j++) {
+                    Map<String, Object> genderDetail = genderDetails.get(j);
+                    //返回的数据结构性别暂时是写死(默认女性)
+                    if ((int) genderDetail.get("state") == 1) {
+                        if ("男".equals(genderDetail.get("detailName"))) {
+                            k = 0.9f;
+                            denger = Double.parseDouble(genderDetail.get("value").toString());
+                            sex = 1;
+
+                        } else if ("女".equals(genderDetail.get("detailName"))) {
+                            k = 0.7f;
+                            denger = Double.parseDouble(genderDetail.get("value").toString());
+                            sex = 2;
+                        }
+                    }
                 }
-                JSONObject valueResult = new JSONObject();
-                JSONObject nameResult = new JSONObject();
-                valueResult.put("name", "GFR值");
-                valueResult.put("text", new DecimalFormat("0.00").format(eGFR3) + " " + unit);
-                nameResult.put("name", "评估结论");
-                nameResult.put("text", text);
-                //                scaleCalcResult.put("text", text);
-                //                scaleCalcResult.put("unit", unit);
-                //                scaleCalcResult.put("value", new DecimalFormat("#.00").format(eGFR3));
-                JSONArray result = new JSONArray();
-                result.add(valueResult);
-                result.add(nameResult);
-                scaleCalcResult.put("result", result);
-                System.out.println("text:" + text + "\tunit:" + unit + "\tvalue:" + eGFR3);
             }
         }
+
+        if (sex == 1){
+            if (scr <= 0.90) {
+                a = -0.411;
+            } else {
+                a = -1.209;
+            }
+        } else if (sex == 2){
+            if (scr <= 0.70) {
+                a = -0.329;
+            } else {
+                a = -1.209;
+            }
+        }
+
+        double eGFR3 = 141 * Math.pow((scr / k), a) * Math.pow(0.993, age) * denger;
+        String unit = "min•1.73㎡";
+        String text = "";
+        if (eGFR3 > 0 && eGFR3 <= 29) {
+            text = "重度肾功能不全";
+        } else if (eGFR3 > 29 && eGFR3 < 60) {
+            text = "中度肾功能不全";
+        } else if (eGFR3 >= 60 && eGFR3 <= 89) {
+            text = "轻度肾功能不全";
+        } else if (eGFR3 > 89) {
+            text = "肾功能正常";
+        }
+
+        valueResult.put("name", "GFR值");
+        nameResult.put("name", "评估结论");
+        if (eGFR3 <= 0 || Double.POSITIVE_INFINITY == eGFR3) {
+            valueResult.put("text", "");
+            nameResult.put("text", "");
+        } else {
+            valueResult.put("text", new DecimalFormat("0.00").format(eGFR3) + " " + unit);
+            nameResult.put("text", text);
+        }
+        JSONArray result = new JSONArray();
+        result.add(valueResult);
+        result.add(nameResult);
+        scaleCalcResult.put("result", result);
         return scaleCalcResult;
     }
 }

+ 24 - 7
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java

@@ -9,6 +9,7 @@ import org.diagbot.common.push.bean.CrisisDetail;
 import org.diagbot.common.push.bean.FeatureRate;
 import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.common.push.bean.neo4j.*;
+import org.diagbot.nlp.rule.module.PreResult;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.neo4j.driver.v1.*;
 import org.neo4j.driver.v1.types.Node;
@@ -1587,7 +1588,7 @@ public class Neo4jAPI {
                             ageJsonObject.put("isShow", 0);
                         }else if("血肌酐".equals(item.replace("\"", "")) && StringUtils.isNotEmpty(serumCreatinine)){
                             ageJsonObject.put("value", serumCreatinine);
-                            ageJsonObject.put("isShow", 1);
+                            ageJsonObject.put("isShow", 0);
                         } else {
                             ageJsonObject.put("isShow", 1);
                         }
@@ -1632,7 +1633,7 @@ public class Neo4jAPI {
                             results.add(name.replace("\"", ""));
                         }
                     } else if (3 == sort1) {
-                        if (medicalIndicationDetail3 == null) {
+                        /*if (medicalIndicationDetail3 == null) {
                             medicalIndicationDetail3 = new MedicalIndicationDetail();
                         }
                         medicalIndicationDetail3.setType(3);
@@ -1649,7 +1650,7 @@ public class Neo4jAPI {
                         shiJsonObject.put("state", Integer.parseInt(state1));
                         shiFouList.add(shiJsonObject);
                         shiFouJson.put("details", shiFouList);
-                        medicalIndicationDetail3.setContent(shiFouJson);
+                        medicalIndicationDetail3.setContent(shiFouJson);*/
                     }
                 }
                 for (String re : results) {
@@ -1660,9 +1661,15 @@ public class Neo4jAPI {
                 }
                 gongshiJson.put("result", resultList);
                 medicalIndicationDetail2.setContent(gongshiJson);
-                medicalIndicationDetailList.add(medicalIndicationDetail1);
-                medicalIndicationDetailList.add(medicalIndicationDetail2);
-                medicalIndicationDetailList.add(medicalIndicationDetail3);
+                if(medicalIndicationDetail1 != null){
+                    medicalIndicationDetailList.add(medicalIndicationDetail1);
+                }
+                if(medicalIndicationDetail2 !=null){
+                    medicalIndicationDetailList.add(medicalIndicationDetail2);
+                }
+                if(medicalIndicationDetail3 !=null){
+                    medicalIndicationDetailList.add(medicalIndicationDetail3);
+                }
                 medicalIndication.setDetails(medicalIndicationDetailList);
                 medicalIndicationList.add(medicalIndication);
             }
@@ -2066,7 +2073,17 @@ public class Neo4jAPI {
     public Map<String, List<FeatureRate>> getLisPacs(SearchData searchData) {
         Map<String, List<FeatureRate>> lisPacsFeature = new HashMap<>();
         List<String> featureList = Arrays.asList(searchData.getFeatureTypes());
-        String webDiag = searchData.getDiag();
+        String webDiag = "";
+        if(searchData.getDiagOrder() != null){
+            for (PreResult preResult : searchData.getDiagOrder()) {
+                if (StringUtils.isEmpty(webDiag)) {
+                    webDiag = preResult.getValue();
+                } else {
+                    webDiag = webDiag + "," + preResult.getValue();
+                }
+            }
+        }
+
         List<String> webDiagList = null;
         if (webDiag != null && webDiag != "") {
             webDiagList = Arrays.asList(webDiag.split(",|,|、"));

+ 372 - 73
graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java

@@ -1,5 +1,6 @@
 package org.diagbot.graph.medicationProcess;
 
+import org.apache.commons.lang3.StringUtils;
 import org.diagbot.common.push.bean.CrisisDetail;
 import org.diagbot.common.push.bean.neo4j.*;
 import org.diagbot.pub.utils.PropertiesUtil;
@@ -57,30 +58,32 @@ public class PushTreat {
      * @return
      */
     private List<TreatDetail> getTreatmentPlan(String disName,String webDiag,String[] inputList,List<String> exculdDiagFilds,Map<String, List<CrisisDetail>> crisisDetails, Map<String, String> ueSet,Driver driver){
+
         List<TreatDetail> treatmentPlanList = new ArrayList<>();
+        List<String> typeList = this.judgeDiseaseType(disName, driver);
+        String sign = typeList.size()>0? typeList.get(0):"NULL";
         //获取全部字段
         List<String> allFilds = this.getAllFilds(webDiag, crisisDetails, inputList, ueSet);
+        if("NULL".equals(sign) || "2".equals(sign)|| "3".equals(sign)){
+            treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
+        }else if("1".equals(sign)){
+            // TODO: 2019/11/19     匹配规则用药,判断是否满足规则
+            treatmentPlanList= this.ruleMedicaton(disName, webDiag, allFilds, driver);
 
-        // TODO: 2019/11/19     匹配规则用药,判断是否满足规则
-        List<TreatDetail> treatDetailList_rule = this.ruleMedicaton(disName, webDiag, allFilds, driver);
-        String name = treatDetailList_rule.get(0).getTitle().substring(0, treatDetailList_rule.get(0).getTitle().indexOf("治疗方案"));
-        if(treatDetailList_rule.size() == 1 && disName.equals(name)){
             // TODO: 2019/11/28  匹配主症+其他+其他
-//            List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
-//            treatmentPlanList = treatmentPlanList_otherrule;
+            List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
+            treatmentPlanList.addAll(treatmentPlanList_otherrule);
 
-        }else if(treatDetailList_rule.size() == 1 && !disName.equals(name)){
-            treatmentPlanList =treatDetailList_rule;
-        }else {
-            treatmentPlanList = treatDetailList_rule;
-        }
-        // TODO: 2019/11/28  匹配主症+其他+其他
-        List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
-        treatmentPlanList.addAll(treatmentPlanList_otherrule);
-        // TODO: 2019/11/19     规则不满足的情况下,返回主诊断的用药情况
-        if(treatmentPlanList.size() == 0){
-            treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
+            // TODO: 2019/12/4 合并规则,多个相同的治疗合并成一个
+            this.mergerRules(treatmentPlanList);
+
+            // TODO: 2019/11/19     规则不满足的情况下,返回主诊断的用药情况
+            if(treatmentPlanList.size() == 0){
+                treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
+            }
         }
+
+
         // TODO: 2019/11/21 处理合并症 例如高热
         List<TreatDetail> treatDetailList = this.complicationMedicaton(inputList, driver, allFilds);
         treatmentPlanList.addAll(treatDetailList);
@@ -88,12 +91,239 @@ public class PushTreat {
         return treatmentPlanList;
     }
 
+    private List<String> judgeDiseaseType(String disName, Driver driver){
+        List<String> signList = new ArrayList<>();
+        if(StringUtils.isNotEmpty(disName)){
+            Session  session = driver.session(AccessMode.WRITE);
+            session.writeTransaction(new TransactionWork<Integer>() {
+                @Override
+                public Integer execute(Transaction tx) {
+                    String query = propertiesUtil_treat.getProperty("judgeDiseaseType").replace("disName",disName.toString());
+                    logger.info("规则用药,查询语句为:\n" + query);
+                    StatementResult result = tx.run(query);
+                    while (result.hasNext()) {
+                        Record next = result.next();
+                        String sign = next.get("design").toString();
+                        signList.add(sign);
+                    }
+                    return 1;
+                }
+            });
+            closeSession(session);
+        }
+        return signList;
+    }
+    /**
+     * 合并规则
+     * @param treatmentPlanList
+     */
+    private void mergerRules(List<TreatDetail> treatmentPlanList) {
+        int i = 0;
+        Map<List<String>,LinkedHashMap<String,List<Drugs>>> fi = new HashMap<>();
+        Map<List<String>,LinkedHashMap<String,List<Drugs>>> fi_second = new HashMap<>();
+        if(treatmentPlanList.size()>0){
+            for (TreatDetail td:treatmentPlanList) {
+                List<String> disList = new ArrayList<>();
+                String title = td.getTitle();
+                String startTitle, subTitle = "";
+                if(title.contains("及其")){
+                    startTitle = title.substring(0,title.indexOf("及其"));
+                    subTitle = title.substring(startTitle.length()+2,title.length());
+                    subTitle = subTitle.substring(0,subTitle.indexOf("建议用药"));
+                    disList.add(startTitle);
+                    disList.add(subTitle);
+                }else {
+                    startTitle = title.substring(0,title.indexOf("建议用药"));
+                    disList.add(startTitle);
+                }
+                LinkedHashMap<String,List<Drugs>> kk = new LinkedHashMap<>();
+                List<MeditionDetail> meditionDetails = td.getMeditionDetails();
+                String description ="";
+                for (MeditionDetail m:meditionDetails) {
+                    description = m.getDescription();
+                    List<Drugs> treatment = m.getTreatment();
+                    kk.put(description,treatment);
+                }
+                if(fi.containsKey(disList)){
+                    LinkedHashMap<String, List<Drugs>> jj = fi.get(disList);
+                    Map.Entry<String, List<Drugs>> next = jj.entrySet().iterator().next();
+                    String key = next.getKey();
+                    String key1 = meditionDetails.get(0).getDescription();
+                    if(!key.equals(key1)){
+                        int type = getType(key.split(":")[0]);//原来的
+                        int type1 = getType(key1.split(":")[0]);//新来的
+                        if(type>type1){
+                            continue;
+                        }else if(type<type1){
+
+                        }
+
+                    }
+                }
+                fi.put(disList,kk);
+            }
+        }
+
+
+
+        if(fi.size()>0){
+            for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> d:fi.entrySet()) { //遍历原始的
+                List<String> key_dis = d.getKey(); // [糖尿病,糖尿病肾病]
+                String s = key_dis.get(0);//糖尿病
+                List<String> otherDis_1 = new ArrayList<>();
+                if(key_dis.size()>1){
+                    for(int j = 1;j<key_dis.size();j++){
+                        otherDis_1.add(key_dis.get(j));
+                    }
+                }
+                //otherDis_1为[糖尿病肾病]
+                LinkedHashMap<String, List<Drugs>> dValue = d.getValue();
+                //"单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂" -> " size = 5"
+                //"糖尿病肾病" -> " size = 1"
+                Map.Entry<String, List<Drugs>> first = dValue.entrySet().iterator().next();//"单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂" -> " size = 5"
+                String key_first = first.getKey();//单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂
+                if(fi_second.keySet().size() == 0){
+                    fi_second.put(key_dis,dValue);
+                }
+
+                for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> d_sec:fi_second.entrySet()) {
+                    List<String> key = d_sec.getKey();// [1型糖尿病,糖尿病肾病]
+                    LinkedHashMap<String, List<Drugs>> value = d_sec.getValue();
+                    Map.Entry<String, List<Drugs>> next = value.entrySet().iterator().next();
+                    String key_next = next.getKey();//"胰岛素治疗:中长效胰岛素、预混胰岛素"
+                    String s_next = key.get(0);//1型糖尿病
+                    List<String> otherDis = new ArrayList<>();
+                    if(key.size()>1){
+                        for(int j = 1;j<key.size();j++){
+                            otherDis.add(key.get(j));
+                        }
+                    }
+                    //otherDis为[糖尿病肾病]
+                    if(s_next.equals(s)){ //1型糖尿病 == 1型糖尿病
+                        if(key_first.equals(key_next)){ //"胰岛素治疗:中长效胰岛素、预混胰岛素" == "胰岛素治疗:中长效胰岛素、预混胰岛素"
+                            if(otherDis_1.size()>0){
+                                for (String dis:otherDis_1) {
+                                    if(!otherDis.contains(dis)){
+                                        otherDis.add(dis);
+                                        List<Drugs> drugsList = dValue.get(dis);
+                                        value.put(dis,drugsList);
+
+                                    }
+                                }
+                            }
+                            fi_second.remove(key);
+                            otherDis.add(0,s_next);
+                            fi_second.put(otherDis,value);
+
+                        }else {
+                            String[] split = key_first.split(":");
+                            String[] split1 = key_next.split(":");
+                            int type_first = getType(split[0]);
+                            int type_next = getType(split1[0]);
+                            if(type_first>type_next){
+                                value.remove(key_next);
+                                LinkedHashMap<String, List<Drugs>> value_new = new LinkedHashMap<>();
+                                LinkedHashMap<String, List<Drugs>> value_new2 = new LinkedHashMap<>();
+                                if(value.size()>0){
+                                    for (Map.Entry<String, List<Drugs>> dg:value.entrySet()
+                                         ) {
+                                        value_new.put(dg.getKey(),dg.getValue());
+                                    }
+
+                                }
+                                value_new2.put(key_first,first.getValue());
+                                if(value_new.size()>0){
+                                    for (Map.Entry<String, List<Drugs>> dg:value_new.entrySet()
+                                            ) {
+                                        value_new2.put(dg.getKey(),dg.getValue());
+                                    }
+                                }
+                                if(otherDis_1.size()>0){
+                                    for (String dis:otherDis_1) {
+                                        if(!otherDis.contains(dis)){
+                                            otherDis.add(dis);
+                                            List<Drugs> drugsList = dValue.get(dis);
+                                            value_new2.put(dis,drugsList);
+                                        }
+                                    }
+                                }
+                                fi_second.remove(key);
+                                otherDis.add(0,s_next);
+                                fi_second.put(otherDis,value_new2);
+                            }else if(type_first == type_next) {
+                                System.out.println("hh");
+                                fi_second.put(key_dis,dValue);
+                            } else {
+                                if(otherDis_1.size()>0){
+                                    for (String dis:otherDis_1) {
+                                        if(!otherDis.contains(dis)){
+                                            otherDis.add(dis);
+                                            List<Drugs> drugsList = dValue.get(dis);
+                                            value.put(dis,drugsList);
+                                        }
+                                    }
+                                }
+                                fi_second.remove(key);
+                                otherDis.add(0,s_next);
+                                fi_second.put(otherDis,value);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+
+
+
+        if(fi_second.size()>0){
+            treatmentPlanList.clear();
+            for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> jfd:fi_second.entrySet()
+                 ) {
+                TreatDetail treatDetail = new TreatDetail();
+                List<String> key = jfd.getKey();
+                LinkedHashMap<String, List<Drugs>> value = jfd.getValue();
+                String title="";
+                title =  key.toString().replace("[","").replace("]","")+"建议用药";
+                List<MeditionDetail> dda = new ArrayList<>();
+                if(value.size()>0){
+                    for (Map.Entry<String, List<Drugs>> ds:value.entrySet()) {
+                        String desc = ds.getKey();
+                        List<Drugs> value1 = ds.getValue();
+                        MeditionDetail meditionDetail = new MeditionDetail();
+                        meditionDetail.setDescription(desc);
+                        meditionDetail.setTreatment(value1);
+                        dda.add(meditionDetail);
+                    }
+                }
+                treatDetail.setTitle(title);
+                treatDetail.setMeditionDetails(dda);
+                treatmentPlanList.add(treatDetail);
+            }
+
+        }
+
+    }
+    private int getType(String type){
+        int i = 0;
+        if(type.equals("单药治疗")){
+            i = 1;
+        }else if(type.equals("双药治疗")){
+            i = 2;
+        }else if(type.equals("胰岛素治疗")){
+            i = 3;
+        }
+        return i;
+    }
+
     private List<TreatDetail> complicationMedicaton(String[] inputList,Driver driver,List<String> allFilds){
         List<TreatDetail> disTreatDetailList = new ArrayList<>();
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
         Map<String, String> medicaton_ji = new HashMap<>();
         Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> filds = new ArrayList<>();
         if(inputList.length>0){
@@ -112,14 +342,14 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         disTreatDetailList = this.processMedication_he(disDrugs, conditionDesign, allFilds, driver);
-
         return disTreatDetailList;
     }
     /**
@@ -134,7 +364,7 @@ public class PushTreat {
 
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {
@@ -160,7 +390,7 @@ public class PushTreat {
         meditionDetail.setTreatment(dList);
         mList.add(meditionDetail);
 
-        treatDetail.setTitle(disName+"治疗方案");
+        treatDetail.setTitle(disName+"建议用药");
         treatDetail.setMeditionDetails(mList);
         disTreatDetailList.add(treatDetail);
         return disTreatDetailList;
@@ -169,6 +399,7 @@ public class PushTreat {
     private List<TreatDetail> otherRuleMedicaton(String disName,List<String> excludeDiagFilds,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         excludeDiagFilds.add("'"+disName+"'");
         Session  session = driver.session(AccessMode.WRITE);
@@ -179,28 +410,23 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-//        if(!disSet.contains(disName)){
-//            //规则不匹配,返回主诊断治疗方案
-//            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-//        }else {
-            treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
-
-//        }
-
+        treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
         return treatDetailList;
     }
 
     //匹配规则,推荐用药
     private List<TreatDetail> ruleMedicaton(String disName,String webDiag,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
-        Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,Map<String,Object>> disDrugs = new LinkedHashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> webDiagList = processWebDiag(disName,webDiag);
         Session  session = driver.session(AccessMode.WRITE);
@@ -208,30 +434,53 @@ public class PushTreat {
             @Override
             public Integer execute(Transaction tx) {
                 String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",webDiagList.toString());
-//                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",allFilds.toString());
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-        if(!disSet.contains(disName)){
-            //规则不匹配,返回主诊断治疗方案
-            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-        }else {
-            treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        return treatDetailList;
+    }
+    private void addColl(Map<String,List<String>> condiTypedis,Map<String,Map<String,Object>> disDrugs){
+        if(condiTypedis!= null &&condiTypedis.size()>0){
+            for (Map.Entry<String,List<String>> ctd:condiTypedis.entrySet()) {
+                String name = ctd.getKey().split("&")[1];
+                String type = ctd.getKey().split("&")[0];//主症或并发症
+                if(disDrugs.containsKey(name)){
 
+                    Map<String, Object> objectMap = disDrugs.get(name);
+                    List<String> cateList = (List<String>) objectMap.get("cate");
+                    int index = cateList.indexOf(type);
+                    if(objectMap.containsKey("coll")){
+                        List<Object> list = (List<Object>) objectMap.get("coll");
+                        List<String> v = new ArrayList<>();
+                        v.addAll(ctd.getValue());
+                        list.add(index,v);
+                        objectMap.put("coll",list);
+                    }else {
+                        List<Object> list = new ArrayList<>();
+                        List<String> v = new ArrayList<>();
+                        v.addAll(ctd.getValue());
+                        list.add(v);
+                        objectMap.put("coll",list);
+                    }
+                    disDrugs.put(name,objectMap);
+                }
+
+            }
         }
 
-        return treatDetailList;
-    }
 
-    private void searchDrugs(StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
-        List<String> collection =null;
+    }
+    private void searchDrugs(Map<String,List<String>> condiTypedis,StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
+        String collection =null;
         int i=0;
         Record next = result.next();
         String name = next.get("name").toString().replace("\"", "");
@@ -242,38 +491,45 @@ public class PushTreat {
         disSet.add(disName);
         if(design >= i){
             i = design;
-            collection = (List) next.get("collection").asList();
+            collection = next.get("collection").toString().replace("\"", "");
         }
         conditionDesign.put(name,i);
+        String ncd =category+"&"+ name + "&" + disName;
+        if(condiTypedis.containsKey(ncd)){
+            List<String> list = condiTypedis.get(ncd);
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }else {
+            List<String> list = new ArrayList<>();
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }
+
         if(!disDrugs.containsKey(name)){
             Map<String, Object> designHashMap = new HashMap<>();
-            List<String> pList = new ArrayList<>();
             List<String> cateList = new ArrayList<>();
             List<String> disList = new ArrayList<>();
-            List<Object> collList = new ArrayList<>();
-            pList.add(p);
-            designHashMap.put("p",pList);
-            cateList.add(category);
+            if(!cateList.contains(category)){
+                cateList.add(category);
+            }
             designHashMap.put("cate",cateList);
-            disList.add(disName);
+            if(!disList.contains(disName)){
+                disList.add(disName);
+            }
             designHashMap.put("dis",disList);
-            collList.add(collection);
-            designHashMap.put("coll",collList);
             disDrugs.put(name,designHashMap);
         }else {
             Map<String, Object> objectMap = disDrugs.get(name);
-            List<String> p1 = (List<String>)objectMap.get("p");
-            p1.add(p);
-            objectMap.put("p",p1);
             List<String> cate1 = (List<String>)objectMap.get("cate");
-            cate1.add(category);
+            if(!cate1.contains(category)){
+                cate1.add(category);
+            }
             objectMap.put("cate",cate1);
             List<String> dis1 = (List<String>)objectMap.get("dis");
-            dis1.add(disName);
+            if(!dis1.contains(disName)){
+                dis1.add(disName);
+            }
             objectMap.put("dis",dis1);
-            List<Object> coll1 = (List<Object>)objectMap.get("coll");
-            coll1.add(collection);
-            objectMap.put("coll",coll1);
             disDrugs.put(name,objectMap);
         }
     }
@@ -333,7 +589,8 @@ public class PushTreat {
         if(disDrugs != null && disDrugs.size()>0){
             for (Map.Entry<String,Map<String,Object>> ds:disDrugs.entrySet()) {
                 String key = ds.getKey();
-                if(Arrays.asList(key.split("\\+")).contains(disName)){
+                List<String> asList = Arrays.asList(key.split("\\+"));
+                if(asList.contains(disName)){
                     Map<String, Object> values = ds.getValue();
                     List<String> cateList = (List<String>) values.get("cate");
                     List<String> disList = (List<String>)values.get("dis");
@@ -344,7 +601,7 @@ public class PushTreat {
                         List<MeditionDetail> meditionDetails = new ArrayList<>();
                         int main = cateList.indexOf("主症");
                         String mainDis = disList.get(main);
-                        treatDetail.setTitle(mainDis+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        treatDetail.setTitle(mainDis+"建议用药");//糖尿病及其2型糖尿病建议用药
                         Integer da = conditionDesign.get(key);
                         String s = switchType(da);
                         MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
@@ -359,6 +616,46 @@ public class PushTreat {
 
                         treatDetailList.add(treatDetail);
                     }
+                    if(asList.size()>2 && cateList.contains("并发症")){
+                        TreatDetail treatDetail = new TreatDetail();
+                        List<MeditionDetail> meditionDetails = new ArrayList<>();
+                        int main = cateList.indexOf("主症");
+                        String mainDis = disList.get(main);
+                        List<String> dds= new ArrayList<>();
+                        for(String s:disList){
+                            if(!s.equals(mainDis)){
+                                dds.add(s);
+                            }
+                        }
+                        treatDetail.setTitle(mainDis+"及其"+String.join("、",dds)+"建议用药");//糖尿病及其2型糖尿病建议用药
+                        Integer da = conditionDesign.get(key);
+                        String s = switchType(da);
+                        MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
+                        List<String> o = (List<String>)collList.get(main);
+                        List<String> yinhao = yinhao(o);
+                        //根据类找药
+                        List<Drugs> drugs = searchMedication(yinhao,allFilds,driver);
+                        meditionDetail_main.setDescription(s+":"+String.join("、",o));//单药治疗:双胍类
+                        meditionDetail_main.setTreatment(drugs);
+                        meditionDetails.add(meditionDetail_main);
+
+                        //并发症用药
+                        for (String dis:dds) {
+                            MeditionDetail meditionDetail_bing = new MeditionDetail();//并发症的
+                            int i = disList.indexOf(dis);
+                            List<String> ol = (List<String>)collList.get(i);
+                            List<String> yinhaol = yinhao(ol);
+                            List<Drugs> drugs1 = searchMedication(yinhaol,allFilds,driver);
+                            meditionDetail_bing.setDescription(dis);//单药治疗:双胍类
+                            meditionDetail_bing.setTreatment(drugs1);
+                            meditionDetails.add(meditionDetail_bing);
+                        }
+
+                        treatDetail.setMeditionDetails(meditionDetails);
+
+                        treatDetailList.add(treatDetail);
+
+                    }
                 }
 
             }
@@ -387,7 +684,7 @@ public class PushTreat {
                                 dds.add(s);
                             }
                         }
-                        treatDetail.setTitle(mainDis+"及其"+String.join("、",dds)+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        treatDetail.setTitle(mainDis+"及其"+String.join("、",dds)+"建议用药");//糖尿病及其2型糖尿病建议用药
                         Integer da = conditionDesign.get(key);
                         String s = switchType(da);
                         MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
@@ -422,7 +719,7 @@ public class PushTreat {
                         List<MeditionDetail> meditionDetails = new ArrayList<>();
                         int main = cateList.indexOf("主症");
                         String mainDis = disList.get(main);
-                        treatDetail.setTitle(mainDis+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        treatDetail.setTitle(mainDis+"建议用药");//糖尿病及其2型糖尿病建议用药
                         Integer da = conditionDesign.get(key);
                         String s = switchType(da);
                         MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
@@ -446,7 +743,7 @@ public class PushTreat {
     private List<Drugs> searchMedication(List<String> drugs,List<String> allFilds,Driver driver){
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {
@@ -685,16 +982,18 @@ public class PushTreat {
                 List<CrisisDetail> value = crisis.getValue();
                 if(value!=null && value.size()>0){
                     for (CrisisDetail crisisDetail:value) {
-                        String[] crisisSplits = crisisDetail.getRemindText().split(":");
-                        if(crisisMap.containsKey(crisisSplits[0])){
-                            if("轻度".equals(crisisMap.get(crisisSplits[0])) && ("重度".equals(crisisSplits[1])||"中度".equals(crisisSplits[1]) )){
-                                crisisMap.put(crisisSplits[0],crisisSplits[1]);
-                            }
-                            if("中度".equals(crisisMap.get(crisisSplits[0])) && "重度".equals(crisisSplits[1])){
-                                crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                        if (crisisDetail.getRemindText().indexOf(":") > -1) {
+                            String[] crisisSplits = crisisDetail.getRemindText().split(":");
+                            if (crisisMap.containsKey(crisisSplits[0])) {
+                                if ("轻度".equals(crisisMap.get(crisisSplits[0])) && ("重度".equals(crisisSplits[1]) || "中度".equals(crisisSplits[1]))) {
+                                    crisisMap.put(crisisSplits[0], crisisSplits[1]);
+                                }
+                                if ("中度".equals(crisisMap.get(crisisSplits[0])) && "重度".equals(crisisSplits[1])) {
+                                    crisisMap.put(crisisSplits[0], crisisSplits[1]);
+                                }
+                            } else {
+                                crisisMap.put(crisisSplits[0], crisisSplits[1]);
                             }
-                        }else {
-                            crisisMap.put(crisisSplits[0],crisisSplits[1]);
                         }
                         /*if(sign.equals(crisisDetail.getTypeId()) && !sign.equals("6")){
                             crisisMap.put(crisisSplits[0],crisisSplits[1]);

+ 6 - 4
graph/src/main/resources/pushTreat.properties

@@ -10,16 +10,16 @@ with c,count(distinct r)>=c.path as hh \n \
 where hh =true \n \
 with c \n \
 match(c)-[r:\u63A8\u8350]->(t:TreatCollection) \n \
-return c.name as name,c.design as design,r.p as p,r.category as category,r.disName as disName,collect(t.name) as collection order by p
+return c.name as name,c.design as design,r.p as p,r.category as category,r.disName as disName,t.name as collection order by p
 #\u89C4\u5219\u627E\u836F
-searchMedication_rule=match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+searchMedication_rule=unwind drugs as row match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name=row \n \
 with m,d \n \
 match(m:Medicine)-[r:\u5C5E\u4E8E]->(h:Drugs) where d.bigDrugs=h.name \n \
 with h,d,m \n \
 match(m)<-[R:\u614E\u7528|:\u5FCC\u7528]-(i) where i.name in filds \n \
 return h.name as big,d.name as sub,m.name as med,type(R) as ty \n \
 union \n \
-match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+unwind drugs as row match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name=row \n \
 with m,d \n \
 match(m:Medicine)-[r:\u5C5E\u4E8E]->(h:Drugs) where d.bigDrugs=h.name \n \
 return h.name as big,d.name as sub,m.name as med,null as ty
@@ -38,4 +38,6 @@ with t,m,d\n \
 match(t)-[r:\u63A8\u8350]->(m)-[r1:\u5C5E\u4E8E]->(h:Drugs)\n \
 where d.name=h.bigDrugs \n \
 return t.name as treat,d.name as big,h.name as sub, m.name as med,null as ty\n \
-order by h.p
+order by h.p
+# \u5224\u65AD\u8BCA\u65AD\u662F\u4EC0\u4E48\u7C7B\u578B
+judgeDiseaseType=match(d:Disease) where d.name='disName' return d.sign as design

+ 36 - 18
nlp/src/main/java/org/diagbot/nlp/rule/module/PreResult.java

@@ -4,14 +4,16 @@ package org.diagbot.nlp.rule.module;
  * Created by louhr on 2019/8/31.
  */
 public class PreResult {
+    protected String name = "";
+    protected String uniqueName = "";
+    protected String dateValue = "";
     private String detailName = "";
-    private String uniqueName = "";
     private String maxValue = "";
     private String minValue = "";
-    private String name = "";
     private String otherValue = "";
     private String units = "";
     private String value = "";
+    private String result = "";
 
     public String getDetailName() {
         return detailName;
@@ -21,14 +23,6 @@ public class PreResult {
         this.detailName = detailName;
     }
 
-    public String getUniqueName() {
-        return uniqueName;
-    }
-
-    public void setUniqueName(String uniqueName) {
-        this.uniqueName = uniqueName;
-    }
-
     public String getMaxValue() {
         return maxValue;
     }
@@ -45,14 +39,6 @@ public class PreResult {
         this.minValue = minValue;
     }
 
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
     public String getOtherValue() {
         return otherValue;
     }
@@ -76,4 +62,36 @@ public class PreResult {
     public void setValue(String value) {
         this.value = value;
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUniqueName() {
+        return uniqueName;
+    }
+
+    public void setUniqueName(String uniqueName) {
+        this.uniqueName = uniqueName;
+    }
+
+    public String getDateValue() {
+        return dateValue;
+    }
+
+    public void setDateValue(String dateValue) {
+        this.dateValue = dateValue;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
 }

+ 42 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentAllergy.java

@@ -0,0 +1,42 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/9.
+ */
+public class PretreatmentAllergy extends Pretreatment {
+    protected NegativeEnum[] nees_allergy = new NegativeEnum[]{NegativeEnum.ALLERGY};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_allergy)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("过敏--");
+                result.setDetailName("过敏--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.ALLERGY) + "过敏");
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 42 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentDrug.java

@@ -0,0 +1,42 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/6.
+ */
+public class PretreatmentDrug extends Pretreatment {
+    protected NegativeEnum[] nees_med = new NegativeEnum[]{NegativeEnum.MEDICINE, NegativeEnum.MEDICINE_NAME, NegativeEnum.MEDICINE_PRD};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_med)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("药品--");
+                result.setDetailName("药品--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.MEDICINE));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 39 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentFamily.java

@@ -0,0 +1,39 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PretreatmentFamily extends Pretreatment {
+    protected NegativeEnum[] nees_family = new NegativeEnum[]{NegativeEnum.FAMILY_HISTORY};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_family)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("家族--");
+                result.setDetailName("家族--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.FAMILY_HISTORY));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 27 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentInfectious.java

@@ -0,0 +1,27 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/9.
+ */
+public class PretreatmentInfectious extends Pretreatment {
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 7 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentNormal.java

@@ -34,6 +34,13 @@ public class PretreatmentNormal extends Pretreatment {
                     preResults.add(result);
                     return preResults;
                 }
+            } else if ("己婚".equals(l.getText()) || "未婚".equals(l.getText())){
+                PreResult result = new PreResult();
+                result.setUniqueName("其他--");
+                result.setDetailName("其他--");
+                result.setValue(l.getText());
+                preResults.add(result);
+                return preResults;
             }
         }
         return preResults;

+ 41 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentOperation.java

@@ -0,0 +1,41 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/6.
+ */
+public class PretreatmentOperation extends Pretreatment {
+    protected NegativeEnum[] operation_disease = new NegativeEnum[]{NegativeEnum.OPERATION};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), operation_disease)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("手术--");
+                result.setDetailName("手术--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.OPERATION));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 6 - 1
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPacs.java

@@ -44,7 +44,12 @@ public class PretreatmentPacs extends Pretreatment {
                     result.setUniqueName("检查--");
                     preResultList.add(result);
                 }
-            } else if (NlpUtil.isFeature(l.getProperty(), nees_time_and_unit) && i > 0) {
+            }else if (NlpUtil.isFeature(l.getProperty(), nees_pacs_result) && i == 0){
+                PreResult result = new PreResult();
+                result.setValue(NlpUtil.concept(l, NegativeEnum.PACS_RESULT));
+                result.setUniqueName("检查--");
+                preResultList.add(result);
+            }else if (NlpUtil.isFeature(l.getProperty(), nees_time_and_unit) && i > 0) {
                 PreResult result = data2Object(lexemes, l, i, l.getProperty());
                 if (result != null) {
                     preResultList.add(result);

+ 1 - 36
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPast.java

@@ -12,10 +12,6 @@ import java.util.List;
 
 public class PretreatmentPast extends Pretreatment {
     protected NegativeEnum[] nees_past_desc = new NegativeEnum[]{NegativeEnum.PAST_DESC};
-    protected NegativeEnum[] nees_disease = new NegativeEnum[]{NegativeEnum.DISEASE};
-    protected NegativeEnum[] nees_operation = new NegativeEnum[]{NegativeEnum.OPERATION};
-    protected NegativeEnum[] nees_allergy = new NegativeEnum[]{NegativeEnum.ALLERGY};
-    protected NegativeEnum[] nees_med = new NegativeEnum[]{NegativeEnum.MEDICINE, NegativeEnum.MEDICINE_NAME, NegativeEnum.MEDICINE_PRD};
 
     public List<PreResult> analyze(String content) throws java.io.IOException{
         List<PreResult> preResults = new ArrayList<>();
@@ -23,42 +19,11 @@ public class PretreatmentPast extends Pretreatment {
         for (int i = 0; i < lexemes.size(); i++) {
             Lexeme l = lexemes.get(i);
             PreResult result = new PreResult();
-            if (NlpUtil.isFeature(l.getProperty(), nees_disease)) {
-                result.setUniqueName("诊断--");
-                result.setDetailName("诊断--");
-                result.setValue(NlpUtil.concept(l, NegativeEnum.DISEASE));
-                preResults.add(result);
-            } else if (NlpUtil.isFeature(l.getProperty(), nees_past_desc)) {
+            if (NlpUtil.isFeature(l.getProperty(), nees_past_desc)) {
                 result.setUniqueName("既往--");
                 result.setDetailName("既往--");
                 result.setValue(NlpUtil.concept(l, NegativeEnum.PAST_DESC));
                 preResults.add(result);
-            } else if (NlpUtil.isFeature(l.getProperty(), nees_operation)) {
-                result.setUniqueName("手术--");
-                result.setDetailName("手术--");
-                result.setValue(NlpUtil.concept(l, NegativeEnum.OPERATION));
-                preResults.add(result);
-            } else if (NlpUtil.isFeature(l.getProperty(), nees_med)) {
-                result.setUniqueName("药品--");
-                result.setDetailName("药品--");
-                result.setValue(NlpUtil.concept(l, NegativeEnum.MEDICINE));
-                preResults.add(result);
-            }
-            if (l.getText().indexOf("过敏") > -1) {
-                int max_find_step = 10;
-                int position = i - 1;
-                Lexeme leftLexeme;
-                while (i - position < max_find_step && position > -1) {
-                    leftLexeme = lexemes.get(position);
-                    //遇上过敏史信息
-                    if (NlpUtil.isFeature(leftLexeme.getProperty(), nees_allergy)) {
-                        result.setUniqueName("过敏--");
-                        result.setDetailName("过敏--");
-                        result.setValue(NlpUtil.concept(leftLexeme, NegativeEnum.ALLERGY) + "过敏");
-                        preResults.add(result);
-                    }
-                    position--;
-                }
             }
         }
         return preResults;

+ 42 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPersonal.java

@@ -0,0 +1,42 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/9.
+ */
+public class PretreatmentPersonal extends Pretreatment {
+    protected NegativeEnum[] nees_allergy = new NegativeEnum[]{NegativeEnum.PERSON_FEATURE_DESC, NegativeEnum.BLOOD, NegativeEnum.BAD_HABBIT};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_allergy)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("个人--");
+                result.setDetailName("个人--");
+                result.setValue(l.getText());
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 39 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVaccination.java

@@ -0,0 +1,39 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.ParticipleUtil;
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.nlp.util.NegativeEnum;
+import org.diagbot.nlp.util.NlpUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PretreatmentVaccination extends Pretreatment {
+    protected NegativeEnum[] nees_vaccination = new NegativeEnum[]{NegativeEnum.VACCINATION};
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        for (int i = 0; i < lexemes.size(); i++) {
+            Lexeme l = lexemes.get(i);
+            if (NlpUtil.isFeature(l.getProperty(), nees_vaccination)) {
+                PreResult result = new PreResult();
+                result.setUniqueName("接种--");
+                result.setDetailName("接种--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.VACCINATION));
+                preResults.add(result);
+            }
+        }
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 17 - 3
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java

@@ -41,9 +41,10 @@ public class PretreatmentVital extends Pretreatment {
                         position++;
                         continue;
                     }
-                    String[] digits = l.getText().split("/");
+                    String[] digits = l.getText().split("/",-1);
                     if (digits.length == 2) {
-                        if (!NlpUtil.isNumberString(digits[0])){
+                        if (!NlpUtil.isNumberString(digits[0])) {
+                            position++;
                             continue;
                         }
                         PreResult result = new PreResult();
@@ -52,7 +53,8 @@ public class PretreatmentVital extends Pretreatment {
                         result.setValue(digits[0]);
                         result.setUnits("mmHg");
                         preResults.add(result);
-                        if (!NlpUtil.isNumberString(digits[1])){
+                        if (!NlpUtil.isNumberString(digits[1])) {
+                            position++;
                             continue;
                         }
                         result = new PreResult();
@@ -65,6 +67,18 @@ public class PretreatmentVital extends Pretreatment {
                     }
                     position++;
                 }
+            } else if ("/".equals(l.getText())) { //针对血压/91mmHg情况
+                int position = i + 1;
+                if (!NlpUtil.isNumberString(lexemes.get(position).getText())
+                        || !"mmHg".equals(lexemes.get(position + 1).getText())) {
+                    continue;
+                }
+                PreResult result = new PreResult();
+                result.setUniqueName("体征--舒张压");
+                result.setDetailName("舒张压");
+                result.setValue(lexemes.get(position).getText());
+                result.setUnits("mmHg");
+                preResults.add(result);
             }
         }
         return preResults;

+ 27 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentWound.java

@@ -0,0 +1,27 @@
+package org.diagbot.nlp.rule.pretreat;
+
+import org.diagbot.nlp.participle.word.Lexeme;
+import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.rule.module.PreResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by louhr on 2019/12/9.
+ */
+public class PretreatmentWound extends Pretreatment {
+
+    public List<PreResult> analyze(String content) throws java.io.IOException{
+        List<PreResult> preResults = new ArrayList<>();
+        return preResults;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 1 - 1
nlp/src/main/java/org/diagbot/nlp/util/Constants.java

@@ -75,5 +75,5 @@ public class Constants {
     public final static String word_property_degree_quan = "43";
     public final static String word_property_other = "44";
 
-
+    public final static String app_rule_type_id = "6";
 }

+ 13 - 1
nlp/src/main/java/org/diagbot/nlp/util/NegativeEnum.java

@@ -13,7 +13,7 @@ public enum NegativeEnum {
     OTHER("44"),
     VITAL_INDEX("33"), VITAL_INDEX_VALUE("34"), VITAL_RESULT("35"),
     ADDRESS("36"), PERSON("38"), PERSON_FEATURE_DESC("39"), PUB_NAME("46"), MEDICINE_NAME("53"),MEDICINE_PRD("54"),PAST_DESC("55"),ALLERGY("65"),
-    MARRIED_DESC("62"), RETURN_VISIT("68"), DIAG_STAND("70");
+    MARRIED_DESC("62"), RETURN_VISIT("68"), DIAG_STAND("70"), BLOOD("58"), BAD_HABBIT("60"), FAMILY_HISTORY("64"), VACCINATION("71");
     private String value;
 
     NegativeEnum(String value) {
@@ -159,9 +159,18 @@ public enum NegativeEnum {
             case "55":
                 negativeEnum = NegativeEnum.PAST_DESC;
                 break;
+            case "58":
+                negativeEnum = NegativeEnum.BLOOD;
+                break;
+            case "60":
+                negativeEnum = NegativeEnum.BAD_HABBIT;
+                break;
             case "62":
                 negativeEnum = NegativeEnum.MARRIED_DESC;
                 break;
+            case "64":
+                negativeEnum = NegativeEnum.FAMILY_HISTORY;
+                break;
             case "65":
                 negativeEnum = NegativeEnum.ALLERGY;
                 break;
@@ -171,6 +180,9 @@ public enum NegativeEnum {
             case "70":
                 negativeEnum = NegativeEnum.DIAG_STAND;
                 break;
+            case "71":
+                negativeEnum = NegativeEnum.VACCINATION;
+                break;
         }
         return negativeEnum;
     }

+ 21 - 16
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -8,17 +8,13 @@ import org.diagbot.common.push.bean.CrisisDetail;
 import org.diagbot.common.push.bean.FeatureRate;
 import org.diagbot.common.push.bean.ResponseData;
 import org.diagbot.common.push.bean.SearchData;
-import org.diagbot.common.push.bean.neo4j.Drugs;
-import org.diagbot.common.push.bean.neo4j.Filnlly;
-import org.diagbot.common.push.bean.neo4j.MedicalIndication;
-import org.diagbot.common.push.bean.neo4j.MedicalIndicationDetail;
-import org.diagbot.common.push.bean.neo4j.Medicition;
+import org.diagbot.common.push.bean.neo4j.*;
 import org.diagbot.common.push.cache.CacheUtil;
 import org.diagbot.common.push.filter.ClassifyDiag;
 import org.diagbot.common.push.filter.rule.PretreatmentRule;
+import org.diagbot.common.push.util.PushConstants;
 import org.diagbot.common.push.work.ParamsDataProxy;
 import org.diagbot.graphWeb.work.GraphCalculate;
-import org.diagbot.graphWeb.work.LisPacsCalculate;
 import org.diagbot.nlp.rule.pretreat.Pretreatment;
 import org.diagbot.nlp.rule.pretreat.PretreatmentLis;
 import org.diagbot.nlp.util.Constants;
@@ -131,12 +127,12 @@ public class AlgorithmController extends BaseController {
         ResponseData responseData = new ResponseData();
         logger.info("开始推送服务......");
         LisApplication lisApplication = new LisApplication();
-        if ((searchData.getLisArr() == null || searchData.getLisArr().size() == 0)
-                && StringUtils.isNotEmpty(searchData.getLis())) {
+        if ((searchData.getLis() == null || searchData.getLis().size() == 0)
+                && StringUtils.isNotEmpty(searchData.getLisString())) {
             Pretreatment pretreatment = new PretreatmentLis();
-            searchData.setLisArr(pretreatment.analyze(searchData.getLis()));
+            searchData.setLis(pretreatment.analyze(searchData.getLisString()));
         }
-        lisApplication.lisConvertToInputs(searchData.getLisArr(),searchData);
+        lisApplication.lisConvertToInputs(searchData.getLis(),searchData);
 
         Response<ResponseData> response = new Response();
         //一些基本信息预处理 如年龄 性别
@@ -147,7 +143,17 @@ public class AlgorithmController extends BaseController {
         pretreatmentRule.rule(searchData);
         //危机值
         CrisisApplication crisisApplication = new CrisisApplication();
-        responseData.setCrisisDetails(crisisApplication.crisisContent(searchData));
+        Map<String, List<CrisisDetail>> crisisDetailMap = crisisApplication.crisisContent(searchData);
+        responseData.setCrisisDetails(crisisDetailMap);
+        //判断是否有危急值或开单合理性数据
+        List<CrisisDetail> crisisDetails = crisisDetailMap.get("crisis");
+        if (crisisDetails != null) {
+            for (CrisisDetail cd : crisisDetails) {
+                if (PushConstants.rule_app_type_id_1.equals(cd.getTypeId()) || PushConstants.rule_app_type_id_2.equals(cd.getTypeId())) {
+                    responseData.setHasIndications("1");
+                }
+            }
+        }
 
         //大数据推送
 //        searchData.setLength(6);    //模型推送最多6个比较合理
@@ -158,8 +164,7 @@ public class AlgorithmController extends BaseController {
         bigDataResponseData.setPacs(new ArrayList<>());
 
         GraphCalculate graphCalculate = new GraphCalculate();
-        Map<String, List<CrisisDetail>> crisisDetails = responseData.getCrisisDetails();
-        ResponseData graphResponseData = graphCalculate.calculate(request, searchData,crisisDetails);
+        ResponseData graphResponseData = graphCalculate.calculate(request, searchData, crisisDetailMap);
         if (graphResponseData.getDis().size() > 0) {
             List<FeatureRate> disFeatureRates = new ArrayList<>();
             List<FeatureRate> bigdis = bigDataResponseData.getDis();
@@ -187,7 +192,7 @@ public class AlgorithmController extends BaseController {
         bigDataResponseData.setTreat(graphResponseData.getTreat());
 
         //量表和指标推送
-        List<MedicalIndication> crisisDetailsList = this.getCrisisDetails(crisisDetails);
+        List<MedicalIndication> crisisDetailsList = this.getCrisisDetails(crisisDetailMap);
         List<MedicalIndication> medicalIndications = graphResponseData.getMedicalIndications();
         if (medicalIndications == null) {
             medicalIndications = new ArrayList<>();
@@ -243,18 +248,18 @@ public class AlgorithmController extends BaseController {
             for (CrisisDetail crisisDetail : entry.getValue()) {
                 String originText = crisisDetail.getOriginText();//文本输入的数据
                 String remindText = crisisDetail.getRemindText();//危机警示指标
-                String standardText = crisisDetail.getStandardText();//评判标准
                 if (StringUtils.isNotEmpty(remindText)) {
                     MedicalIndication medicalIndication = new MedicalIndication();
                     List<MedicalIndicationDetail> crisisMid = new ArrayList<>();
                     MedicalIndicationDetail medicalIndicationDetail = new MedicalIndicationDetail();
                     JSONObject jsonObject = new JSONObject();
                     jsonObject.put("controlType", 2);
-                    jsonObject.put("name", standardText);
+                    jsonObject.put("name", originText);
                     medicalIndicationDetail.setType(4);
                     medicalIndicationDetail.setContent(jsonObject);
                     crisisMid.add(medicalIndicationDetail);
                     medicalIndication.setName(remindText);
+                    medicalIndication.setRule(originText);
                     medicalIndication.setDetails(crisisMid);
                     crisisDetailList.add(medicalIndication);
                 }

+ 161 - 86
push-web/src/main/resources/static/pages/algorithm/list.html

@@ -405,17 +405,30 @@
             startDiag('/algorithm/page_neural', '#pacs_list', '5,2,7', resourceType, '151', '5');
 
         } else {
-            startDiag('/algorithm/page_neural', '#symptom_list', '1', resourceType, '11', '1');
-            startDiag('/algorithm/page_neural', '#vital_list', '3,2,7,42', resourceType, '31', '3');
-            startDiag('/algorithm/page_neural', '#lis_list', '4,2,7', resourceType, '41', '4');
-            startDiag('/algorithm/page_neural', '#pacs_list', '5,2,7', resourceType, '51', '5');
-
-            startDiagMapping('/algorithm/page_neural', '#diag_list', '2', resourceType, '21', '2');
-            startDiagMapping('/algorithm/page_neural', '#before_combine_diag_list', '2', resourceType, '21', '6');
+//            startDiag('/algorithm/page_neural', '#symptom_list', '1', resourceType, '11', '1');
+//            startDiag('/algorithm/page_neural', '#vital_list', '3,2,7,42', resourceType, '31', '3');
+//            startDiag('/algorithm/page_neural', '#lis_list', '4,2,7', resourceType, '41', '4');
+//            startDiag('/algorithm/page_neural', '#pacs_list', '5,2,7', resourceType, '51', '5');
+//
+//            startDiagMapping('/algorithm/page_neural', '#diag_list', '2', resourceType, '21', '2');
+            startDiagMapping('/algorithm/neural', '#before_combine_diag_list', '2', resourceType, '21', '6');
         }
     }
 
     function startDiagMapping(url, obj, featureType, resourceType, algorithmClassify, tp) {
+        var t = {
+            "sysCode":1,"disType":"1",
+            "age":28,
+            "diagOrder":[
+                {
+                    "name":"糖尿病",
+                    "uniqueName":"糖尿病"
+                },
+                {
+                    "name":"糖尿病肾病",
+                    "uniqueName":"糖尿病肾病"
+                }
+            ]};
         $(obj).DataTable({
             "paging": false,
             "bPaginate" : true,
@@ -434,69 +447,99 @@
             ],
             "ajax": {
                 "url": push_web_url + url,
-                "data": function ( d ) {
-                    d.featureType = featureType;
-                    d.resourceType = resourceType;
-                    d.algorithmClassifyValue =  algorithmClassify;
-                    var symptom = $("#symptom_id").val();
-                    var vital = $("#vital_id").val();
-                    var past = $("#past_id").val();
-                    var other = $("#other_id").val();
-                    var lis = $("#lis_id").val();
-                    var pacs = $("#pacs_id").val();
-                    var lisOrder = $("#lis_order").val();
-                    var pacsOrder = $("#pacs_order").val();
-                    var diag = $("#diag_id").val();
-                    var length = $("#length").val();
-                    var sex = $("#sex").val();
-                    var age = $("#age").val();
-                    var age_start = $("#age_start").val();
-                    var age_end = $("#age_end").val();
-                    d.sysCode = "2";
-                    //添加额外的参数传给服务器
-                    if (symptom != null && symptom != undefined) {
-                        d.symptom = symptom;
-                    }
-                    if (vital != null && vital != undefined) {
-                        d.vital = vital;
-                    }
-                    if (past != null && past != undefined) {
-                        d.past = past;
-                    }
-                    if (other != null && other != undefined) {
-                        d.other = other;
-                    }
-                    if (lis != null && lis != undefined) {
-                        d.lis = lis;
-                    }
-                    if (pacs != null && pacs != undefined) {
-                        d.pacs = pacs;
-                    }
-                    if (lisOrder != null && lisOrder != undefined) {
-                        d.lisOrder = lisOrder;
-                    }
-                    if (pacsOrder != null && pacsOrder != undefined) {
-                        d.pacsOrder = pacsOrder;
-                    }
-                    if (diag != null && diag != undefined && diag != '') {
-                        d.diag = diag;
-                    }
-                    if (length != null && length != undefined) {
-                        d.length = length;
-                    }
-                    if (sex != null && sex != undefined) {
-                        d.sex = sex;
-                    }
-                    if (age != '' && age_start != age && age != undefined) {
-                        d.age = age;
-                    }
-                    if (age_start != '' && age_start != null && age_start != undefined) {
-                        d.age_start = age_start;
-                    }
-                    if (age_end != '' && age_end != null && age_end != undefined) {
-                        d.age_end = age_end;
-                    }
-                },
+                "type": "POST",
+                "data":t,
+//                "data": function ( d ) {
+//                    d.featureType = featureType;
+//                    d.resourceType = resourceType;
+//                    d.algorithmClassifyValue =  algorithmClassify;
+//                    var symptom = $("#symptom_id").val();
+//                    var vital = $("#vital_id").val();
+//                    var pasts = $("#past_id").val();
+//                    var other = $("#other_id").val();
+//                    var lisString = $("#lis_id").val();
+//                    var pacsString = $("#pacs_id").val();
+//                    var lisOrder = $("#lis_order").val();
+//                    var pacsOrder = $("#pacs_order").val();
+//                    var diagOrder = $("#diag_id").val();
+//                    var length = $("#length").val();
+//                    var sex = $("#sex").val();
+//                    var age = $("#age").val();
+//                    var age_start = $("#age_start").val();
+//                    var age_end = $("#age_end").val();
+//                    d.sysCode = "2";
+//                    //添加额外的参数传给服务器
+//                    if (symptom != null && symptom != undefined) {
+//                        d.symptom = symptom;
+//                    }
+//                    if (vital != null && vital != undefined) {
+//                        d.vital = vital;
+//                    }
+//                    if (pasts != null && pasts != undefined) {
+//                        d.pasts = pasts;
+//                    }
+//                    if (other != null && other != undefined) {
+//                        d.other = other;
+//                    }
+//                    if (lisString != null && lisString != undefined) {
+//                        d.lisString = lisString;
+//                    }
+//                    if (pacsString != null && pacsString != undefined) {
+//                        d.pacsString = pacsString;
+//                    }
+//                    var lisOrderJson = "";
+//                    if (lisOrder != null && lisOrder != undefined) {
+//                        var arr = lisOrder.split(",");
+//                        for (i = 0; i < arr.length; i++) {
+//                            lisOrderJson  =
+//                                "{'uniqueName':'"+ arr[i]+"','name': '', 'dateValue' : '' }";
+//                        }
+//                        d.lisOrder = lisOrderJson;
+//                    }
+//                    var pacsOrderJson = [];
+//                    if (pacsOrder != null && pacsOrder != undefined) {
+//                        var arr = pacsOrder.split(",");
+//                        for (i = 0; i < arr.length; i++) {
+//                            var json_val  =
+//                                {
+//                                    "uniqueName" : arr[i],
+//                                    "name" : "",
+//                                    "dateValue" : ""
+//                                };
+//                            pacsOrderJson.push(json_val);
+//                        }
+//                        d.pacsOrder = JSON.stringify(pacsOrderJson).toString();
+//                    }
+//                    var diagOrderJson = [];
+//                    if (diagOrder != null && diagOrder != undefined) {
+//                        var arr = diagOrder.split(",");
+//                        for (i = 0; i < arr.length; i++) {
+//                            var json_val  =
+//                                {
+//                                    "uniqueName" : arr[i],
+//                                    "name" : "",
+//                                    "dateValue" : ""
+//                                };
+//                            diagOrderJson.push(json_val);
+//                        }
+//                        d.diagOrder = JSON.stringify(diagOrderJson).toString();
+//                    }
+//                    if (length != null && length != undefined) {
+//                        d.length = length;
+//                    }
+//                    if (sex != null && sex != undefined) {
+//                        d.sex = sex;
+//                    }
+//                    if (age != '' && age_start != age && age != undefined) {
+//                        d.age = age;
+//                    }
+//                    if (age_start != '' && age_start != null && age_start != undefined) {
+//                        d.age_start = age_start;
+//                    }
+//                    if (age_end != '' && age_end != null && age_end != undefined) {
+//                        d.age_end = age_end;
+//                    }
+//                },
                 "dataSrc": function (json) {
                     var inputs = json.data.inputs;
                     var h = "";
@@ -561,13 +604,13 @@
                     d.algorithmClassifyValue =  algorithmClassify;
                     var symptom = $("#symptom_id").val();
                     var vital = $("#vital_id").val();
-                    var past = $("#past_id").val();
+                    var pasts = $("#past_id").val();
                     var other = $("#other_id").val();
-                    var lis = $("#lis_id").val();
-                    var pacs = $("#pacs_id").val();
+                    var lisString = $("#lis_id").val();
+                    var pacsString = $("#pacs_id").val();
                     var lisOrder = $("#lis_order").val();
                     var pacsOrder = $("#pacs_order").val();
-                    var diag = $("#diag_id").val();
+                    var diagOrder = $("#diag_id").val();
                     var length = $("#length").val();
                     var sex = $("#sex").val();
                     var age = $("#age").val();
@@ -581,26 +624,58 @@
                     if (vital != null && vital != undefined) {
                         d.vital = vital;
                     }
-                    if (past != null && past != undefined) {
-                        d.past = past;
+                    if (pasts != null && pasts != undefined) {
+                        d.pasts = pasts;
                     }
                     if (other != null && other != undefined) {
                         d.other = other;
                     }
-                    if (lis != null && lis != undefined) {
-                        d.lis = lis;
+                    if (lisString != null && lisString != undefined) {
+                        d.lisString = lisString;
                     }
-                    if (pacs != null && pacs != undefined) {
-                        d.pacs = pacs;
+                    if (pacsString != null && pacsString != undefined) {
+                        d.pacsString = pacsString;
                     }
+                    var lisOrderJson = [];
                     if (lisOrder != null && lisOrder != undefined) {
-                        d.lisOrder = lisOrder;
-                    }
+                        var arr = lisOrder.split(",");
+                        for (i = 0; i < arr.length; i++) {
+                            var json_val  =
+                                {
+                                    "uniqueName" : arr[i],
+                                    "name" : "",
+                                    "dateValue" : ""
+                                };
+                            d.lisOrder.push(json_val);
+                        }
+                    }
+                    var pacsOrderJson = [];
                     if (pacsOrder != null && pacsOrder != undefined) {
-                        d.pacsOrder = pacsOrder;
-                    }
-                    if (diag != null && diag != undefined && diag != '') {
-                        d.diag = diag;
+                        var arr = pacsOrder.split(",");
+                        for (i = 0; i < arr.length; i++) {
+                            var json_val  =
+                                {
+                                    "uniqueName" : arr[i],
+                                    "name" : "",
+                                    "dateValue" : ""
+                                };
+                            pacsOrderJson.push(json_val);
+                        }
+                        d.pacsOrder = JSON.stringify(pacsOrderJson).toString();
+                    }
+                    var diagOrderJson = [];
+                    if (diagOrder != null && diagOrder != undefined) {
+                        var arr = diagOrder.split(",");
+                        for (i = 0; i < arr.length; i++) {
+                            var json_val  =
+                                {
+                                    "uniqueName" : arr[i],
+                                    "name" : "",
+                                    "dateValue" : ""
+                                };
+                            diagOrderJson.push(json_val);
+                        }
+                        d.diagOrder = JSON.stringify(diagOrderJson).toString();
                     }
                     if (length != null && length != undefined) {
                         d.length = length;

+ 39 - 2
rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

@@ -9,12 +9,16 @@ import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.diagbot.nlp.util.Constants.app_rule_type_id;
+
 /**
  * Created by louhr on 2019/9/2.
  */
@@ -47,7 +51,8 @@ public class CrisisApplication {
             String[] fieldRuleIds = app.getValue().getRuleIds().split("\\^");
             for (String fieldRuleId : fieldRuleIds) {
                 String[] ruleIds = fieldRuleId.split(",");
-                String standardText = "", originText = "", remind = "";;
+                String standardText = "", originText = "", remind = "";
+                ;
                 boolean allRuleIdsSuit = true;
                 for (String ruleId : ruleIds) {
                     boolean isFindRule = false;
@@ -93,9 +98,9 @@ public class CrisisApplication {
             }
             //所有规则都满足
             if (hasAppSuit) {
+
                 CrisisDetail crisisDetail = new CrisisDetail();
                 crisisDetail.setOriginText(appOriginText);
-//                crisisDetail.setStandardText(standardText);
                 crisisDetail.setRemindText(app.getValue().getRemind().replace("${remind}", appRemindVar));
                 crisisDetail.setTypeId(app.getValue().getTypeId());
 
@@ -116,9 +121,41 @@ public class CrisisApplication {
                 crisisMap.put(key, crisisList);
             }
         }
+        //针对同时出现"血压:高血压1级"、"血压:高血压3级"...只取等级高的
+        procHypertension(crisisMap);
         return crisisMap;
     }
 
+    private void procHypertension(Map<String, List<CrisisDetail>> crisisMap) {
+        List<CrisisDetail> crisisDetails = crisisMap.get(key);
+        if (crisisDetails == null || crisisDetails.size() == 0) {
+            return;
+        }
+        List<String> hypertensionRule = new ArrayList<>();
+        for (CrisisDetail crisisDetail : crisisDetails) {
+            if (crisisDetail.getRemindText().contains("血压:高血压")
+                    && crisisDetail.getTypeId().equals(app_rule_type_id)) {
+                hypertensionRule.add(crisisDetail.getRemindText());
+            }
+        }
+        if (hypertensionRule.size() == 0) {
+            return;
+        }
+        Collections.sort(hypertensionRule); //高血压等级从小到大排序
+        //保留高血压等级最大的值,其他的删除
+        for (int i = 0; i < hypertensionRule.size() - 1; i++) {
+            for (int j = 0; j < crisisDetails.size(); j++) {
+                if (hypertensionRule.get(i).equals(crisisDetails.get(j).getRemindText())) {
+                    crisisDetails.remove(j);
+                    //删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。
+                    //要删除的元素往前面移动了,而你的i保存的值依旧往后走,所以如果让i不往后走,往前走一个,
+                    //即可删除本来排在第二个位置的元素现在排在了第一个位置上的元素。
+                    j--;
+                }
+            }
+        }
+    }
+
     private List<String> getAllRuleId(Map<String, RuleApp> ruleApps) {
         Set<String> typeIdSet = new HashSet<>();
         for (Map.Entry<String, RuleApp> ruleAppEntry : ruleApps.entrySet()) {