瀏覽代碼

Merge branch 'master' of http://192.168.2.236:10080/louhr/push

kongwz 5 年之前
父節點
當前提交
3870258411
共有 48 個文件被更改,包括 61246 次插入633 次删除
  1. 17 7
      algorithm/src/main/java/org/algorithm/core/neural/TensorflowModel.java
  2. 4 3
      algorithm/src/main/java/org/algorithm/core/neural/dataset/NNDataSet.java
  3. 6 0
      bigdata-web/pom.xml
  4. 1 1
      bigdata-web/src/main/java/org/diagbot/bigdata/work/AlgorithmCore.java
  5. 4 4
      bigdata-web/src/main/java/org/diagbot/bigdata/work/ResultDataProxy.java
  6. 231 0
      bigdata-web/src/test/java/org/diagbot/Rule2AppTest.java
  7. 187 0
      bigdata-web/src/test/java/org/diagbot/RuleTest.java
  8. 11 2
      common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java
  9. 18 8
      common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java
  10. 10 0
      common-push/src/main/java/org/diagbot/common/push/bean/Rule.java
  11. 15 6
      common-push/src/main/java/org/diagbot/common/push/bean/SearchData.java
  12. 31 4
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Filnlly.java
  13. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/MeditionDetail.java
  14. 27 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Treat.java
  15. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatCate.java
  16. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatDetail.java
  17. 2 1
      common-push/src/main/java/org/diagbot/common/push/cache/ApplicationCacheUtil.java
  18. 5 3
      common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java
  19. 17 1
      common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java
  20. 2 2
      common-push/src/main/java/org/diagbot/common/push/work/ParamsDataProxy.java
  21. 5 2
      graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java
  22. 3 3
      graph-web/src/main/java/org/diagbot/graphWeb/work/DiseaseCalculate.java
  23. 168 79
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  24. 13 8
      graph-web/src/main/java/org/diagbot/graphWeb/work/ScaleCalculate.java
  25. 766 416
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  26. 1185 0
      graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java
  27. 31 3
      graph/src/main/resources/bolt.properties
  28. 43 0
      graph/src/main/resources/pushTreat.properties
  29. 8 5
      graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java
  30. 33 0
      nlp-web/src/main/java/org/diagbot/nlp/controller/SimilarController.java
  31. 3 0
      nlp/src/main/java/org/diagbot/nlp/participle/cfg/Configuration.java
  32. 61 21
      nlp/src/main/java/org/diagbot/nlp/participle/cfg/DefaultConfig.java
  33. 10 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentNormal.java
  34. 22 13
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentOther.java
  35. 10 2
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPacs.java
  36. 74 0
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPast.java
  37. 47 10
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java
  38. 92 0
      nlp/src/main/java/org/diagbot/nlp/similar/SimilarCacheFileManager.java
  39. 44 0
      nlp/src/main/java/org/diagbot/nlp/similar/SimilarCacheUtil.java
  40. 21 0
      nlp/src/main/java/org/diagbot/nlp/similar/SimilarUtil.java
  41. 11 2
      nlp/src/main/java/org/diagbot/nlp/util/NegativeEnum.java
  42. 6 0
      nlp/src/main/java/org/diagbot/nlp/util/NlpUtil.java
  43. 57738 0
      nlp/src/main/resources/bigdata_similar.dict
  44. 110 0
      nlp/src/test/java/org/diagbot/nlp/test/Similar2DBTest.java
  45. 6 3
      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. 2 2
      push-web/src/main/resources/static/pages/algorithm/list.html
  48. 70 20
      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;
     }
 
 

+ 4 - 3
algorithm/src/main/java/org/algorithm/core/neural/dataset/NNDataSet.java

