瀏覽代碼

1.邵逸夫质控规则修改及开发

hujing 5 年之前
父節點
當前提交
dbf4493ec2

+ 122 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH03047.java

@@ -0,0 +1,122 @@
+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.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BEH03047
+ * @Description : 初步诊断诊断依据不充分(暂只做高血压)
+ * @Author : 胡敬
+ * @Date: 2020-07-27 14:54
+ */
+@Component
+public class BEH03047 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        DiagLabel initialDiagLabel = inputInfo.getBeHospitalizedDoc().getInitialDiagLabel();
+        if (initialDiagLabel == null || StringUtil.isBlank(initialDiagLabel.getText())) {
+            return;
+        }
+
+        List<Diag> initDiags = initialDiagLabel.getDiags();
+        List<String> initDiagFilter = initDiags
+                .stream()
+                .map(Diag::getHospitalDiagName)
+                .filter(x -> StringUtil.isNotBlank(x) && x.contains("高血压"))
+                .collect(Collectors.toList());
+
+        if (initDiagFilter.size() > 0) {
+            String regex = "\\d+/\\d+mmHg";
+            List<Integer> highBlood = new ArrayList<>();
+            List<Integer> lowBlood = new ArrayList<>();
+
+            Map<String, String> beStructMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            //现病史取血压值
+            String presentText = beStructMap.get("现病史");
+            String bloodPressure = regularValue(presentText, regex);
+            saveBloodValue(highBlood, lowBlood, bloodPressure);
+
+            //生命体征取血压
+            String bloodValue = beStructMap.get("血压");
+            saveBloodValue(highBlood, lowBlood, bloodValue);
+
+            //专科检查
+            String special = beStructMap.get("专科检查");
+            bloodPressure = regularValue(special, regex);
+            saveBloodValue(highBlood, lowBlood, bloodPressure);
+
+            highBlood.sort(Comparator.reverseOrder());
+            lowBlood.sort(Comparator.reverseOrder());
+
+            Integer high = highBlood.get(0);//收缩压
+            Integer low = lowBlood.get(0);//舒张压
+
+            String diag = initDiagFilter.get(0);//高血压病2级
+            if (diag.contains("1")) {
+                if ((high > 160 || high < 140) && (low > 100 || low < 90)) {
+                    status.set("-1");
+                }
+            } else if (diag.contains("2")) {
+                if ((high > 180 || high < 160) && (low > 110 || low < 100)) {
+                    status.set("-1");
+                }
+            } else if (diag.contains("3")) {
+                if (high < 180 && low < 110) {
+                    status.set("-1");
+                }
+            }
+
+        }
+
+    }
+
+    /**
+     * 从血压值中取收缩压和舒张压(170/97mmHg)
+     *
+     * @param highBlood
+     * @param lowBlood
+     * @param bloodPressure
+     */
+    private void saveBloodValue(List<Integer> highBlood, List<Integer> lowBlood, String bloodPressure) {
+        if (StringUtil.isNotBlank(bloodPressure)) {
+            if (bloodPressure.contains("mmHg")) {
+                bloodPressure = bloodPressure.substring(0, bloodPressure.lastIndexOf("mmHg"));
+            }
+            String[] bloodValue = bloodPressure.split("/");
+            if (bloodValue.length == 2) {
+                highBlood.add(Integer.parseInt(bloodValue[0]));
+                lowBlood.add(Integer.parseInt(bloodValue[1]));
+            }
+        }
+    }
+
+    private String regularValue(String input, String regex) {
+        String value = "";
+        if (StringUtil.isNotBlank(input)) {
+            Pattern p = Pattern.compile(regex);
+            Matcher m = p.matcher(input);
+            if (m.find()) {
+                value = m.group(0);
+            }
+        }
+        return value;
+    }
+
+}

+ 18 - 8
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03045.java

@@ -1,17 +1,15 @@
 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.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @ClassName : FIRP03045
