Przeglądaj źródła

治疗方案添加规则部分

kongwz 5 lat temu
rodzic
commit
bd3dec3df1

+ 11 - 3
common-push/src/main/java/org/diagbot/common/push/bean/neo4j/Filnlly.java

@@ -5,7 +5,8 @@ import java.util.List;
 
 public class Filnlly {
     private List<Indicators> adverseEvent;
-    private ArrayList<Drugs> treatment;
+    private List<Drugs> treatment;
+    private TreatCate treatCate;
 
 
     public List<Indicators> getAdverseEvent() {
@@ -16,12 +17,19 @@ 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 TreatCate getTreatCate() {
+        return treatCate;
+    }
+
+    public void setTreatCate(TreatCate treatCate) {
+        this.treatCate = treatCate;
+    }
 }

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

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

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

+ 83 - 10
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java

@@ -1207,20 +1207,30 @@ public class Neo4jAPI {
                     if (diseFilds != null && diseFilds.size() > 0) {
                         for (Map.Entry<String, ArrayList> df : diseFilds.entrySet()) {
                             //大对象集合
-                            ArrayList<Drugs> drugsList;
+                            List<Drugs> drugsList;
+                            TreatCate treatCate = null;
                             Map<String, String> medicaton_ji = new HashMap<>();//药的忌用和慎用集合
                             Map<String, List<String>> medicatonMap = new LinkedHashMap<>();//全部的药集合
                             String diseaseName = df.getKey();//疾病
                             ArrayList value = df.getValue();//其他条件
                             // TODO: 2019/11/12 处理规则判断的用药情况
-
-                            drugsList = allMedication(tx,medicaton_ji, medicatonMap, diseaseName, value);
+                            JSONObject jsonObject = medicationRule(tx, medicaton_ji, medicatonMap,diseaseName,value);
+                            drugsList = (List<Drugs>)jsonObject.get("drugs");
+                            treatCate = (TreatCate)jsonObject.get("treatCate");
+                            if(treatCate.getType() == null){
+                                treatCate = null;
+                            }
+                            //规则不成立,返回全部用药
+                            if(drugsList == null || drugsList.size() == 0){
+                                drugsList = allMedication(tx,medicaton_ji, medicatonMap, diseaseName, value,1,null);
+                            }
                             Filnlly filnlly = new Filnlly();
                             //显示不良反应
                             if (diseaseType != null && 1 == diseaseType) {
                                 List<Indicators> indicators = sideEffect(diseaseName, disUE, ueSet, crisisDetails, disSet);
                                 filnlly.setAdverseEvent(indicators);
                             }
+                            filnlly.setTreatCate(treatCate);
                             filnlly.setTreatment(drugsList);
                             newTret.put(diseaseName, filnlly);
                         }
@@ -1236,11 +1246,16 @@ public class Neo4jAPI {
         }
     }
 
-    private  ArrayList<Drugs> allMedication(Transaction tx,  Map<String, String> medicaton_ji, Map<String, List<String>> medicatonMap, String diseaseName, ArrayList value) {
-        ArrayList<Drugs> drugsList = new ArrayList<Drugs>();
-        String query;
+    private  List<Drugs> allMedication(Transaction tx,  Map<String, String> medicaton_ji, Map<String, List<String>> medicatonMap, String diseaseName, ArrayList value,int sign,List<String> drugslist) {
+        List<Drugs> drugsList = new ArrayList<Drugs>();
+        String query = null;
         StatementResult result;
-        query = propertiesUtil.getProperty("searchTreat").replace("disName", "\'" + diseaseName + "\'").replace("filds", value.toString());
+        if(sign == 1){
+            query = propertiesUtil.getProperty("searchTreat").replace("disName", "\'" + diseaseName + "\'").replace("filds", value.toString());
+        }else if(sign == 2){
+            query = propertiesUtil.getProperty("searchRuleMedicaton").replace("disName", "\'" + diseaseName + "\'").replace("filds", value.toString()).replace("drugsList",drugslist.toString());
+        }
+
         logger.info("查找诊断对应的类和药物,包括类的排序,查找语句为:\n" + query);
         result = tx.run(query);
         while (result.hasNext()) {
@@ -1337,12 +1352,70 @@ public class Neo4jAPI {
     /**
      * 用药规则处理
      * @param diseaseName
-     * @param values
+     * @param
      */
-    public void medicationRule(String diseaseName,List values,Session session){
-
+    private  JSONObject  medicationRule(Transaction tx,Map<String, String> medicaton_ji, Map<String, List<String>> medicatonMap,String diseaseName, ArrayList value){
+        String query;
+        StatementResult result;
+        JSONObject jsonObject = new JSONObject();
+        TreatCate treatCate = new TreatCate();
+        List<Drugs> drugs = new ArrayList<>();
+        // TODO: 2019/11/13 开始匹配规则
+        query=propertiesUtil.getProperty("medicationRule").replace("filds",value.toString());
+        result = tx.run(query);
+        int i=0;
+        List<String> collection =null;
+        while (result.hasNext()) {
+            Record record = result.next();
+            int j = record.get("design").asInt();
+            if(j>i){
+                i = j;
+                collection = (List) record.get("collection").asList();
+            }
+        }
+        List<String> medictionDrugs =null;
+        if(collection != null){
+            medictionDrugs = new ArrayList<>();
+            for (String drugsp:collection) {
+                String[] splits = drugsp.replace("\"", "").split("\\+");
+                for (String drug:splits) {
+                    if(medictionDrugs.contains("'"+drug+"'")){
+                       continue;
+                    }
+                    medictionDrugs.add("'"+drug+"'");
+                }
+            }
+        }
+        //根据类找药
+        try {
+            drugs = allMedication(tx, medicaton_ji, medicatonMap, diseaseName, value, 2, medictionDrugs);
+        }catch (Exception e){
+            drugs = null;
+        }
+        treatCate.setType(switchType(i));
+        treatCate.setName(collection);
+        jsonObject.put("drugs",drugs);
+        jsonObject.put("treatCate",treatCate);
+        return  jsonObject;
 
     }
+   //单、双药、胰岛素药
+    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;
+    }
 
     /**
      * 治疗方案,取每个诊断对应的filds

+ 27 - 2
graph/src/main/resources/bolt.properties

@@ -5,9 +5,9 @@ pass_235 = diagbot@20180822
 
 # neo4j bolt credentials
 #\u7EBF\u4E0A\u4F7F\u7528
-bolt.uri=bolt://192.168.3.180
+bolt.uri=bolt://192.168.2.234
 bolt.user=neo4j
-bolt.passwd=123456
+bolt.passwd=root
 
 
 #\u6D4B\u8BD5\u4F7F\u7528
@@ -110,6 +110,31 @@ 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
+
+#\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,collect(t.name) as collection
+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