Browse Source

1.医嘱与病程记录抗生素剂量不一致,若医嘱中记录,在病程中匹配到剂量一致,若在病程中再有不一致也不会报
2.病程中抗生素记录不规范,完全从病程中抓取抗生素,与医嘱无关

huj 4 years ago
parent
commit
eacfa26652

+ 5 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03076.java

@@ -173,6 +173,7 @@ public class THR03076 extends QCCatalogue {
                 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();
@@ -183,8 +184,11 @@ public class THR03076 extends QCCatalogue {
                         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 (wardUsage.size() > 0 && !sb.toString().contains(drugKey + "(" + adDateStr + ")")) {
+                            if (!match && wardUsage.size() > 0 && !sb.toString().contains(drugKey + "(" + adDateStr + ")")) {
                                 infoAppend(sb, ai.getKey(), adDateStr);
                                 break;
                             }

+ 43 - 203
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03077.java

@@ -7,7 +7,6 @@ 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;
@@ -24,9 +23,9 @@ import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -41,79 +40,14 @@ public class THR03077 extends QCCatalogue {
 
     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) {
-            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("已停止"))
-                .filter(x -> StringUtil.isNotBlank(x.get("给药方式")) && x.get("给药方式").contains("静脉滴注"))
-                .filter(x -> StringUtil.isNotBlank(x.get("医嘱频率")) && !x.get("医嘱频率").equals("ONCE"))
-                .collect(Collectors.toList());
-
-        //抗生素及开医嘱时间(包括加用过抗生素的时间)     key:抗生素名    "2020-08-20,2020-08-21 ..."
-        Map<String, List<String>> antibioticDate = Maps.newHashMap();
-        //抗生素加用集合   key:抗生素名    value:  0:未加用,1及以上:加用次数
-        Map<String, Integer> antibioticStatus = Maps.newHashMap();
-        //抗生素及各初始剂量     key:抗生素名    value:抗生素第一次使用时剂量
-        Map<String, List<Double>> antibioticValue = Maps.newHashMap();
-        //记录同一天内是否开过多次同一抗生素
-        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
-        String drugName = null, value = null, startDateStr = null;
-        Date startDate = null;
-        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
-        for (Map<String, String> structMap : docAdvStruct) {
-            drugName = structMap.get("医嘱项目名称");
-            value = structMap.get("医嘱单次剂量");
-            startDateStr = structMap.get("医嘱开始时间");
-            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
-            if (Arrays.asList(KSS).contains(drugName)) {
-                continue;
-            }
-            if (extData != null && extData.containsKey(startDate) && extData.get(startDate).equals(drugName)) {
-                continue;   //THR02985  医嘱有抗生素使用病程无记录,规则中没报未记录的抗生素继续走这条规则,报未记录的抗生素过滤
-            }
-            if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
-                continue;   //一天内同一抗生素开过多次的抗生素直接过滤
-            }
-            collectAntibioticInfo(antibioticDate, antibioticStatus, antibioticValue, drugName, value, startDateStr);
-        }
-
-        //把抗生素使用剂量没变化过的抗生素删除
-        antibioticStatus.forEach((x, y) -> {
-            if (y == 0) {
-                antibioticDate.remove(x);
-                antibioticValue.remove(x);
-            }
-        });
-        //把同一天内同一个抗生素开过多次的抗生素删除
-//        antibioticDateTimes.forEach((x, y) -> {
-//            if (y > 0) {
-//                antibioticDate.remove(x);
-//                antibioticValue.remove(x);
-//            }
-//        });
-        //抗生素加用过的集合如果为空,则一个抗生素都没有加用过,直接返回0
-        if (antibioticDate.size() == 0) {
-            return;
-        }
 
         //病程记录中没有用量的抗生素及查房时间       key:抗生素名    "2020-08-20,2020-08-21 ..."
-        Map<String, List<String>> antibioticDateCourse = Maps.newHashMap();
+        Map<String, Map<String, List<String>>> antibioticDateCourse = Maps.newHashMap();
         String dateStr = null;
         /*********************************************首程治疗计划********************************************************/
         if (firstCourseRecordDoc != null) {
@@ -122,7 +56,8 @@ public class THR03077 extends QCCatalogue {
             if (drugLabel != null && StringUtil.isNotBlank(dateStr)) {
                 List<Drug> drugs = drugLabel.getDrugs();
                 getCourseDrugInfo(antibioticDateCourse, dateStr, drugs,
-                        CatalogueUtil.structureMapJoin(firstCourseRecordDoc.getStructureMap(), Lists.newArrayList("治疗计划")));
+                        CatalogueUtil.structureMapJoin(firstCourseRecordDoc.getStructureMap(), Lists.newArrayList("治疗计划")),
+                        "首次病程录");
             }
         }
         /*********************************************查房记录********************************************************/
@@ -136,7 +71,8 @@ public class THR03077 extends QCCatalogue {
                 ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
                 List<Drug> drugs = label.getDrugs();
                 getCourseDrugInfo(antibioticDateCourse, dateStr, drugs,
-                        CatalogueUtil.structureMapJoin(doc.getStructureMap(), Lists.newArrayList("病情记录", "治疗计划和措施")));
+                        CatalogueUtil.structureMapJoin(doc.getStructureMap(), Lists.newArrayList("病情记录", "治疗计划和措施")),
+                        "查房记录");
             }
         }
         /*********************************************手术记录、术后首程************************************************/
