Преглед изворни кода

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

rengb пре 5 година
родитељ
комит
4e41608a10

+ 15 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0010.java

@@ -5,7 +5,7 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.model.label.ChiefLabel;
-import org.apache.commons.lang3.StringUtils;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Arrays;
@@ -34,7 +34,17 @@ public class BEH0010 extends QCCatalogue {
             status.set("0");
             return;
         }
+        String chiefText = chiefLabel.getText();
+        if (StringUtil.isNotBlank(chiefText)) {
+            for (String word : containList) {
+                if (chiefText.contains(word)) {
+                    status.set("0");
+                    return;
+                }
+            }
+        }
         List<Diag> diags = chiefLabel.getDiags();
+        /*
         if (diags != null && diags.size() > 0) {
             Iterator<Diag> diagIterator = diags.iterator();
             while (diagIterator.hasNext()) {
@@ -48,13 +58,14 @@ public class BEH0010 extends QCCatalogue {
                 }
             }
         }
+         */
         if (diags != null && diags.size() > 0) {
             status.set("-1");
             for (Diag diag : diags) {
-                if (StringUtils.isEmpty(info.get())) {
-                    info.set(diag.getName());
+                if (StringUtil.isEmpty(info.get())) {
+                    info.set(diag.getHospitalDiagName());
                 } else {
-                    info.set(info.get() + "," + diag.getName());
+                    info.set(info.get() + "," + diag.getHospitalDiagName());
                 }
             }
         }

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

@@ -12,6 +12,7 @@ import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
 import java.util.List;
 
 
@@ -23,6 +24,9 @@ import java.util.List;
  */
 @Component
 public class BEH0014 extends QCCatalogue {
+    private List<String> containList = Arrays.asList("体检", "发现", "检查", "因", "确诊", "诊断", "复查", "术后"
+            , "药物", "误服", "查", "撞", "伤", "月经", "暴力", "超", "术");
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         if (inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
@@ -53,18 +57,18 @@ public class BEH0014 extends QCCatalogue {
                 }
             }
         }
-        //硬规则匹配 前30个字有"体检"或"发现"或"检查"字样
+        //硬规则匹配 前30个字有"体检"或"发现"或"检查"(containList)字样
         String present = presentLabel.getText();
         if (StringUtils.isNotEmpty(present)) {
             if (present.length() > 30) {
                 present = present.substring(0, 30);
             }
-            present = present.replaceAll("[\"“”]","");
-            if (present.contains("体检") || present.contains("发现") || present.contains("检查") || present.contains("因")
-                    || present.contains("确诊") || present.contains("诊断") || present.contains("复查") || present.contains("术后")
-                    || present.contains("药物") || present.contains("误服") || present.contains("查") || present.contains("撞") || present.contains("伤") || present.contains("月经")) {
-                status.set("0");
-                return;
+            present = present.replaceAll("[\"“”]", "");
+            for (String word : containList) {
+                if (present.contains(word)) {
+                    status.set("0");
+                    return;
+                }
             }
             //模型在现病史前30个字里能提出来疾病,那也可以算有诱因
             List<Diag> presentDiags = presentLabel.getDiags();

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC0097.java

@@ -22,6 +22,7 @@ import java.util.Map;
 public class DEAC0097 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        String outWay = inputInfo.getFirstPageRecordDoc().getStructureMap().get(Content.outWay);
         List<String> deathRecords = new ArrayList<>();
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         if (doctorAdviceDocs.size() == 0 ) {
@@ -32,7 +33,7 @@ public class DEAC0097 extends QCCatalogue {
                 deathRecords.add(dad.getStructureMap().get("医嘱项目名称"));
             }
         }
-        if(deathRecords != null && deathRecords.size()>0 && inputInfo.getDeathRecordDoc() == null){
+        if((deathRecords.size()>0 || outWay.contains("死亡")) && inputInfo.getDeathRecordDoc() == null){
             status.set("-1");
         }
         /*if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {

+ 12 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC0108.java

@@ -6,8 +6,10 @@ import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,11 +30,19 @@ public class DEAC0108 extends QCCatalogue {
             if (CatalogueUtil.isEmpty(outWay) || !outWay.contains("死亡")) {
                 return;
             }
-            if (((inputInfo.getDeathCaseDiscussDoc() == null || inputInfo.getDeathCaseDiscussDoc().getStructureMap().size() == 0)
+            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+            if (doctorAdviceDocs.size() == 0 ) {
+                return;
+            }
+            long count = doctorAdviceDocs.stream().filter(x -> x.getStructureMap().get("医嘱项目名称").contains("死亡")).count();
+            if((count>0 || outWay.contains("死亡")) && (inputInfo.getDeathCaseDiscussDoc() == null || inputInfo.getDeathCaseDiscussDoc().getStructureMap().size() == 0)){
+                status.set("-1");
+            }
+            /*if (((inputInfo.getDeathCaseDiscussDoc() == null || inputInfo.getDeathCaseDiscussDoc().getStructureMap().size() == 0)
             && outWay.contains("死亡")) || ((inputInfo.getDeathCaseDiscussDoc() == null || inputInfo.getDeathCaseDiscussDoc().getStructureMap().size() == 0)
             && deathRecordDoc != null)){
                 status.set("-1");
-            }
+            }*/
         }
     }
 }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0178.java

@@ -61,7 +61,7 @@ public class FIRP0178 extends QCCatalogue {
                 if (jsonArray.size() == 2) {
                     /* 相似度分数 */
                     double likeRate = jsonArray.getDoubleValue(1);
-                    if (likeRate > 0.9) {
+                    if (likeRate < 0.9) {
                         infoStr = CatalogueUtil.concatInfo(infoStr, leaveDiag);
                     }
                 }

+ 6 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0190.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
@@ -35,6 +36,10 @@ public class FIRP0190 extends QCCatalogue {
         int matchSum = 0, noRhSum = 0;
         for (ClinicalBloodDoc clinicalBloodDoc : clinicalBloodDocList) {
             String bloodType = clinicalBloodDoc.getStructureMap().get("输注种类、血型、数量");
+            if (StringUtil.isBlank(bloodType)) {
+                // 台州无“输注种类、血型、数量”,匹配“Rh血型”
+                bloodType = clinicalBloodDoc.getStructureMap().get("Rh血型");
+            }
             if (StringUtils.isEmpty(bloodType)) {
                 continue;
             }
@@ -49,7 +54,7 @@ public class FIRP0190 extends QCCatalogue {
             if (bloodType.contains(rh) ||
                     bloodType.contains(CatalogueUtil.removeSpecialChar(rhFactor))) {
                 matchSum++;
-                break;
+                return ;
             }
         }
         /* 如果所有输血记录都没有rh记录(阴、阳),则不报错 */

+ 1 - 23
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA02987.java

@@ -64,7 +64,7 @@ public class LEA02987 extends QCCatalogue {
 
         //没有包含的药品再次查看商品名或化学名在出院医嘱书写
         for (String drug : notContainsDrugs) {
-            Set<String> splitDrugs = getRegexWords(drug, "[((][^()()]+[))]");
+            Set<String> splitDrugs = CatalogueUtil.getRegexWords(drug, "[((\\[][^\\[\\]()()]+[\\]))]");
             boolean isFind = false;
             for (String sd : splitDrugs) {
                 if (dischargeOrder.contains(sd)){
@@ -81,26 +81,4 @@ public class LEA02987 extends QCCatalogue {
         }
     }
 
-
-    private Set<String> getRegexWords(String word, String regex) {
-        Set<String> ret = new HashSet<>();
-        if (StringUtil.isNotBlank(word) && StringUtil.isNotBlank(regex)) {
-            Pattern pattern = Pattern.compile(regex);
-            Matcher matcher = pattern.matcher(word);
-            if (matcher.find()) {
-                ret.add(matcher.group().replaceAll("[(())]", ""));
-                int startIndex = matcher.start();
-                int endIndex = matcher.end();
-                if (startIndex > 0) {
-                    ret.add(word.substring(0, startIndex));
-                }
-                if (endIndex <= word.length()) {
-                    ret.addAll(getRegexWords(word.substring(endIndex), regex));
-                }
-            } else {
-                ret.add(word);
-            }
-        }
-        return ret;
-    }
 }

+ 42 - 37
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0507.java

@@ -1,38 +1,43 @@
-package com.lantone.qc.kernel.catalogue.leavehospital;
-
-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.doc.DeathRecordDoc;
-import com.lantone.qc.pub.util.StringUtil;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.Map;
-
-/**
- * @Description: 无出院记录
- * 出院时间-入院时间 大于24小时 有出院记录 (死亡患者除外)
- * @author: 胡敬
- * @time: 2020/3/27 15:15
- */
-@Component
-public class LEA0507 extends QCCatalogue {
-    @Override
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        Map<String, String> pageMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
-        if (deathRecordDoc == null) {
-            String outDate = pageMap.get("出院时间");
-            String inDate = pageMap.get("入院时间");
-            Date infusionEndDate = StringUtil.parseDateTime(inDate);
-            Date recordDate = StringUtil.parseDateTime(outDate);
-
-            if (CatalogueUtil.compareTime(infusionEndDate, recordDate, 24 * 60L) && inputInfo.getLeaveHospitalDoc() == null) {
-                status.set("-1");
-            }
-        }
-    }
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @Description: 无出院记录
+ * 出院时间-入院时间 大于24小时 有出院记录 (死亡患者除外)
+ * @author: 胡敬
+ * @time: 2020/3/27 15:15
+ */
+@Component
+public class LEA0507 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            return;
+        }
+        Map<String, String> pageMap = firstPageRecordDoc.getStructureMap();
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if (deathRecordDoc == null) {
+            String outDate = pageMap.get("出院时间");
+            String inDate = pageMap.get("入院时间");
+            Date infusionEndDate = StringUtil.parseDateTime(inDate);
+            Date recordDate = StringUtil.parseDateTime(outDate);
+
+            if (CatalogueUtil.compareTime(infusionEndDate, recordDate, 24 * 60L) && inputInfo.getLeaveHospitalDoc() == null) {
+                status.set("-1");
+            }
+        }
+    }
 }

+ 10 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03026.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 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.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
@@ -23,18 +24,24 @@ import java.util.Map;
 @Component
 public class OPE03026 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 1.由于术后首程取到的手术时间无法精确到时分,所以去手术记录的手术结束时间取手术时间
+         * 2.由于目前operationDocs中的手术记录和术后首程对应不上,因此只判断手术记录只有一次的情况
+         */
         status.set("0");
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-        if (ListUtil.isEmpty(operationDocs)) {
+        if (ListUtil.isEmpty(operationDocs) || operationDocs.size() > 1) {
             return;
         }
         for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
             OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
-            if (operationDiscussionDoc == null) {
+            if (operationRecordDoc == null || operationDiscussionDoc == null) {
                 continue;
             }
+            Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
             Map<String, String> operationDiscussionStructureMap = operationDiscussionDoc.getStructureMap();
-            String operationDateStr = operationDiscussionStructureMap.get("手术日期");
+            String operationDateStr = operationRecordStructureMap.get("手术结束时间");
             String dateStr = operationDiscussionStructureMap.get("记录日期");
             if (CatalogueUtil.isEmpty(operationDateStr) || CatalogueUtil.isEmpty(dateStr)) {
                 continue;

+ 10 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03028.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 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.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
@@ -23,18 +24,24 @@ import java.util.Map;
 @Component
 public class OPE03028 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 1.由于术后首程取到的手术时间无法精确到时分,所以去手术记录的手术结束时间取手术时间
+         * 2.由于目前operationDocs中的手术记录和术后首程对应不上,因此只判断手术记录只有一次的情况
+         */
         status.set("0");
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-        if (ListUtil.isEmpty(operationDocs)) {
+        if (ListUtil.isEmpty(operationDocs) || operationDocs.size() > 1) {
             return;
         }
         for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
             OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
-            if (operationDiscussionDoc == null) {
+            if (operationRecordDoc == null || operationDiscussionDoc == null) {
                 continue;
             }
+            Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
             Map<String, String> operationDiscussionStructureMap = operationDiscussionDoc.getStructureMap();
-            String operationDateStr = operationDiscussionStructureMap.get("手术日期");
+            String operationDateStr = operationRecordStructureMap.get("手术结束时间");
             String dateStr = operationDiscussionStructureMap.get("记录日期");
             if (CatalogueUtil.isEmpty(operationDateStr) || CatalogueUtil.isEmpty(dateStr)) {
                 continue;

+ 20 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02985.java

@@ -7,12 +7,11 @@ import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * @ClassName : THR02985
@@ -48,13 +47,24 @@ public class THR02985 extends QCCatalogue {
             return;
         }
         String infoStr = "";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
             Date doctorAdviceDate = doctorAdviceDrug.getKey();
-            String drug = doctorAdviceDrug.getValue();
-            int matchSum = 0;
-            matchSum = getMatchSum(allDoctorWradDocs, doctorAdviceDate, drug, matchSum, 2);
-            if (matchSum == 0) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, drug);
+            Set<String> splitDrugs = CatalogueUtil.getRegexWords(doctorAdviceDrug.getValue(), "[((\\[][^\\[\\]()()]+[\\]))]");
+
+            boolean isFind = false;
+            for (String drug : splitDrugs) {
+                int matchSum = 0;
+                if (drug.equals("合资") || drug.equals("进口") || drug.equals("国产") ) {
+                    continue;
+                }
+                matchSum = getMatchSum(allDoctorWradDocs, doctorAdviceDate, drug, matchSum, 2);
+                if (matchSum > 0) {
+                    isFind = true;
+                }
+            }
+            if (!isFind) {
+                String.format(infoStr = CatalogueUtil.concatInfo(infoStr, doctorAdviceDrug.getValue() + "<医嘱时间>:" + sdf.format(doctorAdviceDate)));
             }
         }
 
@@ -70,7 +80,7 @@ public class THR02985 extends QCCatalogue {
         for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
             Map<String, String> wardDocStructureMap = threeLevelWardDoc.getStructureMap();
             String wardDateStr = wardDocStructureMap.get("查房日期");
-            String content = wardDocStructureMap.get("病情记录");
+            String content = wardDocStructureMap.get("病情记录") + wardDocStructureMap.get("治疗计划和措施");
             Date wardDate = StringUtil.parseDateTime(wardDateStr);
             if (doctorAdviceDate.before(wardDate) && !CatalogueUtil.compareTime(doctorAdviceDate, wardDate, days * 24 * 60L)) {
                 if (content.contains(drug)) {

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

@@ -69,7 +69,7 @@ public class THR02986 extends QCCatalogue {
         for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
             Map<String, String> wardDocStructureMap = threeLevelWardDoc.getStructureMap();
             String wardDateStr = wardDocStructureMap.get("查房日期");
-            String content = wardDocStructureMap.get("病情记录");
+            String content = wardDocStructureMap.get("病情记录") + wardDocStructureMap.get("治疗计划和措施");
             Date wardDate = StringUtil.parseDateTime(wardDateStr);
             if (doctorAdviceDate.before(wardDate) && !CatalogueUtil.compareTime(doctorAdviceDate, wardDate, days * 24 * 60L)) {
                 if (content.contains(drug)) {

+ 23 - 7
kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java

@@ -17,13 +17,7 @@ import lombok.Setter;
 import org.apache.commons.lang3.StringUtils;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -553,4 +547,26 @@ public class CatalogueUtil {
         return false;
     }
 
+    public static Set<String> getRegexWords(String word, String regex) {
+        Set<String> ret = new HashSet<>();
+        if (StringUtil.isNotBlank(word) && StringUtil.isNotBlank(regex)) {
+            Pattern pattern = Pattern.compile(regex);
+            Matcher matcher = pattern.matcher(word);
+            if (matcher.find()) {
+                ret.add(matcher.group().replaceAll("[\\[\\](())]", ""));
+                int startIndex = matcher.start();
+                int endIndex = matcher.end();
+                if (startIndex > 0) {
+                    ret.add(word.substring(0, startIndex));
+                }
+                if (endIndex <= word.length()) {
+                    ret.addAll(getRegexWords(word.substring(endIndex), regex));
+                }
+            } else {
+                ret.add(word);
+            }
+        }
+        return ret;
+    }
+
 }