Kaynağa Gözat

Merge branch 'push-dev' of http://192.168.2.236:10080/louhr/push into push-dev

louhr 5 yıl önce
ebeveyn
işleme
47f5397686
20 değiştirilmiş dosya ile 2151 ekleme ve 558 silme
  1. 61 29
      bigdata-web/src/test/java/org/diagbot/Rule2AppTest.java
  2. 18 8
      common-push/src/main/java/org/diagbot/common/push/bean/ResponseData.java
  3. 31 4
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Filnlly.java
  4. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/MeditionDetail.java
  5. 27 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Treat.java
  6. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatCate.java
  7. 24 0
      common-push/src/main/java/org/diagbot/common/push/bean/neo4j/TreatDetail.java
  8. 5 2
      graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java
  9. 3 3
      graph-web/src/main/java/org/diagbot/graphWeb/work/DiseaseCalculate.java
  10. 147 76
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  11. 766 416
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  12. 888 0
      graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java
  13. 31 3
      graph/src/main/resources/bolt.properties
  14. 41 0
      graph/src/main/resources/pushTreat.properties
  15. 8 5
      graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java
  16. 40 6
      nlp/src/main/java/org/diagbot/nlp/rule/pretreat/PretreatmentVital.java
  17. 6 0
      nlp/src/main/java/org/diagbot/nlp/util/NlpUtil.java
  18. 3 3
      push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java
  19. 4 2
      push-web/src/main/java/org/diagbot/push/controller/GraphController.java
  20. 0 1
      rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

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

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

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

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

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

+ 147 - 76
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);
@@ -47,30 +55,26 @@ public class GraphCalculate {
         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);
+        //从大数据解析分词
+        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 +86,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 +143,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 +175,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 +251,43 @@ 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){
+        List<String> exculdDiagFilds = new ArrayList<>();
+        if(inputs != null && inputs.size()>0){
+            String fildName ="";
+            for (Map.Entry<String, Map<String, String>> fild:inputs.entrySet()) {
+                fildName = fild.getKey();
+                Map<String, String> value = fild.getValue();
+                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);
+                    }
+                }
+            }
+        }
+        return exculdDiagFilds;
+    }
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 766 - 416
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java


+ 888 - 0
graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java