@@ -149,7 +85,8 @@ public class THR03077 extends QCCatalogue {
                     .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
                     .collect(Collectors.toList());
             operationRecordDocs.forEach(x -> getCourseDrugInfo(antibioticDateCourse, x.getStructureMap().get("病历日期"), x.getOperationRecordLabel().getDrugs()
-                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术经过"))));
+                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术经过")),
+                    "手术记录"));
             List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
                     .stream()
                     .map(OperationDoc::getOperationDiscussionDoc)
@@ -157,7 +94,8 @@ public class THR03077 extends QCCatalogue {
                     .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("记录日期")))
                     .collect(Collectors.toList());
             operationDiscussionDocs.forEach(x -> getCourseDrugInfo(antibioticDateCourse, x.getStructureMap().get("记录日期"), x.getOperationDiscussionLabel().getDrugs()
-                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术经过", "治疗计划和措施"))));
+                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术经过", "治疗计划和措施")),
+                    "术后首次病程录"));
         }
         /*********************************************会诊结果单********************************************************/
         /*if (consultationDocs.size() > 0) {
@@ -177,11 +115,10 @@ public class THR03077 extends QCCatalogue {
             if (leaveHospitalLabel != null && StringUtil.isNotBlank(dateStr)) {
                 List<Drug> drugs = leaveHospitalLabel.getDrugs();
                 getCourseDrugInfo(antibioticDateCourse, dateStr, drugs
-                        , CatalogueUtil.structureMapJoin(leaveHospitalDoc.getStructureMap(), Lists.newArrayList("诊治经过", "出院带药")));
+                        , CatalogueUtil.structureMapJoin(leaveHospitalDoc.getStructureMap(), Lists.newArrayList("诊治经过", "出院带药")),
+                        "出院小结");
             }
         }
-        //将病程日期排序
-        antibioticDateCourse.forEach((x, y) -> y.sort(Comparator.naturalOrder()));
 
         /**
          * 1.antibioticDate:从医嘱中取   key:抗生素名    value:医嘱中该抗生素所有剂量变化的时间(包括初始使用时间)
@@ -189,71 +126,33 @@ public class THR03077 extends QCCatalogue {
          * 3.医嘱中该抗生素初始使用时间往后两天内,查房记录中出现该抗生素并且该抗生素没有用量,报出该抗生素
          */
         StringBuffer sb = new StringBuffer();
-        String drugKey = null, start = null, change = null, wardStartStr = null, wardChangeStr = null;
+        String source = null, drugKey = null;
         List<String> dateList = null;
