Parcourir la source

Merge remote-tracking branch 'origin/hb/beilun' into hb/beilun

wangsy il y a 3 ans
Parent
commit
671a3360b8

+ 1 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0411.java

@@ -39,6 +39,7 @@ public class BEH0411 extends QCCatalogue {
         {
             case "1":                            //长兴
             case "2":
+            case "11":
                 return "记录日期";
             case "7":                            //厦门
                 return "记录日期";

+ 1 - 11
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0571.java

@@ -26,16 +26,6 @@ public class CLI0571 extends QCCatalogue {
             status.set("0");
             return;
         }
-        if (clinicalBloodDocs!=null && clinicalBloodDocs.size()>0){
-            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
-                Map<String, String> cliBStructureMap = cliB.getStructureMap();
-                //台州
-                if (StringUtils.isNotEmpty(cliBStructureMap.get("Rh血型"))) {
-                    status.set("0");
-                    return;
-                }
-            }
-        }
         if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
             for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
                 Map<String, String> cliBStructureMap = cliB.getStructureMap();
@@ -43,7 +33,7 @@ public class CLI0571 extends QCCatalogue {
                     String bloodType = cliBStructureMap.get("病历内容");
                     if (StringUtil.isNotBlank(bloodType)) {
                         if (bloodType.contains("Rh") || bloodType.contains("RH")
-                                || bloodType.contains("蛋白")) {
+                                || bloodType.contains("蛋白")) {
                             status.set("0");
                             return;
                         }

+ 145 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/preoperativediscussion/PRE0328.java

@@ -0,0 +1,145 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.preoperativediscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术患者无术前讨论记录
+ * @author: rengb
+ * @time: 2020/3/23 15:09
+ */
+@Component
+public class PRE0328 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        /**
+         * 1:如果急诊手术【入院时间-手术开始时间小于30分钟】则可不用写术前小结。
+         * 2:如果入院时间-手术开始时间小于30分钟,则术前讨论、术前小结次数+1。
+         * 3:如果手术记录次数(第一次手术的日期内有其他手术不算次数) 大于 术前讨论、术前小结次数,则出错
+         */
+        status.set("0");
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs == null || operationDocs.size() == 0) {
+            return;
+        }
+        boolean emergencyOperation = false;
+        if (inputInfo.getBeHospitalizedDoc() != null) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get("入院日期");
+            //取手术记录第一次手术开始时间和入院时间比较,相差30分钟内不报缺陷
+            OperationRecordDoc operationRecordDoc = operationDocs.get(0).getOperationRecordDoc();
+            String startTime = "";
+            if (operationRecordDoc != null) {
+                startTime = operationRecordDoc.getStructureMap().get("手术开始时间");
+            }
+            if(StringUtil.isBlank(startTime)){
+                startTime = operationRecordDoc.getStructureMap().get("手术日期").replace(" 时","时");
+            }
+            if (StringUtil.isNotBlank(startTime) && StringUtil.isNotBlank(admisTime) &&
+                    StringUtil.parseDateTime(startTime) != null) {
+                if (!CatalogueUtil.compareTime(
+                        StringUtil.parseDateTime(admisTime),
+                        StringUtil.parseDateTime(startTime),
+                        Long.valueOf(30))) {//入院到手术未超过30分钟,则可不用写术前小结
+                    emergencyOperation = true;
+                }
+            }
+        }
+
+        int i = getOperationSum(operationDocs); // 获取手术记录次数
+        int j = 0;  // 获取术前讨论、术前小结次数
+        for (OperationDoc operationDoc : operationDocs) {
+            if (operationDoc.getPreoperativeDiscussionDoc() != null) {
+                j++;
+            }
+        }
+        /* 如果入院时间-手术开始时间小于30分钟,则术前讨论、术前小结次数+1*/
+        if (emergencyOperation) {
+            if (j == 0) {
+                j++;
+            }
+        }
+        //医嘱中包含“冠状动脉造影术”,且无术前讨论.则报规则
+        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+            Map<String, String> doctorAdviceStructuerMap = doctorAdviceDoc.getStructureMap();
+            String advicename = doctorAdviceStructuerMap.get("医嘱项目名称");
+            if (StringUtil.isNotBlank(advicename) && advicename.contains("冠状动脉造影术") && j == 0) {
+                status.set("-1");
+                info.set("手术记录不一致");
+            }
+        }
+
+        if (i > 0 && i > j) {
+            status.set("-1");
+            info.set("手术记录不一致");
+        }
+    }
+
+    /**
+     * 获取手术记录次数
+     *
+     * @param operationDocs
+     * @return
+     */
+    private int getOperationSum(List<OperationDoc> operationDocs) {
+        List<Map<String, Date>> operationDateList = new ArrayList<>();
+        Map<String, Date> operationDate = null;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String operationStartDateStr = structureMap.get("手术开始时间");
+            if(StringUtil.isBlank(operationStartDateStr)){
+                operationStartDateStr = operationRecordDoc.getStructureMap().get("手术日期").replace(" 时","时");
+            }
+            if (StringUtil.isNotBlank(operationStartDateStr) && StringUtil.parseDateTime(operationStartDateStr) != null) {
+                Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                operationStartDate = DateUtil.dateZeroClear(operationStartDate);
+                if (operationStartDate != null) {
+                    /* 放第一个手术记录的日期到operationDateList */
+                    if (operationDateList.size() == 0) {
+                        operationDate = new HashMap<>();
+                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDateList.add(operationDate);
+                        continue;
+                    }
+                    /* 如果其中一个手术记录的开始时间到结束时间之间还包含另一个手术,就不往operationDateList里加 */
+                    boolean findInnerOperation = false;
+                    for (Map<String, Date> date : operationDateList) {
+                        Date listStartDate = DateUtil.dateZeroClear(date.get("手术开始时间"));
+                        if (listStartDate.equals(operationStartDate)) {
+                            findInnerOperation = true;
+                            break;
+                        }
+                    }
+                    if (!findInnerOperation) {
+                        operationDate = new HashMap<>();
+                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDateList.add(operationDate);
+                    }
+                }
+            }
+        }
+        return operationDateList.size();
+    }
+
+}

