浏览代码

Merge remote-tracking branch 'origin/shaoyf/dev' into shaoyf/master

# Conflicts:
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02860.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0449.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02985.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02986.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03070.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03071.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03076.java
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03077.java
#	kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessDrug.java
huj 4 年之前
父节点
当前提交
12cb89943c
共有 17 个文件被更改,包括 584 次插入152 次删除
  1. 7 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0001.java
  2. 9 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0006.java
  3. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0013.java
  4. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0014.java
  5. 23 13
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02860.java
  6. 18 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02988.java
  7. 8 6
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0400.java
  8. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0449.java
  9. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE03064.java
  10. 15 16
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02985.java
  11. 98 85
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02986.java
  12. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03070.java
  13. 8 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03071.java
  14. 6 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03076.java
  15. 5 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03077.java
  16. 330 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03079.java
  17. 48 3
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessDrug.java

+ 7 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0001.java

@@ -3,12 +3,9 @@ package com.lantone.qc.kernel.catalogue.behospitalized;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
-import com.lantone.qc.pub.model.entity.Clinical;
 import com.lantone.qc.pub.model.entity.PD;
 import com.lantone.qc.pub.model.label.ChiefLabel;
-import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -23,16 +20,20 @@ import java.util.List;
 @Component
 public class BEH0001 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-
-        status.set("0");
         if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
             return;
         }
         ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
         if (chiefLabel == null) {
+            status.set("0");
             return;
         }
         String chiefText = chiefLabel.getText();
