Browse Source

修改规则 FIRP03231 输血反应填写错误

hecc 3 years ago
parent
commit
af887a6311

+ 161 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03238.java

@@ -0,0 +1,161 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.Regular;
+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.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : FIRP03231
+ * @Description :输血反应填写错误
+ * @Author : 贺聪聪
+ * @Date: 2022-8-8 10:32
+ */
+@Component
+public class FIRP03238 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+
+        if (inputInfo.getFirstPageRecordDoc() == null){
+            return;
+        }
+        //1.获取【首页>>输血反应】,若未填写则通过
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String bloodTransfusion = firstpageStructureMap.get("输血反应");
+            if (bloodTransfusion == null){
+                return;
+            }
+
+            Boolean flag = false;//默认无输血情况
+            //2.判断是否输血.
+            //2.1获取首页>>血费,若血费为大于0,则有事实输血
+            if (Integer.valueOf(firstpageStructureMap.get("血费")) >0){
+                flag = true;
+            }
+
+            //2.2【临时医嘱】获取包含【输*血/输*红细胞/输*白细胞/输*血小板/输*血浆//输*冷沉淀因子/全血*ml/血小板*ml/红细胞*ml/白细胞*ml/血浆*ml】任一的医嘱,
+            //且该条医嘱不含【透析/血*过滤/血*滤过/血*透/预约】任一,,排除处方类型为(化验/检验/检查)的且医嘱状态不为“作废”、“删除”、“取消”任一,则有事实输血。
+            Pattern ysx = Pattern.compile(Regular.PDZZ_YSX);
+            Pattern wsx = Pattern.compile(Regular.PDZZ_WSX);
+            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();//医嘱信息
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {//遍历医嘱信息
+                //取临时医嘱,不为作废医嘱
+                if(doctorAdviceDoc.getStructureMap()!=null){
+                    Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();//医嘱信息结构化
+                    String adviceType = doctorAdviceDocStructureMap.get(Content.doctorAdviceType);//获取医嘱类型类别
+                    if(StringUtil.isNotEmpty(adviceType)){
+                        if(adviceType.equals(Content.statOrder)){//类别包含临时医嘱
+                            String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);//获取医嘱状态判别
+                            if(StringUtil.isNotEmpty(adviceState)){
+                                if(!Content.cancellationOrderList.contains(adviceState)){//医嘱状态
+                                    String medicinalAdviceType = doctorAdviceDocStructureMap.get("医嘱处方类型");//获取医嘱处方类型
+                                    if (!(medicinalAdviceType.contains("化验") || medicinalAdviceType.contains("检验") || medicinalAdviceType.contains("检查"))){
+                                        String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);//获取医嘱项目名称结构化信息
+                                        if(StringUtil.isNotEmpty(medicalOrderName)) {
+                                            Matcher mYsx = ysx.matcher(medicalOrderName);
+                                            Matcher mWsx = wsx.matcher(medicalOrderName);
+                                            if((mYsx.find()) && (!mWsx.find())){
+                                                flag = true;
+                                                continue;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            //2.3查房记录内容可匹配正则【pdzz--是否存在输血事实的正则】,则有事实输血
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            if (threeLevelWardDocs != null || threeLevelWardDocs.size()>0) {
+                Pattern pattern = Pattern.compile(Regular.PDZZ_SXSS);
+                for (ThreeLevelWardDoc docs : threeLevelWardDocs){
+                    Matcher matcher = pattern.matcher(docs.getStructureMap().get("病情记录"));
+                    if (matcher.find()) {
+                        flag = true;
+                        continue;
+                    }
+                }
+            }
+            //2.4.该患者有【输血记录】病例文书,则有事实输血。
+            List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+            if (clinicalBloodDocs !=null && clinicalBloodDocs.size()>0) {
+                    flag = true;
+            }
+            //3.无输血情况,【首页>>输血反应】填写为【有/有反应/无/无反应/有输血无反应/-/-】则报出
+            if (!flag){
+                if (bloodTransfusion.contains("有") || bloodTransfusion.contains("有反应") || bloodTransfusion.contains("无")
+                    || bloodTransfusion.contains("无反应") || bloodTransfusion.contains("有输血无反应") || bloodTransfusion.contains("-") || bloodTransfusion.contains("-")){
+                    status.set("-1");
+                    return;
+                }
+            }
+            if (flag){
+                //4.存在输血情况,【首页>>输血反应】填写为【未输/未输血/无输血/-/-】则报出
+                if (bloodTransfusion.contains("未输") || bloodTransfusion.contains("未输血") || bloodTransfusion.contains("无输血")
+                   || bloodTransfusion.contains("-") || bloodTransfusion.contains("-")){
+                    status.set("-1");
+                    return;
+                }
+            }
+            /**
+            5.存在输血情况,查证病历中是否本次住院存在输血不良反应
+            5.1.查证该患者本次病历所有查房记录内容,有任一可匹配正则【pdzz--存在输血不良反应】,
+            5.2.查证该患者本次病历所有【输血*记录】文本值,有任一可匹配正则【pdzz--存在输血不良反应】,
+            以上任一成立,则说明本次住院存在输血不良反应
+            */
+            Boolean reper= false;//默认不存在不良反应
+            Pattern pattern = Pattern.compile(Regular.PDZZ_SXBLFY);
+            List<ThreeLevelWardDoc> allDoctorWradDoc = inputInfo.getThreeLevelWardDocs();//获取查房记录
+            for (ThreeLevelWardDoc allDoctorWrad : allDoctorWradDoc){
+                List<ThreeLevelWardDoc> allDoctorWradDocs = allDoctorWrad.getAllDoctorWradDocs();
+                for (ThreeLevelWardDoc docs : allDoctorWradDocs){
+                    Matcher matcher = pattern.matcher(docs.getStructureMap().get("病情记录"));
+                    if (matcher.find()){
+                        reper = true;
+                        continue;
+                    }
+                }
+            }
+            if (clinicalBloodDocs !=null && clinicalBloodDocs.size()>0){
+                for (ClinicalBloodDoc doc : clinicalBloodDocs){
+                    Matcher matcher = pattern.matcher(doc.getStructureMap().get("病历内容"));
+                    if (matcher.find()){
+                        reper = true;
+                        continue;
+                    }
+                }
+            }
+            //6.若本次住院存在输血不良反应,【首页>>输血反应】内容为【未输/未输血/无输血/-/-/有输血无反应/无/无反应】任一,则报规则。
+            if (reper){
+                if (bloodTransfusion.contains("未输") || bloodTransfusion.contains("未输血") || bloodTransfusion.contains("无输血") || bloodTransfusion.contains("-")
+                   || bloodTransfusion.contains("有输血无反应") || bloodTransfusion.contains("无") || bloodTransfusion.contains("无反应")){
+                    status.set("-1");
+                    return;
+                }
+            }
+            //7.若本次住院不存在输血不良反应,【首页>>输血反应】内容为【未输/未输血/无输血/-/-/有输血有反应/有/有反应】任一,则报规则。
+            if (!reper){
+                if (bloodTransfusion.contains("未输") || bloodTransfusion.contains("未输血") || bloodTransfusion.contains("无输血") || bloodTransfusion.contains("-")
+                   || bloodTransfusion.contains("有输血有反应") || bloodTransfusion.contains("有") || bloodTransfusion.contains("有反应")){
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 1 - 1
public/src/main/java/com/lantone/qc/pub/Content.java

@@ -376,7 +376,7 @@ public class Content {
     public static final String specimen = "标本";
     //医嘱状态
     public static List<String> cancellationOrderList = Arrays.asList(
-            "作废", "删除", "取消"
+            "作废", "删除", "取消","停止","已停止"
     );
     //医嘱中处方类型判断是否为手术
     public static List<String> operationList = Arrays.asList(

+ 50 - 0
public/src/main/java/com/lantone/qc/pub/Regular.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.pub;
+
+/**
+ * @Description :正则表达式
+ * @author hecc
+ * @data 2022/8/11  16:20
+ */
+public class Regular {
+
+    //是否存在输血事实的正则
+    public static String PDZZ_SXSS = "(?<!([未否无没不非]|排除)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非除]{0,10}((?:今|昨)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:输)" +
+            "[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:全血|红细胞|白细胞|血小板|血浆)[^。,;。,;未否无没不非]" +
+            "{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml|u|U)|(?:今|昨)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称" +
+            "|非对称)?[^。,;。,;未否无没不非]{0,10}(?:输)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml|u|U)" +
+            "[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:全血|红细胞|白细胞|血小板|血浆))(?!([^。,;。,;]{0,3}" +
+            "([::\\t](否|无|从不|从未|未发现|未见|未诉|没有)|(否|无|从不|从未|未发现|未见|未诉|没有)(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
+
+    //存在输血不良反应
+    public static String PDZZ_SXBLFY = "(?<!([未否无没不非]|排除|预防|防止)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除防]{0,10}(?:未知|未明|淹没|没药|不对称" +
+            "|非对称)?[^。,;。,;未否无没不非除防]{0,10}((?:输血反应|输血不良反应|不良输血反应)(?<!([未否无没不非]|排除|预防|防止)[^。,;。,;]{0,20})[^。,;。,;" +
+            "未否无没不非除防]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非除防]{0,10}(?:有|有不良反应|是|存在|阳性)|(?:输血反应|输血不良反应|" +
+            "不良输血反应|)(?<!([未否无没不非]|排除|预防|防止)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除防]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;" +
+            "未否无没不非除防]{0,10}(?:出现|发生|有|存在)(?<!([未否无没不非]|排除|预防|防止)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除防]{0,10}(?:未知|未明|淹没|没药" +
+            "|不对称|非对称)?[^。,;。,;未否无没不非除防]{0,10}(?:输血反应|输血不良反应|不良输血反应)|(?:输血后)(?<!([未否无没不非]|排除|预防|防止)[^。,;。,;]{0,20})" +
+            "[^。,;。,;未否无没不非除防]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非除防]{0,10}(?:出现|发生|有|存在)(?<!([未否无没不非]|排除|" +
+            "预防|防止)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除防]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非除防]{0,10}(?:不良反应|不适|热|" +
+            "寒战|水肿|痛|过敏|休克|溶血|衰|困难|胸闷|气促|气短|酸中毒|疹|心悸|心慌))(?!([^。,;。,;]{0,3}([::\\t](否|无|从不|从未|未发现|未见|未诉|没有)|(否|无|从不|" +
+            "从未|未发现|未见|未诉|没有)(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
+
+    //医嘱信息中有输血
+    public static String PDZZ_YSX = "(?<!([未否无没不非]|排除)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非除]{0,10}((?:输)" +
+            "[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:血)|(?:输)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非]{0,10}(?:红细胞)|(?:输)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:白细胞)|(?:输)[^。,;。,;未否无没不非]{0,10}" +
+            "(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:血小板)|(?:输)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:血浆)" +
+            "|(?:输)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:冷沉淀因子)|(?:全血)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)" +
+            "?[^。,;。,;未否无没不非]{0,10}(?:ml)|(?:血小板)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml)|(?:红细胞)[^。,;。,;未否无没不非]{0,10}" +
+            "(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml)|(?:白细胞)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml)|" +
+            "(?:血浆)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:ml))(?!([^。,;。,;]{0,3}([::\\t](否|无|从不|从未|未发现|未见|未诉|没有)|" +
+            "(否|无|从不|从未|未发现|未见|未诉|没有)(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
+
+    //医嘱信息中无输血
+    public static String PDZZ_WSX = "(?<!([未否无没不非]|排除)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非除]{0,10}((?:透析)|(?:血)" +
+            "[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:过滤)|(?:血)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非]{0,10}(?:滤过)|(?:血)[^。,;。,;未否无没不非]{0,10}(?:未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:透)|(?:预约))(?!([^。,;。,;]{0,3}([::\\t]" +
+            "(否|无|从不|从未|未发现|未见|未诉|没有)|(否|无|从不|从未|未发现|未见|未诉|没有)(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
+
+
+
+}