+ 15 - 16
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR0144.java

@@ -22,6 +22,7 @@ import java.util.Map;
 @Component
 public class THR0144 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
         MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
         if (medicalRecordInfoDoc != null && medicalRecordInfoDoc.getStructureMap() != null) {
             //入院日期
@@ -32,7 +33,6 @@ public class THR0144 extends QCCatalogue {
                 status.set("0");
                 return;
             }
-
             if (!CatalogueUtil.compareTime(
                     StringUtil.parseDateTime(admisTime),
                     StringUtil.parseDateTime(DateUtil.nowString()),
@@ -41,15 +41,15 @@ public class THR0144 extends QCCatalogue {
                 return;
             }
             //如果住院天数小于2天则不判断该条规则
-            if (DateUtil.parseDate(dischargeTime) != null &&
-                    !CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (48 * 60))) {
-                status.set("0");
+           if (DateUtil.parseDate(dischargeTime) != null &&
+                   !CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (48 * 60))) {
+               status.set("0");
                 return;
             } else {
-                if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+               if (inputInfo.getThreeLevelWardDocs().size() == 0) {
                     status.set("-1");
-                    return;
-                }
+                   return;
+               }
             }
         }
 
@@ -66,24 +66,23 @@ public class THR0144 extends QCCatalogue {
             status.set("0");
             return;
         }
-        int j = 0; //最后次查房记录
+        int j = 0; //最后次查房记录
         Boolean lastFlag = true;