+        if (StringUtil.isBlank(chiefText)) {
+            status.set("0");
+            return;
+        }
         if (StringUtil.isNotBlank(chiefText) && (chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物"))) {
             status.set("0");
             return;
@@ -71,6 +72,7 @@ public class BEH0001 extends QCCatalogue {
             status.set("-1");
         }*/
     }
+
     private boolean isDate(String pdName) {
         String regex = "[0-9]{4}.?[0-9]{2}.?[0-9]{2}";
         return pdName.matches(regex);

+ 9 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0006.java

@@ -23,6 +23,7 @@ import java.util.List;
 @Component
 public class BEH0006 extends QCCatalogue {
     private List<String> containList = Arrays.asList("半年", "术后");
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
 //        status.set("0");
         if (inputInfo.getBeHospitalizedDoc() == null) {
@@ -36,8 +37,8 @@ public class BEH0006 extends QCCatalogue {
         }
         String chiefText = chiefLabel.getText();
         if (StringUtil.isNotBlank(chiefText)) {
-            for (String fild:containList) {
-                if(chiefText.contains(fild)){
+            for (String fild : containList) {
+                if (chiefText.contains(fild)) {
                     status.set("0");
                     return;
                 }
@@ -60,7 +61,12 @@ public class BEH0006 extends QCCatalogue {
                         }
                     }
                 }
+            } else {
+                if (StringUtil.isNotBlank(chiefLabel.getText())) {
+                    status.set("0");
+                    return;
+                }
             }
         }
-     }
+    }
 }

+ 3 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0013.java

@@ -32,9 +32,11 @@ public class BEH0013 extends QCCatalogue {
         }
         String text = presentLabel.getText();
         if (StringUtil.isNotBlank(text)) {
-            if (text.contains("无") || text.contains("否认")) {
+            if ((text.contains("无") || text.contains("否认")) && !text.contains("诱因")) {
                 return;
             }
+        } else {
+            return;
         }
         List<Clinical> clinicalNegative = new ArrayList<>();
         List<Clinical> clinicals = presentLabel.getClinicals();

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0014.java

@@ -45,7 +45,7 @@ public class BEH0014 extends QCCatalogue {
             }
         }*/
         PresentLabel presentLabel = inputInfo.getBeHospitalizedDoc().getPresentLabel();
-        if (presentLabel == null) {
+        if (presentLabel == null || StringUtil.isBlank(presentLabel.getText())) {
             status.set("0");
             return;
         }

+ 23 - 13
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02860.java

@@ -1,18 +1,16 @@
 package com.lantone.qc.kernel.catalogue.behospitalized;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
-import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
-import com.lantone.qc.pub.model.entity.Clinical;
 import com.lantone.qc.pub.model.entity.PD;
 import com.lantone.qc.pub.model.label.ChiefLabel;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
 import java.util.List;
-import java.util.regex.Pattern;
 
 
 /**
@@ -24,33 +22,45 @@ import java.util.regex.Pattern;
 @Component
 public class BEH02860 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
         if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
             return;
         }
         ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
         if (chiefLabel == null || StringUtil.isBlank(chiefLabel.getText())) {
+            status.set("0");
             return;
         }
-        String regex = "[零一二三四五六七八九十百千]";
+        List<String> arabicNumList = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7"
+                , "8", "9");
+        List<String> containList = Arrays.asList("零", "一", "二", "三", "四", "五", "六", "七"
+                , "八", "九", "十", "百", "千");
         List<PD> pds = chiefLabel.getPds();
         if (ListUtil.isNotEmpty(pds)) {
             String name = null, value = null;
             for (PD pd : pds) {
                 name = pd.getName();
                 value = pd.getValue();
-                if(name.contains("半")){
+                if (name.contains("半")) {
                     continue;
                 }
-                if (value != null && Pattern.matches(regex, value)) {
-                    status.set("-1");
-                    return;
+                for (String num : arabicNumList) {
+                    if (StringUtil.isNotBlank(name) && name.contains(num)) {
+                        status.set("0");
+                        return;
+                    }
                 }
-                if (name != null && Pattern.matches(regex, name)) {
-                    status.set("-1");
-                    return;
+                for (String word : containList) {
+                    if (StringUtil.isNotBlank(value) && value.contains(word)) {
+                        return;
+                    }
+                    if (StringUtil.isNotBlank(name) && name.contains(word)) {
+                        return;
+                    }
                 }
             }
+        } else {
+            status.set("0");
         }
     }
-}
+}

+ 18 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02988.java

@@ -3,6 +3,10 @@ package com.lantone.qc.kernel.catalogue.behospitalized;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
@@ -17,11 +21,22 @@ public class BEH02988 extends QCCatalogue {
     @Override
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getBeHospitalizedDoc() == null) {
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //主诉
+        ChiefLabel chiefLabel = beHospitalizedDoc.getChiefLabel();
+        //现病史
+        PresentLabel presentLabel = beHospitalizedDoc.getPresentLabel();
+        //既往史
+        PastLabel pastLabel = beHospitalizedDoc.getPastLabel();
+        if (beHospitalizedDoc == null) {
             return;
         }
-        if (inputInfo.getBeHospitalizedDoc().getChiefLabel() == null
-                && StringUtil.isBlank(inputInfo.getBeHospitalizedDoc().getChiefLabel().getText())) {
+        if (StringUtil.isBlank(chiefLabel.getText()) && StringUtil.isNotBlank(presentLabel.getText()) ||
+                StringUtil.isNotBlank(pastLabel.getText())) {
+            status.set("-1");
+            return;
+        }
+        if (chiefLabel == null && StringUtil.isBlank(chiefLabel.getText())) {
             status.set("-1");
         }
     }

+ 8 - 6
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0400.java

@@ -7,7 +7,6 @@ import com.lantone.qc.pub.model.label.PastLabel;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -27,19 +26,22 @@ public class BEH0400 extends QCCatalogue {
             status.set("0");
             return;
         }
-        List<String>  Str =  Arrays.asList("咳嗽气喘史","胸闷心悸史","腹痛腹泻史","多饮多尿史","浮肿少尿史","尿频尿痛史","抽搐史","出血史","过敏史","药物过敏史","传染病史","外伤手术史","输血史","重大疾病史和治疗史");
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        if (StringUtil.isBlank(pastLabel.getText())) {
+            status.set("0");
+            return;
+        }
+        List<String> Str = Arrays.asList("咳嗽气喘史", "胸闷心悸史", "腹痛腹泻史", "多饮多尿史", "浮肿少尿史", "尿频尿痛史", "抽搐史", "出血史", "过敏史", "药物过敏史", "传染病史", "外伤手术史", "输血史", "重大疾病史和治疗史");
         Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
-        for(String s : Str){
-            if(structureMap!=null &&structureMap.containsKey(s)){
+        for (String s : Str) {
+            if (structureMap != null && structureMap.containsKey(s)) {
                 status.set("0");
                 return;
             }
         }
 
-        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
         if (pastLabel != null && StringUtil.isNotBlank(pastLabel.getText())) {
             status.set("0");
         }
     }
-
 }

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0449.java

@@ -38,9 +38,11 @@ public class BEH0449 extends QCCatalogue {
         }
         BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
         String chief_text = beHospitalizedDoc.getChiefLabel().getText();
+        String Present_text = beHospitalizedDoc.getPresentLabel().getText();
         if (chief_text.contains("检查") || chief_text.contains("术后") || chief_text.contains("药物")
                 || chief_text.contains("发现") || chief_text.contains("体检") || chief_text.contains("确诊")
                 || chief_text.contains("复查") || chief_text.contains("诊断") || StringUtil.isBlank(chief_text)
+                || StringUtil.isBlank(Present_text)
         ) {
             status.set("0");
             return;

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE03064.java

@@ -65,7 +65,7 @@ public class PRE03064 extends QCCatalogue {
 
             if (matchSum < normalCheck.size()) {
                 status.set("-1");
-                info.set("未完成常规检查" + missCheck.toString().replaceAll("[\\[\\]]", ""));
+                info.set("未完成常规检查:" + missCheck.toString().replaceAll("[\\[\\]]", ""));
             }
         }
 //        for (String operationDateStr : operationDateList) {

+ 15 - 16
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02985.java

@@ -10,7 +10,6 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.*;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
-import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
@@ -73,7 +72,8 @@ public class THR02985 extends QCCatalogue {
             String drugName = adviceDoc.get("医嘱项目名称");
             String startDateStr = adviceDoc.get("医嘱开始时间");
             if (StringUtil.isNotBlank(drugName)) {
-                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+                startDate = StringUtil.parseDateTime(startDateStr);
                 if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
                     continue;   //一天内同一抗生素开过多次的抗生素直接过滤
                 }
@@ -173,7 +173,7 @@ public class THR02985 extends QCCatalogue {
             if (drugs.contains(" ")) {
                 drugs = drugs.split(" ")[0];
             }
-            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5针]", "");
+//            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5针]", "");
             Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
                     .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
             /**********************************************先文本匹配************************************************/
@@ -210,15 +210,14 @@ public class THR02985 extends QCCatalogue {
                     break;
                 }
             }
-
             if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
-                infoAppend(sb, splitDrugs.toString().replaceAll("[\\[\\]]", ""), DateUtil.formatDate(doctorAdviceDate));
+                infoAppend(sb, drugs, DateUtil.formatDateTime(doctorAdviceDate));
                 data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
             }
         }
         if (StringUtil.isNotBlank(sb.toString())) {
             this.status.set("-1");
-            this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+            this.info.set("医嘱" + sb.toString().substring(0, sb.toString().length() - 1));
             extData.set(data);
         }
     }
