Jelajahi Sumber

Merge remote-tracking branch 'origin/push-dev-edite' into push-test

# Conflicts:
#	graph/src/main/resources/bolt.properties
kongwz 5 tahun lalu
induk
melakukan
f4b39d8f8e

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

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

+ 24 - 6
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -52,10 +52,13 @@ 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();
-        List<String> exculdDiagFilds = this.exculdDiagFilds(inputs);
+        List<String> exculdDiagFilds = this.exculdDiagFilds(inputs,webDiagList,diseaseName);
         //从大数据解析分词
         Set<String> ss = processParticiple(inputs);
         logger.info("从分词系统接收到的词 :" + ss);
@@ -68,9 +71,7 @@ public class GraphCalculate {
             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);
@@ -269,10 +270,11 @@ public class GraphCalculate {
         }
         return sc;
     }
-    private List<String> exculdDiagFilds(Map<String, Map<String, String>> inputs){
+    private List<String> exculdDiagFilds(Map<String, Map<String, String>> inputs,String[] webDiagList,String disName){
         List<String> exculdDiagFilds = new ArrayList<>();
+        String fildName ="";
         if(inputs != null && inputs.size()>0){
-            String fildName ="";
+
             for (Map.Entry<String, Map<String, String>> fild:inputs.entrySet()) {
                 fildName = fild.getKey();
                 Map<String, String> value = fild.getValue();
@@ -288,6 +290,22 @@ public class GraphCalculate {
                 }
             }
         }
+        try{
+            if(webDiagList!=null && webDiagList.length>0){
+                for (String wd:webDiagList) {
+                    if(wd != null && !disName.equals(wd)){
+                        fildName = "'"+wd+"'";
+                        if(!exculdDiagFilds.contains(fildName)){
+                            exculdDiagFilds.add(fildName);
+                        }
+                    }
+
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
         return exculdDiagFilds;
     }
 }

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

+ 317 - 54
graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java

@@ -62,25 +62,20 @@ public class PushTreat {
         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;
-        }
+        treatmentPlanList= this.ruleMedicaton(disName, webDiag, allFilds, driver);
+
         // TODO: 2019/11/28  匹配主症+其他+其他
         List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
         treatmentPlanList.addAll(treatmentPlanList_otherrule);
+
+        // TODO: 2019/12/4 合并规则,多个相同的治疗合并成一个
+        this.mergerRules(treatmentPlanList);
+
         // TODO: 2019/11/19     规则不满足的情况下,返回主诊断的用药情况
         if(treatmentPlanList.size() == 0){
             treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
         }
+
         // TODO: 2019/11/21 处理合并症 例如高热
         List<TreatDetail> treatDetailList = this.complicationMedicaton(inputList, driver, allFilds);
         treatmentPlanList.addAll(treatDetailList);
@@ -88,12 +83,213 @@ public class PushTreat {
         return treatmentPlanList;
     }
 
+    private void mergerRules(List<TreatDetail> treatmentPlanList) {
+        int i = 0;
+        Map<List<String>,LinkedHashMap<String,List<Drugs>>> fi = new HashMap<>();
+        Map<List<String>,LinkedHashMap<String,List<Drugs>>> fi_second = new HashMap<>();
+        if(treatmentPlanList.size()>0){
+            for (TreatDetail td:treatmentPlanList) {
+                List<String> disList = new ArrayList<>();
+                String title = td.getTitle();
+                String startTitle, subTitle = "";
+                if(title.contains("及其")){
+                    startTitle = title.substring(0,title.indexOf("及其"));
+                    subTitle = title.substring(startTitle.length()+2,title.length());
+                    subTitle = subTitle.substring(0,subTitle.indexOf("治疗方案"));
+                    disList.add(startTitle);
+                    disList.add(subTitle);
+                }else {
+                    startTitle = title.substring(0,title.indexOf("治疗方案"));
+                    disList.add(startTitle);
+                }
+                LinkedHashMap<String,List<Drugs>> kk = new LinkedHashMap<>();
+                List<MeditionDetail> meditionDetails = td.getMeditionDetails();
+                String description ="";
+                for (MeditionDetail m:meditionDetails) {
+                    description = m.getDescription();
+                    List<Drugs> treatment = m.getTreatment();
+                    kk.put(description,treatment);
+                }
+                if(fi.containsKey(disList)){
+                    LinkedHashMap<String, List<Drugs>> jj = fi.get(disList);
+                    Map.Entry<String, List<Drugs>> next = jj.entrySet().iterator().next();
+                    String key = next.getKey();
+                    String key1 = meditionDetails.get(0).getDescription();
+                    if(!key.equals(key1)){
+                        int type = getType(key.split(":")[0]);//原来的
+                        int type1 = getType(key1.split(":")[0]);//新来的
+                        if(type>type1){
+                            continue;
+                        }else if(type<type1){
+
+                        }
+
+                    }
+                }
+                fi.put(disList,kk);
+            }
+        }
+
+
+
+        if(fi.size()>0){
+            for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> d:fi.entrySet()) { //遍历原始的
+                List<String> key_dis = d.getKey(); // [糖尿病,糖尿病肾病]
+                String s = key_dis.get(0);//糖尿病
+                List<String> otherDis_1 = new ArrayList<>();
+                if(key_dis.size()>1){
+                    for(int j = 1;j<key_dis.size();j++){
+                        otherDis_1.add(key_dis.get(j));
+                    }
+                }
+                //otherDis_1为[糖尿病肾病]
+                LinkedHashMap<String, List<Drugs>> dValue = d.getValue();
+                //"单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂" -> " size = 5"
+                //"糖尿病肾病" -> " size = 1"
+                Map.Entry<String, List<Drugs>> first = dValue.entrySet().iterator().next();//"单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂" -> " size = 5"
+                String key_first = first.getKey();//单药治疗:双胍类、格列奈类、SGLT-2抑制剂、磺脲类、DDP-4抑制剂
+                if(fi_second.keySet().size() == 0){
+                    fi_second.put(key_dis,dValue);
+                }
+
+                for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> d_sec:fi_second.entrySet()) {
+                    List<String> key = d_sec.getKey();// [1型糖尿病,糖尿病肾病]
+                    LinkedHashMap<String, List<Drugs>> value = d_sec.getValue();
+                    Map.Entry<String, List<Drugs>> next = value.entrySet().iterator().next();
+                    String key_next = next.getKey();//"胰岛素治疗:中长效胰岛素、预混胰岛素"
+                    String s_next = key.get(0);//1型糖尿病
+                    List<String> otherDis = new ArrayList<>();
+                    if(key.size()>1){
+                        for(int j = 1;j<key.size();j++){
+                            otherDis.add(key.get(j));
+                        }
+                    }
+                    //otherDis为[糖尿病肾病]
+                    if(s_next.equals(s)){ //1型糖尿病 == 1型糖尿病
+                        if(key_first.equals(key_next)){ //"胰岛素治疗:中长效胰岛素、预混胰岛素" == "胰岛素治疗:中长效胰岛素、预混胰岛素"
+                            if(otherDis_1.size()>0){
+                                for (String dis:otherDis_1) {
+                                    if(!otherDis.contains(dis)){
+                                        otherDis.add(dis);
+                                        List<Drugs> drugsList = dValue.get(dis);
+                                        value.put(dis,drugsList);
+
+                                    }
+                                }
+                            }
+                            fi_second.remove(key);
+                            otherDis.add(0,s_next);
+                            fi_second.put(otherDis,value);
+
+                        }else {
+                            String[] split = key_first.split(":");
+                            String[] split1 = key_next.split(":");
+                            int type_first = getType(split[0]);
+                            int type_next = getType(split1[0]);
+                            if(type_first>type_next){
+                                value.remove(key_next);
+                                LinkedHashMap<String, List<Drugs>> value_new = new LinkedHashMap<>();
+                                LinkedHashMap<String, List<Drugs>> value_new2 = new LinkedHashMap<>();
+                                if(value.size()>0){
+                                    for (Map.Entry<String, List<Drugs>> dg:value.entrySet()
+                                         ) {
+                                        value_new.put(dg.getKey(),dg.getValue());
+                                    }
+
+                                }
+                                value_new2.put(key_first,first.getValue());
+                                if(value_new.size()>0){
+                                    for (Map.Entry<String, List<Drugs>> dg:value_new.entrySet()
+                                            ) {
+                                        value_new2.put(dg.getKey(),dg.getValue());
+                                    }
+                                }
+                                if(otherDis_1.size()>0){
+                                    for (String dis:otherDis_1) {
+                                        if(!otherDis.contains(dis)){
+                                            otherDis.add(dis);
+                                            List<Drugs> drugsList = dValue.get(dis);
+                                            value_new2.put(dis,drugsList);
+                                        }
+                                    }
+                                }
+                                fi_second.remove(key);
+                                otherDis.add(0,s_next);
+                                fi_second.put(otherDis,value_new2);
+                            }else if(type_first == type_next) {
+                                System.out.println("hh");
+                                fi_second.put(key_dis,dValue);
+                            } else {
+                                if(otherDis_1.size()>0){
+                                    for (String dis:otherDis_1) {
+                                        if(!otherDis.contains(dis)){
+                                            otherDis.add(dis);
+                                            List<Drugs> drugsList = dValue.get(dis);
+                                            value.put(dis,drugsList);
+                                        }
+                                    }
+                                }
+                                fi_second.remove(key);
+                                otherDis.add(0,s_next);
+                                fi_second.put(otherDis,value);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+
+
+
+        if(fi_second.size()>0){
+            treatmentPlanList.clear();
+            for (Map.Entry<List<String>,LinkedHashMap<String,List<Drugs>>> jfd:fi_second.entrySet()
+                 ) {
+                TreatDetail treatDetail = new TreatDetail();
+                List<String> key = jfd.getKey();
+                LinkedHashMap<String, List<Drugs>> value = jfd.getValue();
+                String title="";
+                title =  key.toString().replace("[","").replace("]","")+"治疗方案";
+                List<MeditionDetail> dda = new ArrayList<>();
+                if(value.size()>0){
+                    for (Map.Entry<String, List<Drugs>> ds:value.entrySet()) {
+                        String desc = ds.getKey();
+                        List<Drugs> value1 = ds.getValue();
+                        MeditionDetail meditionDetail = new MeditionDetail();
+                        meditionDetail.setDescription(desc);
+                        meditionDetail.setTreatment(value1);
+                        dda.add(meditionDetail);
+                    }
+                }
+                treatDetail.setTitle(title);
+                treatDetail.setMeditionDetails(dda);
+                treatmentPlanList.add(treatDetail);
+            }
+
+        }
+
+    }
+    private int getType(String type){
+        int i = 0;
+        if(type.equals("单药治疗")){
+            i = 1;
+        }else if(type.equals("双药治疗")){
+            i = 2;
+        }else if(type.equals("胰岛素治疗")){
+            i = 3;
+        }
+        return i;
+    }
+
     private List<TreatDetail> complicationMedicaton(String[] inputList,Driver driver,List<String> allFilds){
         List<TreatDetail> disTreatDetailList = new ArrayList<>();
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
         Map<String, String> medicaton_ji = new HashMap<>();
         Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> filds = new ArrayList<>();
         if(inputList.length>0){
@@ -112,14 +308,14 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         disTreatDetailList = this.processMedication_he(disDrugs, conditionDesign, allFilds, driver);
-
         return disTreatDetailList;
     }
     /**
@@ -134,7 +330,7 @@ public class PushTreat {
 
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {
@@ -169,6 +365,7 @@ public class PushTreat {
     private List<TreatDetail> otherRuleMedicaton(String disName,List<String> excludeDiagFilds,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         excludeDiagFilds.add("'"+disName+"'");
         Session  session = driver.session(AccessMode.WRITE);
@@ -179,21 +376,15 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-//        if(!disSet.contains(disName)){
-//            //规则不匹配,返回主诊断治疗方案
-//            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-//        }else {
-            treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
-
-//        }
-
+        treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
         return treatDetailList;
     }
 
@@ -201,6 +392,7 @@ public class PushTreat {
     private List<TreatDetail> ruleMedicaton(String disName,String webDiag,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> webDiagList = processWebDiag(disName,webDiag);
         Session  session = driver.session(AccessMode.WRITE);
@@ -208,30 +400,53 @@ public class PushTreat {
             @Override
             public Integer execute(Transaction tx) {
                 String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",webDiagList.toString());
-//                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",allFilds.toString());
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-        if(!disSet.contains(disName)){
-            //规则不匹配,返回主诊断治疗方案
-            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-        }else {
-            treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        return treatDetailList;
+    }
+    private void addColl(Map<String,List<String>> condiTypedis,Map<String,Map<String,Object>> disDrugs){
+        if(condiTypedis!= null &&condiTypedis.size()>0){
+            for (Map.Entry<String,List<String>> ctd:condiTypedis.entrySet()) {
+                String name = ctd.getKey().split("&")[1];
+                String type = ctd.getKey().split("&")[0];//主症或并发症
+                if(disDrugs.containsKey(name)){
+
+                    Map<String, Object> objectMap = disDrugs.get(name);
+                    List<String> cateList = (List<String>) objectMap.get("cate");
+                    int index = cateList.indexOf(type);
+                    if(objectMap.containsKey("coll")){
+                        List<Object> list = (List<Object>) objectMap.get("coll");
+                        List<String> v = new ArrayList<>();
+                        v.addAll(ctd.getValue());
+                        list.add(index,v);
+                        objectMap.put("coll",list);
+                    }else {
+                        List<Object> list = new ArrayList<>();
+                        List<String> v = new ArrayList<>();
+                        v.addAll(ctd.getValue());
+                        list.add(v);
+                        objectMap.put("coll",list);
+                    }
+                    disDrugs.put(name,objectMap);
+                }
 
+            }
         }
 
-        return treatDetailList;
-    }
 
-    private void searchDrugs(StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
-        List<String> collection =null;
+    }
+    private void searchDrugs(Map<String,List<String>> condiTypedis,StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
+        String collection =null;
         int i=0;
         Record next = result.next();
         String name = next.get("name").toString().replace("\"", "");
@@ -242,38 +457,45 @@ public class PushTreat {
         disSet.add(disName);
         if(design >= i){
             i = design;
-            collection = (List) next.get("collection").asList();
+            collection = next.get("collection").toString().replace("\"", "");
         }
         conditionDesign.put(name,i);
+        String ncd =category+"&"+ name + "&" + disName;
+        if(condiTypedis.containsKey(ncd)){
+            List<String> list = condiTypedis.get(ncd);
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }else {
+            List<String> list = new ArrayList<>();
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }
+
         if(!disDrugs.containsKey(name)){
             Map<String, Object> designHashMap = new HashMap<>();
-            List<String> pList = new ArrayList<>();
             List<String> cateList = new ArrayList<>();
             List<String> disList = new ArrayList<>();
-            List<Object> collList = new ArrayList<>();
-            pList.add(p);
-            designHashMap.put("p",pList);
-            cateList.add(category);
+            if(!cateList.contains(category)){
+                cateList.add(category);
+            }
             designHashMap.put("cate",cateList);
-            disList.add(disName);
+            if(!disList.contains(disName)){
+                disList.add(disName);
+            }
             designHashMap.put("dis",disList);
-            collList.add(collection);
-            designHashMap.put("coll",collList);
             disDrugs.put(name,designHashMap);
         }else {
             Map<String, Object> objectMap = disDrugs.get(name);
-            List<String> p1 = (List<String>)objectMap.get("p");
-            p1.add(p);
-            objectMap.put("p",p1);
             List<String> cate1 = (List<String>)objectMap.get("cate");
-            cate1.add(category);
+            if(!cate1.contains(category)){
+                cate1.add(category);
+            }
             objectMap.put("cate",cate1);
             List<String> dis1 = (List<String>)objectMap.get("dis");
-            dis1.add(disName);
+            if(!dis1.contains(disName)){
+                dis1.add(disName);
+            }
             objectMap.put("dis",dis1);
-            List<Object> coll1 = (List<Object>)objectMap.get("coll");
-            coll1.add(collection);
-            objectMap.put("coll",coll1);
             disDrugs.put(name,objectMap);
         }
     }
@@ -333,7 +555,8 @@ public class PushTreat {
         if(disDrugs != null && disDrugs.size()>0){
             for (Map.Entry<String,Map<String,Object>> ds:disDrugs.entrySet()) {
                 String key = ds.getKey();
-                if(Arrays.asList(key.split("\\+")).contains(disName)){
+                List<String> asList = Arrays.asList(key.split("\\+"));
+                if(asList.contains(disName)){
                     Map<String, Object> values = ds.getValue();
                     List<String> cateList = (List<String>) values.get("cate");
                     List<String> disList = (List<String>)values.get("dis");
@@ -359,6 +582,46 @@ public class PushTreat {
 
                         treatDetailList.add(treatDetail);
                     }
+                    if(asList.size()>2 && cateList.contains("并发症")){
+                        TreatDetail treatDetail = new TreatDetail();
+                        List<MeditionDetail> meditionDetails = new ArrayList<>();
+                        int main = cateList.indexOf("主症");
+                        String mainDis = disList.get(main);
+                        List<String> dds= new ArrayList<>();
+                        for(String s:disList){
+                            if(!s.equals(mainDis)){
+                                dds.add(s);
+                            }
+                        }
+                        treatDetail.setTitle(mainDis+"及其"+String.join("、",dds)+"治疗方案");//糖尿病及其2型糖尿病治疗方案
+                        Integer da = conditionDesign.get(key);
+                        String s = switchType(da);
+                        MeditionDetail meditionDetail_main = new MeditionDetail();//主诊断的
+                        List<String> o = (List<String>)collList.get(main);
+                        List<String> yinhao = yinhao(o);
+                        //根据类找药
+                        List<Drugs> drugs = searchMedication(yinhao,allFilds,driver);
+                        meditionDetail_main.setDescription(s+":"+String.join("、",o));//单药治疗:双胍类
+                        meditionDetail_main.setTreatment(drugs);
+                        meditionDetails.add(meditionDetail_main);
+
+                        //并发症用药
+                        for (String dis:dds) {
+                            MeditionDetail meditionDetail_bing = new MeditionDetail();//并发症的
+                            int i = disList.indexOf(dis);
+                            List<String> ol = (List<String>)collList.get(i);
+                            List<String> yinhaol = yinhao(ol);
+                            List<Drugs> drugs1 = searchMedication(yinhaol,allFilds,driver);
+                            meditionDetail_bing.setDescription(dis);//单药治疗:双胍类
+                            meditionDetail_bing.setTreatment(drugs1);
+                            meditionDetails.add(meditionDetail_bing);
+                        }
+
+                        treatDetail.setMeditionDetails(meditionDetails);
+
+                        treatDetailList.add(treatDetail);
+
+                    }
                 }
 
             }
@@ -446,7 +709,7 @@ public class PushTreat {
     private List<Drugs> searchMedication(List<String> drugs,List<String> allFilds,Driver driver){
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {

+ 1 - 1
graph/src/main/resources/bolt.properties

@@ -5,7 +5,7 @@ pass_235 = diagbot@20180822
 
 # neo4j bolt credentials
 #\u7EBF\u4E0A\u4F7F\u7528
-bolt.uri=bolt://192.168.2.232
+bolt.uri=bolt://192.168.2.233
 bolt.user=neo4j
 bolt.passwd=root
 

+ 3 - 3
graph/src/main/resources/pushTreat.properties

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

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