@@ -27,7 +27,7 @@ public abstract class NNDataSet {
 
     // 再分词和疾病过滤相关容器
     protected final Map<String, String> RE_SPLIT_WORD_DICT = new HashMap<>();  // 在分词表
-    protected final List<String> FEATURE_NAME_STORE = new ArrayList<>();  // 特征保存
+    protected List<String> FEATURE_NAME_STORE = new ArrayList<>();  // 特征保存
     protected final Map<String, Map<String, Integer>> RELATED_DIAGNOSIS_DICT = new HashMap<>();  // 特征与疾病相关表
     private boolean doFilterDiagnosis = false;  // 是否做疾病过滤
 
@@ -352,8 +352,9 @@ public abstract class NNDataSet {
      * @param features
      */
     public void storeFeatureNames(Map<String, Map<String, String>> features) {
-        this.FEATURE_NAME_STORE.size();  // this.FEATURE_NAME_STORE.clear() 未知原因会出现数据越界异常,加了这个则没有了
-        this.FEATURE_NAME_STORE.clear();
+//        this.FEATURE_NAME_STORE.size();  // this.FEATURE_NAME_STORE.clear() 未知原因会出现数据越界异常,加了这个则没有了
+//        this.FEATURE_NAME_STORE.clear();
+        this.FEATURE_NAME_STORE = new ArrayList<>();
         this.FEATURE_NAME_STORE.addAll(features.keySet());
     }
 

+ 6 - 0
bigdata-web/pom.xml

@@ -77,6 +77,12 @@
             <version>1.2.5</version>
         </dependency>
 
+		<dependency>
+			<groupId>net.sourceforge.jexcelapi</groupId>
+			<artifactId>jxl</artifactId>
+			<version>2.6.12</version>
+		</dependency>
+
 		<dependency>
 			<groupId>mysql</groupId>
 			<artifactId>mysql-connector-java</artifactId>

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

@@ -53,7 +53,7 @@ public class AlgorithmCore {
             switch (searchData.getAlgorithmType() == null ? 1 : searchData.getAlgorithmType()) {
                 case 1: //机器学习算法推理
                     executor = AlgorithmFactory.getInstance(classifies[i]);
-                    if (FeatureType.parse(featureTypes[i]) == FeatureType.DIAG) {
+                    if (FeatureType.parse(featureTypes[i]) == FeatureType.DIAG && !"2".equals(searchData.getSysCode())) {
                         bigDataSearchData.setLength(6);//模型推送最多6个比较合理
                     }
                     break;

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

@@ -151,13 +151,13 @@ public class ResultDataProxy {
      * @return
      */
     public ResponseData resultSexAgeFilter(HttpServletRequest request, ResponseData responseData, SearchData searchData) {
-        if (responseData.getLabs().size() > 0) {//化验
+        if (responseData.getLabs() != null && responseData.getLabs().size() > 0) {//化验
             responseData.setLabs(sexFilter(request, responseData.getLabs(), searchData, Constants.feature_type_lis));
         }
-        if (responseData.getPacs().size() > 0) {//辅检
+        if (responseData.getPacs() != null && responseData.getPacs().size() > 0) {//辅检
             responseData.setPacs(sexFilter(request, responseData.getPacs(), searchData, Constants.feature_type_pacs));
         }
-        if (responseData.getVitals().size() > 0) {//查体
+        if (responseData.getVitals() != null && responseData.getVitals().size() > 0) {//查体
             responseData.setVitals(sexFilter(request, responseData.getVitals(), searchData, Constants.feature_type_vital));
         }
         return responseData;
@@ -180,7 +180,7 @@ public class ResultDataProxy {
                 ResultMappingFilter filter = filterMap.get(featureRate.getFeatureName());
                 if (filter != null) {
                     if (filter.getSex() != null && !StringUtils.isEmpty(searchData.getSex())
-                            && !filter.getSex().equals(searchData.getSex())) {      //性别过滤
+                            && filter.getSex().equals(searchData.getSex()) || filter.getSex().equals("3")) {      //性别过滤
                         isFirst = true;
                     } else {
                         isFirst = false;

+ 231 - 0
bigdata-web/src/test/java/org/diagbot/Rule2AppTest.java

@@ -0,0 +1,231 @@
+package org.diagbot;
+
+import jxl.Cell;
+import jxl.Sheet;
+import jxl.Workbook;
+import jxl.read.biff.BiffException;
+import jxl.write.Label;
+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;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/11/21 17:08
+ */
+public class Rule2AppTest {
+    public static void main(String[] args) {
+        Map<String, String> ruleId = getRuleId();
+        String fileNameRead = "D:\\大数据小组\\慢病\\11.病历评级案例-20191126.xls";
+        String fileNameWrite = "D:\\大数据小组\\慢病\\病历评级规则app列表20191126.xls";
+        readExcel(fileNameRead);
+        writeExcel(ruleId, readExcel(fileNameRead), fileNameWrite);
+    }
+
+    public static void writeExcel(Map<String, String> ruleId, List<List<String>> ruleList, String fileName) {
+        String[] title = { "编码", "是否删除", "记录创建时间", "记录修改时间", "创建人", "修改人", "指标名称", "规则类别", "提醒内容" };
+        File file = new File(fileName);
+        if (file.exists()) {
+            //如果文件存在就删除
+            file.delete();
+        }
+        try {
+            file.createNewFile();
+            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
+            WritableSheet sheetA = workbookA.createSheet("sheet1", 0);
+            Label labelA = null;
+            //设置列名
+            for (int j = 0; j < title.length; j++) {
+                labelA = new Label(j, 0, title[j], format);
+                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) {
+                    String[] pacsOrder = rule.get(0).split("、");
+                    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]));
+                             * sheetA.addCell(labelA);
+                             * labelA = new Label(8, row, rules[k] + ",不宜做" + pacsOrder[j]);
+                             * sheetA.addCell(labelA);
+                             * row++;*/
+                            String feature = ruleId.get(rules[k]) != null ? ruleId.get(rules[k]) : rules[k];
+                            if (rules[k].contains("血小板计数(PLT)")){
+                                feature = "1131";
+                            } else if (rules[k].contains("经期")){
+                                feature = "70、71";
+                            } else if (rules[k].contains("妊娠")){
+                                feature = "1164、1165";
+                                remind = rule.size()>2?rule.get(2):"妊娠不宜做此项检查";
+                            } else if (rules[k].contains("妊娠1-3个月")){
+                                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("、");
+                            for (int l = 0; l < featureArr.length; l++) {
+                                if (k == rules.length - 1 && l == featureArr.length - 1) {
+                                    content += ruleId.get(pacsOrder[j]) + "," + featureArr[l];
+                                } else {
+                                    content += ruleId.get(pacsOrder[j]) + "," + featureArr[l] + "^";
+                                }
+                            }
+                        }
+//                        write2DB(content,StringUtils.isEmpty(remind)?"请注意:该患者${remind}":remind);
+                        labelA = new Label(6, row, content,format);
+                        sheetA.addCell(labelA);
+                        labelA = new Label(8, row, StringUtils.isEmpty(remind)?"请注意:该患者${remind}":remind,format);
+                        sheetA.addCell(labelA);
+                        row++;
+                    }
+                }
+                //                } else if (rule.size() == 3){
+                //                    String[] rules = rule.get(1).split("、");
+                //                    for (int j = 0; j < rules.length; j++) {
+                //                        labelA = new Label(6, row, ruleId.get(rule.get(0))+","+ruleId.get(rules[j]));
+                //                        sheetA.addCell(labelA);
+                //                        labelA = new Label(8, row, rule.get(2));
+                //                        sheetA.addCell(labelA);
+                //                        row++;
+                //                    }
+                //                }
+            }
+            System.out.println("成功写入文件,请前往" + fileName + "查看文件!");
+            workbookA.write();  //写入数据
+            workbookA.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println("文件写入失败,报异常...");
+        }
+    }
+
+    public static List<List<String>> readExcel(String fileName) {
+        List<List<String>> ruleList = new ArrayList<>();
+        List<String> rule = null;
+        FileInputStream fis = null;
+        try {
+            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(0);
+                for (int j = 1; j < rs.getRows(); j++) {
+                    rule = new ArrayList<>();
+                    String content = "";
+                    Cell[] cells = rs.getRow(j);
+                    for (int k = 0; k < cells.length; k++) {
+                        if (k == 0 || k == 2 || k == 3) {
+                            content = cells[k].getContents();
+                            rule.add(content.trim());
+                        }
+                    }
+                    ruleList.add(rule);
+                }
+//            }
+            fis.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (BiffException e) {
+            e.printStackTrace();
+        }
+        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");
+        Connection conn = jdbc.connect();
+        PreparedStatement pstQuery = null;
+        ResultSet rs = null;
+        String sql = "SELECT id,eq_value FROM kl_rule_pub WHERE eq_value is not null";
+        try {
+            pstQuery = conn.prepareStatement(sql);
+            rs = pstQuery.executeQuery();
+            while (rs.next()) {
+                String id = String.valueOf(rs.getInt(1));
+                String eqValue = rs.getString(2).trim();
+                ruleId.put(eqValue, id);
+            }
+            ruleId.put("收缩压≥180mmHg", "238");
+            ruleId.put("舒张压≥110mmHg", "239");
+            ruleId.put("收缩压≤80mmHg", "29");
+            ruleId.put("舒张压≤50mmHg", "30");
+            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();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return ruleId;
+    }
+}

+ 187 - 0
bigdata-web/src/test/java/org/diagbot/RuleTest.java

@@ -0,0 +1,187 @@
+package org.diagbot;
+
+import org.diagbot.common.push.bean.Rule;
+import org.diagbot.common.push.bean.SearchData;
+import org.diagbot.common.push.filter.rule.PretreatmentRule;
+import org.diagbot.nlp.rule.module.PreResult;
+import org.diagbot.pub.jdbc.MysqlJdbc;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by louhr on 2019/11/22.
+ */
+public class RuleTest {
+    public static void main(String[] args) {
+        RuleTest test = new RuleTest();
+        try {
+            test.validatePub();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    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");
+        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"}, "");
+
+        List<Map<String, Object>> updates = new ArrayList<>();
+        List<Map<String, Object>> wheres = new ArrayList<>();
+        //数据预处理
+        PretreatmentRule pretreatmentRule = new PretreatmentRule();
+        for (Map<String, String> map : data) {
+            SearchData searchData = new SearchData();
+            searchData.setSysCode("1");
+            createSearchData(searchData, map);
+
+            Map<String, Object> line = new HashMap<>();
+            Map<String, Object> where = new HashMap<>();
+
+            pretreatmentRule.rule(searchData);
+            Map<String, List<Rule>> rules = searchData.getRules();
+            for (Map.Entry<String, List<Rule>> entry : rules.entrySet()) {
+                if (entry.getValue().size() > 0) {
+                    line.put("rule_type", "9");
+                    where.put("id", map.get("id"));
+
+                    updates.add(line);
+                    wheres.add(where);
+                    break;
+                }
+            }
+        }
+
+        nlpJdbc.update("kl_rule_pub", updates, wheres);
+    }
+
+    private void validateApp() throws Exception {
+        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"}, "");
+
+        Map<String, Map<String, String>> rulesMap = new HashMap<>();
+        for (Map<String, String> map : data) {
+            rulesMap.put(map.get("id"), map);
+        }
+
+        data = nlpJdbc.query("kl_rule_app", new String[]{"id", "rule_id"}, "");
+        for (Map<String, String> map : data) {
+
+        }
+
+        List<Map<String, Object>> updates = new ArrayList<>();
+        List<Map<String, Object>> wheres = new ArrayList<>();
+    }
+
+    private SearchData createSearchData(SearchData searchData, Map<String, String> map) {
+        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"));
+            }
+            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"));
+            }
+            if ("症状--".equals(map.get("pub_name"))) {
+                searchData.setSymptom(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"));
+            }
+            if ("过敏--".equals(map.get("pub_name"))) {
+                searchData.setPasts(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"));
+            }
+        } else if (!StringUtils.isEmpty(map.get("min_operator")) && !StringUtils.isEmpty(map.get("max_operator"))) {
+            if (map.get("pub_name").indexOf("体征--") > -1) {
+                value = Double.valueOf(map.get("min_value")) + 0.1;
+                searchData.setVital(map.get("pub_name") + value + map.get("min_unit"));
+            }
+            if (map.get("pub_name").indexOf("其他--") > -1) {
+                value = Double.valueOf(map.get("min_value")) + 0.1;
+                searchData.setOther(map.get("pub_name") + value + map.get("min_unit"));
+            }
+            if (map.get("pub_name").indexOf("化验--") > -1) {
+                value = Double.valueOf(map.get("min_value")) + 0.1;
+                List<PreResult> list = new ArrayList<>();
+                PreResult preResult = new PreResult();
+                preResult.setUniqueName(map.get("pub_name").substring(4));
+                preResult.setValue(String.valueOf(value));
+                preResult.setUnits(map.get("min_unit"));
+                list.add(preResult);
+                searchData.setLisArr(list);
+            }
+            if (map.get("pub_name").indexOf("年龄--") > -1) {
+                int v = Integer.valueOf(map.get("min_value")) + 1;
+                searchData.setAge(v);
+            }
+        } else if (!StringUtils.isEmpty(map.get("min_operator"))) {
+            if (map.get("pub_name").indexOf("体征--") > -1) {
+                value = Double.valueOf(map.get("min_value")) - 0.1;
+                searchData.setVital(map.get("pub_name") + value + map.get("min_unit"));
+            }
+            if (map.get("pub_name").indexOf("其他--") > -1) {
+                value = Double.valueOf(map.get("min_value")) - 0.1;
+                searchData.setOther(map.get("pub_name") + value + map.get("min_unit"));
+            }
+            if (map.get("pub_name").indexOf("化验--") > -1) {
+                value = Double.valueOf(map.get("min_value")) - 0.1;
+                List<PreResult> list = new ArrayList<>();
+                PreResult preResult = new PreResult();
+                preResult.setUniqueName(map.get("pub_name").substring(4));
+                preResult.setValue(String.valueOf(value));
+                preResult.setUnits(map.get("min_unit"));
+                list.add(preResult);
+                searchData.setLisArr(list);
+            }
+            if (map.get("pub_name").indexOf("年龄--") > -1) {
+                int v = Integer.valueOf(map.get("min_value")) - 1;
+                searchData.setAge(v);
+            }
+        } else if (!StringUtils.isEmpty(map.get("max_operator"))) {
+            if (map.get("pub_name").indexOf("体征--") > -1) {
+                value = Double.valueOf(map.get("max_value")) + 0.1;
+                searchData.setVital(map.get("pub_name") + value + map.get("max_unit"));
+            }
+            if (map.get("pub_name").indexOf("其他--") > -1) {
+                value = Double.valueOf(map.get("max_value")) + 0.1;
+                searchData.setOther(map.get("pub_name") + value + map.get("max_unit"));
+            }
+            if (map.get("pub_name").indexOf("化验--") > -1) {
+                value = Double.valueOf(map.get("max_value")) + 0.1;
+                List<PreResult> list = new ArrayList<>();
+                PreResult preResult = new PreResult();
+                preResult.setUniqueName(map.get("pub_name").substring(4));
+                preResult.setValue(String.valueOf(value));
+                preResult.setUnits(map.get("max_unit"));
+                list.add(preResult);
+                searchData.setLisArr(list);
+            }
+            if (map.get("pub_name").indexOf("年龄--") > -1) {
+                int v = Integer.valueOf(map.get("max_value")) + 1;
+                searchData.setAge(v);
+            }
+        }
+
+        return searchData;
+    }
+}

+ 11 - 2
common-push/src/main/java/org/diagbot/common/push/bean/CrisisDetail.java

@@ -5,8 +5,9 @@ package org.diagbot.common.push.bean;
  */
 public class CrisisDetail {
     private String remindText;
-    private String standardText;
-    private String originText;
+    private String standardText = "";
+    private String originText = "";
+    private String typeId;
 
     public String getRemindText() {
         return remindText;
@@ -31,4 +32,12 @@ public class CrisisDetail {
     public void setOriginText(String originText) {
         this.originText = originText;
     }
+
+    public String getTypeId() {
+        return typeId;
+    }
+
+    public void setTypeId(String typeId) {
+        this.typeId = typeId;
+    }
 }

+ 18 - 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,7 +24,8 @@ 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; //管理评估
@@ -65,6 +67,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 +149,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;

+ 10 - 0
common-push/src/main/java/org/diagbot/common/push/bean/Rule.java

@@ -34,6 +34,8 @@ public class Rule {
     private String eq_unit = "";
     //提醒信息
     private String remind = "";
+    //追加到文本尾部信息
+    private String suffixInfo = "";
     //提醒信息
     private String originText = "";
 
@@ -133,6 +135,14 @@ public class Rule {
         this.remind = remind;
     }
 
+    public String getSuffixInfo() {
+        return suffixInfo;
+    }
+
+    public void setSuffixInfo(String suffixInfo) {
+        this.suffixInfo = suffixInfo;
+    }
+
     public String getOriginText() {
         return originText;
     }

+ 15 - 6
common-push/src/main/java/org/diagbot/common/push/bean/SearchData.java

@@ -34,7 +34,7 @@ public class SearchData {
     protected String pacs = "";
     protected String diag = "";
     private String diseaseName;
-    protected String past = "";
+    protected String pasts = "";
     protected String other = "";
     //当前开单lis项目
     protected String lisOrder = "";
@@ -47,7 +47,6 @@ public class SearchData {
 
     //量表
     protected String scaleName = "";
-
     //指标结果
     protected String indications="";
     //模型
@@ -62,6 +61,8 @@ public class SearchData {
     private Map<String, List<Rule>> rules = new HashMap<>();
     //特征推送走的模型 1:机器学习 2:朴素贝叶斯
     private Integer algorithmType;
+    //规则类型
+    private String ruleType;
 
     public Integer getDisType() {
         return disType;
@@ -221,12 +222,12 @@ public class SearchData {
         this.diag = diag;
     }
 
-    public String getPast() {
-        return past;
+    public String getPasts() {
+        return pasts;
     }
 
-    public void setPast(String past) {
-        this.past = past;
+    public void setPasts(String pasts) {
+        this.pasts = pasts;
     }
 
     public String getOther() {
@@ -332,4 +333,12 @@ public class SearchData {
     public void setDiseaseName(String diseaseName) {
         this.diseaseName = diseaseName;
     }
+
+    public String getRuleType() {
+        return ruleType;
+    }
+
+    public void setRuleType(String ruleType) {
+        this.ruleType = ruleType;
+    }
 }

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

+ 2 - 1
common-push/src/main/java/org/diagbot/common/push/cache/ApplicationCacheUtil.java

@@ -165,7 +165,7 @@ public class ApplicationCacheUtil {
         for (String line : fileContents) {
             String[] content = line.split("\\|", -1);
             Rule rule = new Rule();
-            if (content.length == 12) {
+            if (content.length == 13) {
                 rule.setId(content[0] == null ? "" : content[0]);
                 rule.setPub_name(content[1] == null ? "" : content[1]);
                 rule.setMin_operator(content[2] == null ? "" : content[2]);
@@ -178,6 +178,7 @@ public class ApplicationCacheUtil {
                 rule.setEq_value(content[9] == null ? "" : content[9]);
                 rule.setEq_unit(content[10] == null ? "" : content[10]);
                 rule.setRemind(content[11] == null ? "" : content[11]);
+                rule.setSuffixInfo(content[12] == null ? "" : content[12]);
                 if (kl_rule_filter_map.get(rule.getPub_name()) == null) {
                     rules = new ArrayList<>();
                 } else {

+ 5 - 3
common-push/src/main/java/org/diagbot/common/push/cache/CacheFileManager.java

@@ -344,11 +344,11 @@ public class CacheFileManager {
 
             //规则过滤信息
             sql = "SELECT id, pub_name, min_operator, min_value, min_unit, max_operator, max_value, " +
-                    "max_unit, eq_operator, eq_value, eq_unit, remind FROM kl_rule_pub";
+                    "max_unit, eq_operator, eq_value, eq_unit, remind,suffix_info FROM kl_rule_pub";
             st = conn.createStatement();
             rs = st.executeQuery(sql);
             fw = new FileWriter(path + "bigdata_rule_filter.dict");
-            String r6, r7, r8, r9, r10, r11, r12;
+            String r6, r7, r8, r9, r10, r11, r12,r13;
             while (rs.next()) {
                 r1 = String.valueOf(rs.getInt(1));
                 r2 = rs.getString(2);
@@ -362,6 +362,7 @@ public class CacheFileManager {
                 r10 = rs.getString(10);
                 r11 = rs.getString(11);
                 r12 = rs.getString(12);
+                r13 = rs.getString(13);
                 r1 = StringUtils.isEmpty(r1) ? "" : r1;
                 r2 = StringUtils.isEmpty(r2) ? "" : r2;
                 r3 = StringUtils.isEmpty(r3) ? "" : r3;
@@ -374,9 +375,10 @@ public class CacheFileManager {
                 r10 = StringUtils.isEmpty(r10) ? "" : r10;
                 r11 = StringUtils.isEmpty(r11) ? "" : r11;
                 r12 = StringUtils.isEmpty(r12) ? "" : r12;
+                r13 = StringUtils.isEmpty(r13) ? "" : r13;
                 fw.write(encrypDES.encrytor(r1 + "|" + r2 + "|" + r3 + "|" + r4 + "|" + r5
                         + "|" + r6 + "|" + r7 + "|" + r8 + "|" + r9 + "|" + r10 + "|" + r11
-                        + "|" + r12));
+                        + "|" + r12 + "|" + r13));
                 fw.write("\n");
             }
             fw.close();

+ 17 - 1
common-push/src/main/java/org/diagbot/common/push/filter/rule/PretreatmentRule.java

@@ -30,6 +30,10 @@ public class PretreatmentRule {
         }
         //lis结构化信息
         if (searchData.getLisArr() != null && searchData.getLisArr().size() > 0) {
+            List<PreResult> preResults = searchData.getLisArr();
+            for (PreResult result : preResults) {
+                result.setUniqueName("化验--" + result.getUniqueName());
+            }
             searchData.setLis(add2PreResultList(searchData.getLisArr(), searchData.getLis(), "lis", searchData));
         } else if (!StringUtils.isEmpty(searchData.getLis())) {
             searchData.setLis(add2PreResultList(new PretreatmentLis(), searchData.getLis(), "lis", searchData));
@@ -38,8 +42,13 @@ public class PretreatmentRule {
         if (!StringUtils.isEmpty(searchData.getPacs())) {
             searchData.setPacs(add2PreResultList(new PretreatmentPacs(), searchData.getPacs(), "pacs", searchData));
         }
+        //既往史
+        if (!StringUtils.isEmpty(searchData.getPasts())) {
+            searchData.setPasts(add2PreResultList(new PretreatmentPast(), searchData.getPasts(), "past", searchData));
+        }
         //其他史
         if (!StringUtils.isEmpty(searchData.getOther())) {
+            add2PreResultList(new PretreatmentOther(), searchData.getSymptom(), "symptom-other", searchData);
             searchData.setOther(add2PreResultList(new PretreatmentOther(), searchData.getOther(), "other", searchData));
         }
         //开具诊断
@@ -54,6 +63,13 @@ public class PretreatmentRule {
         if (!StringUtils.isEmpty(searchData.getPacsOrder())) {
             add2PreResultList(new PretreatmentMakeList(), searchData.getPacsOrder(), "pacsOrder", searchData);
         }
+
+//        Map<String, List<Rule>> ruleMap = searchData.getRules();
+//        for (Map.Entry<String, List<Rule>> entry : ruleMap.entrySet()) {
+//            for (Rule rule : entry.getValue()) {
+//                System.out.println("id:" + rule.getId() + "; pub_name: " + rule.getPub_name());
+//            }
+//        }
     }
 
     private String add2PreResultList(Pretreatment pretreatment, String content, String ruleType, SearchData searchData) throws java.io.IOException {
@@ -87,7 +103,7 @@ public class PretreatmentRule {
                             accord_rule_map.put(ruleType, accord_rules);
                             searchData.setRules(accord_rule_map);
 
-                            content = content + (rule.getRemind() == null ? "" : rule.getRemind());
+                            content = content + (rule.getRemind() == null ? "" : rule.getSuffixInfo());
                         }
                     }
                 }

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

@@ -99,9 +99,9 @@ public class ParamsDataProxy {
             featuresList = fa.start(searchData.getVital(), FeatureType.FEATURE);
             paramFeatureInit(searchData, featuresList);
         }
-        if (!StringUtils.isEmpty(searchData.getPast())) {
+        if (!StringUtils.isEmpty(searchData.getPasts())) {
             //提取既往史
-            featuresList = fa.start(searchData.getPast(), FeatureType.FEATURE);
+            featuresList = fa.start(searchData.getPasts(), FeatureType.FEATURE);
             paramFeatureInit(searchData, featuresList);
         }
         if (!StringUtils.isEmpty(searchData.getOther()) || !StringUtils.isEmpty(searchData.getIndications())) {

+ 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) {

+ 168 - 79
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,13 +16,23 @@ 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 ;
 
     /**
@@ -35,7 +43,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);
@@ -44,33 +52,30 @@ public class GraphCalculate {
         int age = searchData.getAge();
         String sex = searchData.getSex();
         String diseaseName = searchData.getDiseaseName();
+        String webDiag = searchData.getDiag();
+        logger.info("页面诊断为 :"+webDiag);
+        String[] webDiagList = webDiag.split(",|,|、|;|:|;");
         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);
-                }
-            }
-        }
-
+        List<String> exculdDiagFilds = this.exculdDiagFilds(inputs,webDiagList,diseaseName);
+        //从大数据解析分词
+        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();
-        logger.info("页面诊断为 :"+webDiag);
-        String[] webDiagList = webDiag.split(",|,|、|;|:|;");
+
+        //处理血肌酐
+        List<PreResult> lisArr = searchData.getLisArr();
+        String serumCreatinine = processSerumcreatinine(lisArr);
+
         //计算诊断
         Map<String, Object> condition =null;
         Map<String, Map<String, String>> excludelist = null;
@@ -82,75 +87,35 @@ 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()]));
+            PushTreat pushTreat = new PushTreat();
+            Treat treat = pushTreat.processTreat(diseaseName,webDiag,diseaseType, driver, (String[]) inputList.toArray(new String[inputList.size()]),exculdDiagFilds, crisisDetails);
+//            Map<String, List<String>> disUE = pushTreat.getDisUE(diseaseName,1,driver);
+//            Map<String,String> ue = pushTreat.getUe((String[]) inputList.toArray(new String[inputList.size()]),driver);
             //走平常诊断治疗
 //            Map<String, Filnlly> mulDiseaseTreat = neo4jAPI.getMulDiseaseTreat_2(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
-            Map<String, Filnlly> mulDiseaseTreat_new = neo4jAPI.getMulDiseaseTreat_new(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
-            System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
-            responseData.setTreat(mulDiseaseTreat_new);
+//            Map<String, Filnlly> mulDiseaseTreat_new = neo4jAPI.getMulDiseaseTreat_new(diseaseName,webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList),crisisDetails);
+//            System.out.println("推送治疗消耗:"+(System.currentTimeMillis()-starttime)+"s");
+            responseData.setTreat(treat);
         }
         //管理评估(慢病才有)
         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,7 +144,7 @@ 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);
                 }
@@ -211,6 +176,74 @@ public class GraphCalculate {
         System.out.println("Total takes: " + (System.currentTimeMillis()-starttime)/1000d + 's');
         return responseData;
     }
+
+    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 +252,60 @@ 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;
+    }
 }

+ 13 - 8
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,6 +155,8 @@ 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");
@@ -167,7 +170,7 @@ public class ScaleCalculate {
                 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"))) {
+                        if (StringUtils.isEmpty(detailSub.get("value").toString())) {
                             //如果拿到的年龄为空,
                             break;
                         } else {
@@ -214,9 +217,7 @@ public class ScaleCalculate {
                 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) {
+                if(eGFR3 > 0 && eGFR3 < 15) {
                     text = "肾功能衰竭";
                 } else if (eGFR3 >= 15 && eGFR3 <= 29) {
                     text = "重度下降";
@@ -227,12 +228,16 @@ public class ScaleCalculate {
                 } else if (eGFR3 > 89) {
                     text = "正常或肾损伤代偿期";
                 }
-                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);
+                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);
+                }
                 //                scaleCalcResult.put("text", text);
                 //                scaleCalcResult.put("unit", unit);
                 //                scaleCalcResult.put("value", new DecimalFormat("#.00").format(eGFR3));

文件差異過大導致無法顯示
+ 766 - 416
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java


文件差異過大導致無法顯示
+ 1185 - 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("、");

+ 33 - 0
nlp-web/src/main/java/org/diagbot/nlp/controller/SimilarController.java

@@ -0,0 +1,33 @@
+package org.diagbot.nlp.controller;
+
+import org.diagbot.nlp.similar.SimilarCacheUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/10/25 10:38
+ */
+@Controller
+@RequestMapping("/similar")
+public class SimilarController {
+
+    @RequestMapping(value = "/getsimilar", method = RequestMethod.POST)
+    @ResponseBody
+    public static List<String> getSimilarList(@RequestBody String inputWord) {
+        Map<String, List<String>> similarDictMap = SimilarCacheUtil.getSimilar_dict_map();
+        if (similarDictMap.get(inputWord) != null && similarDictMap.get(inputWord).size() > 0) {
+            return similarDictMap.get(inputWord);
+        }
+        return new ArrayList<>();
+    }
+}

+ 3 - 0
nlp/src/main/java/org/diagbot/nlp/participle/cfg/Configuration.java

@@ -10,5 +10,8 @@ public interface Configuration {
 	public Segment loadMainDict(List<String> dicts);
 	public Map<String, String> loadMapDict(String path);
 	public List<String> readFileContents(String path);
+	public List<String> readDirectFileContents(String path);
+	public List<String> readTargetFileContents(String path);
 	void writeFileContents(List<String> contents, String path);
+
 }

+ 61 - 21
nlp/src/main/java/org/diagbot/nlp/participle/cfg/DefaultConfig.java

@@ -86,35 +86,28 @@ public class DefaultConfig implements Configuration {
     }
 
     public List<String> readFileContents(String path) {
-        if (!StringUtils.isEmpty(path_prefix)) path = path_prefix + path;
+        if (!StringUtils.isEmpty(path_prefix)) {
+            path = path_prefix + path;
+        }
+        return readDirectFileContents(path);
+    }
+
+    public List<String> readDirectFileContents(String path) {
         InputStream is = null;
         List<String> fileContents = new ArrayList<String>(10);
         try {
-            if (StringUtils.isEmpty(path)) path = DEFAULT_PATH;
-            is = this.getClass().getClassLoader().getResourceAsStream(path);
+            if (StringUtils.isEmpty(path)) {
+                path = DEFAULT_PATH;
+            }
+            //            is = this.getClass().getClassLoader().getResourceAsStream(path);
             File file = new File(path);
-//            File file = new File(this.getClass().getResource(path).getFile());
+            //            File file = new File(this.getClass().getResource(path).getFile());
             is = new FileInputStream(file);
             if (is == null) {
                 throw new RuntimeException(path + ".......文件未找到!!");
             }
 
-            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"), 512);
-
-            EncrypDES encrypDES = new EncrypDES();
-            String theWord = null;
-            int i = 0;
-            do {
-                theWord = br.readLine();
-                if (theWord != null && !"".equals(theWord.trim())) {
-                    if (i == 5) {
-                        logger.info("读取文件第六行解密前:" + theWord.trim());
-                        logger.info("读取文件第六行解密后:" + encrypDES.decryptor(theWord.trim()));
-                    }
-                    fileContents.add(encrypDES.decryptor(theWord.trim()));
-                }
-                i++;
-            } while (theWord != null);
+            addFileContents(is, fileContents);
         } catch (Exception ioe) {
             System.err.println("读取文件" + path + "出错.......................");
             ioe.printStackTrace();
@@ -124,12 +117,59 @@ public class DefaultConfig implements Configuration {
         return fileContents;
     }
 
+    public List<String> readTargetFileContents(String path) {
+        InputStream is = null;
+        List<String> fileContents = new ArrayList<String>(10);
+        try {
+            if (StringUtils.isEmpty(path)) {
+                path = DEFAULT_PATH;
+            }
+            is = this.getClass().getClassLoader().getResourceAsStream(path);
+            //            File file = new File(path);
+            //            File file = new File(this.getClass().getResource(path).getFile());
+            //            is = new FileInputStream(file);
+            if (is == null) {
+                throw new RuntimeException(path + ".......文件未找到!!");
+            }
+
+            addFileContents(is, fileContents);
+        } catch (Exception ioe) {
+            System.err.println("读取文件" + path + "出错.......................");
+            ioe.printStackTrace();
+        } finally {
+            this.close(is);
+        }
+        return fileContents;
+    }
+
+    public void addFileContents(InputStream is, List<String> fileContents) throws Exception {
+        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"), 512);
+
+        EncrypDES encrypDES = new EncrypDES();
+        String theWord = null;
+        int i = 0;
+        do {
+            theWord = br.readLine();
+            if (theWord != null && !"".equals(theWord.trim())) {
+                if (i == 5) {
+                    logger.info("读取文件第六行解密前:" + theWord.trim());
+                    logger.info("读取文件第六行解密后:" + encrypDES.decryptor(theWord.trim()));
+                }
+                fileContents.add(encrypDES.decryptor(theWord.trim()));
+            }
+            i++;
+        } while (theWord != null);
+    }
+
+
     public void writeFileContents(List<String> contents, String path) {
         this.writeFileContents(contents, path, "");
     }
 
     public void writeFileContents(List<String> contents, String path, String separator) {
-        if (!StringUtils.isEmpty(path_prefix)) path = path_prefix + path;
+        if (!StringUtils.isEmpty(path_prefix)) {
+            path = path_prefix + path;
+        }
         try {
             FileWriter fw = new FileWriter(path);
             for (String content : contents) {

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

@@ -24,6 +24,16 @@ public class PretreatmentNormal extends Pretreatment {
                     preResults.add(result);
                     return preResults;
                 }
+            } else if (l.getText().equals("婚姻") && i < lexemes.size() - 1) {
+                Lexeme afterLexeme = lexemes.get(i + 1);
+                if ("己婚".equals(afterLexeme.getText()) || "未婚".equals(afterLexeme.getText())) {
+                    PreResult result = new PreResult();
+                    result.setUniqueName(l.getText()+"--");
+                    result.setDetailName(l.getText()+"--");
+                    result.setValue(afterLexeme.getText());
+                    preResults.add(result);
+                    return preResults;
+                }
             }
         }
         return preResults;

+ 22 - 13
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentOther.java

@@ -11,24 +11,22 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class PretreatmentOther extends Pretreatment {
-    protected NegativeEnum[] nees_disease = new NegativeEnum[]{NegativeEnum.DISEASE};
-    protected NegativeEnum[] nees_operation = new NegativeEnum[]{NegativeEnum.OPERATION};
+    protected NegativeEnum[] nees_married = new NegativeEnum[]{NegativeEnum.MARRIED_DESC};
 
     public List<PreResult> analyze(String content) throws java.io.IOException{
-        List<PreResult> preResults = new ArrayList<>();
+        List<PreResult> preResults = super.analyzeDefault(content);
+        for (PreResult result : preResults) {
+            result.setUniqueName("其他--" + result.getUniqueName());
+        }
+
         LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
         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_operation)) {
-                result.setUniqueName("手术--");
-                result.setDetailName("手术--");
-                result.setValue(NlpUtil.concept(l, NegativeEnum.OPERATION));
+            if (NlpUtil.isFeature(l.getProperty(), nees_married)) {
+                result.setUniqueName("其他--");
+                result.setDetailName("其他--");
+                result.setValue(NlpUtil.concept(l, NegativeEnum.MARRIED_DESC));
                 preResults.add(result);
             }
         }
@@ -36,10 +34,21 @@ public class PretreatmentOther extends Pretreatment {
     }
 
     public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
-        return null;
+        return super.createDefaultPreResult(lexemes, lexeme, index);
     }
 
     public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        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.MARRIED_DESC})) {
+                return NlpUtil.concept(leftLexeme, NegativeEnum.MARRIED_DESC);
+            }
+            search_len++;
+            cursor--;
+        }
         return null;
     }
 }

+ 10 - 2
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPacs.java

@@ -24,18 +24,26 @@ public class PretreatmentPacs extends Pretreatment {
             Lexeme l = lexemes.get(i);
             if (NlpUtil.isFeature(l.getProperty(), nees_pacs_result) && i > 0) {
                 int c = i - 1;
+                boolean isFind = false;
                 while (c > -1) {
                     leftLexeme = lexemes.get(c);
                     if (NlpUtil.isFeature(leftLexeme.getProperty(), nees_pacs_name)) {
                         PreResult result = new PreResult();
                         result.setValue(NlpUtil.concept(l, NegativeEnum.PACS_RESULT));
                         result.setDetailName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
-                        result.setUniqueName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
+                        result.setUniqueName("检查--" + NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
                         preResultList.add(result);
+                        isFind = true;
                         break;
                     }
                     c--;
                 }
+                if (!isFind) {
+                    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) {
@@ -83,7 +91,7 @@ public class PretreatmentPacs extends Pretreatment {
         if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[] { NegativeEnum.PACS_NAME })) {
             result.setDetailName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
         } else if (NlpUtil.isFeature(leftLexeme.getProperty(), new NegativeEnum[] { NegativeEnum.PACS_NAME })) {
-            result.setUniqueName(NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
+            result.setUniqueName("检查--" + NlpUtil.concept(leftLexeme, NegativeEnum.PACS_NAME));
         } else {
             return null;
         }

+ 74 - 0
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentPast.java

@@ -0,0 +1,74 @@
+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 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<>();
+        LexemePath<Lexeme> lexemes = ParticipleUtil.participle(content);
+        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)) {
+                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;
+    }
+
+    public PreResult createPreResult(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+
+    public String findBodyValue(LexemePath<Lexeme> lexemes, Lexeme lexeme, int index) {
+        return null;
+    }
+}

+ 47 - 10
nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java

@@ -10,26 +10,61 @@ 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());
+        }
         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_vital_result)) {
                 PreResult result = new PreResult();
-                result.setUniqueName("体征结果--");
-                result.setDetailName("体征结果--");
+                result.setUniqueName("体征--");
+                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.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("/");
+                    if (digits.length == 2) {
+                        if (!NlpUtil.isNumberString(digits[0])){
+                            continue;
+                        }
+                        PreResult result = new PreResult();
+                        result.setUniqueName("体征--收缩压");
+                        result.setDetailName("收缩压");
+                        result.setValue(digits[0]);
+                        result.setUnits("mmHg");
+                        preResults.add(result);
+                        if (!NlpUtil.isNumberString(digits[1])){
+                            continue;
+                        }
+                        result = new PreResult();
+                        result.setUniqueName("体征--舒张压");
+                        result.setDetailName("舒张压");
+                        result.setValue(digits[1]);
+                        result.setUnits("mmHg");
+                        preResults.add(result);
+                        break;
+                    }
+                    position++;
+                }
             }
         }
         return preResults;
@@ -41,12 +76,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++;

+ 92 - 0
nlp/src/main/java/org/diagbot/nlp/similar/SimilarCacheFileManager.java

@@ -0,0 +1,92 @@
+package org.diagbot.nlp.similar;
+
+import org.diagbot.pub.jdbc.MysqlJdbc;
+import org.diagbot.pub.utils.PropertiesUtil;
+import org.diagbot.pub.utils.security.EncrypDES;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/10/16 13:46
+ */
+public class SimilarCacheFileManager {
+    private String user = "root";
+    private String password = "diagbot@20180822";
+    private String url = "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8";
+
+    private String path = "";
+
+    public static void main(String[] args) {
+        SimilarCacheFileManager similarCacheFileManager = new SimilarCacheFileManager();
+        String resourcePath = similarCacheFileManager.getResourcePath();
+//        PropertiesUtil propertiesUtil = new PropertiesUtil("nlp.properties");
+//        String p = propertiesUtil.getProperty("cache.file.dir");
+        File file = new File(resourcePath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        //相似度知识库
+        similarCacheFileManager.createSimilarCacheFile(resourcePath);
+    }
+
+    public String getResourcePath(){
+        return this.getClass().getResource("/").getPath();
+    }
+
+    public SimilarCacheFileManager() {
+//        PropertiesUtil propertiesUtil = new PropertiesUtil("nlp.properties");
+//        String p = propertiesUtil.getProperty("cache.file.dir");
+
+        String resourcePath = getResourcePath();
+        File file = new File(resourcePath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        path = resourcePath;
+    }
+
+    public void createCacheFile() {
+        createSimilarCacheFile(path);
+    }
+
+    public void createSimilarCacheFile(String path) {
+        MysqlJdbc nlpJdbc = new MysqlJdbc(user, password, url);
+        Connection conn = nlpJdbc.connect();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            EncrypDES encrypDES = new EncrypDES();
+            //疾病科室
+            String sql = "SELECT similar_1,similar_2 FROM doc_similar";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            FileWriter fw = new FileWriter(path + "bigdata_similar.dict");
+
+            String r1, r2;
+            while (rs.next()) {
+                r1 = rs.getString(1).trim();
+                r2 = rs.getString(2).trim();
+
+                fw.write(encrypDES.encrytor(r1 + "|" + r2));
+                fw.write("\n");
+            }
+            fw.close();
+        } catch (IOException ioe) {
+            ioe.printStackTrace();
+        } catch (SQLException sqle) {
+            sqle.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            nlpJdbc.close(rs, st, conn);
+        }
+    }
+}

+ 44 - 0
nlp/src/main/java/org/diagbot/nlp/similar/SimilarCacheUtil.java

@@ -0,0 +1,44 @@
+package org.diagbot.nlp.similar;
+
+import org.diagbot.nlp.participle.cfg.Configuration;
+import org.diagbot.nlp.participle.cfg.DefaultConfig;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/10/16 15:30
+ */
+public class SimilarCacheUtil {
+    //相似度知识库
+    public static Map<String, List<String>> similar_dict_map = null;
+
+    public static Map<String, List<String>> getSimilar_dict_map() {
+        if (similar_dict_map == null) {
+            createSimilar_dict_map();
+        }
+        return similar_dict_map;
+    }
+
+    public static Map<String, List<String>> createSimilar_dict_map() {
+        similar_dict_map = new HashMap<>();
+        List<String> similarList = null;
+        Configuration configuration = new DefaultConfig();
+        List<String> fileContents = configuration.readTargetFileContents("bigdata_similar.dict");
+        for (String line:fileContents) {
+            String[] similarPair = line.split("\\|", -1);
+            if (similar_dict_map.get(similarPair[0]) == null){
+                similarList = new ArrayList<>();
+                similarList.add(similarPair[1]);
+                similar_dict_map.put(similarPair[0],similarList);
+            } else {
+                similar_dict_map.get(similarPair[0]).add(similarPair[1]);
+            }
+        }
+        return similar_dict_map;
+    }
+}

+ 21 - 0
nlp/src/main/java/org/diagbot/nlp/similar/SimilarUtil.java

@@ -0,0 +1,21 @@
+package org.diagbot.nlp.similar;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/10/16 15:59
+ */
+public class SimilarUtil {
+
+    public static List<String> getSimilarList(String inputWord) {
+        Map<String, List<String>> similarDictMap = SimilarCacheUtil.getSimilar_dict_map();
+        if (similarDictMap.get(inputWord) != null && similarDictMap.get(inputWord).size() > 0){
+            return similarDictMap.get(inputWord);
+        }
+        return new ArrayList<>();
+    }
+}

+ 11 - 2
nlp/src/main/java/org/diagbot/nlp/util/NegativeEnum.java

@@ -12,8 +12,8 @@ public enum NegativeEnum {
     SYMPTOM_PERFORMANCE("26"), NUMBER_QUANTIFIER("27"), DIGITS("28"),
     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"),
-    RETURN_VISIT("68"), DIAG_STAND("70");
+    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");
     private String value;
 
     NegativeEnum(String value) {
@@ -156,6 +156,15 @@ public enum NegativeEnum {
             case "54":
                 negativeEnum = NegativeEnum.MEDICINE_PRD;
                 break;
+            case "55":
+                negativeEnum = NegativeEnum.PAST_DESC;
+                break;
+            case "62":
+                negativeEnum = NegativeEnum.MARRIED_DESC;
+                break;
+            case "65":
+                negativeEnum = NegativeEnum.ALLERGY;
+                break;
             case "68":
                 negativeEnum = NegativeEnum.RETURN_VISIT;
                 break;

+ 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())) {

文件差異過大導致無法顯示
+ 57738 - 0
nlp/src/main/resources/bigdata_similar.dict


+ 110 - 0
nlp/src/test/java/org/diagbot/nlp/test/Similar2DBTest.java

@@ -0,0 +1,110 @@
+package org.diagbot.nlp.test;
+
+import org.diagbot.nlp.similar.SimilarUtil;
+import org.diagbot.pub.jdbc.MysqlJdbc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/10/16 10:11
+ */
+public class Similar2DBTest {
+    private String user = "root";
+    private String password = "diagbot@20180822";
+    private String url = "jdbc:mysql://192.168.2.235:3306/med-s?useUnicode=true&characterEncoding=UTF-8";
+
+    public static void main(String[] args) {
+//        String fileName = "D:/大数据小组/相似度知识库.txt";
+//        Similar2DBTest similar2DBTest = new Similar2DBTest();
+//        Map<String, Set<String>> similarFile = similar2DBTest.readSimilarFile(fileName);
+//        similar2DBTest.write2DB(similarFile);
+        List<String> similarList = SimilarUtil.getSimilarList("表情淡漠");
+        System.out.println(similarList);
+        similarList = SimilarUtil.getSimilarList("右侧乳房");
+        System.out.println(similarList);
+//        SimilarCacheFileManager similarCacheFileManager = new SimilarCacheFileManager();
+//        String resourcePath = similarCacheFileManager.getResourcePath();
+//        System.out.println(resourcePath);
+
+    }
+
+    public Map<String, Set<String>> readSimilarFile(String fileName) {
+        BufferedReader reader = null;
+        Map<String, Set<String>> similarMap = new HashMap<>();
+        Set<String> similarSet = null;
+        try {
+            reader = new BufferedReader(new FileReader(new File(fileName)));
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                line = line.replaceAll("\'|]|\\[", "");
+                String[] words = line.split(",");
+                if (similarMap.get(words[0]) == null) {
+                    similarSet = new HashSet<>();
+                    similarSet.add(words[1]);
+                    similarMap.put(words[0], similarSet);
+                } else {
+                    similarMap.get(words[0]).add(words[1]);
+                }
+                //                System.out.println(line);
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                reader.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return similarMap;
+    }
+
+    public void write2DB(Map<String, Set<String>> similarMap) {
+        MysqlJdbc jdbc = new MysqlJdbc(user, password, url);
+        Connection conn = jdbc.connect();
+        PreparedStatement pst = null;
+        String sql = "INSERT INTO doc_similar(similar_1,similar_2) VALUES(?,?)";
+        try {
+            pst = conn.prepareStatement(sql);
+
+            String similar1 = "";
+            int i = 1;
+            for (Map.Entry<String, Set<String>> similarFileMap : similarMap.entrySet()) {
+                //            System.out.println(similarFileMap.getKey());
+                similar1 = similarFileMap.getKey();
+                pst.setString(1, similar1);
+                for (String similar2 : similarFileMap.getValue()) {
+                    pst.setString(2, similar2);
+                    System.out.println(i++);
+                    pst.addBatch();
+                    pst.executeBatch();
+                }
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                pst.close();
+                conn.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

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

@@ -153,9 +153,13 @@ public class AlgorithmController extends BaseController {
 //        searchData.setLength(6);    //模型推送最多6个比较合理
         AlgorithmCore core = new AlgorithmCore();
         ResponseData bigDataResponseData = core.algorithm(request, searchData, responseData);
+        bigDataResponseData.setVitals(new ArrayList<>());
+        bigDataResponseData.setLabs(new ArrayList<>());
+        bigDataResponseData.setPacs(new ArrayList<>());
 
         GraphCalculate graphCalculate = new GraphCalculate();
-        ResponseData graphResponseData = graphCalculate.calculate(request, searchData);
+        Map<String, List<CrisisDetail>> crisisDetails = responseData.getCrisisDetails();
+        ResponseData graphResponseData = graphCalculate.calculate(request, searchData,crisisDetails);
         if (graphResponseData.getDis().size() > 0) {
             List<FeatureRate> disFeatureRates = new ArrayList<>();
             List<FeatureRate> bigdis = bigDataResponseData.getDis();
@@ -183,7 +187,6 @@ public class AlgorithmController extends BaseController {
         bigDataResponseData.setTreat(graphResponseData.getTreat());
 
         //量表和指标推送
-        Map<String, List<CrisisDetail>> crisisDetails = responseData.getCrisisDetails();
         List<MedicalIndication> crisisDetailsList = this.getCrisisDetails(crisisDetails);
         List<MedicalIndication> medicalIndications = graphResponseData.getMedicalIndications();
         if (medicalIndications == null) {
@@ -410,7 +413,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;
     }

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

@@ -400,13 +400,13 @@
             $('#diag_list').html("");
             $('#before_combine_diag_list').html("");
             startDiag('/algorithm/page_neural', '#symptom_list', '1', resourceType, '111', '1');
-            startDiag('/algorithm/page_neural', '#vital_list', '3,2,7', resourceType, '131', '3');
+            startDiag('/algorithm/page_neural', '#vital_list', '3,2,7,42', resourceType, '131', '3');
             startDiag('/algorithm/page_neural', '#lis_list', '4,2,7', resourceType, '141', '4');
             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', resourceType, '31', '3');
+            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');
 

+ 70 - 20
rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

@@ -8,7 +8,9 @@ import org.diagbot.common.push.cache.ApplicationCacheUtil;
 import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -21,6 +23,7 @@ public class CrisisApplication {
 
     public Map<String, List<CrisisDetail>> crisisContent(SearchData searchData) {
         Map<String, List<Rule>> rules = searchData.getRules();
+        List<String> ruleTypeIdList = new ArrayList<>();
         if (rules == null) {
             return new HashMap<String, List<CrisisDetail>>();
         }
@@ -28,36 +31,73 @@ public class CrisisApplication {
 
         Map<String, List<CrisisDetail>> crisisMap = new HashMap<>();
         List<CrisisDetail> crisisList = null;
+        if (!StringUtils.isEmpty(searchData.getRuleType())) {
+            ruleTypeIdList = Arrays.asList(searchData.getRuleType().split(","));
+        }
         for (Map.Entry<String, RuleApp> app : ruleApps.entrySet()) {
-            if (StringUtils.isEmpty(app.getValue().getRuleIds())) {
+            if (StringUtils.isEmpty(app.getValue().getRuleIds()) || StringUtils.isEmpty(app.getValue().getTypeId())) {
+                continue;
+            }
+            if (!ruleTypeIdList.contains(app.getValue().getTypeId())) {
                 continue;
             }
-            String[] ruleIds = app.getValue().getRuleIds().split(",");
-            String standardText = "", originText = "";
-            boolean allRuleIdsSuit = true;
-            for (String ruleId : ruleIds) {
-                boolean isFindRule = false;
-                for (Map.Entry<String, List<Rule>> suitRules : rules.entrySet()) {
-                    for (Rule suitRule : suitRules.getValue()) {
-                        if (ruleId.equals(suitRule.getId())) {
-                            isFindRule = true;
-                            standardText += suitRule.getPub_name() + ";";
-                            originText += suitRule.getOriginText() + ";";
-                            break;
+            String appRemindVar = "";
+            String appOriginText = "";
+            boolean hasAppSuit = false;
+            String[] fieldRuleIds = app.getValue().getRuleIds().split("\\^");
+            for (String fieldRuleId : fieldRuleIds) {
+                String[] ruleIds = fieldRuleId.split(",");
+                String standardText = "", originText = "", remind = "";;
+                boolean allRuleIdsSuit = true;
+                for (String ruleId : ruleIds) {
+                    boolean isFindRule = false;
+                    for (Map.Entry<String, List<Rule>> suitRules : rules.entrySet()) {
+                        for (Rule suitRule : suitRules.getValue()) {
+                            if (ruleId.equals(suitRule.getId())) {
+                                isFindRule = true;
+                                standardText += suitRule.getPub_name() + ";";
+                                if (StringUtils.isEmpty(remind)) {
+                                    remind = suitRule.getRemind();
+                                } else if (!StringUtils.isEmpty(remind) && !StringUtils.isEmpty(suitRule.getRemind())) {
+                                    remind = remind + "," + suitRule.getRemind();
+                                }
+
+                                if (StringUtils.isEmpty(originText)) {
+                                    originText = suitRule.getOriginText();
+                                } else if (!StringUtils.isEmpty(originText) && !StringUtils.isEmpty(suitRule.getOriginText())) {
+                                    originText = originText + ";" + suitRule.getOriginText();
+                                }
+                                break;
+                            }
                         }
                     }
+                    if (!isFindRule) {
+                        allRuleIdsSuit = false;
+                        break;
+                    }
                 }
-                if (!isFindRule) {
-                    allRuleIdsSuit = false;
-                    break;
+                if (allRuleIdsSuit) {
+                    if (StringUtils.isEmpty(appRemindVar)) {
+                        appRemindVar = remind;
+                    } else {
+                        appRemindVar = appRemindVar + "," + remind;
+                    }
+                    if (StringUtils.isEmpty(appOriginText)) {
+                        appOriginText = originText;
+                    } else {
+                        appOriginText = appOriginText + "," + originText;
+                    }
+
+                    hasAppSuit = true;
                 }
             }
             //所有规则都满足
-            if (allRuleIdsSuit) {
+            if (hasAppSuit) {
                 CrisisDetail crisisDetail = new CrisisDetail();
-                crisisDetail.setOriginText(originText);
-                crisisDetail.setStandardText(standardText);
-                crisisDetail.setRemindText(app.getValue().getRemind());
+                crisisDetail.setOriginText(appOriginText);
+//                crisisDetail.setStandardText(standardText);
+                crisisDetail.setRemindText(app.getValue().getRemind().replace("${remind}", appRemindVar));
+                crisisDetail.setTypeId(app.getValue().getTypeId());
 
                 crisisList = crisisMap.get(key);
                 if (crisisList == null) {
@@ -70,6 +110,7 @@ public class CrisisApplication {
                     }
                 }
                 if (!isHave) {
+                    System.out.println("remind_text:" + crisisDetail.getRemindText());
                     crisisList.add(crisisDetail);
                 }
                 crisisMap.put(key, crisisList);
@@ -78,6 +119,15 @@ public class CrisisApplication {
         return crisisMap;
     }
 
+    private List<String> getAllRuleId(Map<String, RuleApp> ruleApps) {
+        Set<String> typeIdSet = new HashSet<>();
+        for (Map.Entry<String, RuleApp> ruleAppEntry : ruleApps.entrySet()) {
+            typeIdSet.add(ruleAppEntry.getValue().getTypeId());
+        }
+        List<String> allTypeIdList = new ArrayList<>(typeIdSet);
+        return allTypeIdList;
+    }
+
     private String mergeStandardText(Rule rule) {
         //标准值最优先匹配
         StringBuffer sb = new StringBuffer();