@@ -237,7 +236,8 @@ public class THR02985 extends QCCatalogue {
         for (Map<String, String> structMap : docAdvStruct) {
             drugName = structMap.get("医嘱项目名称");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (antibioticDateTimes.containsKey(drugName)) {
                 Map<Date, Integer> map = antibioticDateTimes.get(drugName);
                 if (map.containsKey(startDate)) {
@@ -386,7 +386,7 @@ public class THR02985 extends QCCatalogue {
      * @param date
      */
     private void infoAppend(StringBuffer sb, String drugKey, String date) {
-        sb.append(drugKey).append("(").append(date).append(")").append("");
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
     }
 
     private static final String[] KSS = {
@@ -395,7 +395,7 @@ public class THR02985 extends QCCatalogue {
             "亚胺培南西司他丁",
             "伊曲康唑",
             "伏立康唑",
-            "依替米星氯化钠",
+            "依替米星",
             "克拉霉素",
             "克林霉素",
             "利奈唑胺",
@@ -404,10 +404,10 @@ public class THR02985 extends QCCatalogue {
             "制霉菌素",
             "卡泊芬净",
             "厄他培南",
-            "吗啉硝唑氯化钠",
+            "吗啉硝唑",
             "呋喃唑酮",
             "哌拉西林他唑巴坦",
-            "复方磺胺甲噁唑",
+            "磺胺甲恶唑",
             "多粘菌素B",
             "多西环素",
             "夫西地酸",
@@ -433,7 +433,7 @@ public class THR02985 extends QCCatalogue {
             "妥布霉素",
             "妥布霉素地塞米松",
             "左氧氟沙星",
-            "左氧氟沙星氯化钠",
+            "左氧氟沙星",
             "庆大霉素",
             "异帕米星",
             "拉氧头孢",
@@ -442,14 +442,14 @@ public class THR02985 extends QCCatalogue {
             "替考拉宁",
             "比阿培南",
             "氟康唑",
-            "氟康唑氯化钠",
+            "氟康唑",
             "氟胞嘧啶",
             "氨曲南",
             "氨苄西林",
             "泊沙康唑",
             "特比萘芬",
             "甲硝唑",
-            "甲硝唑氯化钠",
+            "甲硝唑",
             "磷霉素",
             "磷霉素氨丁三醇",
             "米卡芬净",
@@ -458,7 +458,7 @@ public class THR02985 extends QCCatalogue {
             "美罗培南",
             "苄星青霉素",
             "莫西沙星",
-            "莫西沙星氯化钠",
+            "莫西沙星",
             "达托霉素",
             "阿奇霉素",
             "阿奇霉素枸橼酸二氢钠",
@@ -468,5 +468,4 @@ public class THR02985 extends QCCatalogue {
             "阿莫西林克拉维酸",
             "青霉素"
     };
-
 }

+ 98 - 85
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02986.java

@@ -58,10 +58,12 @@ public class THR02986 extends QCCatalogue {
                 .map(DoctorAdviceDoc::getStructureMap)
                 .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("激素"))
                 .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
-                .filter(x -> StringUtil.isNotBlank(x.get("给药方式")) && x.get("给药方式").contains("静脉滴注"))
-                .filter(x -> StringUtil.isNotBlank(x.get("医嘱频率")) && !x.get("医嘱频率").equals("ONCE"))
+//                .filter(x -> StringUtil.isNotBlank(x.get("给药方式")) && x.get("给药方式").contains("静脉滴注"))
+//                .filter(x -> StringUtil.isNotBlank(x.get("医嘱频率")) && !x.get("医嘱频率").equals("ONCE"))
                 .collect(Collectors.toList());
 
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+
         //记录同一天内是否开过多次同一激素
         Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
         //记录同一激素同一天内是否开过多次,用于医嘱中需要处理的激素过滤(一天内同一激素开过多次的激素直接过滤)
@@ -72,14 +74,22 @@ public class THR02986 extends QCCatalogue {
             String drugName = adviceDoc.get("医嘱项目名称");
             String startDateStr = adviceDoc.get("医嘱开始时间");
             if (StringUtil.isNotBlank(drugName)) {
-                if (Arrays.asList(JS).contains(drugName)) {
-                    continue;
-                }
-                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+                startDate = StringUtil.parseDateTime(startDateStr);
                 if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
-                    continue;   //一天内同一激素开过多次的激素直接过滤
+                    continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+                }
+                drugName = removeBracket(drugName).replaceAll("[^\u4e00-\u9fa5]", "");
+                String drugStandardWord = similarityUtil.getDrugStandardWord(drugName);
+                if (StringUtil.isNotBlank(drugStandardWord)) {
+                    drugName = drugStandardWord;
                 }
-                doctorAdviceDrugMap.put(startDate, drugName);
+                if (drugName.contains("甲泼尼龙") || drugName.contains("泼尼松") || drugName.contains("地塞米松") || drugName.contains("可的松")) {
+                    doctorAdviceDrugMap.put(startDate, adviceDoc.get("医嘱项目名称"));
+                }
+//                if (!Arrays.asList(JS).contains(drugName)) {
+//                     doctorAdviceDrugMap.put(startDate, adviceDoc.get("医嘱项目名称"));
+//                }
             }
         }
 
@@ -168,7 +178,7 @@ public class THR02986 extends QCCatalogue {
             if (drugs.contains(" ")) {
                 drugs = drugs.split(" ")[0];
             }
-            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
+//            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
             Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
                     .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
             /**********************************************先文本匹配************************************************/
@@ -205,15 +215,14 @@ public class THR02986 extends QCCatalogue {
                     break;
                 }
             }
-
             if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
-                infoAppend(sb, splitDrugs.toString().replaceAll("[\\[\\]]", ""), DateUtil.formatDate(doctorAdviceDate));
+                infoAppend(sb, drugs, DateUtil.formatDateTime(doctorAdviceDate));
                 data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
             }
         }
         if (StringUtil.isNotBlank(sb.toString())) {
             this.status.set("-1");
-            this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+            this.info.set("医嘱" + sb.toString().substring(0, sb.toString().length() - 1));
             extData.set(data);
         }
     }
@@ -232,7 +241,8 @@ public class THR02986 extends QCCatalogue {
         for (Map<String, String> structMap : docAdvStruct) {
             drugName = structMap.get("医嘱项目名称");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (antibioticDateTimes.containsKey(drugName)) {
                 Map<Date, Integer> map = antibioticDateTimes.get(drugName);
                 if (map.containsKey(startDate)) {
@@ -378,78 +388,81 @@ public class THR02986 extends QCCatalogue {
      * @param date
      */
     private void infoAppend(StringBuffer sb, String drugKey, String date) {
-        sb.append(drugKey).append("(").append(date).append(")").append(",");
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
     }
 
-    private static final String[] JS = {
-            "瑞格列奈片",
-            "西格列汀片",
-            "维格列汀片",
-            "伏格列波糖片",
-            "[合资]二甲双胍片",
-            "[进口]硫辛酸针",
-            "[合资]阿卡波糖片",
-            "格列齐特缓释片",
-            "达格列净片",
-            "[合资]格列美脲片",
-            "[绿叶]阿卡波糖胶囊",
-            "[海汇]格列美脲片",
-            "格列吡嗪缓释胶囊",
-            "[国产]阿卡波糖片",
-            "格列吡嗪控释片",
-            "[国产]二甲双胍片",
-            "吡格列酮二甲双胍片",
-            "沙格列汀片",
-            "[艾可拓]吡格列酮片",
-            "阿仑膦酸钠维D3片",
-            "[卡司平]吡格列酮片",
-            "[国产]硫辛酸针",
-            "格列喹酮片",
-            "[国产]阿仑膦酸钠肠溶片",
-            "那格列奈片",
-            "[自备]格列齐特-II片",
-            "[特]门冬胰岛素针",
-            "[预填充]甘精胰岛素针",
-            "[优泌乐50]精蛋白锌赖脯胰岛素针",
-            "[特30]门冬胰岛素30针",
-            "左旋甲状腺素片",
-            "胰岛素针",
-            "[进口]奥曲肽针",
-            "[优泌乐25]精蛋白锌赖脯胰岛素针",
-            "[国产]生长抑素针",
-            "[国产]特利加压素针",
-            "[国产]奥曲肽针",
-            "[诺和灵30R]精蛋白生物合成人胰岛素针",
-            "谷赖胰岛素针",
-            "地特胰岛素针",
-            "[进口]生长抑素针",
-            "甲巯咪唑片",
-            "降钙素针",
-            "[优泌乐]赖脯胰岛素针",
-            "利拉鲁肽针",
-            "重组甘精胰岛素针",
-            "[70/30]精蛋白锌重组人胰岛素针",
-            "[预灌封优泌乐50]精蛋白锌赖脯胰岛素针",
-            "黄体酮针",
-            "地屈孕酮片",
-            "50/50混合重组人胰岛素针",
-            "炔诺酮片",
-            "[进口]特利加压素针",
-            "戊酸雌二醇片",
-            "4.5iu生长激素针",
-            "生物合成人胰岛素针",
-            "米非司酮片",
-            "[进口]黄体酮软胶囊",
-            "十一酸睾酮胶囊",
-            "[芯中效]精蛋白锌重组人胰岛素针",
-            "[国产]丙硫氧嘧啶片",
-            "[国产]黄体酮胶囊",
-            "[芯常规]重组人胰岛素针",
-            "[自备]重组甘精胰岛素针",
-            "[密盖息]降钙素鼻喷剂",
-            "甲羟孕酮片",
-            "替勃龙片",
-            "[金尔力]降钙素鼻喷剂",
-            "雷洛昔芬片"
-    };
+    private static final List<String> filterKey = Lists.newArrayList("静脉滴注", "静脉注射", "口服", "皮下注射", "肌注", "静脉注射(泵)",
+            "膀胱持续冲洗", "静脉滴注(泵)", "膀胱冲洗", "腹腔注射", "鞘内注射", "关节腔注射", "胸腔注射", "皮内");
+
+    /*private static final String[] JS = {
+            "瑞格列奈",
+            "西格列汀",
+            "维格列汀",
+            "伏格列波糖",
+            "二甲双胍",
+            "硫辛酸",
+            "阿卡波糖",
+            "格列齐特",
+            "达格列净",
+            "格列美脲",
+            "阿卡波糖",
+            "格列美脲",
+            "格列吡嗪",
+            "阿卡波糖",
+            "格列吡嗪",
+            "二甲双胍",
+            "吡格列酮二甲双胍",
+            "沙格列汀",
+            "吡格列酮",
+            "阿仑膦酸钠维D3",
+            "吡格列酮",
+            "硫辛酸",
+            "格列喹酮",
+            "阿仑膦酸钠",
+            "那格列奈",
+            "格列齐特",
+            "门冬胰岛素",
+            "甘精胰岛素",
+            "赖脯胰岛素",
+            "门冬胰岛素30",
+            "甲状腺",
+            "胰岛素",
+            "奥曲肽",
+            "赖脯胰岛素",
+            "生长抑素",
+            "特利加压素",
+            "奥曲肽",
+            "精蛋白生物合成人胰岛素",
+            "谷赖胰岛素",
+            "地特胰岛素",
+            "生长抑素",
+            "甲巯咪唑",
+            "鲑降钙素",
+            "赖脯胰岛素",
+            "利拉鲁肽",
+            "重组甘精胰岛素",
+            "精蛋白锌重组人胰岛素",
+            "赖脯胰岛素",
+            "黄体酮",
+            "地屈孕酮",
+            "重组人胰岛素",
+            "炔诺酮",
+            "特利加压素",
+            "戊酸雌二醇",
+            "重组人生长激素",
+            "生物合成人胰岛素",
+            "米非司酮",
+            "黄体酮",
+            "十一酸睾酮",
+            "精蛋白锌重组人胰岛素",
+            "丙硫氧嘧啶",
+            "黄体酮",
+            "重组人胰岛素",
+            "重组甘精胰岛素",
+            "鲑降钙素",
+            "甲羟孕酮",
+            "替勃龙",
+            "鲑降钙素",
+            "雷洛昔芬"
+    };*/
 }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03070.java

@@ -168,7 +168,7 @@ public class THR03070 extends QCCatalogue {
 
         if (sb.toString().length() > 0) {
             status.set("-1");
-            info.set("化验:" + sb.toString().substring(0, sb.toString().length() - 1));
+            info.set("化验" + sb.toString().substring(0, sb.toString().length() - 1));
         }
     }
 
@@ -193,7 +193,7 @@ public class THR03070 extends QCCatalogue {
     private void infoAppend(StringBuffer sb, String repNm, Map<String, String> abnormalMap) {
         for (Map.Entry<String, String> map : abnormalMap.entrySet()) {
             if (repNm.equals(map.getKey())) {
-                sb.append(repNm).append("(").append(DateUtil.formatDate(StringUtil.parseDateTime(map.getValue()))).append(")").append("");
+                sb.append(repNm).append("(").append(DateUtil.formatDateTime(StringUtil.parseDateTime(map.getValue()))).append(")").append("_");
             }
         }
     }

+ 8 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03071.java

@@ -54,7 +54,7 @@ public class THR03071 extends QCCatalogue {
 //            }
             String[] itemDiags = itemDiag.split(splitRegex);
             List<String> itemDiagList = Lists.newArrayList(itemDiags);
-            Set<String> itemDateList = Sets.newHashSet(DateUtil.formatDate(StringUtil.parseDateTime(itemDate)));
+            Set<String> itemDateList = Sets.newHashSet(itemDate);
             if (pacsMap.containsKey(itemName)) {
                 pacsMap.get(itemName).addAll(itemDiagList);
                 pacsDate.get(itemName).addAll(itemDateList);
@@ -100,7 +100,7 @@ public class THR03071 extends QCCatalogue {
 
         if (sb.toString().length() > 0) {
             status.set("-1");
-            info.set("检查:" + sb.toString().substring(0, sb.toString().length() - 1));
+            info.set("检查" + sb.toString().substring(0, sb.toString().length() - 1));
         }
     }
 
@@ -130,9 +130,12 @@ public class THR03071 extends QCCatalogue {
      * @param pacsDate
      */
     private void infoAppend(StringBuffer sb, String reptNm, Map<String, Set<String>> pacsDate) {
-        if (pacsDate.containsKey(reptNm)) {
-            for (String date : pacsDate.get(reptNm)) {
-                sb.append(reptNm).append("(").append(DateUtil.formatDate(StringUtil.parseDateTime(date))).append(")").append("、");
+        for (Map.Entry<String, Set<String>> map : pacsDate.entrySet()) {
+            if (reptNm.equals(map.getKey())) {
+                for (String date : map.getValue()) {
+                    String checkDate = DateUtil.formatDateTime(StringUtil.parseDateTime(date));
+                    sb.append(reptNm).append("(").append(checkDate).append(")").append("_");
+                }
             }
         }
     }

+ 6 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03076.java

@@ -81,7 +81,8 @@ public class THR03076 extends QCCatalogue {
             drugName = structMap.get("医嘱项目名称");
             value = structMap.get("医嘱单次剂量");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (extData != null && extData.containsKey(startDate) && extData.get(startDate).equals(drugName)) {
                 continue;   //THR02985  医嘱有抗生素使用病程无记录,规则中没报未记录的抗生素继续走这条规则,报未记录的抗生素过滤
             }
@@ -187,7 +188,7 @@ public class THR03076 extends QCCatalogue {
                             if (wardUsage.size() == 0) {
                                 match = true;
                             }
-                            adDateStr = DateUtil.formatDate(adDate);
+                            adDateStr = DateUtil.formatDateTime(adDate);
                             if (!match && wardUsage.size() > 0 && !sb.toString().contains(drugKey + "(" + adDateStr + ")")) {
                                 infoAppend(sb, ai.getKey(), adDateStr);
                                 break;
@@ -218,7 +219,8 @@ public class THR03076 extends QCCatalogue {
         for (Map<String, String> structMap : docAdvStruct) {
             drugName = structMap.get("医嘱项目名称");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (antibioticDateTimes.containsKey(drugName)) {
                 Map<Date, Integer> map = antibioticDateTimes.get(drugName);
                 if (map.containsKey(startDate)) {
@@ -257,7 +259,7 @@ public class THR03076 extends QCCatalogue {
      * @param date
      */
     private void infoAppend(StringBuffer sb, String drugKey, String date) {
-        sb.append(drugKey).append("(").append(date).append(")").append("");
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
     }
 
     /**

+ 5 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03077.java

@@ -80,8 +80,8 @@ public class THR03077 extends QCCatalogue {
             drugName = structMap.get("医嘱项目名称");
             value = structMap.get("医嘱单次剂量");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
-
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (StringUtil.isNotBlank(drugName)) {
                 if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
                     continue;   //一天内同一抗生素开过多次的抗生素直接过滤
@@ -269,7 +269,7 @@ public class THR03077 extends QCCatalogue {
                 dateList = drug.getValue();
                 for (String date_miss : dateList) {
                     String[] date_miss_nfo = date_miss.split("=");
-                    strBuf.append(DateUtil.formatDate(StringUtil.parseDateTime(date_miss_nfo[1]))).append(",").append(date_miss_nfo[2]).append("、");
+                    strBuf.append(DateUtil.formatDateTime(StringUtil.parseDateTime(date_miss_nfo[1]))).append(",").append(date_miss_nfo[2]).append("、");
                 }
             }
 
@@ -298,7 +298,8 @@ public class THR03077 extends QCCatalogue {
         for (Map<String, String> structMap : docAdvStruct) {
             drugName = structMap.get("医嘱项目名称");
             startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            startDate = StringUtil.parseDateTime(startDateStr);
             if (antibioticDateTimes.containsKey(drugName)) {
                 Map<Date, Integer> map = antibioticDateTimes.get(drugName);
                 if (map.containsKey(startDate)) {

+ 330 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03079.java

@@ -0,0 +1,330 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.SimilarityUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.entity.Drug;
+import com.lantone.qc.pub.model.label.DrugLabel;
+import com.lantone.qc.pub.model.label.LeaveHospitalLabel;
+import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @author HUJING
+ * @create 2020-09-18 14:23
+ * @desc 病程记录激素剂量与医嘱不一致
+ **/
+@Component
+public class THR03079 extends QCCatalogue {
+    @Autowired
+    SimilarityUtil similarityUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (doctorAdviceDocs.size() == 0 || threeLevelWardDocs.size() == 0) {
+            return;
+        }
+
+        Map<Date, String> extData = null;
+        if (outputInfo.getResult().get("THR02985") != null) {
+            extData = (Map<Date, String>) outputInfo.getResult().get("THR02985").get("extData");
+        }
+
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .map(DoctorAdviceDoc::getStructureMap)
+                .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("激素") && StringUtil.isNotBlank(x.get("一次使用数量")))
+                .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
+                .collect(Collectors.toList());
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+
+        //抗生素及开医嘱时间 <抗生素名,<抗生素用量,[抗生素使用时间...]>>
+        Map<String, Map<String, List<Double>>> antibioticInfo = Maps.newLinkedHashMap();
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        //记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
+        String drugName = null, value = null, startDateStr = null;
+        Date startDate = null;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            value = structMap.get("一次使用数量");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            if (extData != null && extData.containsKey(startDate) && extData.get(startDate).equals(drugName)) {
+                continue;   //THR02985  医嘱有抗生素使用病程无记录,规则中没报未记录的抗生素继续走这条规则,报未记录的抗生素过滤
+            }
+            if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+            }
+            collectAntibioticInfo(antibioticInfo, drugName, value, startDateStr);
+        }
+
+        //抗生素及开医嘱时间 <抗生素名,<抗生素用量,[抗生素使用时间...]>>
+        Map<String, Map<String, List<Double>>> antibioticWardInfo = Maps.newLinkedHashMap();
+        String dateStr = null;
+        /*********************************************首程治疗计划********************************************************/
+        if (firstCourseRecordDoc != null) {
+            DrugLabel drugLabel = firstCourseRecordDoc.getDrugLabel();
+            dateStr = firstCourseRecordDoc.getStructureMap().get("记录时间");
+            if (drugLabel != null && StringUtil.isNotBlank(dateStr)) {
+                List<Drug> drugs = drugLabel.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+        /*********************************************查房记录********************************************************/
+        if (threeLevelWardDocs.size() > 0) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            for (ThreeLevelWardDoc doc : allDoctorWradDocs) {
+                if (doc.getThreeLevelWardLabel().size() == 0) {
+                    continue;
+                }
+                dateStr = doc.getStructureMap().get("查房日期");
+                ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
+                List<Drug> drugs = label.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+        /**********************************************手术记录、术后首程************************************************/
+        if (operationDocs.size() > 0) {
+            //手术记录
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationRecordDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
+                    .collect(Collectors.toList());
+            operationRecordDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getOperationRecordLabel().getDrugs(), x.getStructureMap().get("病历日期")));
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationDiscussionDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("记录日期")))
+                    .collect(Collectors.toList());
+            operationDiscussionDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getOperationDiscussionLabel().getDrugs(), x.getStructureMap().get("记录日期")));
+        }
+        /*********************************************会诊结果单********************************************************/
+        /*if (consultationDocs.size() > 0) {
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
+                    .stream()
+                    .map(ConsultationDoc::getConsultationResultsDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
+                    .collect(Collectors.toList());
+            consultationResultsDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getConsultationResultLabel().getDrugs(), x.getStructureMap().get("会诊日期及时间")));
+        }*/
+        /*********************************************出院小结********************************************************/
+        if (leaveHospitalDoc != null) {
+            LeaveHospitalLabel leaveHospitalLabel = leaveHospitalDoc.getLeaveHospitalLabel();
+            dateStr = leaveHospitalDoc.getStructureMap().get("出院时间");
+            if (leaveHospitalLabel != null && StringUtil.isNotBlank(dateStr)) {
+                List<Drug> drugs = leaveHospitalLabel.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+
+        /**
+         * 1.医嘱中开了抗生素,查房记录中没有该抗生素,则医嘱中该抗生素出现过的所有时间都会提示出来
+         * 2.医嘱中开了抗生素,查房记录中有该抗生素:
+         *      2.1 医嘱中该抗生素某使用量(如50),查房记录中没有该使用量(如只有100),则医嘱中该抗生素使用量出现过的所有时间都会提示出来
+         *      2.2 医嘱中该抗生素某使用量(如50),查房记录中也有该使用量,对比这两个时间,若医嘱时间两天内的查房记录没有该使用量,则该医嘱时间会提示出来
+         */
+        StringBuffer sb = new StringBuffer();
+        String drugKey = null;
+        for (Map.Entry<String, Map<String, List<Double>>> ai : antibioticInfo.entrySet()) {
+            drugKey = ai.getKey();
+            drugKey = removeBracket(drugKey).replaceAll("[^\u4e00-\u9fa5]", "");
+            String drugStandardWord = similarityUtil.getDrugStandardWord(drugKey);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                drugKey = drugStandardWord;
+            }
+            if (antibioticWardInfo.containsKey(drugKey)) {
+                Map<String, List<Double>> adDateValue = ai.getValue();
+                Map<String, List<Double>> wardDateValue = antibioticWardInfo.get(drugKey);
+                for (Map.Entry<String, List<Double>> adMap : adDateValue.entrySet()) {
+                    boolean match = false;
+                    String adDateStr = adMap.getKey();
+                    Date adDate = StringUtil.parseDateTime(adDateStr);
+                    List<Double> adUsage = adMap.getValue();
+                    for (Map.Entry<String, List<Double>> wdvMap : wardDateValue.entrySet()) {
+                        String wardDateStr = wdvMap.getKey();
+                        Date wardDate = StringUtil.parseDateTime(wardDateStr);
+                        List<Double> wardUsage = wdvMap.getValue();
+                        if ((adDate.before(wardDate) && !CatalogueUtil.compareTime(adDate, wardDate, 48 * 60L))
+                                || (wardDate.before(adDate) && !CatalogueUtil.compareTime(wardDate, adDate, 24 * 60L))) {
+                            wardUsage.removeAll(adUsage);//比如adUsage有1.0、2.0,wardUsage中有2.0、3.0,removeAll之后wardUsage只剩3.0
+                            if (wardUsage.size() == 0) {
+                                match = true;
+                            }
+                            adDateStr = DateUtil.formatDate(adDate);
+                            if (!match && wardUsage.size() > 0 && !sb.toString().contains(drugKey + "(" + adDateStr + ")")) {
+                                infoAppend(sb, ai.getKey(), adDateStr);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (sb.toString().length() > 0) {
+            status.set("-1");
+            info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+        }
+    }
+
+    /**
+     * 记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+     *
+     * @param docAdvStruct
+     * @param antibioticDateTimes
+     */
+    private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
+        String drugName;
+        String startDateStr;
+        Date startDate;
+        Map<Date, Integer> antibioticDateTime;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            if (antibioticDateTimes.containsKey(drugName)) {
+                Map<Date, Integer> map = antibioticDateTimes.get(drugName);
+                if (map.containsKey(startDate)) {
+                    map.put(startDate, map.get(startDate) + 1);
+                } else {
+                    map.put(startDate, 0);
+                }
+            } else {
+                antibioticDateTime = Maps.newHashMap();
+                antibioticDateTime.put(startDate, 0);
+                antibioticDateTimes.put(drugName, antibioticDateTime);
+            }
+        }
+    }
+
+    private void getCourseDrugInfo(Map<String, Map<String, List<Double>>> antibioticWardInfo, List<Drug> drugs, String dateStr) {
+        for (Drug drug : drugs) {
+            String wardDrug = drug.getName();
+            wardDrug = removeBracket(wardDrug);
+            String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                wardDrug = drugStandardWord;
+            }
+            if (drug.getConsumption() != null) {
+                String consumption = drug.getConsumption().getName();
+                collectAntibioticInfo(antibioticWardInfo, wardDrug, consumption, dateStr);
+            }
+        }
+    }
+
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date) {
+        sb.append(drugKey).append("(").append(date).append(")").append("、");
+    }
+
+    /**
+     * 收集抗生素各种信息
+     *
+     * @param antibioticInfo 抗生素使用量及所有时间
+     * @param drugName       抗生素名称
+     * @param value          抗生素用量
+     * @param startDateStr   抗生素使用时间(医嘱开始时间或查房时间)
+     */
+    private void collectAntibioticInfo(Map<String, Map<String, List<Double>>> antibioticInfo, String drugName, String value, String startDateStr) {
+        Map<String, List<Double>> antibioticValueList = null;
+        double v = -1;
+        try {
+            v = Double.parseDouble(getNumber(value));
+        } catch (Exception e) {
+            System.out.println("THR03076:       " + drugName + ":" + value + "解析异常");
+        }
+        if (v < 0) {
+            return;
+        }
+        if (v > 100) {
+            v = v / 1000;
+        }
+        if (!antibioticInfo.containsKey(drugName)) {
+            //存该抗生素使用第1个值
+            antibioticValueList = Maps.newLinkedHashMap();
+            antibioticValueList.put(startDateStr, Lists.newArrayList(v));
+            antibioticInfo.put(drugName, antibioticValueList);
+        } else {
+            antibioticValueList = antibioticInfo.get(drugName);
+            //存该抗生素使用时间时第n个量
+            if (antibioticValueList.containsKey(startDateStr)) {
+                antibioticValueList.get(startDateStr).add(v);
+            } else {
+                //存该抗生素使用时间时第1个量
+                antibioticValueList.put(startDateStr, Lists.newArrayList(v));
+            }
+        }
+    }
+
+    public static String getNumber(String content) {
+        String group = "";
+        String compile = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9]|\\.\\d*[1-9]|0)";
+        Pattern p = Pattern.compile(compile);
+        Matcher matcher = p.matcher(content);
+        if (matcher.find()) {
+            group = matcher.group(0);
+        }
+        return group;
+    }
+
+    /**
+     * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
+     *
+     * @param str
+     * @return
+     */
+    private String removeBracket(String str) {
+        if (str.contains("]") && str.indexOf("]") != str.length() - 1) {
+            return str.substring(str.indexOf("]") + 1);
+        }
+        return str;
+    }
+
+    private static final List<String> filterKey = Lists.newArrayList("ACF", "ID", "IG", "IM", "IP", "IV",
+            "关节腔注射", "宫颈注射", "皮下注射", "皮下注射(儿童)", "皮下注射(免费)", "皮下注射(成人)", "皮内", "皮内注射",
+            "结膜下注射", "肌注", "肌肉注射(儿童)", "肌肉注射(公卫专用)", "肌肉注射(成人)", "胸腔注射", "腹腔内注射", "腹腔注射",
+            "静滴(儿童)", "静滴(成人)", "静脉注射", "静脉注射(儿童)", "静脉注射(免费)", "静脉注射(成人)", "静脉注射(泵)",
+            "静脉滴注", "静脉滴注(泵)", "鞘内注射");
+
+}

+ 48 - 3
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessDrug.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
 import com.lantone.qc.kernel.structure.ai.model.Lemma;
 import com.lantone.qc.pub.model.entity.*;
+import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -20,10 +21,15 @@ public class EntityProcessDrug extends EntityProcess {
         //药物
         List<Drug> drugs = new ArrayList<>();
         try {
-            List<Lemma> DrugLemmas = createEntityTree(aiOut, EntityEnum.DRUG.toString());
-            for (Lemma lemma : DrugLemmas) {
+            List<Lemma> drugLemmas = createEntityTree(aiOut, EntityEnum.DRUG.toString());
+            List<Lemma> consumptionLemmas = createEntityTree(aiOut, EntityEnum.CONSUMPTION.toString().split("-")[0]);
+            List<Lemma> usageWardRoundLemmas = createEntityTree(aiOut, EntityEnum.USAGE_WARD_ROUND.toString());
+            List<Lemma> frequencyLemmas = createEntityTree(aiOut, EntityEnum.FREQUENCY.toString());
+            List<Lemma> stopLemmas = createEntityTree(aiOut, EntityEnum.STOP.toString());
+            List<Lemma> reasonsForAntibioticLemmas = createEntityTree(aiOut, EntityEnum.REASONS_FOR_ANTIBIOTIC.toString());
+            for (Lemma lemma : drugLemmas) {
                 int lemmaPosition = Integer.parseInt(lemma.getPosition());
-                if (content.substring(Math.max(0, lemmaPosition - 10), lemmaPosition).contains("暂停")){
+                if (content.substring(Math.max(0, lemmaPosition - 10), lemmaPosition).contains("暂停")) {
                     continue;
                 }
                 Drug drug = new Drug();
@@ -33,6 +39,26 @@ public class EntityProcessDrug extends EntityProcess {
                 drug.setFrequency(findTAfter(lemma, new Frequency(), EntityEnum.FREQUENCY.toString()));
                 drug.setStop(findTAfter(lemma, new Stop(), EntityEnum.STOP.toString()));
                 drug.setReasonsForAntibiotic(findTAfter(lemma, new ReasonsForAntibiotic(), EntityEnum.REASONS_FOR_ANTIBIOTIC.toString()));
+                //用量
+                if (drug.getConsumption() == null) {
+                    drug.setConsumption(setDrugs(consumptionLemmas, lemma, new Consumption()));
+                }
+                //用法
+                if (drug.getUsageWardRound() == null) {
+                    drug.setUsageWardRound(setDrugs(usageWardRoundLemmas, lemma, new UsageWardRound()));
+                }
+                //频率
+                if (drug.getFrequency() == null) {
+                    drug.setFrequency(setDrugs(frequencyLemmas, lemma, new Frequency()));
+                }
+                //停用
+                if (drug.getStop() == null) {
+                    drug.setStop(setDrugs(stopLemmas, lemma, new Stop()));
+                }
+                //抗生素使用原因
+                if (drug.getReasonsForAntibiotic() == null) {
+                    drug.setReasonsForAntibiotic(setDrugs(reasonsForAntibioticLemmas, lemma, new ReasonsForAntibiotic()));
+                }
                 drugs.add(drug);
             }
         } catch (Exception e) {
@@ -41,4 +67,23 @@ public class EntityProcessDrug extends EntityProcess {
         }
         return drugs;
     }
+
+    /**
+     * 模型抓取抗生素信息为空的时候判断是否在20个字节之内
+     *
+     * @param Lemmas
+     * @param lemma
+     * @param t
+     * @return
+     * @throws Exception
+     */
+    private <T> T setDrugs(List<Lemma> Lemmas, Lemma lemma, T t) throws Exception {
+        for (Lemma lem : Lemmas) {
+            if (Integer.parseInt(lem.getPosition()) - Integer.parseInt(lemma.getPosition()) <= 20) {
+                BeanUtils.copyProperty(t, "name", lemma.getText());
+                return t;
+            }
+        }
+        return null;
+    }
 }