@@ -0,0 +1,888 @@
+package org.diagbot.graph.medicationProcess;
+
+import org.diagbot.common.push.bean.CrisisDetail;
+import org.diagbot.common.push.bean.neo4j.*;
+import org.diagbot.pub.utils.PropertiesUtil;
+import org.neo4j.driver.v1.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+/**
+ * 治疗方案的推送
+ */
+public class PushTreat {
+    Logger logger = LoggerFactory.getLogger(PushTreat.class);
+    PropertiesUtil propertiesUtil_treat = new PropertiesUtil("pushTreat.properties");
+    PropertiesUtil propertiesUtil = new PropertiesUtil("bolt.properties");
+
+    /**
+     *
+     * @param disName 主诊断
+     * @param diseaseType 慢病为1
+     * @param driver
+     * @param keys 大数据的分词
+     * @param crisisDetails 规则返回结果
+     * @return
+     */
+    public Treat processTreat(String disName,String webDiag,Integer diseaseType,Driver driver,String[] keys,List<String> exculdDiagFilds,Map<String, List<CrisisDetail>> crisisDetails){
+        Treat treat =new Treat();
+
+        // TODO: 2019/11/20
+        //主诊断下的不良反应
+        Map<String, List<String>> disUE = this.getDisUE(disName, diseaseType, driver);
+        //根据分词推出的不良反应
+        Map<String, String> ueSet = this.getUe(keys, driver);//肾功能不全:可能有
+        //显示不良反应
+        if(diseaseType != null && 1 == diseaseType){
+            List<Indicators> indicators = sideEffect(disName, disUE, ueSet, crisisDetails);
+            treat.setAdverseEvent(indicators);
+        }
+
+        // TODO: 2019/11/20
+        //具体用药
+        List<TreatDetail> treatmentPlan = this.getTreatmentPlan(disName,webDiag, keys,exculdDiagFilds, crisisDetails,ueSet,driver);
+        treat.setTreatmentPlan(treatmentPlan);
+
+
+        return treat;
+    }
+
+    /**
+     * @param webDiag 界面下的诊断
+     * @param
+     * @param inputList 分词
+     * @param crisisDetails 规则结果
+     * @return
+     */
+    private List<TreatDetail> getTreatmentPlan(String disName,String webDiag,String[] inputList,List<String> exculdDiagFilds,Map<String, List<CrisisDetail>> crisisDetails, Map<String, String> ueSet,Driver driver){
+        List<TreatDetail> treatmentPlanList = new ArrayList<>();
+        //获取全部字段
+        List<String> allFilds = this.getAllFilds(webDiag, crisisDetails, inputList, ueSet);
+
+        // TODO: 2019/11/19     匹配规则用药,判断是否满足规则
+        List<TreatDetail> treatDetailList_rule = this.ruleMedicaton(disName, webDiag, allFilds, driver);
+        String name = treatDetailList_rule.get(0).getTitle().substring(0, treatDetailList_rule.get(0).getTitle().indexOf("治疗方案"));
+        if(treatDetailList_rule.size() == 1 && disName.equals(name)){
+            // TODO: 2019/11/28  匹配主症+其他+其他
+//            List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
+//            treatmentPlanList = treatmentPlanList_otherrule;
+
+        }else if(treatDetailList_rule.size() == 1 && !disName.equals(name)){
+            treatmentPlanList =treatDetailList_rule;
+        }else {
+            treatmentPlanList = treatDetailList_rule;
+        }
+        // TODO: 2019/11/28  匹配主症+其他+其他
+        List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
+        treatmentPlanList.addAll(treatmentPlanList_otherrule);
+        // TODO: 2019/11/19     规则不满足的情况下,返回主诊断的用药情况
+        if(treatmentPlanList.size() == 0){
+            treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
+        }
+        // TODO: 2019/11/21 处理合并症 例如高热
+        List<TreatDetail> treatDetailList = this.complicationMedicaton(inputList, driver, allFilds);
+        treatmentPlanList.addAll(treatDetailList);
+
+        return treatmentPlanList;
+    }
+
+    private List<TreatDetail> complicationMedicaton(String[] inputList,Driver driver,List<String> allFilds){
+        List<TreatDetail> disTreatDetailList = new ArrayList<>();
+        Map<String,Integer> conditionDesign = new HashMap<>();
+        Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String, String> medicaton_ji = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Set<String> disSet = new HashSet<>();
+        List<String> filds = new ArrayList<>();
+        if(inputList.length>0){
+            for (String fild:inputList) {
+                String s = "\'" + fild.trim() + "\'";
+                if(filds.indexOf(s)<0){
+                    filds.add(s);
+                }
+            }
+        }
+        Session  session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",filds.toString());
+                logger.info("规则用药,查询语句为:\n" + query);
+                StatementResult result = tx.run(query);
+                while (result.hasNext()) {
+                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                }
+                return 1;
+            }
+        });
+        closeSession(session);
+        disTreatDetailList = this.processMedication_he(disDrugs, conditionDesign, allFilds, driver);
+
+        return disTreatDetailList;
+    }
+    /**
+     * 规则不匹配返回主诊断用药
+     * @param disName 主诊断
+     * @param allFilds 其他条件
+     * @param driver
+     * @return
+     */
+    private List<TreatDetail> ordinaryMedicaton(String disName,List<String> allFilds,Driver driver){
+        List<TreatDetail> disTreatDetailList = new ArrayList<>();
+
+        List<Drugs> dList = new ArrayList<>();
+        Map<String, String> medicaton_ji = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new HashMap<>();
+
+        Session session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                String query = propertiesUtil_treat.getProperty("searchMedication").replace("disName", "\'" + disName + "\'").replace("filds", allFilds.toString());
+                logger.info("规则通过类找药:\n" + query);
+                StatementResult result  = tx.run(query);
+                while (result.hasNext()) {
+                    Record record = result.next();
+                    searchAllMedication(record, medicatonMap, medicaton_ji);
+                }
+                medicationList(medicatonMap, medicaton_ji, dList);
+                return 1;
+            }
+        });
+        closeSession(session);
+
+        TreatDetail treatDetail = new TreatDetail();
+        List<MeditionDetail> mList = new ArrayList<>();
+        MeditionDetail meditionDetail = new MeditionDetail();
+        meditionDetail.setDescription("");
+        meditionDetail.setTreatment(dList);
+        mList.add(meditionDetail);
+
+        treatDetail.setTitle(disName+"治疗方案");
+        treatDetail.setMeditionDetails(mList);
+        disTreatDetailList.add(treatDetail);
+        return disTreatDetailList;
+    }
+    //匹配规则,主症+其他+其他
+    private List<TreatDetail> otherRuleMedicaton(String disName,List<String> excludeDiagFilds,List<String> allFilds,Driver driver){
+        Map<String,Integer> conditionDesign = new HashMap<>();
+        Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Set<String> disSet = new HashSet<>();
+        excludeDiagFilds.add("'"+disName+"'");
+        Session  session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",excludeDiagFilds.toString());
+                logger.info("规则用药,查询语句为:\n" + query);
+                StatementResult result = tx.run(query);
+                while (result.hasNext()) {
+                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                }
+                return 1;
+            }
+        });
+        closeSession(session);
+        List<TreatDetail> treatDetailList =new ArrayList<>();
+//        if(!disSet.contains(disName)){
+//            //规则不匹配,返回主诊断治疗方案
+//            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
+//        }else {
+            treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
+
+//        }
+
+        return treatDetailList;
+    }
+
+    //匹配规则,推荐用药
+    private List<TreatDetail> ruleMedicaton(String disName,String webDiag,List<String> allFilds,Driver driver){
+        Map<String,Integer> conditionDesign = new HashMap<>();
+        Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Set<String> disSet = new HashSet<>();
+        List<String> webDiagList = processWebDiag(disName,webDiag);
+        Session  session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",webDiagList.toString());
+//                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",allFilds.toString());
+                logger.info("规则用药,查询语句为:\n" + query);
+                StatementResult result = tx.run(query);
+                while (result.hasNext()) {
+                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                }
+                return 1;
+            }
+        });
+        closeSession(session);
+        List<TreatDetail> treatDetailList =new ArrayList<>();
+        if(!disSet.contains(disName)){
+            //规则不匹配,返回主诊断治疗方案
+            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
+        }else {
+            treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+
+        }
+
+        return treatDetailList;
+    }
+
+    private void searchDrugs(StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
+        List<String> collection =null;
+        int i=0;
+        Record next = result.next();
+        String name = next.get("name").toString().replace("\"", "");
+        int design = next.get("design").asInt();
+        String p = next.get("p").toString();
+        String category = next.get("category").toString().replace("\"","");
+        String disName = next.get("disName").toString().replace("\"","");
+        disSet.add(disName);
+        if(design >= i){
+            i = design;
+            collection = (List) next.get("collection").asList();
+        }
+        conditionDesign.put(name,i);
+        if(!disDrugs.containsKey(name)){
+            Map<String, Object> designHashMap = new HashMap<>();
+            List<String> pList = new ArrayList<>();
+            List<String> cateList = new ArrayList<>();
+            List<String> disList = new ArrayList<>();
+            List<Object> collList = new ArrayList<>();
+            pList.add(p);
+            designHashMap.put("p",pList);
+            cateList.add(category);
+            designHashMap.put("cate",cateList);
+            disList.add(disName);
+            designHashMap.put("dis",disList);
+            collList.add(collection);
+            designHashMap.put("coll",collList);
+            disDrugs.put(name,designHashMap);
+        }else {
+            Map<String, Object> objectMap = disDrugs.get(name);
+            List<String> p1 = (List<String>)objectMap.get("p");
+            p1.add(p);
+            objectMap.put("p",p1);
+            List<String> cate1 = (List<String>)objectMap.get("cate");
+            cate1.add(category);
+            objectMap.put("cate",cate1);
+            List<String> dis1 = (List<String>)objectMap.get("dis");
+            dis1.add(disName);
+            objectMap.put("dis",dis1);
+            List<Object> coll1 = (List<Object>)objectMap.get("coll");
+            coll1.add(collection);
+            objectMap.put("coll",coll1);
+            disDrugs.put(name,objectMap);
+        }
+    }
+    private List<TreatDetail> processMedication_he(Map<String,Map<String,Object>> disDrugs,Map<String,Integer> conditionDesign,List<String> allFilds,Driver driver){
+        List<TreatDetail> treatDetailList = new ArrayList<>();
+        Map<String,Set<String>> dis_Drugs =new HashMap<>();
+        if(disDrugs != null && disDrugs.size()>0){
+            for (Map.Entry<String,Map<String,Object>> ds:disDrugs.entrySet()) {
+                String key = ds.getKey();
+                Map<String, Object> values = ds.getValue();
+                List<String> cateList = (List<String>) values.get("cate");
+                List<String> disList = (List<String>)values.get("dis");
+                List<Object> collList = (List<Object>)values.get("coll");
+                if(cateList.contains("合并症")){
+                    List<Integer> indexList = same(cateList, "合并症");
+                    if(indexList.size()>0){
+                        for (Integer i:indexList) {
+                            String mainDis = disList.get(i);
+                            List<String> o = (List<String>)collList.get(i);
+                            List<String> yinhao = yinhao(o);
+                            if(dis_Drugs.containsKey(mainDis)){
+                                Set<String> strings = dis_Drugs.get(mainDis);
+                                strings.addAll(yinhao);
+                                dis_Drugs.put(mainDis,strings);
+                            }else {
+                                Set<String> strings = new HashSet<>();
+                                strings.addAll(yinhao);
+                                dis_Drugs.put(mainDis,strings);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if(dis_Drugs != null && dis_Drugs.size()>0){
+            for (Map.Entry<String,Set<String>> dd:dis_Drugs.entrySet()) {
+                TreatDetail treatDetail = new TreatDetail();
+                String mainDis = dd.getKey();
+                Set<String> drugs = dd.getValue();
+                //根据类找药
+                List<Drugs> drugsList = searchMedication(new ArrayList<>(drugs),allFilds,driver);
+                List<MeditionDetail> meditionDetails = new ArrayList<>();
+                MeditionDetail meditionDetail = new MeditionDetail();
+                meditionDetail.setDescription("");
+                meditionDetail.setTreatment(drugsList);
+                meditionDetails.add(meditionDetail);
+                treatDetail.setTitle(mainDis);
+                treatDetail.setMeditionDetails(meditionDetails);
+                treatDetailList.add(treatDetail);
+            }
+        }
+        return treatDetailList;
+    }
+    private List<TreatDetail> processMedication_otherrule(String disName,Map<String,Map<String,Object>> disDrugs,Map<String,Integer> conditionDesign,List<String> allFilds,Driver driver){
+        List<TreatDetail> treatDetailList = new ArrayList<>();
+
+        if(disDrugs != null && disDrugs.size()>0){
+            for (Map.Entry<String,Map<String,Object>> ds:disDrugs.entrySet()) {
+                String key = ds.getKey();
+                if(Arrays.asList(key.split("\\+")).contains(disName)){
+                    Map<String, Object> values = ds.getValue();
+                    List<String> cateList = (List<String>) values.get("cate");
+                    List<String> disList = (List<String>)values.get("dis");
+                    List<Object> collList = (List<Object>)values.get("coll");
+                    if(cateList.size()==1 && cateList.contains("主症")){
+
+                        TreatDetail treatDetail = new TreatDetail();
+                        List<MeditionDetail> meditionDetails = new ArrayList<>();
+                        int main = cateList.indexOf("主症");
+                        String mainDis = disList.get(main);
+                        treatDetail.setTitle(mainDis+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        Integer da = conditionDesign.get(key);
+                        String s = switchType(da);
+                        MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
+                        List<String> o = (List<String>)collList.get(main);
+                        List<String> yinhao = yinhao(o);
+                        //根据类找药
+                        List<Drugs> drugs = searchMedication(yinhao,allFilds,driver);
+                        meditionDetail_main.setDescription(s+":"+String.join("、",o));//单药治疗:双胍类
+                        meditionDetail_main.setTreatment(drugs);
+                        meditionDetails.add(meditionDetail_main);
+                        treatDetail.setMeditionDetails(meditionDetails);
+
+                        treatDetailList.add(treatDetail);
+                    }
+                }
+
+            }
+        }
+        return treatDetailList;
+    }
+    private List<TreatDetail> processMedication(String disName,Map<String,Map<String,Object>> disDrugs,Map<String,Integer> conditionDesign,List<String> allFilds,Driver driver){
+        List<TreatDetail> treatDetailList = new ArrayList<>();
+
+        if(disDrugs != null && disDrugs.size()>0){
+            for (Map.Entry<String,Map<String,Object>> ds:disDrugs.entrySet()) {
+                String key = ds.getKey();
+                if(Arrays.asList(key.split("\\+")).contains(disName)){
+                    Map<String, Object> values = ds.getValue();
+                    List<String> cateList = (List<String>) values.get("cate");
+                    List<String> disList = (List<String>)values.get("dis");
+                    List<Object> collList = (List<Object>)values.get("coll");
+                    if(cateList.contains("主症") && cateList.contains("并发症")){
+                        TreatDetail treatDetail = new TreatDetail();
+                        List<MeditionDetail> meditionDetails = new ArrayList<>();
+                        int main = cateList.indexOf("主症");
+                        String mainDis = disList.get(main);
+                        List<String> dds= new ArrayList<>();
+                        for(String s:disList){
+                            if(!s.equals(mainDis)){
+                                dds.add(s);
+                            }
+                        }
+                        treatDetail.setTitle(mainDis+"及其"+String.join("、",dds)+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        Integer da = conditionDesign.get(key);
+                        String s = switchType(da);
+                        MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
+                        List<String> o = (List<String>)collList.get(main);
+                        List<String> yinhao = yinhao(o);
+                        //根据类找药
+                        List<Drugs> drugs = searchMedication(yinhao,allFilds,driver);
+                        meditionDetail_main.setDescription(s+":"+String.join("、",o));//单药治疗:双胍类
+                        meditionDetail_main.setTreatment(drugs);
+                        meditionDetails.add(meditionDetail_main);
+
+                        //并发症用药
+                        for (String dis:dds) {
+                            MeditionDetail meditionDetail_bing = new MeditionDetail();//并发症的
+                            int i = disList.indexOf(dis);
+                            List<String> ol = (List<String>)collList.get(i);
+                            List<String> yinhaol = yinhao(ol);
+                            List<Drugs> drugs1 = searchMedication(yinhaol,allFilds,driver);
+                            meditionDetail_bing.setDescription(dis);//单药治疗:双胍类
+                            meditionDetail_bing.setTreatment(drugs1);
+                            meditionDetails.add(meditionDetail_bing);
+                        }
+
+                        treatDetail.setMeditionDetails(meditionDetails);
+
+                        treatDetailList.add(treatDetail);
+
+                    }
+                    if(cateList.size()==1 && cateList.contains("主症")){
+
+                        TreatDetail treatDetail = new TreatDetail();
+                        List<MeditionDetail> meditionDetails = new ArrayList<>();
+                        int main = cateList.indexOf("主症");
+                        String mainDis = disList.get(main);
+                        treatDetail.setTitle(mainDis+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        Integer da = conditionDesign.get(key);
+                        String s = switchType(da);
+                        MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
+                        List<String> o = (List<String>)collList.get(main);
+                        List<String> yinhao = yinhao(o);
+                        //根据类找药
+                        List<Drugs> drugs = searchMedication(yinhao,allFilds,driver);
+                        meditionDetail_main.setDescription(s+":"+String.join("、",o));//单药治疗:双胍类
+                        meditionDetail_main.setTreatment(drugs);
+                        meditionDetails.add(meditionDetail_main);
+                        treatDetail.setMeditionDetails(meditionDetails);
+
+                        treatDetailList.add(treatDetail);
+                    }
+                }
+
+            }
+        }
+        return treatDetailList;
+    }
+    private List<Drugs> searchMedication(List<String> drugs,List<String> allFilds,Driver driver){
+        List<Drugs> dList = new ArrayList<>();
+        Map<String, String> medicaton_ji = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new HashMap<>();
+
+        Session session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                String query = propertiesUtil_treat.getProperty("searchMedication_rule").replace("drugs",drugs.toString()).replace("filds",allFilds.toString());
+                logger.info("规则通过类找药:\n" + query);
+                StatementResult result  = tx.run(query);
+                while (result.hasNext()) {
+                    Record record = result.next();
+                    searchAllMedication(record, medicatonMap, medicaton_ji);
+                }
+                medicationList(medicatonMap, medicaton_ji, dList);
+                return 1;
+            }
+        });
+        closeSession(session);
+        return dList;
+    }
+
+    private void medicationList(Map<String, List<String>> medicatonMap, Map<String, String> medicaton_ji, List<Drugs> dList) {
+        if (medicatonMap != null && medicatonMap.size() > 0) {
+            for (Map.Entry<String, List<String>> fd : medicatonMap.entrySet()) {
+                int i = 0;
+                String big = "", sub = "";
+                String big_sub = fd.getKey();//大小类
+                List<String> medications = fd.getValue();//药的集合
+                String[] splits = big_sub.split("\\$");
+                Drugs drugs = new Drugs();
+                if (splits[0].equals(splits[1])) {
+                    sub = "";
+                    big = splits[0];
+                    sub = splits[0];
+                } else {
+                    big = splits[0];
+                    sub = splits[1];
+                }
+                LinkedList<Medicition> mes = new LinkedList<>();
+                if (medications != null && medications.size() > 0) {
+                    for (String m : medications) {
+                        Medicition medicition = new Medicition();
+                        medicition.setMedicitionName(m);
+                        if (medicaton_ji.containsKey(m)) {
+                            String s = medicaton_ji.get(m);
+                            if (s.equals("忌用")) {
+                                medicition.setForbidden(2);
+                            } else {
+                                medicition.setForbidden(1);
+                            }
+                        } else {
+                            medicition.setForbidden(0);
+                        }
+                        if (i < 3) {
+                            medicition.setIsShow(1);
+                            i++;
+                        } else {
+                            medicition.setIsShow(0);
+                        }
+                        mes.add(medicition);
+                    }
+                }
+                drugs.setBigdrugsName(big);
+                drugs.setSubdrugsName(sub);
+                drugs.setDrugsForbidden(0);
+                drugs.setMedicitionsList(mes);
+                dList.add(drugs);
+            }
+        }
+    }
+
+    private void searchAllMedication(Record record, Map<String, List<String>> medicatonMap, Map<String, String> medicaton_ji) {
+        String big = record.get("big").toString().replace("\"", "");
+        String sub = record.get("sub").toString().replace("\"", "");
+        String med = record.get("med").toString().replace("\"", "");
+        String ty = record.get("ty").toString().replace("\"", "");
+        if ("NULL".equals(ty)) {
+            if (medicatonMap.containsKey(big + "$" + sub)) {
+                List<String> ml = medicatonMap.get(big + "$" + sub);
+                ml.add(med);
+                medicatonMap.put(big + "$" + sub, ml);
+            } else {
+                List<String> ml = new ArrayList<>();
+                ml.add(med);
+                medicatonMap.put(big + "$" + sub, ml);
+            }
+        } else {
+            if (medicaton_ji.containsKey(med)) {
+                if (medicaton_ji.get(med).equals("慎用") && ty.equals("忌用")) {
+                    medicaton_ji.put(med, "忌用");
+                }
+            } else {
+                medicaton_ji.put(med, ty);
+            }
+        }
+    }
+
+    //查找主诊断
+    private String mainDisease(String disName,Driver driver){
+        String main_dis = "";
+        List<String> disArray = new ArrayList<>();
+        Session session = null;
+        session = driver.session(AccessMode.WRITE);
+        session.writeTransaction(new TransactionWork<Integer>() {
+            @Override
+            public Integer execute(Transaction tx) {
+                StatementResult result = null;
+                String query = propertiesUtil_treat.getProperty("mainDis").replace("disName",disName);
+                logger.info("判断主诊断,查询语句为:\n" + query);
+                result = tx.run(query);
+                while (result.hasNext()) {
+                    Record next = result.next();
+                    Integer sign = next.get("sign").asInt();//1:并发症 2:主诊断
+                    Integer ksign = next.get("ksign").asInt();
+                    String kname = next.get("kname").toString().replace("\"", "");
+                    if(0 == sign){
+                        disArray.add(disName);
+                    }else {
+                        disArray.add(kname);
+                    }
+                }
+                disArray.add(disName);
+                return 1;
+            }
+        });
+        closeSession(session);
+        main_dis = disArray.size()>0 ? disArray.get(disArray.size()-1):"";
+        return  main_dis;
+    }
+
+    private List<String> getAllFilds(String webDiag,Map<String, List<CrisisDetail>> crisisDetails,String[] inputList,Map<String, String> ueSet){
+        List<String> filds = new ArrayList<>();
+        Map<String, String> details = this.processCrisisDetails(crisisDetails, "6");
+        String[] diseaseArray = webDiag.split(",|,|、|;|:|;");
+        for(int i=0;i<diseaseArray.length;i++){
+            filds.add("\'"+diseaseArray[i]+"\'");
+        }
+        if(inputList.length>0){
+            for (String fild:inputList) {
+                filds.add("\'"+fild.trim()+"\'");
+            }
+        }
+        if(details != null && details.size() >0){
+            for (Map.Entry<String,String> de:details.entrySet()) {
+                filds.add("\'"+de.getValue().trim()+de.getKey().trim()+"\'");
+            }
+        }
+        if(ueSet != null && ueSet.size()>0){
+            for(Map.Entry<String, String> sd:ueSet.entrySet()){
+                filds.add("\'"+sd.getKey().trim()+"\'");
+            }
+        }
+
+        return filds;
+    }
+    private List<String> getAllFilds(String[] inputList){
+        List<String> filds = new ArrayList<>();
+        if(inputList.length>0){
+            for (String fild:inputList) {
+                filds.add("\'"+fild.trim()+"\'");
+            }
+        }
+        return filds;
+    }
+
+
+    //不良反应set
+    private List<Indicators> sideEffect(String diseaseName, Map<String, List<String>> disUE, Map<String, String> ueSet, Map<String, List<CrisisDetail>> crisisDetails) {
+        List<Indicators> indicatorsList =null;
+        List<String> stringList = disUE.get(diseaseName);
+        logger.info(diseaseName + "下面有" + stringList + "不良反应");
+        if (stringList != null && stringList.size() > 0) {
+            indicatorsList = new ArrayList<>();
+            for (String de : stringList) {
+                Indicators indicators = getAdverse(ueSet, de,crisisDetails);
+                indicatorsList.add(indicators);
+            }
+        }
+        return indicatorsList;
+    }
+
+    /**
+     * 组装不良反应
+     * @param dis
+     * @param name
+     * @param crisisDetails
+     * @return
+     */
+    private Indicators getAdverse(Map<String,String> dis, String name,Map<String, List<CrisisDetail>> crisisDetails) {
+        Map<String, String> crisisDetailsMap = this.processCrisisDetails(crisisDetails,"6");
+        if(crisisDetailsMap != null && dis != null){
+            for (Map.Entry<String,String> d:dis.entrySet()
+                    ) {
+                if(!crisisDetailsMap.containsKey(d.getKey())){
+                    crisisDetailsMap.put(d.getKey(),d.getValue());
+                }
+            }
+        }
+        String[] item={"无","可能有","轻度","中度","重度"};
+        Indicators indicators = new Indicators();
+        indicators.setName(name);
+        indicators.setControlType(2);
+        List<Detail> detailList1 = new ArrayList<>();
+        for (String it:item) {
+            int value = 0;
+            Detail detail = new Detail();
+            detail.setName(it);
+            if(crisisDetailsMap != null && crisisDetailsMap.size()>0){
+                if(crisisDetailsMap.containsKey(name) ){
+                    if(it.equals(crisisDetailsMap.get(name))){
+                        value = 1;
+                        detail.setValue(value);
+                    }else {
+                        detail.setValue(value);
+                    }
+                }else {
+                    detail.setValue(value);
+                }
+            }else {
+                detail.setValue(value);
+            }
+            detailList1.add(detail);
+        }
+        indicators.setDetails(detailList1);
+        return indicators;
+    }
+    /**
+     * 处理风险因素评估或不良反应
+     * @param crisisDetails
+     * @return
+     */
+    public Map<String,String> processCrisisDetails(Map<String, List<CrisisDetail>> crisisDetails,String sign){
+        Map<String,String> crisisMap = new HashMap<>();
+        if(crisisDetails != null && crisisDetails.size()>0 ){
+            for (Map.Entry<String, List<CrisisDetail>>  crisis:crisisDetails.entrySet()
+                    ) {
+                List<CrisisDetail> value = crisis.getValue();
+                if(value!=null && value.size()>0){
+                    for (CrisisDetail crisisDetail:value) {
+                        String[] crisisSplits = crisisDetail.getRemindText().split(":");
+                        if(crisisMap.containsKey(crisisSplits[0])){
+                            if("轻度".equals(crisisMap.get(crisisSplits[0])) && ("重度".equals(crisisSplits[1])||"中度".equals(crisisSplits[1]) )){
+                                crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                            }
+                            if("中度".equals(crisisMap.get(crisisSplits[0])) && "重度".equals(crisisSplits[1])){
+                                crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                            }
+                        }else {
+                            crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                        }
+                        /*if(sign.equals(crisisDetail.getTypeId()) && !sign.equals("6")){
+                            crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                        }else if(sign.equals(crisisDetail.getTypeId()) && sign.equals("6")){//不良反应
+                            if(crisisMap.containsKey(crisisSplits[0])){
+                                if("轻度".equals(crisisMap.get(crisisSplits[0])) && ("重度".equals(crisisSplits[1])||"中度".equals(crisisSplits[1]) )){
+                                    crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                                }
+                                if("中度".equals(crisisMap.get(crisisSplits[0])) && "重度".equals(crisisSplits[1])){
+                                    crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                                }
+                            }else {
+                                crisisMap.put(crisisSplits[0],crisisSplits[1]);
+                            }
+                        }*/
+                    }
+                }
+            }
+        }
+        return crisisMap;
+    }
+
+
+    /**
+     * 只有主诊断才会有不良反应
+     * 查找主诊断的不良反应
+     * 获取每个慢病对应的不良反应
+     * @param disName 主诊断
+     * @param diseaseType 1为慢病
+     * @return 这个慢病对应的不良反应的组合
+     */
+    public Map<String, List<String>> getDisUE(String disName, Integer diseaseType,Driver driver) {
+        Map<String, List<String>> disUE = new HashMap<>();
+        if(diseaseType != null && 1 == diseaseType){
+            Session session = null;
+            session = driver.session(AccessMode.WRITE);
+            session.writeTransaction(new TransactionWork<Integer>() {
+                @Override
+                public Integer execute(Transaction tx) {
+                    StatementResult result = null;
+                    String query = propertiesUtil_treat.getProperty("disUe").replace("disName",disName);
+                    logger.info("根据页面诊断查询每个诊断所对应的不良反应集合,查询语句为:\n" + query);
+                    result = tx.run(query);
+                    while (result.hasNext()) {
+                        Record next = result.next();
+                        String dis = next.get("dis").toString().replace("\"", "");
+                        List<Object> stringList = next.get("ueCollect").asList();
+                        List<String> ueList = new ArrayList<>();
+                        for (Object o : stringList) {
+                            ueList.add(o.toString().replace("\"", ""));
+                        }
+                        disUE.put(dis, ueList);
+                    }
+                    return 1;
+                }
+            });
+            closeSession(session);
+        }
+        return disUE;
+    }
+
+    /**
+     * 不良反应推送
+     */
+    public Map<String,String> getUe(String[] keys,Driver driver) {
+        //查找不良反应推送
+        Map<String,String> indSet = new HashMap<>();
+        List<String> newList = new ArrayList<>();
+        List<String> fildList = new ArrayList<>();
+        List<String> startList = new ArrayList<>();
+        for (String fild : keys) {
+            fildList.add("\"" + fild.trim() + "\"");
+        }
+        logger.info("根据 " + fildList + " 这些词推送不良反应!!!");
+        Session session = null;
+        StatementResult result = null;
+        String query = "";
+        try {
+            session = driver.session(AccessMode.WRITE);
+            logger.info("session 为: " + session);
+            //第一步查询输入的词所在number
+            query = propertiesUtil.getProperty("searchNumColl").replace("startList", fildList.toString());
+            logger.info("查找词所在的number \n" + query);
+            result = session.run(query);
+            while (result.hasNext()) {
+                Record next = result.next();
+                String v = next.get("v").toString();
+                startList.add(v);
+            }
+            newList.addAll(startList);
+            int i = 1;
+            while (newList.size() > 0) {
+                query = propertiesUtil.getProperty("searchNewCondition").replace("newList", newList.toString()).replace("fildList", startList.toString());
+                logger.info("第" + i + "次查询conditon语句 \n" + query);
+                i++;
+                result = session.run(query);
+                newList.clear();
+                while (result.hasNext()) {
+                    Record record = result.next();
+                    String condition = record.get("condition").toString();
+                    newList.add(condition);
+                    startList.add(condition);
+                }
+            }
+            query = propertiesUtil.getProperty("searchUe").replace("fildList", startList.toString());
+            logger.info("查找界面输入是否有不良反应,处理语句为:\n" + query);
+            result = session.run(query);
+            while (result.hasNext()) {
+                Record record = result.next();
+                String indName = record.get("name").toString().replace("\"", "");
+                String tr = record.get("tr").toString().replace("\"", "");//类型
+                indSet.put(indName,tr);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            closeSession(session);
+            return indSet;
+        }
+    }
+    //单、双药、胰岛素药
+    private String switchType(int i) {
+        String type;
+        switch (i){
+            case 1:
+                type = "单药治疗";
+                break;
+            case 2:
+                type = "双药治疗";
+                break;
+            case 3:
+                type = "胰岛素治疗";
+                break;
+            default:type = null;
+        }
+        return type;
+    }
+
+    public void closeSession(Session session){
+        if(session != null){
+            session.close();
+        }
+
+    }
+
+    private List<String> yinhao(List<String> o){
+        List<String> yinhaoList = new ArrayList<>();
+        if(o != null && o.size()>0){
+            for (String sd:o
+                 ) {
+                yinhaoList.add("\'"+sd+"\'");
+            }
+        }
+        return yinhaoList;
+    }
+    private List<String> processWebDiag(String disName,String webdiag){
+        List<String> diagList = new ArrayList<>();
+        String[] diseaseArray = webdiag.split(",|,|、|;|:|;");
+        for(int i=0;i<diseaseArray.length;i++){
+            diagList.add("\'"+diseaseArray[i]+"\'");
+        }
+        disName = "\'"+disName+"\'";
+        if(!diagList.contains(disName)){
+            diagList.add(disName);
+        }
+        return diagList;
+    }
+    public  List<Integer> same(List<String> list,String input) {
+        Map<String, String> map = new HashMap<String, String>();
+        for (int i = 0; i < list.size(); i++) {
+            String key = list.get(i);
+            String old = map.get(key);
+            if (old != null) {
+                map.put(key, old + "," + (i + 1));
+            } else {
+                map.put(key, "" + (i + 1));
+            }
+        }
+        List<Integer> indexList = new ArrayList<Integer>();
+        try {
+            String s = map.get(input);
+            String[] split = s.split(",");
+            for (String ds:split) {
+                indexList.add(Integer.parseInt(ds)-1);
+            }
+        }catch (Exception e){
+
+        }
+        return indexList;
+    }
+}

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

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

@@ -0,0 +1,41 @@
+#\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,collect(t.name) as collection order by p
+#\u89C4\u5219\u627E\u836F
+searchMedication_rule=match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+with m,d \n \
+match(m:Medicine)-[r:\u5C5E\u4E8E]->(h:Drugs) where d.bigDrugs=h.name \n \
+with h,d,m \n \
+match(m)<-[R:\u614E\u7528|:\u5FCC\u7528]-(i) where i.name in filds \n \
+return h.name as big,d.name as sub,m.name as med,type(R) as ty \n \
+union \n \
+match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+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

+ 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("、");

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

@@ -10,10 +10,11 @@ import org.diagbot.nlp.util.NlpUtil;
 import java.util.List;
 
 public class PretreatmentVital extends Pretreatment {
-    protected NegativeEnum[] nees_vital_result = new NegativeEnum[]{NegativeEnum.VITAL_RESULT};
-    protected NegativeEnum[] nees_vital_index = new NegativeEnum[]{NegativeEnum.VITAL_INDEX};
+    protected NegativeEnum[] nees_vital_result = new NegativeEnum[] { NegativeEnum.VITAL_RESULT };
+    protected NegativeEnum[] nees_vital_index = new NegativeEnum[] { NegativeEnum.VITAL_INDEX };
+    protected NegativeEnum[] nees_digit = new NegativeEnum[] { NegativeEnum.DIGITS };
 
-    public List<PreResult> analyze(String content) throws java.io.IOException{
+    public List<PreResult> analyze(String content) throws java.io.IOException {
         List<PreResult> preResults = super.analyzeDefault(content);
         for (PreResult result : preResults) {
             result.setUniqueName("体征--" + result.getUniqueName());
@@ -27,12 +28,43 @@ public class PretreatmentVital extends Pretreatment {
                 result.setDetailName("体征--");
                 result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_RESULT));
                 preResults.add(result);
-            }else if (NlpUtil.isFeature(l.getProperty(), nees_vital_index)) {
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_vital_index)) {
                 PreResult result = new PreResult();
                 result.setUniqueName("体征--");
                 result.setDetailName("体征--");
                 result.setValue(NlpUtil.concept(l, NegativeEnum.VITAL_INDEX));
                 preResults.add(result);
+            } else if (NlpUtil.isFeature(l.getProperty(), nees_digit) && l.getText().contains("/")) {
+                int position = i + 1;
+                while (position < i + 4 && position < lexemes.size()) {
+                    if (!"mmHg".equals(lexemes.get(position).getText())) {
+                        position++;
+                        continue;
+                    }
+                    String[] digits = l.getText().split("/");
+                    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;
@@ -44,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++;

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

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

@@ -158,7 +158,8 @@ public class AlgorithmController extends BaseController {
         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();
@@ -186,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) {
@@ -413,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;
     }

+ 0 - 1
rule/src/main/java/org/diagbot/rule/crisis/CrisisApplication.java

@@ -22,7 +22,6 @@ public class CrisisApplication {
     private String key = "crisis";
 
     public Map<String, List<CrisisDetail>> crisisContent(SearchData searchData) {
-        searchData.setRuleType("1,2");
         Map<String, List<Rule>> rules = searchData.getRules();
         List<String> ruleTypeIdList = new ArrayList<>();
         if (rules == null) {