-        for (Map.Entry<String, List<String>> ad : antibioticDate.entrySet()) {
-            drugKey = ad.getKey();
-            drugKey = removeBracket(drugKey).replaceAll("[^\u4e00-\u9fa5]", "");
-            String drugStandardWord = similarityUtil.getDrugStandardWord(drugKey);
-            if (StringUtil.isNotBlank(drugStandardWord)) {
-                drugKey = drugStandardWord;
-            }
-            if (antibioticDateCourse.containsKey(drugKey)) {
-                dateList = ad.getValue();
-                List<String> wardDateStr = antibioticDateCourse.get(drugKey);
-                for (int i = 0; i < dateList.size(); i++) {
-                    start = dateList.get(i);        //抗生素开医嘱时间
-                    Date adStart = DateUtil.dateZeroClear(StringUtil.parseDateTime(start));
-                    for (int j = 0; j < wardDateStr.size(); j++) {
-                        wardStartStr = wardDateStr.get(j);         //查房记录开抗生素时间
-                        wardStartStr = wardStartStr.split("=")[0];
-                        Date wardStart = StringUtil.parseDateTime(wardStartStr);
-                        if ((adStart.before(wardStart) && !CatalogueUtil.compareTime(adStart, wardStart, 48 * 60L))
-                                || (wardStart.before(adStart) && !CatalogueUtil.compareTime(wardStart, adStart, 24 * 60L))) {
-                            infoAppend(sb, ad.getKey(), start, wardDateStr.get(j).split("=")[1]);
-                            break;
-                        }
-                    }
+        for (Map.Entry<String, Map<String, List<String>>> ad : antibioticDateCourse.entrySet()) {
+            source = ad.getKey();
+            Map<String, List<String>> drugInfo = ad.getValue();
+            sb.append(source).append("(");
+            for (Map.Entry<String, List<String>> drug : drugInfo.entrySet()) {
+                drugKey = drug.getKey();
+                sb.append(drugKey).append(":");
+                dateList = drug.getValue();
+                for (String date_miss : dateList) {
+                    String[] date_missInfo = date_miss.split("=");
+                    sb.append(DateUtil.formatDate(StringUtil.parseDateTime(date_missInfo[0]))).append(",").append(date_missInfo[1]).append("、");
                 }
             }
+            sb.deleteCharAt(sb.length() - 1);
+            sb.append(")").append("、");
         }
 
         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);
-            }
-        }
     }
 
+
     /**
      * 收集各模块药品信息
      *
@@ -261,7 +160,7 @@ public class THR03077 extends QCCatalogue {
      * @param dateStr            记录日期
      * @param drugs              模型提取出的药品列表
      */