@@ -26,14 +24,26 @@ public class FIRP03045 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureExtMap() != null
-        && inputInfo.getDoctorAdviceDocs().size()>0) {
+                && inputInfo.getDoctorAdviceDocs().size() > 0) {
             List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
-            List<DoctorAdviceDoc> collect = doctorAdviceDocs.stream().filter(x -> x.getStructureMap().get("医嘱项目名称").contains("呼吸机")).collect(Collectors.toList());
-            List<String> collect1 = collect.stream().map(x -> x.getStructureMap().get("医嘱项目名称")).filter(x -> x != null && x.contains("呼吸机")).collect(Collectors.toList());
+            List<String> docAdviceElement = doctorAdviceDocs
+                    .stream()
+                    .map(x -> x.getStructureMap().get("医嘱项目名称"))
+                    .filter(x -> x != null && x.contains("呼吸机"))
+                    .collect(Collectors.toList());
+
             Map<String, Object> extMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
-            List<Map<String,String>> operationList =(List<Map<String,String>>) extMap.get("手术信息");
-            if(operationList.size()>0){
+            List<Map<String, String>> operationList = (List<Map<String, String>>) extMap.get("手术信息");
+            if (operationList != null && operationList.size() > 0) {
+                List<String> firstPageElement = operationList
+                        .stream()
+                        .map(x -> x.get("手术名称"))
+                        .filter(x -> StringUtil.isNotBlank(x) && x.contains("呼吸机"))
+                        .collect(Collectors.toList());
 
+                if (docAdviceElement.size() > 0 && firstPageElement.size() == 0) {
+                    status.set("-1");
+                }
             }
 
         }

+ 56 - 57
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03044.java

@@ -1,22 +1,19 @@
 package com.lantone.qc.kernel.catalogue.threelevelward;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 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.DoctorAdviceDoc;
 import com.lantone.qc.pub.model.doc.LisDoc;
-import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
-import com.lantone.qc.pub.model.entity.Lis;
-import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
-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.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -29,85 +26,88 @@ import java.util.stream.Collectors;
  */
 @Component
 public class THR03044 extends QCCatalogue {
-    public static Map<String, String> lisData = ImmutableMap.<String, String>builder().put("C—反应蛋白(CRP)","大于10mg/L")
-            .put("降钙素原检测","大于0.25ng/mL")
-            .put("白细胞计数(WBC)","小于0.4*11⁹/L")
-            .put("血培养及鉴定","细菌生长")
-            .put("痰培养及鉴定","细菌生长")
-            .put("尿培养加菌落计数","细菌生长")
-            .put("一般细菌涂片检查","细菌生长")
-            .put("内毒素鲎定性试验","阳性")
-            .put("常规药敏定性试验","阳性")
-            .put("细菌抗体测定","阳性")
-            .put("碱性磷酸酶染色","大于80分")
-            .put("红细胞沉降率测定(ESR)","大于25mm/h")
-            .put("肥达氏反应","≥1:160")
-            .put("外斐氏反应","≥1:160")
-            .put("尿白细胞计数","大于5个/高位视野")
-            .put("粪便白细胞","大于2个/高位视野")
-            .put("前列腺液白细胞","大于1个/高位视野")
-            .put("胸腹水细胞分类","白细胞计数大于500*10^6/L")
+    public static Map<String, String> lisData = ImmutableMap.<String, String>builder()
+            .put("C—反应蛋白(CRP)", "大于10mg/L")
+            .put("降钙素原检测", "大于0.25ng/mL")
+            .put("白细胞计数(WBC)", "小于0.4*11⁹/L")
+            .put("血培养及鉴定", "细菌生长")
+            .put("痰培养及鉴定", "细菌生长")
+            .put("尿培养加菌落计数", "细菌生长")
+            .put("一般细菌涂片检查", "细菌生长")
+            .put("内毒素鲎定性试验", "阳性")
+            .put("常规药敏定性试验", "阳性")
+            .put("细菌抗体测定", "阳性")
+            .put("碱性磷酸酶染色", "大于80分")
+            .put("红细胞沉降率测定(ESR)", "大于25mm/h")
+            .put("肥达氏反应", "大于等于1:160")
+            .put("外斐氏反应", "大于等于:160")
+            .put("尿白细胞计数", "大于5个/高位视野")
+            .put("粪便白细胞", "大于2个/高位视野")
+            .put("前列腺液白细胞", "大于1个/高位视野")
+            .put("胸腹水细胞分类", "白细胞计数大于500*10^6/L")
             .build();
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         List<LisDoc> lisDocs = inputInfo.getLisDocs();
-        if(doctorAdviceDocs.size() == 0 || lisDocs.size() == 0){
+
+        /*
+        if (doctorAdviceDocs.size() == 0 || lisDocs.size() == 0) {
             return;
         }
 
-        List<String> antibiotics = new ArrayList<>();
-        for (DoctorAdviceDoc doctorAdviceDoc:doctorAdviceDocs) {
-            Map<String, String> adviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-            if(adviceDocStructureMap != null){
-                if(adviceDocStructureMap.get("医嘱项目名称").contains("抗生素")){
-                    antibiotics.add(adviceDocStructureMap.get("医嘱项目名称"));
-                }
-            }
-        }
-        if(antibiotics.size() == 0){
+         */
+
+        Set<String> antibiotics = doctorAdviceDocs
+                .stream()
+                .map(x -> x.getStructureMap().get("药品类型"))
+                .filter(x -> StringUtil.isNotBlank(x) && x.contains("抗生素"))
+                .collect(Collectors.toSet());
+
+        if (antibiotics.size() == 0) {
             return;
         }
 
         List<String> lises = new ArrayList<>();
-        Map<String,String> lisReportMap = new HashMap<>();
+        Map<String, String> lisReportMap = new HashMap<>();
 
-        for (LisDoc lisDoc:lisDocs) {
+        for (LisDoc lisDoc : lisDocs) {
             Map<String, String> lisDocStructureMap = lisDoc.getStructureMap();
             String lisName = lisDocStructureMap.get("报告名称").trim();
             String result = lisDocStructureMap.get("检验结果");
-            lisReportMap.put(lisName,result);
-            if(!lises.contains(lisName)){
+            lisReportMap.put(lisName, result);
+            if (!lises.contains(lisName)) {
                 lises.add(lisName);
             }
 
         }
         //如果这个病例的化验项目不在lisData,不报
         Set<String> dataLises = lisData.keySet();
-        List<String> collect = dataLises.stream().collect(Collectors.toList());
+        List<String> collect = new ArrayList<>(dataLises);
         collect.retainAll(lises);
-        if(collect.size() == 0){
+        if (collect.size() == 0) {
             return;
         }
 
-        for (Map.Entry<String,String> lis:lisReportMap.entrySet()) {
+        for (Map.Entry<String, String> lis : lisReportMap.entrySet()) {
             String lisname = lis.getKey();
             String result = lis.getValue();
-            if(collect.contains(lisname)){
+            if (collect.contains(lisname)) {
                 String value = lisData.get(lisname);
                 String s = num_method(value);
                 System.out.println(s);
-                if(num_contain(result) && num_contain(s)){
-                    if(Float.parseFloat(result)>Float.parseFloat(s) && !value.contains("大于")){
+                if (num_contain(result) && num_contain(s)) {
+                    if (Float.parseFloat(result) > Float.parseFloat(s) && !value.contains("大于")) {
                         status.set("-1");
                         return;
                     }
-                    if(Float.parseFloat(result)<Float.parseFloat(s) && !value.contains("小于")){
+                    if (Float.parseFloat(result) < Float.parseFloat(s) && !value.contains("小于")) {
                         status.set("-1");
                         return;
                     }
-                }else {
-                    if(!result.equals(s)){
+                } else {
+                    if (!result.equals(s)) {
                         status.set("-1");
                         return;
                     }
@@ -118,21 +118,20 @@ public class THR03044 extends QCCatalogue {
         }
 
 
-
     }
-    public String num_method(String content){
-//        String compile = "(\\d+\\.\\d+)|(\\d+)";
+
+    public String num_method(String content) {
+        //        String compile = "(\\d+\\.\\d+)|(\\d+)";
         String compile = "(\\d+\\.\\d+)";
         Pattern p = Pattern.compile(compile);
         Matcher matcher = p.matcher(content);
-        boolean b = matcher.find();
         String group = matcher.group(1);
-        group = group == null? "":group;
+        group = group == null ? "" : group;
         return group;
     }
 
-    public Boolean num_contain(String content){
-//        String compile = "(\\d+\\.\\d+)|(\\d+)";
+    public Boolean num_contain(String content) {
+        //        String compile = "(\\d+\\.\\d+)|(\\d+)";
         String compile = "(\\d+)";
         Pattern p = Pattern.compile(compile);
         Matcher matcher = p.matcher(content);