Browse Source

医嘱有激素使用病程无记录修改逻辑

huj 4 years atrás
parent
commit
1919ab536f

+ 88 - 32
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02986.java

@@ -2,6 +2,7 @@ package com.lantone.qc.kernel.catalogue.threelevelward;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.kernel.util.SimilarityUtil;
@@ -9,12 +10,10 @@ 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;
 import com.lantone.qc.pub.model.entity.Drug;
-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;
@@ -53,27 +52,34 @@ public class THR02986 extends QCCatalogue {
         if (allDoctorWradDocs.size() == 0) {
             return;
         }
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .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"))
+                .collect(Collectors.toList());
+
+        //记录同一天内是否开过多次同一激素
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        //记录同一激素同一天内是否开过多次,用于医嘱中需要处理的激素过滤(一天内同一激素开过多次的激素直接过滤)
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
         Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
-        for (DoctorAdviceDoc adviceDoc : doctorAdviceDocs) {
-            Map<String, String> adviceDocStructureMap = adviceDoc.getStructureMap();
-            String name = adviceDocStructureMap.get("医嘱项目名称");
-            String drugCategory = adviceDocStructureMap.get("药品类型");
-            String startDateStr = adviceDocStructureMap.get("医嘱开始时间");
-            if (StringUtil.isNotBlank(drugCategory) && drugCategory.contains("激素")) {
-                if (StringUtil.isNotBlank(name)) {
-                    if (Arrays.asList(KSS).contains(name)) {
-                        continue;
-                    }
-                    name = name.replaceAll("[针]", "");
-                    if (name.contains(" ")) {
-                        name = name.split(" ")[0];
-                    }
-                    Date startDate = StringUtil.parseDateTime(startDateStr);
-                    if (startDate != null) {
-                        startDate = DateUtil.dateZeroClear(startDate);
-                        doctorAdviceDrugMap.put(startDate, name);
-                    }
+        Date startDate = null;
+        for (Map<String, String> adviceDoc : docAdvStruct) {
+            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));
+                if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                    continue;   //一天内同一激素开过多次的激素直接过滤
+                }
+                doctorAdviceDrugMap.put(startDate, drugName);
             }
         }
 
@@ -128,7 +134,7 @@ public class THR02986 extends QCCatalogue {
         }
 
         //从会诊记录中获取信息
-        if (consultationDocs.size() > 0) {
+        /*if (consultationDocs.size() > 0) {
             List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
                     .stream()
                     .map(ConsultationDoc::getConsultationResultsDoc)
@@ -137,7 +143,7 @@ public class THR02986 extends QCCatalogue {
                     .collect(Collectors.toList());
             consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
             consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
-        }
+        }*/
 
         //从出院小结中获取信息
         if (leaveHospitalDoc != null) {
@@ -152,17 +158,23 @@ public class THR02986 extends QCCatalogue {
             }
         }
 
+        StringBuffer sb = new StringBuffer();
+        Map<Object, Object> data = Maps.newHashMap();
+        Set<String> existDrug = Sets.newHashSet();
         String infoStr = "";
         for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
             Date doctorAdviceDate = doctorAdviceDrug.getKey();
             String drugs = doctorAdviceDrug.getValue();
+            if (drugs.contains(" ")) {
+                drugs = drugs.split(" ")[0];
+            }
             drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
             Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
-                    .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产") && !x.contains("胰岛素")).collect(Collectors.toSet());
+                    .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
             /**********************************************先文本匹配************************************************/
             String missDrug = "";
             for (Map.Entry<String, Date> map : info.entrySet()) {
-                missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug);
+                missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug, existDrug);
                 //当前激素药(drugs)在info中已找到,直接跳出当前循环
                 if (StringUtil.isBlank(missDrug)) {
                     break;
@@ -195,12 +207,44 @@ public class THR02986 extends QCCatalogue {
             }
 
             if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
+                infoAppend(sb, splitDrugs.toString().replaceAll("[\\[\\]]", ""), DateUtil.formatDate(doctorAdviceDate));
+                data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
             }
         }
-        if (StringUtil.isNotBlank(infoStr)) {
+        if (StringUtil.isNotBlank(sb.toString())) {
             this.status.set("-1");
-            this.info.set(infoStr);
+            this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+            extData.set(data);
+        }
+    }
+
+    /**
+     * 记录同一激素同一天内是否开过多次,用于医嘱中需要处理的激素过滤(一天内同一激素开过多次的激素直接过滤)
+     *
+     * @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);
+            }
         }
     }
 
@@ -239,7 +283,7 @@ public class THR02986 extends QCCatalogue {
      * @param days
      * @return 如果文本中找到该药,则返回空字符串
      */
-    private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug) {
+    private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug, Set<String> existDrug) {
         if ("时间不匹配".equals(missDrug)) {
             missDrug = "";//初始化缺失药物
         }
@@ -252,9 +296,10 @@ public class THR02986 extends QCCatalogue {
                     continue;
                 }
                 if (content.contains(drug.replaceAll("[^\\u4e00-\\u9fa5]", ""))
-                        || regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
-                        || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前")) {
+                        || (existDrug.contains(drug) && (regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
+                        || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前")))) {
                     findDrug = true;
+                    existDrug.add(drug);
                     break;
                 } else {
                     missDrug = concatInfo(missDrug, drug);
@@ -325,7 +370,18 @@ public class THR02986 extends QCCatalogue {
         return str;
     }
 
-    private static final String[] KSS = {
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date) {
+        sb.append(drugKey).append("(").append(date).append(")").append(",");
+    }
+
+    private static final String[] JS = {
             "瑞格列奈片",
             "西格列汀片",
             "维格列汀片",