-    private void getCourseDrugInfo(Map<String, List<String>> antibioticDateWard, String dateStr, List<Drug> drugs, String content) {
+    private void getCourseDrugInfo(Map<String, Map<String, List<String>>> antibioticDateWard, String dateStr, List<Drug> drugs, String content, String source) {
         StringBuffer sb = null;
         for (Drug drug : drugs) {
             sb = new StringBuffer();
@@ -272,10 +171,6 @@ public class THR03077 extends QCCatalogue {
                 continue;
             }
             wardDrug = removeBracket(wardDrug);
-            String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
-            if (StringUtil.isNotBlank(drugStandardWord)) {
-                wardDrug = drugStandardWord;
-            }
             if (drug.getConsumption() == null) {
                 concatInfo(dateStr, sb, "用量");
             }
@@ -286,10 +181,17 @@ public class THR03077 extends QCCatalogue {
                 concatInfo(dateStr, sb, "频率");
             }
             if (sb.toString().length() > 0) {
-                if (antibioticDateWard.containsKey(wardDrug)) {
-                    antibioticDateWard.get(wardDrug).add(sb.toString());
+                if (antibioticDateWard.containsKey(source)) {
+                    Map<String, List<String>> drugData = antibioticDateWard.get(source);
+                    if (drugData.containsKey(wardDrug)) {
+                        drugData.get(wardDrug).add(sb.toString());
+                    } else {
+                        drugData.put(wardDrug, Lists.newArrayList(sb.toString()));
+                    }
                 } else {
-                    antibioticDateWard.put(wardDrug, Lists.newArrayList(sb.toString()));
+                    Map<String, List<String>> drugData = Maps.newHashMap();
+                    drugData.put(wardDrug, Lists.newArrayList(sb.toString()));
+                    antibioticDateWard.put(source, drugData);
                 }
             }
         }
@@ -309,69 +211,6 @@ public class THR03077 extends QCCatalogue {
         }
     }
 
-    /**
-     * 收集抗生素各种信息
-     *
-     * @param antibioticDate   抗生素使用所有时间
-     * @param antibioticStatus 抗生素用量改变状态
-     * @param antibioticValue  抗生素及用量
-     * @param drugName         抗生素名称
-     * @param value            抗生素用量
-     * @param startDateStr     抗生素使用时间(医嘱开始时间或查房时间)
-     */
-    private void collectAntibioticInfo(Map<String, List<String>> antibioticDate, Map<String, Integer> antibioticStatus,
-                                       Map<String, List<Double>> antibioticValue, String drugName, String value, String startDateStr) {
-        double v = -1;
-        try {
-            v = Double.parseDouble(getNumber(value));
-        } catch (Exception e) {
-            System.out.println("THR03077:       " + drugName + ":" + value + "解析异常");
-        }
-        if (v < 0) {
-            return;
-        }
-        if (v > 100) {
-            v = v / 1000;
-        }
-        if (!antibioticValue.containsKey(drugName)) {
-            antibioticValue.put(drugName, Lists.newArrayList(v));
-            antibioticDate.put(drugName, Lists.newArrayList(startDateStr));
-            antibioticStatus.put(drugName, 0);
-        } else {
-            //1.如果抗生素剂量有变化,则记录该抗生素开始时间
-            List<Double> beforeValue = antibioticValue.get(drugName);
-            if (beforeValue.get(beforeValue.size() - 1) != v) {
-                beforeValue.add(v);
-                antibioticValue.put(drugName, beforeValue);//添加该抗生素更大的值
-                antibioticStatus.put(drugName, antibioticStatus.get(drugName) + 1);
-                antibioticDate.get(drugName).add(startDateStr);
-                return;
-            }
-            //2.如果抗生素剂量两次开启的时间间隔相差3天,也记录该抗生素开始时间
-            List<String> currentAntibioticDate = antibioticDate.get(drugName);
-            if (currentAntibioticDate.size() > 0) {
-                String lastDate = currentAntibioticDate.get(currentAntibioticDate.size() - 1);
-                if (CatalogueUtil.compareTime(StringUtil.parseDateTime(lastDate), StringUtil.parseDateTime(startDateStr), 72 * 60L)) {
-                    beforeValue.add(v);
-                    antibioticValue.put(drugName, beforeValue);//添加该抗生素值
-                    antibioticStatus.put(drugName, antibioticStatus.get(drugName) + 1);
-                    antibioticDate.get(drugName).add(startDateStr);
-                }
-            }
-        }
-    }
-
-    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;
-    }
-
     /**
      * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
      *
@@ -389,11 +228,12 @@ public class THR03077 extends QCCatalogue {
      * 拼接提示信息
      *
      * @param sb
+     * @param source
      * @param drugKey
      * @param date
      */
-    private void infoAppend(StringBuffer sb, String drugKey, String date, String missType) {
-        sb.append(drugKey).append("(").append(DateUtil.formatDate(StringUtil.parseDateTime(date)))
+    private void infoAppend(StringBuffer sb, String source, String drugKey, String date, String missType) {
+        sb.append(drugKey).append("(").append(source).append(",").append(DateUtil.formatDate(StringUtil.parseDateTime(date)))
                 .append(",").append(missType).append(")").append("、");
     }