-        for (int i = allDoctorWradDocs.size() - 1; i >= 0 && j < 2; i--) {
+        for (int i = allDoctorWradDocs.size() - 1; i >= 0 && j < 3; i--) {
             j++;
             ThreeLevelWardDoc lastWardDoc = allDoctorWradDocs.get(i);
             Map<String, String> structureMap = lastWardDoc.getStructureMap();
             String conditionRecord = structureMap.get("病情记录");
             String treatmentPlan = structureMap.get("治疗计划和措施");
             String title = structureMap.get("查房标题");
-            //|| title.contains("病理记录") || title.contains("病理诊断")
-            if (StringUtil.isBlank(title) || title.contains("病理报告") || title.contains("化验记录")) {
+            if (StringUtil.isBlank(title) || title.equals("病理报告") || title.equals("病理记录") || title.equals("化验记录")) {
                 continue;
             }
             conditionRecord = StringUtil.isBlank(conditionRecord) ? "" : conditionRecord;
             conditionRecord = conditionRecord.replace(" ", "");
             treatmentPlan = StringUtil.isBlank(treatmentPlan) ? "" : treatmentPlan;
             //主任或主治查房 标题需要包含“主任”或“主治”,内容需要包含“出院”
-            if ((conditionRecord.contains("出院") || conditionRecord.contains("转上级医院") || treatmentPlan.contains("出院"))
+            if ((!conditionRecord.contains("出院") || treatmentPlan.contains("出院") || conditionRecord.contains("转上级医院"))
                     && (CatalogueUtil.subTitle(title).contains(Content.attend)
                     || CatalogueUtil.subTitle(title).contains(Content.director)
                     || CatalogueUtil.subTitle(title).contains("主刀"))) {
@@ -91,15 +90,15 @@ public class THR0144 extends QCCatalogue {
                 return;
             }
             //普通查房 内容需要包含“上级”和“出院”
-            if (StringUtil.isBlank(title)
+            if (StringUtil.isNotBlank(title)
                     || (title.contains("日常查房记录") || title.contains("普通查房记录") || title.contains("日常病程记录"))
                     && (title.contains("上级") || conditionRecord.contains("上级"))
                     && (conditionRecord.contains("出院") || treatmentPlan.contains("出院"))) {
                 status.set("0");
                 return;
             }
-            // 添加硬规则,最后一个记录包含“医院”或 “离院”就不报错  || conditionRecord.contains("出院")
-            if (lastFlag==true) {
+            if (lastFlag == true) {
+                // 添加硬规则,最后一个记录包含“医院”或 “离院”就不报错
                 if (conditionRecord.contains("医院") || conditionRecord.contains("离院")) {
                     status.set("0");
                     return;
@@ -108,4 +107,4 @@ public class THR0144 extends QCCatalogue {
             }
         }
     }
-}
+}

+ 8 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR02900.java

@@ -52,21 +52,27 @@ public class THR02900 extends QCCatalogue {
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
             String opeAssName = structureMap.get("手术人员");
+            firstAssistant = structureMap.get("一助");
+            if(StringUtil.isBlank(firstAssistant)){
+                firstAssistant = structureMap.get("助手(一、二)");
+            }
             if (StringUtil.isNotBlank(opeAssName)) {
                 split = opeAssName.split(" ");
-                firstAssistant = structureMap.get("助手");
                 opeEndTime = structureMap.get("手术日期");
             } else {
-                firstAssistant = structureMap.get("一助");
                 //取得手术时间截取结束时间(格式 2020-07-24 10:30-2020-07-24 11:45)
                 String key = getKeyByHospitalId();
                 opeEndTime = structureMap.get(key);
                 opeEndTime = getTime(opeEndTime, structureMap);
             }
             String chiefSurgeon = structureMap.get("主刀医师");
+            if(StringUtil.isBlank(chiefSurgeon)){
+                chiefSurgeon = structureMap.get("手术者");
+            }
             if (opeEndTime.contains("年月日")) {
                 continue;
             }
+            opeEndTime = opeEndTime.replace(" 时","时");
             Date opeEndDate = CatalogueUtil.parseStringDate(opeEndTime);
             if (opeEndDate == null) {
                 continue;