浏览代码

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

lipc 5 年之前
父节点
当前提交
a27f3ece6b
共有 48 个文件被更改,包括 3844 次插入968 次删除
  1. 17 7
      algorithm/src/main/java/org/algorithm/core/neural/TensorflowModel.java
  2. 3 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java
  3. 1 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/BigDataParamsProxy.java
  4. 2 2
      bigdata-web/src/main/java/org/diagbot/bigdata/work/ResultDataProxy.java
  5. 61 29
      bigdata-web/src/test/java/org/diagbot/Rule2AppTest.java
  6. 16 12
      bigdata-web/src/test/java/org/diagbot/RuleTest.java
  7. 0 9
      common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java
  8. 27 8
      common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java
  9. 231 66
      common-push/src/main/java/org/diagbot/common/push/bean/SearchData.java
  10. 31 4
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Filnlly.java
  11. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/MeditionDetail.java
  12. 27 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Treat.java
  13. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatCate.java
  14. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatDetail.java
  15. 79 0
      common-push/src/main/java/org/diagbot/common/push/filter/rule/CalcFormula.java
  16. 177 35
      common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java
  17. 9 0
      common-push/src/main/java/org/diagbot/common/push/util/PushConstants.java
  18. 40 23
      common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java
  19. 1 1
      common-push/src/main/java/org/diagbot/common/push/work/RelationExtractionUtil.java
  20. 5 2
      graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java
  21. 3 3
      graph-web/src/main/java/org/diagbot/graphWeb/work/DiseaseCalculate.java
  22. 243 81
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  23. 92 83
      graph-web/src/main/java/org/diagbot/graphWeb/work/ScaleCalculate.java
  24. 789 422
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  25. 1187 0
      graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java
  26. 31 3
      graph/src/main/resources/bolt.properties
  27. 43 0
      graph/src/main/resources/pushTreat.properties
  28. 8 5
      graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java
  29. 36 18
      nlp/src/main/java/org/diagbot/nlp/rule/module/PreResult.java
  30. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentAllergy.java
  31. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentDrug.java
  32. 39 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentFamily.java
  33. 27 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentInfectious.java
  34. 7 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentNormal.java
  35. 41 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentOperation.java
  36. 6 1
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPacs.java
  37. 1 36
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPast.java
  38. 42 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPersonal.java
  39. 39 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVaccination.java
  40. 54 6
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java
  41. 27 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentWound.java
  42. 1 1
      nlp/src/main/java/org/diagbot/nlp/util/Constants.java
  43. 13 1
      nlp/src/main/java/org/diagbot/nlp/util/NegativeEnum.java
  44. 6 0
      nlp/src/main/java/org/diagbot/nlp/util/NlpUtil.java
  45. 22 17
      push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java
  46. 4 2
      push-web/src/main/java/org/diagbot/push/controller/GraphController.java
  47. 161 86
      push-web/src/main/resources/static/pages/algorithm/list.html
  48. 39 3
      rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

+ 17 - 7
algorithm/src/main/java/org/algorithm/core/neural/TensorflowModel.java

@@ -107,23 +107,33 @@ public class TensorflowModel {
                 FloatBuffer.wrap(inputValues)
         );
 
+        float[][] result = null;
+        Tensor<?> t = null;
         // 序列数据
         if (this.withSequenceInputs){
             Map<String, Tensor<Integer>> sequenceTensorMap = this.wrapSequenceInputs(sequenceValues, numExamples);
-            this.session.runner();
 
-            return this.session.runner().feed(this.X, inputTensor)
+            t = this.session.runner().feed(this.X, inputTensor)
                     .feed(this.Char_ids, sequenceTensorMap.get(this.Char_ids))
                     .feed(this.Pos_ids, sequenceTensorMap.get(this.Pos_ids))
                     .feed("keep_prob", Tensor.create(1.0f, Float.class))  // dropout保留率
-                    .fetch(this.SOFT_MAX).run().get(0)
-                    .copyTo(new float[numExamples][this.NUM_LABEL]);
+                    .fetch(this.SOFT_MAX).run().get(0);
+
+            for (Map.Entry<String, Tensor<Integer>> entry : sequenceTensorMap.entrySet()) {
+                entry.getValue().close();
+            }
+
         }else{
-            return this.session.runner().feed(this.X, inputTensor)
+            t =  this.session.runner().feed(this.X, inputTensor)
                     .feed("keep_prob", Tensor.create(1.0f, Float.class))  // dropout保留率
-                    .fetch(this.SOFT_MAX).run().get(0)
-                    .copyTo(new float[numExamples][this.NUM_LABEL]);
+                    .fetch(this.SOFT_MAX).run().get(0);
         }
+        result = t.copyTo(new float[numExamples][this.NUM_LABEL]);
+
+        t.close();
+        inputTensor.close();
+
+        return result;
     }
 
 

+ 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;

+ 61 - 29
bigdata-web/src/test/java/org/diagbot/Rule2AppTest.java

@@ -9,6 +9,7 @@ import jxl.write.WritableCellFormat;
 import jxl.write.WritableFont;
 import jxl.write.WritableSheet;
 import jxl.write.WritableWorkbook;
+import org.apache.commons.lang3.StringUtils;
 import org.diagbot.pub.jdbc.MysqlJdbc;
 
 import java.io.File;
