Parcourir la source

1.邵逸夫质控规则开发

hujing il y a 5 ans
Parent
commit
c898fcf650

+ 50 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH03048.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.google.common.collect.Lists;
+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.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : BEH03048
+ * @Description : 入院记录体格检查与专科检查不一致
+ * @Author : 胡敬
+ * @Date: 2020-07-28 09:52
+ */
+@Component
+public class BEH03048 extends QCCatalogue {
+    private List<String> vitals = Lists.newArrayList("Murphy征", "麦氏点压痛");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        Map<String, String> beHospitalStructureMap = beHospitalizedDoc.getStructureMap();
+        String vitalLabelSpecial = beHospitalStructureMap.get("专科体格检查");
+        if (StringUtil.isBlank(vitalLabelSpecial)) {
+            return;
+        }
+        vitalLabelSpecial = vitalLabelSpecial.replace("墨菲氏征", "Murphy征");
+
+        for (String vital : vitals) {
+            String v = beHospitalStructureMap.get(vital);
+            if (StringUtil.isNotBlank(v)) {
+                v = vital + v;
+                if (vitalLabelSpecial.contains(vital) && !vitalLabelSpecial.contains(v)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+
+        }
+    }
+}

+ 73 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH03050.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.google.common.collect.Lists;
+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.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName : BEH03050
+ * @Description : 主诉与现病史发病部位不一致
+ * @Author : 胡敬
+ * @Date: 2020-07-28 09:52
+ */
+@Component
+public class BEH03050 extends QCCatalogue {
+    private List<String> positions = Lists.newArrayList("左上", "左下", "右上", "右下", "上", "下", "左", "右");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        ChiefLabel chiefLabel = beHospitalizedDoc.getChiefLabel();
+        PresentLabel presentLabel = beHospitalizedDoc.getPresentLabel();
+        if (chiefLabel == null || presentLabel == null) {
+            return;
+        }
+
+        List<String> chiefPosition = new ArrayList<>();
+        List<String> presentPosition = new ArrayList<>();
+
+        //取主诉有方位词的症状
+        String chiefText = chiefLabel.getText();
+        for (String position : positions) {
+            if (chiefText.contains(position)) {
+                chiefPosition.add(position);
+                chiefText = chiefText.replace(position, "");
+            }
+        }
+
+        //取现病史有方位词的症状
+        String presentText = presentLabel.getText();
+        for (String position : positions) {
+            if (presentText.contains(position)) {
+                presentPosition.add(position);
+                presentText = presentText.replace(position, "");
+            }
+        }
+
+        int matchNum = 0;
+        for (String chiefP : chiefPosition) {
+            for (String presentP : presentPosition) {
+                if (chiefP.equals(presentP)) {
+                    matchNum++;
+                    break;
+                }
+            }
+        }
+
+        if (matchNum == 0) {
+            status.set("-1");
+        }
+    }
+}

+ 94 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH03051.java

@@ -0,0 +1,94 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.google.common.collect.ImmutableMap;
+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.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.VitalLabelSpecial;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BEH03051
+ * @Description : 与诊断相关的主要体征未描述
+ * @Author : 胡敬
+ * @Date: 2020-07-28 09:52
+ */
+@Component
+public class BEH03051 extends QCCatalogue {
+    /**
+     * 暂时先整理出以下诊断的体征
+     * 用|分隔。
+     * |前面的是且的关系,每个都要有
+     * |后面的是或的关系,有一个就可以
+     */
+
+    Map<String, String> diagVital = ImmutableMap.<String, String>builder()
+            .put("急性阑尾炎", "右下腹/反跳痛|麦氏点/麦氏点压痛/阑尾点")
+            .put("冠状动脉粥样硬化性心脏病", "心率/律|瓣膜/二尖瓣/三尖瓣/主动脉瓣")
+            .build();
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+        VitalLabelSpecial vitalLabelSpecial = beHospitalizedDoc.getVitalLabelSpecial();
+        if (initialDiagLabel == null || vitalLabelSpecial == null) {
+            return;
+        }
+
+        String vitalSpecialText = vitalLabelSpecial.getText();
+        if (StringUtil.isBlank(vitalSpecialText)) {
+            return;
+        }
+
+        List<Diag> initDiags = initialDiagLabel.getDiags();
+        List<String> initDiagStrs = initDiags
+                .stream()
+                .map(Diag::getHospitalDiagName)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (initDiagStrs.size() == 0) {
+            return;
+        }
+        for (String initDiagStr : initDiagStrs) {
+            if (diagVital.containsKey(initDiagStr)) {
+                String vitals = diagVital.get(initDiagStr);
+                String[] vitalArr = vitals.split("\\|");
+                String vitalAnd = vitalArr[0];//体征且的关系,每个必须有
+                String vitalOr = vitalArr[1];//体征或的关系,有一个就行
+                for (String vital : vitalAnd.split("/")) {
+                    if (!vitalSpecialText.contains(vital)) {
+                        status.set("-1");
+                        info.set(vital);
+                        return;
+                    }
+                }
+                int existNum = 0;
+                for (String vital : vitalOr.split("/")) {
+                    if (vitalSpecialText.contains(vital)) {
+                        existNum++;
+                    }
+                }
+                if (existNum == 0) {
+                    status.set("-1");
+                    info.set(vitalOr.split("/")[0]);
+                    return;
+                }
+            }
+        }
+    }
+}