@@ -32,11 +33,8 @@ import java.util.Map;
 public class Rule2AppTest {
     public static void main(String[] args) {
         Map<String, String> ruleId = getRuleId();
-        //        for (Map.Entry<String, Integer> ruleAndId:ruleId.entrySet()) {
-        //            System.out.println(ruleAndId.getValue() + "---" + ruleAndId.getKey());
-        //        }
-        String fileNameRead = "D:\\大数据小组\\慢病\\11.病历评级案例-20191024心内科&呼吸科.xls";
-        String fileNameWrite = "D:\\大数据小组\\慢病\\病历评级规则app列表20191125.xls";
+        String fileNameRead = "D:\\大数据小组\\慢病\\11.病历评级案例-20191126.xls";
+        String fileNameWrite = "D:\\大数据小组\\慢病\\病历评级规则app列表20191126.xls";
         readExcel(fileNameRead);
         writeExcel(ruleId, readExcel(fileNameRead), fileNameWrite);
     }
@@ -50,8 +48,9 @@ public class Rule2AppTest {
         }
         try {
             file.createNewFile();
-            WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
-            WritableCellFormat format = new WritableCellFormat(font);
+            WritableFont titleFont = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD);
+            WritableFont contentFont = new WritableFont(WritableFont.createFont("宋体"), 10);
+            WritableCellFormat format = new WritableCellFormat(titleFont);
             //创建工作簿
             WritableWorkbook workbookA = Workbook.createWorkbook(file);
             //创建sheet
@@ -63,6 +62,7 @@ public class Rule2AppTest {
                 sheetA.addCell(labelA);
             }
             int row = 1;
+            format = new WritableCellFormat(contentFont);
             for (int i = 0; i < ruleList.size(); i++) {
                 List<String> rule = ruleList.get(i);
                 if (rule.size() == 2 || rule.size() == 3) {
@@ -70,6 +70,7 @@ public class Rule2AppTest {
                     String[] rules = rule.get(1).split("、");
                     for (int j = 0; j < pacsOrder.length; j++) {
                         String content = "";
+                        String remind = "";
                         for (int k = 0; k < rules.length; k++) {
                             /** 原规则app样式
                              * labelA = new Label(6, row, ruleId.get(pacsOrder[j]) + "," + ruleId.get(rules[k]));
@@ -79,15 +80,19 @@ public class Rule2AppTest {
                              * row++;*/
                             String feature = ruleId.get(rules[k]) != null ? ruleId.get(rules[k]) : rules[k];
                             if (rules[k].contains("血小板计数(PLT)")){
-                                feature = "131";
-                            } else if (rules[k].contains("氧饱和度(O2sat)")){
-                                feature = "138";
+                                feature = "1131";
                             } else if (rules[k].contains("经期")){
                                 feature = "70、71";
                             } else if (rules[k].contains("妊娠")){
-                                feature = "164、165";
+                                feature = "1164、1165";
+                                remind = rule.size()>2?rule.get(2):"妊娠不宜做此项检查";
                             } else if (rules[k].contains("妊娠1-3个月")){
-                                feature = "166、167";
+                                feature = "1166、1167、1168、1169";
+//                                remind = rule.size()>2?rule.get(2):"妊娠不宜做此项检查";
+                            } else if (rules[k].contains("男性")){
+                                remind = rule.size()>2?rule.get(2):"男性不宜做此项检查";
+                            } else if (rules[k].contains("女性")){
+                                remind = rule.size()>2?rule.get(2):"女性不宜做此项检查";
                             }
 
                             String[] featureArr = feature.split("、");
@@ -95,13 +100,14 @@ public class Rule2AppTest {
                                 if (k == rules.length - 1 && l == featureArr.length - 1) {
                                     content += ruleId.get(pacsOrder[j]) + "," + featureArr[l];
                                 } else {
-                                    content += ruleId.get(pacsOrder[j]) + "," + featureArr[l] + "|";
+                                    content += ruleId.get(pacsOrder[j]) + "," + featureArr[l] + "^";
                                 }
                             }
                         }
-                        labelA = new Label(6, row, content);
+//                        write2DB(content,StringUtils.isEmpty(remind)?"请注意:该患者${remind}":remind);
+                        labelA = new Label(6, row, content,format);
                         sheetA.addCell(labelA);
-                        labelA = new Label(8, row, "${remind}:" + pacsOrder[j]);
+                        labelA = new Label(8, row, StringUtils.isEmpty(remind)?"请注意:该患者${remind}":remind,format);
                         sheetA.addCell(labelA);
                         row++;
                     }
@@ -134,8 +140,8 @@ public class Rule2AppTest {
             fis = new FileInputStream(new File(fileName));
             Workbook rwb = Workbook.getWorkbook(fis);
             Sheet[] sheet = rwb.getSheets();
-            for (int i = 0; i < sheet.length; i++) {
-                Sheet rs = rwb.getSheet(i);
+//            for (int i = 0; i < sheet.length; i++) {
+                Sheet rs = rwb.getSheet(0);
                 for (int j = 1; j < rs.getRows(); j++) {
                     rule = new ArrayList<>();
                     String content = "";
@@ -148,7 +154,7 @@ public class Rule2AppTest {
                     }
                     ruleList.add(rule);
                 }
-            }
+//            }
             fis.close();
         } catch (FileNotFoundException e) {
             e.printStackTrace();
@@ -160,6 +166,27 @@ public class Rule2AppTest {
         return ruleList;
     }
 
+    public static void write2DB(String ruleId,String remind){
+        MysqlJdbc jdbc = new MysqlJdbc( "root", "diagbot@20180822","jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
+        Connection conn = jdbc.connect();
+        PreparedStatement pstUpdate = null;
+        String sql = "INSERT INTO kl_rule_app(rule_id,type_id,remind) VALUES (?,?,?)";
+
+        try {
+            pstUpdate = conn.prepareStatement(sql);
+            pstUpdate.setString(1,ruleId);
+            pstUpdate.setString(2,"2");
+            pstUpdate.setString(3,remind);
+            System.out.println(ruleId + "\t" + remind);
+            pstUpdate.executeUpdate();
+            pstUpdate.close();
+            conn.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
     public static Map<String, String> getRuleId() {
         Map<String, String> ruleId = new HashMap<>();
         MysqlJdbc jdbc = new MysqlJdbc( "root", "diagbot@20180822","jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8");
@@ -175,19 +202,24 @@ public class Rule2AppTest {
                 String eqValue = rs.getString(2).trim();
                 ruleId.put(eqValue, id);
             }
-            ruleId.put("收缩压≥180mmHg", "74");
-            ruleId.put("舒张压≥110mmHg", "75");
+            ruleId.put("收缩压≥180mmHg", "238");
+            ruleId.put("舒张压≥110mmHg", "239");
             ruleId.put("收缩压≤80mmHg", "29");
             ruleId.put("舒张压≤50mmHg", "30");
-            ruleId.put("收缩压≥140mmHg", "129");
-            ruleId.put("舒张压≥90mmHg", "130");
-            ruleId.put("体温>39.1℃", "122");
-            ruleId.put("体温>37.3℃", "123");
-            ruleId.put("凝血酶原时间(PT)对照>5s", "132");
-            ruleId.put("活化部分凝血活酶(APTT)对照>10s", "133");
-            ruleId.put("T7至L3椎体MR增强", "648");
-            ruleId.put("体温>39.0℃", "743");
-
+            ruleId.put("收缩压≥140mmHg", "273");
+            ruleId.put("舒张压≥90mmHg", "274");
+            ruleId.put("体温>39.1℃", "272");
+            ruleId.put("体温>37.3℃", "1123");
+            ruleId.put("凝血酶原时间(PT)对照>5s", "1132");
+            ruleId.put("活化部分凝血活酶(APTT)对照>10s", "1133");
+            ruleId.put("T7至L3椎体MR增强", "1648");
+//            ruleId.put("体温>39.0℃", "743");
+            ruleId.put("心率<60次/分", "1128");
+            ruleId.put("心率≥120次/分", "28");
+            ruleId.put("肾病综合征+胸腔积液", "1211,1140");
+            ruleId.put("肝硬化+胸腔积液", "1212,1140");
+            ruleId.put("心力衰竭+胸腔积液", "60,1140");
+            ruleId.put("低蛋白血症+胸腔积液", "1213,1140");
             rs.close();
             pstQuery.close();
             conn.close();

+ 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;
     }

+ 27 - 8
common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java

@@ -2,6 +2,7 @@ package org.diagbot.common.push.bean;
 
 import org.diagbot.common.push.bean.neo4j.Filnlly;
 import org.diagbot.common.push.bean.neo4j.MedicalIndication;
+import org.diagbot.common.push.bean.neo4j.Treat;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -23,13 +24,15 @@ public class ResponseData {
 
     private List<FeatureRate> beforeCombineDis = new ArrayList<>(10);
 
-    private Map<String, Filnlly> treat = new HashMap<>();
+//    private Map<String, Filnlly> treat = new HashMap<>();
+    private Treat treat;
     private List<FeatureRate> graphWords = new ArrayList<>(10);
     private List<MedicalIndication> medicalIndications;//量表和指标推送
 //    private Map<String,JSONObject> managementEvaluation; //管理评估
     private Map managementEvaluation;
     private List<String> diffDiag;//鉴别诊断
     private List<String> excludeDiag; //排除诊断
+    private String hasIndications = "0";  //是否有病情提示标识 包括危急值 开单合理项 默认无
 
     private Map<String, List<CrisisDetail>> crisisDetails = new HashMap<>();
 
@@ -65,6 +68,14 @@ public class ResponseData {
 //        this.managementEvaluation = managementEvaluation;
 //    }
 
+    public Treat getTreat() {
+        return treat;
+    }
+
+    public void setTreat(Treat treatObject) {
+        this.treat = treatObject;
+    }
+
     public List<MedicalIndication> getMedicalIndications() {
         return medicalIndications;
     }
@@ -139,13 +150,13 @@ public class ResponseData {
         this.inputs = inputs;
     }
 
-    public Map<String, Filnlly> getTreat() {
-        return treat;
-    }
-
-    public void setTreat(Map<String, Filnlly> treat) {
-        this.treat = treat;
-    }
+//    public Map<String, Filnlly> getTreat() {
+//        return treat;
+//    }
+//
+//    public void setTreat(Map<String, Filnlly> treat) {
+//        this.treat = treat;
+//    }
 
     public List<FeatureRate> getHistory() {
         return history;
@@ -170,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;
     }
 }

+ 31 - 4
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Filnlly.java

@@ -4,8 +4,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class Filnlly {
-    private List<Indicators> adverseEvent;
-    private ArrayList<Drugs> treatment;
+    private List<Indicators> adverseEvent;//不良反应
+    private List<Drugs> treatment;//具体用药
+    private List<TreatCate> treatCate;//规则匹配用药情况(单药、双药、胰岛素药)
+    private List<TreatCate> compli_cate;//并发症规则匹配用药情况
+    private List<Drugs> compli_treatment;//并发症具体用药
+
 
 
     public List<Indicators> getAdverseEvent() {
@@ -16,12 +20,35 @@ public class Filnlly {
         this.adverseEvent = adverseEvent;
     }
 
-    public ArrayList<Drugs> getTreatment() {
+    public List<Drugs> getTreatment() {
         return treatment;
     }
 
-    public void setTreatment(ArrayList<Drugs> treatment) {
+    public void setTreatment(List<Drugs> treatment) {
         this.treatment = treatment;
     }
 
+    public List<TreatCate> getTreatCate() {
+        return treatCate;
+    }
+
+    public void setTreatCate(List<TreatCate> treatCate) {
+        this.treatCate = treatCate;
+    }
+
+    public List<TreatCate> getCompli_cate() {
+        return compli_cate;
+    }
+
+    public void setCompli_cate(List<TreatCate> compli_cate) {
+        this.compli_cate = compli_cate;
+    }
+
+    public List<Drugs> getCompli_treatment() {
+        return compli_treatment;
+    }
+
+    public void setCompli_treatment(List<Drugs> compli_treatment) {
+        this.compli_treatment = compli_treatment;
+    }
 }

+ 24 - 0
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/MeditionDetail.java

@@ -0,0 +1,24 @@
+package org.diagbot.common.push.bean.neo4j;
+
+import java.util.List;
+
+public class MeditionDetail {
+    private String description;//双药治疗:双胍类+SGLT-2
+    private List<Drugs> treatment;//具体用药
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public List<Drugs> getTreatment() {
+        return treatment;
+    }
+
+    public void setTreatment(List<Drugs> treatment) {
+        this.treatment = treatment;
+    }
+}

+ 27 - 0
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Treat.java

@@ -0,0 +1,27 @@
+package org.diagbot.common.push.bean.neo4j;
+
+import java.util.List;
+
+/**
+ * 治疗返回
+ */
+public class Treat {
+    private List<Indicators> adverseEvent;//不良反应
+    private List<TreatDetail> treatmentPlan;//治疗方案
+
+    public List<Indicators> getAdverseEvent() {
+        return adverseEvent;
+    }
+
+    public void setAdverseEvent(List<Indicators> adverseEvent) {
+        this.adverseEvent = adverseEvent;
+    }
+
+    public List<TreatDetail> getTreatmentPlan() {
+        return treatmentPlan;
+    }
+
+    public void setTreatmentPlan(List<TreatDetail> treatmentPlan) {
+        this.treatmentPlan = treatmentPlan;
+    }
+}

+ 24 - 0
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatCate.java

@@ -0,0 +1,24 @@
+package org.diagbot.common.push.bean.neo4j;
+
+import java.util.List;
+
+public class TreatCate {
+    private String type;//单药,双药,胰岛素用药
+    private List<String> name;//具体药类组合
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<String> getName() {
+        return name;
+    }
+
+    public void setName(List<String> name) {
+        this.name = name;
+    }
+}

+ 24 - 0
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatDetail.java

@@ -0,0 +1,24 @@
+package org.diagbot.common.push.bean.neo4j;
+
+import java.util.List;
+
+public class TreatDetail {
+    private String title;//糖尿病推荐用药
+    private List<MeditionDetail> meditionDetails;//集体治疗
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public List<MeditionDetail> getMeditionDetails() {
+        return meditionDetails;
+    }
+
+    public void setMeditionDetails(List<MeditionDetail> meditionDetails) {
+        this.meditionDetails = meditionDetails;
+    }
+}

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

@@ -0,0 +1,79 @@
+package org.diagbot.common.push.filter.rule;
+
+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())) {
+                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) {

+ 5 - 2
graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java

@@ -1,5 +1,6 @@
 package org.diagbot.graphWeb.controller;
 
+import org.diagbot.common.push.bean.CrisisDetail;
 import org.diagbot.common.push.bean.ResponseData;
 import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.graph.javabean.GdbResponse;
@@ -15,16 +16,18 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/graph")
 public class GraphController {
     @RequestMapping(value = "/push", method = RequestMethod.POST)
     @ResponseBody
-    public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+    public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData,Map<String, List<CrisisDetail>> crisisDetails) throws Exception {
         Response<ResponseData> response = new Response();
         GraphCalculate graphCalculate = new GraphCalculate();
-        ResponseData responseData = graphCalculate.calculate(request, searchData);
+        ResponseData responseData = graphCalculate.calculate(request, searchData,crisisDetails);
         response.setData(responseData);
         return response;
     }

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

@@ -32,7 +32,7 @@ public class DiseaseCalculate {
         List<FeatureRate> diseaseName = this.getDisease(dis);
 
         //走治疗推送(治疗里面包含治疗方案和不良反应)
-        Map<String, Filnlly> treat = this.getTreat(diseaseResponse.getTreat());
+//        Map<String, Filnlly> treat = this.getTreat(diseaseResponse.getTreat());
 
         //走量表和指标推送
         List<MedicalIndication> medicalIndications = this.getMedicalIndications(diseaseResponse.getMedicalIndications());
@@ -43,7 +43,7 @@ public class DiseaseCalculate {
 //        Map test = this.getMan(managementEvaluation);
 //
 //        responseData.setManagementEvaluation(test);
-        responseData.setTreat(treat);
+//        responseData.setTreat(treat);
         responseData.setDis(diseaseName);
         return responseData;
     }
@@ -91,7 +91,7 @@ public class DiseaseCalculate {
                     }
                 }
 
-                ArrayList<Drugs> treatment = value.getTreatment();
+                List<Drugs> treatment = value.getTreatment();
                 ArrayList<Drugs> newTreatment = new ArrayList<>();
                 if (treatment != null && treatment.size() > 0) {
                     for (Drugs d : treatment) {

+ 243 - 81
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -4,13 +4,11 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang3.StringUtils;
+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.Filnlly;
-import org.diagbot.common.push.bean.neo4j.MangementEvaluation;
-import org.diagbot.common.push.bean.neo4j.MedicalIndication;
-import org.diagbot.common.push.bean.neo4j.MedicalIndicationDetail;
+import org.diagbot.common.push.bean.neo4j.*;
 import org.diagbot.common.push.cache.CacheUtil;
 import org.diagbot.graph.jdbc.DriverManager;
 import org.diagbot.graph.jdbc.Neo4jAPI;
@@ -18,14 +16,25 @@ import org.diagbot.graph.jdbc.Neo4jAPI;
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
+import org.diagbot.graph.medicationProcess.PushTreat;
 import org.diagbot.nlp.rule.module.PreResult;
 import org.diagbot.nlp.util.Constants;
+import org.neo4j.driver.v1.Driver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class GraphCalculate {
     Logger logger = LoggerFactory.getLogger(GraphCalculate.class);
+    private static Driver driver;
+    static {
+        try {
+            driver = DriverManager.newDrive();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     private static Neo4jAPI neo4jAPI ;
+    private static Map<String,List<String>> mergeMap;
 
     /**
      * 返回诊断和治疗
@@ -35,7 +44,7 @@ public class GraphCalculate {
      * @return
      * @throws Exception
      */
-    public ResponseData calculate(HttpServletRequest request, SearchData searchData) throws Exception {
+    public ResponseData calculate(HttpServletRequest request, SearchData searchData,Map<String, List<CrisisDetail>> crisisDetails) throws Exception {
 
         long starttime = System.currentTimeMillis();
         System.out.println("Start at: " + starttime);
@@ -43,34 +52,44 @@ 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();
-        Set<String> ss = new HashSet<>();
-        if(inputs.size()>0){
-            for (Map.Entry<String, Map<String, String>> input:inputs.entrySet()) {
-                Map<String, String> value = input.getValue();
-                String concept = value.get("concept");
-                String[] splits = StringUtils.split(concept, ",");
-                for (String s:splits) {
-                    ss.add(s);
-                }
-            }
-        }
 
+        //从大数据解析分词
+        Set<String> ss = processParticiple(inputs);
         logger.info("从分词系统接收到的词 :" + ss);
         System.out.println("Participle takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
+        inputList.addAll(ss);
+        //提取前端传来的features
         List<String> featureTypeList = Arrays.asList(searchData.getFeatureTypes());
         logger.info("featureTypeList : " + featureTypeList);
-        inputList.addAll(ss);
         if(neo4jAPI == null){
-            neo4jAPI = new Neo4jAPI(DriverManager.newDrive());
+            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.getLis();
+        String serumCreatinine = processSerumcreatinine(lisArr);
+
         //计算诊断
         Map<String, Object> condition =null;
         Map<String, Map<String, String>> excludelist = null;
@@ -82,75 +101,29 @@ public class GraphCalculate {
             excludelist = neo4jAPI.getExcludeDiag(inputList);
             responseData.setExcludeDiag(Arrays.asList(excludelist.keySet().stream().toArray(String[]::new)));
         }
-        List<FeatureRate> featureRates = new ArrayList<>();
-        if(condition != null){
-            Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
-            if(allCondition != null && allCondition.size()>0){
-                for (Map.Entry<String, Map<String,String>> d : allCondition.entrySet()) {
-                    String dis = d.getKey();
-                    Map<String, String> sexAgeMap = sexAgeCache.get(dis);
-                    if(sexAgeMap != null){
-                        String sexType = sexAgeMap.get("sexType");
-                        Integer min_age = Integer.parseInt(sexAgeMap.get("min_age"));
-                        Integer max_age = Integer.parseInt(sexAgeMap.get("max_age"));
-                        if(("1".equals(sexType) &&sex.equals(sexType)) || ("2".equals(sexType) &&sex.equals(sexType)) || "3".equals(sexType)){
-                            if(min_age <age && age<=max_age){
-                                FeatureRate featureRate = new FeatureRate();
-                                featureRate.setFeatureName(dis);
-                                Map<String, String> value = d.getValue();
-                                String s = JSON.toJSONString(value);
-                                featureRate.setDesc(s);
-                                featureRate.setSource("neo4j");
-                                featureRates.add(featureRate);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        Set<String> diseaseSet =null;
-        if(condition != null){
-            diseaseSet = condition.keySet();
-            logger.info("diseaseSet :" + diseaseSet);
-        }
+        //包装推送出来的诊断
+        List<FeatureRate> featureRates = pavkageAndSetDis(age, sex, sexAgeCache, condition);
+        //返回拟、确诊组合
+        Set<String> diseaseSet = getQueNiDiagnose(condition);
+
         Integer diseaseType = searchData.getDisType();
-        List<PreResult> lisArr = searchData.getLisArr();
-        Set<String> lisSet = new HashSet<>();
-        Map<String,Double> lis_Result = new HashMap<>();
-        if(lisArr != null && lisArr.size() > 0){
-            for (PreResult lis:lisArr) {
-                String detailName = lis.getUniqueName();
-                logger.info("公表名为  :"+detailName);
-                String lisValue = lis.getValue();
-                if(StringUtils.isNotEmpty(lisValue)){
-                    Double value = Double.valueOf(lisValue);
-                    lis_Result.put(detailName,value);
-                    lisSet.add(detailName);
-                }
-            }
-        }
-        logger.info("页面导入的所有化验项为 :" +lisSet);
+
         starttime = System.currentTimeMillis();
         //走治疗
         if (StringUtils.isNotEmpty(diseaseName) && featureTypeList.contains(Constants.feature_type_treat)) {
-            // 查找页面诊断里是否有不良反应
-            Map<String, List<String>> disUE = neo4jAPI.getDisUE(diseaseName, diseaseType);
-            //根据页面输入内容推出的不良反应集合
-            Set<String> ue = neo4jAPI.getUe((String[]) inputList.toArray(new String[inputList.size()]));
-            //走平常诊断治疗
-//            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));
-            System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
-            responseData.setTreat(mulDiseaseTreat_new);
+            PushTreat pushTreat = new PushTreat();
+            Treat treat = pushTreat.processTreat(diseaseName,webDiag,diseaseType, driver, (String[]) inputList.toArray(new String[inputList.size()]),exculdDiagFilds, crisisDetails);
+            responseData.setTreat(treat);
         }
         //管理评估(慢病才有)
         if (featureTypeList.contains("11") && diseaseType == 1 && diseaseType != null) {
             logger.info("featureTypeList 包含11,走管理评估!!!");
             starttime = System.currentTimeMillis();
             if(webDiag != null){
-                MangementEvaluation mangementEvaluation = neo4jAPI.pushMe(webDiagList,lis_Result);
+//                MangementEvaluation mangementEvaluation = neo4jAPI.pushMe(webDiagList,lis_Result);
+                MangementEvaluation mangementEvaluation_new = neo4jAPI.pushMe_new(diseaseName,crisisDetails);
                 System.out.println("推送管理评估消耗:"+(System.currentTimeMillis()-starttime)+"s");
-                Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation.getMangementEvaluation();
+                Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation_new.getMangementEvaluation();
                 responseData.setManagementEvaluation(mangementEvaluation1);
             }
         }
@@ -179,14 +152,15 @@ public class GraphCalculate {
             logger.info("featureTypeList 包含22,走指标推送!!!,图谱推出的指标为:" + indSet);
             List<MedicalIndication> idn =null;
             if(newindSet.contains("肾功能不全")){
-                idn = neo4jAPI.getIdn(newindSet, age, sex);
+                idn = neo4jAPI.getIdn(newindSet, age, sex,serumCreatinine);
                 if(idn!= null && idn.size()>0){
                     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<>();
@@ -194,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);
@@ -211,6 +185,137 @@ public class GraphCalculate {
         System.out.println("Total takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
         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){
+            Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
+            if(allCondition != null && allCondition.size()>0){
+                for (Map.Entry<String, Map<String,String>> sd:allCondition.entrySet()) {
+                    Set<String> keyset = sd.getValue().keySet();
+                    if(keyset.contains("拟诊") || keyset.contains("确诊")){
+                        diseaseSet.add(sd.getKey());
+                    }
+                }
+            }
+            logger.info("diseaseSet :" + diseaseSet);
+        }
+        return diseaseSet;
+    }
+
+    private List<FeatureRate> pavkageAndSetDis(int age, String sex, Map<String, Map<String, String>> sexAgeCache, Map<String, Object> condition) {
+        List<FeatureRate> featureRates = new ArrayList<>();
+        if(condition != null){
+            Map<String, Map<String,String>> allCondition = (Map<String, Map<String,String>>)condition.get("全部诊断");
+            if(allCondition != null && allCondition.size()>0){
+                for (Map.Entry<String, Map<String,String>> d : allCondition.entrySet()) {
+                    String dis = d.getKey();
+                    Map<String, String> sexAgeMap = sexAgeCache.get(dis);
+                    if(sexAgeMap != null){
+                        String sexType = sexAgeMap.get("sexType");
+                        Integer min_age = Integer.parseInt(sexAgeMap.get("min_age"));
+                        Integer max_age = Integer.parseInt(sexAgeMap.get("max_age"));
+                        if(("1".equals(sexType) &&sex.equals(sexType)) || ("2".equals(sexType) &&sex.equals(sexType)) || "3".equals(sexType)){
+                            if(min_age <age && age<=max_age){
+                                FeatureRate featureRate = new FeatureRate();
+                                featureRate.setFeatureName(dis);
+                                Map<String, String> value = d.getValue();
+                                String s = JSON.toJSONString(value);
+                                featureRate.setDesc(s);
+                                featureRate.setSource("neo4j");
+                                featureRates.add(featureRate);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return featureRates;
+    }
+
+    /**
+     * 解析分词
+     * @param inputs
+     * @return
+     */
+    private Set<String>  processParticiple(Map<String, Map<String, String>> inputs) {
+        Set<String> ss = new HashSet<>();
+        if(inputs.size()>0){
+            for (Map.Entry<String, Map<String, String>> input:inputs.entrySet()) {
+                Map<String, String> value = input.getValue();
+                String concept = value.get("concept");
+                String[] splits = StringUtils.split(concept, ",");
+                for (String s:splits) {
+                    ss.add(s);
+                }
+            }
+        }
+        return  ss;
+    }
+
     /**
      * 推送化验,辅检,体征
      */
@@ -219,4 +324,61 @@ public class GraphCalculate {
         Map<String, List<FeatureRate>> lisPacs = neo4jAPI.getLisPacs(searchData);
         return lisPacs;
     }
+    /**
+     * 处理血肌酐
+     * @return
+     */
+    public String processSerumcreatinine(List<PreResult> lisArr){
+        String sc = "";
+        if(lisArr !=null && lisArr.size()>0){
+            for (PreResult pre:lisArr) {
+                if("化验--肾功能测定--肌酐(Cr)".equals(pre.getUniqueName()) && StringUtils.isNotEmpty(pre.getValue())){
+                    try {
+                        sc = String.format("%.2f",Double.parseDouble(pre.getValue().trim())*0.01131);
+                    }catch (Exception e){e.printStackTrace();}
+
+                }
+            }
+        }
+        return sc;
+    }
+    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){
+
+            for (Map.Entry<String, Map<String, String>> fild:inputs.entrySet()) {
+                fildName = fild.getKey();
+                Map<String, String> value = fild.getValue();
+                String propertys = value.get("property");
+                List<String> stringList = Arrays.asList(propertys.split(","));
+                if(stringList.contains("18") || stringList.contains("55")){
+                    continue;
+                }else {
+                    fildName = "'"+fildName+"'";
+                    if(!exculdDiagFilds.contains(fildName)){
+                        exculdDiagFilds.add(fildName);
+                    }
+                }
+            }
+        }
+        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;
     }
 }

文件差异内容过多而无法显示
+ 789 - 422
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java


文件差异内容过多而无法显示
+ 1187 - 0
graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java


+ 31 - 3
graph/src/main/resources/bolt.properties

@@ -85,10 +85,10 @@ match(i:Indicators) WHERE i.name=m.name and age>i.minAge and age<i.maxAge and i.
 return i.name as name
 
 #\u67E5\u627E\u4E0D\u826F\u53CD\u5E94\u7684\u8BED\u53E5
-searchUe=match (n:Condition)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:UntowardEffect)\n \
+searchUe=match (n:Condition)-[r:\u53EF\u80FD\u6709|:\u8F7B\u5EA6|:\u4E2D\u5EA6|:\u91CD\u5EA6]->(m:UntowardEffect)\n \
 where n.name in fildList\n \
 with distinct m,r\n \
-return m.name as name
+return m.name as name,type(r) as tr
 
 #\u6839\u636E\u75BE\u75C5\u67E5\u627E\u76F8\u5E94\u7684Lis Pacs
 serchLisPacs=unwind disList as row \n \
@@ -107,9 +107,37 @@ union\n \
 match(h:Disease{name:disName})-[r:\u6CBB\u7597\u65B9\u6848]->(t:Treat)-[r2:\u63A8\u8350]->(m:Medicine)-[r1:\u5C5E\u4E8E]->(d:Drugs)\n \
 with t,m,d\n \
 match(t)-[r:\u63A8\u8350]->(m)-[r1:\u5C5E\u4E8E]->(h:Drugs)\n \
-where d.name=h.bigDrugs and h.p<6 \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
+
+#\u89C4\u5219\u7528\u836F
+medicationRule=match(h)-[r:\u8BCA\u65AD\u4F9D\u636E]->(c:Condition) \n \
+where (h:HistoryDiagnose  or h:LISResult  ) and \n \
+h.name in filds \n \
+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.design as design,r.p as p,r.category as category,r.disName as disName,collect(t.name) as collection order by p
+searchRuleMedicaton=match(h:Disease{name:disName})-[r:\u6CBB\u7597\u65B9\u6848]->(t:Treat)-[r2:\u63A8\u8350]->(m:Medicine)-[r1:\u5C5E\u4E8E]->(d:Drugs)\n \
+with t,m,d\n \
+match(t)-[r:\u63A8\u8350]->(m)-[r1:\u5C5E\u4E8E]->(h:Drugs)\n \
+where d.name=h.bigDrugs and h.name in drugsList\n \
+with t,m,d,h\n \
+match(m)<-[R:\u614E\u7528|:\u5FCC\u7528]-(i) where i.name in filds\n \
+return t.name as treat,d.name as big,h.name as sub,m.name as med,type(R) as ty\n \
+order by h.p\n \
+union\n \
+match(h:Disease{name:disName})-[r:\u6CBB\u7597\u65B9\u6848]->(t:Treat)-[r2:\u63A8\u8350]->(m:Medicine)-[r1:\u5C5E\u4E8E]->(d:Drugs)\n \
+with t,m,d\n \
+match(t)-[r:\u63A8\u8350]->(m)-[r1:\u5C5E\u4E8E]->(h:Drugs)\n \
+where d.name=h.bigDrugs and h.name in drugsList\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
+# \u65B0\u7ED3\u6784\u7BA1\u7406\u8BC4\u4F30
+mangement=match(d:Disease)-[r:\u7BA1\u7406\u8BC4\u4F30]->(m)-[r1]->(e) where d.name='disName' \
+   return e.name as name,e.filds as filds,type(r1) as type order by r1.p
 
 #\u66F4\u65B0\u8BCA\u65AD\u4F9D\u636E\u7684path
 updateConditionPath=match (n:Condition)<-[:\u8BCA\u65AD\u4F9D\u636E]-(m) \n \

+ 43 - 0
graph/src/main/resources/pushTreat.properties

@@ -0,0 +1,43 @@
+#\u4E3B\u8BCA\u65AD\u4E0B\u7684\u4E0D\u826F\u53CD\u5E94
+disUe=match(d:Disease)-[r:\u4E0D\u826F\u53CD\u5E94]->(u:UntowardEffect) where d.name = 'disName' return d.name as dis,collect(u.name) as ueCollect
+#\u67E5\u627E\u4E3B\u8BCA\u65AD
+mainDis=match(c:Chronic)-[r:\u4E0A\u7EA7]->(k:Chronic) where c.name='disName' return c.sing as sign,k.sing as ksign,k.name as kname
+#\u89C4\u5219\u627E\u7C7B
+medicationRule=match(h)-[r:\u8BCA\u65AD\u4F9D\u636E]->(c:Condition) \n \
+where (h:HistoryDiagnose or h:LISResult) and \n \
+h.name in filds \n \
+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,t.name as collection order by p
+#\u89C4\u5219\u627E\u836F
+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 \
+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
+#\u89C4\u5219\u4E0D\u7B26\u5408\u7528\u836F
+searchMedication=match(h:Disease{name:disName})-[r:\u6CBB\u7597\u65B9\u6848]->(t:Treat)-[r2:\u63A8\u8350]->(m:Medicine)-[r1:\u5C5E\u4E8E]->(d:Drugs)\n \
+with t,m,d\n \
+match(t)-[r:\u63A8\u8350]->(m)-[r1:\u5C5E\u4E8E]->(h:Drugs)\n \
+where d.name=h.bigDrugs \n \
+with t,m,d,h\n \
+match(m)<-[R:\u614E\u7528|:\u5FCC\u7528]-(i) where i.name in filds\n \
+return t.name as treat,d.name as big,h.name as sub,m.name as med,type(R) as ty\n \
+order by h.p\n \
+union\n \
+match(h:Disease{name:disName})-[r:\u6CBB\u7597\u65B9\u6848]->(t:Treat)-[r2:\u63A8\u8350]->(m:Medicine)-[r1:\u5C5E\u4E8E]->(d:Drugs)\n \
+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
+# \u5224\u65AD\u8BCA\u65AD\u662F\u4EC0\u4E48\u7C7B\u578B
+judgeDiseaseType=match(d:Disease) where d.name='disName' return d.sign as design

+ 8 - 5
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -1973,11 +1973,14 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
                         diseaseRepository.mergePublicLIS_1(unique_name);
                         //疾病和化验公表项创建推荐关系
                         diseaseRepository.mergeRelationLIS_1(disId,unique_name);
-                        lis =standard;
-                    //创建大项名
-                    diseaseRepository.mergePublicLIS(lis);
-                    //疾病推荐化验大项名
-                    diseaseRepository.mergeRelationLIS(disId,lis);
+                        lis = searchStandWord(standard,type,ciKu);
+                        if(StringUtils.isNotEmpty(lis)){
+                            //创建大项名
+                            diseaseRepository.mergePublicLIS(lis);
+                            //疾病推荐化验大项名
+                            diseaseRepository.mergeRelationLIS(disId,lis);
+                        }
+
                     //处理化验结果
                     if(StringUtils.isNotEmpty(result) && StringUtils.isNotEmpty(unique_name)){
                         lisResultSplit = result.split("、");

+ 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;
+    }
+}

+ 54 - 6
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java

@@ -10,10 +10,11 @@ import org.diagbot.nlp.util.NlpUtil;
 import java.util.List;
 
 public class PretreatmentVital extends Pretreatment {
-    protected NegativeEnum[] nees_vital_result = new NegativeEnum[]{NegativeEnum.VITAL_RESULT};
-    protected NegativeEnum[] nees_vital_index = new NegativeEnum[]{NegativeEnum.VITAL_INDEX};
+    protected NegativeEnum[] nees_vital_result = new NegativeEnum[] { NegativeEnum.VITAL_RESULT };
+    protected NegativeEnum[] nees_vital_index = new NegativeEnum[] { NegativeEnum.VITAL_INDEX };
+    protected NegativeEnum[] nees_digit = new NegativeEnum[] { NegativeEnum.DIGITS };
 
-    public List<PreResult> analyze(String content) throws java.io.IOException{
+    public List<PreResult> analyze(String content) throws java.io.IOException {
         List<PreResult> preResults = super.analyzeDefault(content);
         for (PreResult result : preResults) {
             result.setUniqueName("体征--" + result.getUniqueName());
@@ -27,12 +28,57 @@ public class PretreatmentVital extends Pretreatment {
                 result.setDetailName("体征--");
                 result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_RESULT));
                 preResults.add(result);
-            }else if (NlpUtil.isFeature(l.getProperty(), nees_vital_index)) {
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_vital_index)) {
                 PreResult result = new PreResult();
                 result.setUniqueName("体征--");
                 result.setDetailName("体征--");
                 result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_INDEX));
                 preResults.add(result);
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_digit) && l.getText().contains("/")) {
+                int position = i + 1;
+                while (position < i + 4 && position < lexemes.size()) {
+                    if (!"mmHg".equals(lexemes.get(position).getText())) {
+                        position++;
+                        continue;
+                    }
+                    String[] digits = l.getText().split("/",-1);
+                    if (digits.length == 2) {
+                        if (!NlpUtil.isNumberString(digits[0])) {
+                            position++;
+                            continue;
+                        }
+                        PreResult result = new PreResult();
+                        result.setUniqueName("体征--收缩压");
+                        result.setDetailName("收缩压");
+                        result.setValue(digits[0]);
+                        result.setUnits("mmHg");
+                        preResults.add(result);
+                        if (!NlpUtil.isNumberString(digits[1])) {
+                            position++;
+                            continue;
+                        }
+                        result = new PreResult();
+                        result.setUniqueName("体征--舒张压");
+                        result.setDetailName("舒张压");
+                        result.setValue(digits[1]);
+                        result.setUnits("mmHg");
+                        preResults.add(result);
+                        break;
+                    }
+                    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;
@@ -44,12 +90,14 @@ public class PretreatmentVital extends Pretreatment {
 
 
     public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
-        if (cursor > 0) cursor--;
+        if (cursor > 0) {
+            cursor--;
+        }
         int search_len = 0;
         Lexeme leftLexeme = null;
         while (search_len < max_back_search && cursor > -1) {
             leftLexeme = lexemes.get(cursor);
-            if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[]{NegativeEnum.VITAL_INDEX})) {
+            if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[] { NegativeEnum.VITAL_INDEX })) {
                 return NlpUtil.concept(leftLexeme, NegativeEnum.VITAL_INDEX);
             }
             search_len++;

+ 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;
     }

+ 6 - 0
nlp/src/main/java/org/diagbot/nlp/util/NlpUtil.java

@@ -1,5 +1,6 @@
 package org.diagbot.nlp.util;
 
+import org.apache.commons.lang3.StringUtils;
 import org.diagbot.nlp.participle.word.Lexeme;
 
 import java.util.*;
@@ -43,6 +44,11 @@ public class NlpUtil {
         return Pattern.matches("^[-\\+]?\\d+(\\.\\d+)?",l.getText());
     }
 
+    public static boolean isNumberString(String s) {
+        if (StringUtils.isEmpty(s)) return false;
+        return Pattern.matches("^[-\\+]?\\d+(\\.\\d+)?",s);
+    }
+
     public static double numberText2value(Lexeme l) {
         double value = 0.0;
         if (numtextList.contains(l.getText())) {

+ 22 - 17
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,7 +164,7 @@ public class AlgorithmController extends BaseController {
         bigDataResponseData.setPacs(new ArrayList<>());
 
         GraphCalculate graphCalculate = new GraphCalculate();
-        ResponseData graphResponseData = graphCalculate.calculate(request, searchData);
+        ResponseData graphResponseData = graphCalculate.calculate(request, searchData, crisisDetailMap);
         if (graphResponseData.getDis().size() > 0) {
             List<FeatureRate> disFeatureRates = new ArrayList<>();
             List<FeatureRate> bigdis = bigDataResponseData.getDis();
@@ -186,8 +192,7 @@ public class AlgorithmController extends BaseController {
         bigDataResponseData.setTreat(graphResponseData.getTreat());
 
         //量表和指标推送
-        Map<String, List<CrisisDetail>> crisisDetails = responseData.getCrisisDetails();
-        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);
                 }
@@ -413,7 +418,7 @@ public class AlgorithmController extends BaseController {
                 treatResult.put(diseaseName, filnlly);
             }
         }
-        graphResponseData.setTreat(treatResult);
+//        graphResponseData.setTreat(treatResult);
         return graphResponseData;
     }
 }

+ 4 - 2
push-web/src/main/java/org/diagbot/push/controller/GraphController.java

@@ -1,6 +1,7 @@
 package org.diagbot.push.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import org.diagbot.common.push.bean.CrisisDetail;
 import org.diagbot.common.push.bean.ResponseData;
 import org.diagbot.common.push.bean.SearchData;
 import org.diagbot.common.push.work.ParamsDataProxy;
@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -43,10 +45,10 @@ public class GraphController extends BaseController {
      */
     @RequestMapping(value = "/push", method = RequestMethod.POST)
     @ResponseBody
-    public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+    public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData,Map<String, List<CrisisDetail>> crisisDetails) throws Exception {
         Response<ResponseData> response = new Response();
         GraphCalculate graphCalculate = new GraphCalculate();
-        ResponseData responseData = graphCalculate.calculate(request, searchData);
+        ResponseData responseData = graphCalculate.calculate(request, searchData,crisisDetails);
         response.setData(responseData);
         return response;
     }

+ 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 - 3
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.
  */
@@ -22,7 +26,6 @@ public class CrisisApplication {
     private String key = "crisis";
 
     public Map<String, List<CrisisDetail>> crisisContent(SearchData searchData) {
-        searchData.setRuleType("1,2");
         Map<String, List<Rule>> rules = searchData.getRules();
         List<String> ruleTypeIdList = new ArrayList<>();
         if (rules == null) {
@@ -48,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;
@@ -94,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());
 
@@ -117,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()) {