浏览代码

21版新增规则编写

zhanghang 3 年之前
父节点
当前提交
73bd4ba236
共有 28 个文件被更改,包括 1260 次插入45 次删除
  1. 12 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC03146.java
  2. 10 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF03148.java
  3. 76 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0085.java
  4. 96 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC03152.java
  5. 71 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03153.java
  6. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03154.java
  7. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03155.java
  8. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03156.java
  9. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03157.java
  10. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03158.java
  11. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03159.java
  12. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03160.java
  13. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03161.java
  14. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03162.java
  15. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03163.java
  16. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03164.java
  17. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03165.java
  18. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03166.java
  19. 41 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03167.java
  20. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03168.java
  21. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03137.java
  22. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03138.java
  23. 16 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03147.java
  24. 79 34
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03149.java
  25. 219 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03150.java
  26. 96 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03151.java
  27. 29 0
      public/src/main/java/com/lantone/qc/pub/Content.java
  28. 2 0
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouRescueDocTrans.java

+ 12 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC03146.java

@@ -4,6 +4,7 @@ import com.lantone.qc.dbanaly.util.KernelConstants;
 import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
 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 org.springframework.beans.factory.annotation.Autowired;
@@ -35,10 +36,20 @@ public class DEAC03146 extends QCCatalogue {
                 //其中有个字段为  职务-->科主任
                 String recordDoctor = deathCaseDiscussStructureMap.get("讨论主持人");
                 if (CatalogueUtil.isEmpty(recordDoctor)) {
-                    if(!findDirectorDoctor(recordDoctor)) {
+                   /* if(!findDirectorDoctor(recordDoctor)) {
                         status.set("-1");
+                    }*/
+                    Map<String, String> positionMap = Content.positionMap;
+                    for (String keyStr : positionMap.keySet()) {
+                        if(recordDoctor.contains(keyStr)){
+                            String position = positionMap.get(keyStr);
+                            if(position.equals("科室主任")){
+                                status.set("-1");
+                            }
+                        }
                     }
                 }
+
             }
         }
     }

+ 10 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF03148.java

@@ -2,6 +2,7 @@ package com.lantone.qc.kernel.catalogue.difficultcasediscuss;
 
 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.DifficultCaseDiscussDoc;
@@ -35,10 +36,15 @@ public class DIF03148 extends QCCatalogue {
                 if(CatalogueUtil.isEmpty(diisDate)){
                   return;
                 }
-                String professor = CatalogueUtil.getProfessor(diisDate);
-                if(!professor.contains("主任")){
-                    status.set("-1");
-                    return;
+                Map<String, String> positionMap = Content.positionMap;
+                for (String keyStr : positionMap.keySet()) {
+                    if(keyStr.equals(diisDate)){
+                        String valueStr = positionMap.get(keyStr);
+                        if(!valueStr.equals("科室主任")){
+                            status.set("-1");
+                            return;
+                        }
+                    }
                 }
 
             }

+ 76 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0085.java

@@ -6,17 +6,20 @@ import com.lantone.qc.kernel.catalogue.QCCatalogue;
 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.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.label.CaseCharacteristicLabel;
 import com.lantone.qc.pub.util.SpringContextUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.Map;
 
 /**
- * @ClassName : FIRC0082
- * @Description : 首次病程由非执业医师书写
+ * @ClassName : FIRC0085
+ * @Description : 未归纳出病史特点
  * @Author : rengb
  * @Date: 2020-03-06 17:28
  */
@@ -24,8 +27,76 @@ import java.util.Map;
 public class FIRC0085 extends QCCatalogue {
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-
+        /**
+         * 有病例特点四字,并该段内容包含病史,体格检查,辅助检查
+         *
+         * 1.在【首次病程录】文书找到【病例特点】四字,2.找是否有【病史(p1)】【体格检查(p2)】【辅助检查(p3)】,除病例特点外,缺失某项不扣分,均无扣10分
+         */
+        status.set("0");
+        boolean medicalHistory=false;
+        boolean physicalCheck=false;
+        boolean auxiliaryExamination=false;
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        if(firstCourseRecordDoc==null){
+            return;
+        }
+        List<String> physicalCheckList = Content.physicalCheckList;
+        List<String> auxiliaryExaminationList = Content.auxiliaryExaminationList;
+        String characteristics  = firstCourseRecordDoc.getStructureMap().get("病例特点");
+        String docText = firstCourseRecordDoc.getText();
+        CaseCharacteristicLabel caseCharacteristicLabel = firstCourseRecordDoc.getCaseCharacteristicLabel();
+        if(caseCharacteristicLabel!=null){
+            String text = caseCharacteristicLabel.getText();
+            if(StringUtil.isNotBlank(text)){
+                if(text.contains("病史")||text.contains("既往")){
+                    medicalHistory=true;
+                }
+                for (String physicalCheckStr: physicalCheckList) {
+                    if(text.contains(physicalCheckStr)){
+                        physicalCheck=true;
+                    }
+                }
+                for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                    if(text.contains(auxiliaryExaminationStr)){
+                        auxiliaryExamination=true;
+                    }
+                }
+            }
+        }
+        //去结构化数据种找
+        if(StringUtil.isNotBlank(characteristics)){
+            if(characteristics.contains("病史")||characteristics.contains("既往")){
+                medicalHistory=true;
+            }
+            for (String physicalCheckStr: physicalCheckList) {
+                if(characteristics.contains(physicalCheckStr)){
+                    physicalCheck=true;
+                }
+            }
+            for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                if(characteristics.contains(auxiliaryExaminationStr)){
+                    auxiliaryExamination=true;
+                }
+            }
+        }
+        if(StringUtil.isNotBlank(docText)){
+            if(docText.contains("病史")||docText.contains("既往")){
+                medicalHistory=true;
+            }
+            for (String physicalCheckStr: physicalCheckList) {
+                if(docText.contains(physicalCheckStr)){
+                    physicalCheck=true;
+                }
+            }
+            for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                if(docText.contains(auxiliaryExaminationStr)){
+                    auxiliaryExamination=true;
+                }
+            }
+        }
+        if(!medicalHistory&&!physicalCheck&&!auxiliaryExamination){
+            status.set("-1");
+            return;
+        }
     }
-
-
 }

+ 96 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC03152.java

@@ -0,0 +1,96 @@
+package com.lantone.qc.kernel.catalogue.firstcourserecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.label.CaseCharacteristicLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : FIRC0085
+ * @Description : 未归纳出病史特点
+ * @Author : rengb
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class FIRC03152 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 有病例特点四字,并该段内容包含病史,体格检查,辅助检查
+         *
+         * 1.在【首次病程录】文书找到【病例特点】四字,2.找是否有【病史(p1)】【体格检查(p2)】【辅助检查(p3)】,除病例特点外,缺失某项不扣分,均无扣10分
+         */
+        status.set("0");
+        boolean medicalHistory=false;
+        boolean physicalCheck=false;
+        boolean auxiliaryExamination=false;
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        if(firstCourseRecordDoc==null){
+            return;
+        }
+        List<String> physicalCheckList = Content.physicalCheckList;
+        List<String> auxiliaryExaminationList = Content.auxiliaryExaminationList;
+        String characteristics  = firstCourseRecordDoc.getStructureMap().get("病例特点");
+        String docText = firstCourseRecordDoc.getText();
+        CaseCharacteristicLabel caseCharacteristicLabel = firstCourseRecordDoc.getCaseCharacteristicLabel();
+        if(caseCharacteristicLabel!=null){
+            String text = caseCharacteristicLabel.getText();
+            if(StringUtil.isNotBlank(text)){
+                if(text.contains("病史")||text.contains("既往")){
+                    medicalHistory=true;
+                }
+                for (String physicalCheckStr: physicalCheckList) {
+                    if(text.contains(physicalCheckStr)){
+                        physicalCheck=true;
+                    }
+                }
+                for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                    if(text.contains(auxiliaryExaminationStr)){
+                        auxiliaryExamination=true;
+                    }
+                }
+            }
+        }
+        //去结构化数据种找
+        if(StringUtil.isNotBlank(characteristics)){
+            if(characteristics.contains("病史")||characteristics.contains("既往")){
+                medicalHistory=true;
+            }
+            for (String physicalCheckStr: physicalCheckList) {
+                if(characteristics.contains(physicalCheckStr)){
+                    physicalCheck=true;
+                }
+            }
+            for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                if(characteristics.contains(auxiliaryExaminationStr)){
+                    auxiliaryExamination=true;
+                }
+            }
+        }
+        if(StringUtil.isNotBlank(docText)){
+            if(docText.contains("病史")||docText.contains("既往")){
+                medicalHistory=true;
+            }
+            for (String physicalCheckStr: physicalCheckList) {
+                if(docText.contains(physicalCheckStr)){
+                    physicalCheck=true;
+                }
+            }
+            for (String auxiliaryExaminationStr: auxiliaryExaminationList) {
+                if(docText.contains(auxiliaryExaminationStr)){
+                    auxiliaryExamination=true;
+                }
+            }
+        }
+        if(!medicalHistory||!physicalCheck||!auxiliaryExamination){
+            status.set("-1");
+            return;
+        }
+    }
+}

+ 71 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03153.java

@@ -0,0 +1,71 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.model.doc.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : INVA03153
+ * @Description : 缺有创诊疗操作记录单
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03153 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<String> haveOperationList = Content.haveOperationList;
+        boolean flag=false;
+        if(ListUtil.isNotEmpty(doctorAdviceDocs)){
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                //取长期临时医嘱,不为作废医嘱
+                if(doctorAdviceDoc.getStructureMap()==null) {
+                    continue;
+                }
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String adviceType = doctorAdviceDocStructureMap.get(Content.doctorAdviceType);
+                if (StringUtil.isEmpty(adviceType)) {
+                    continue;
+                }
+                if (adviceType.equals(Content.standingOrder) || adviceType.equals(Content.statOrder)) {
+                    String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);
+                    if (StringUtil.isEmpty(adviceState)) {
+                        continue;
+                    }
+                    if (!Content.cancellationOrderList.contains(adviceState)) {
+                        String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
+                        if(StringUtil.isBlank(medicalOrderName)) {
+                            continue;
+                        }
+                        //判断医嘱是否包含有创
+                        for (String haveOperation : haveOperationList) {
+                            if(medicalOrderName.contains(haveOperation)){
+                                flag=true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if(flag){
+            status.set("-1");
+            //含有创操作患者,判断是否含记录单
+            List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+            if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+            }
+        }
+    }
+}

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03154.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.model.doc.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : INVA03154
+ * @Description : 有创诊疗操作记录单姓名未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03154 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String name = invasiveOperationDoc.getStructureMap().get("姓名");
+            if(StringUtil.isBlank(name)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03155.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03155
+ * @Description : 性别未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03155 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String sex = invasiveOperationDoc.getStructureMap().get("性别");
+            if(StringUtil.isBlank(sex)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03156.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03156
+ * @Description : 有创诊疗操作记录单科别未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03156 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String families = invasiveOperationDoc.getStructureMap().get("科别");
+            if(StringUtil.isBlank(families)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03157.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03157
+ * @Description : 床号未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03157 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String bed = invasiveOperationDoc.getStructureMap().get("床号");
+            if(StringUtil.isBlank(bed)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03158.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03158
+ * @Description : 有创诊疗操作记录单病案号未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03158 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String medicalRecord = invasiveOperationDoc.getStructureMap().get("病案号");
+            if(StringUtil.isBlank(medicalRecord)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03159.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03159
+ * @Description : 操作医师签名未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03159 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String operatingPhysician = invasiveOperationDoc.getStructureMap().get("操作医师签名");
+            if(StringUtil.isBlank(operatingPhysician)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03160.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03160
+ * @Description : 年龄未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03160 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String age = invasiveOperationDoc.getStructureMap().get("年龄");
+            if(StringUtil.isBlank(age)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03161.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03161
+ * @Description : 有创诊疗操作记录单入院时间未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03161 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String admissionTime = invasiveOperationDoc.getStructureMap().get("入院时间");
+            if(StringUtil.isBlank(admissionTime)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03162.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03162
+ * @Description : 操作名称未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03162 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String operationName = invasiveOperationDoc.getStructureMap().get("操作名称");
+            if(StringUtil.isBlank(operationName)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03163.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03163
+ * @Description : 操作时间未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03163 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String operationTime = invasiveOperationDoc.getStructureMap().get("操作日期");
+            if(StringUtil.isBlank(operationTime)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03164.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03164
+ * @Description : 术前准备未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03164 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String preoperativePreparation = invasiveOperationDoc.getStructureMap().get("术前准备");
+            if(StringUtil.isBlank(preoperativePreparation)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03165.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03165
+ * @Description : 操作步骤未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03165 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String steps = invasiveOperationDoc.getStructureMap().get("操作步骤");
+            if(StringUtil.isBlank(steps)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03166.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03166
+ * @Description : 患者一般情况未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03166 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String generalSituation = invasiveOperationDoc.getStructureMap().get("一般情况");
+            if(StringUtil.isBlank(generalSituation)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 41 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03167.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03167
+ * @Description : 患者有无不良反应未记录
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03167 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String adverseReactions = invasiveOperationDoc.getStructureMap().get("有无记录不良反应");
+            if(StringUtil.isBlank(adverseReactions)){
+                status.set("-1");
+                return;
+            }else {
+                if(adverseReactions.equals("flase")){
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+
+}

+ 36 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03168.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.kernel.catalogue.invasiveoperation;
+
+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.InvasiveOperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : INVA03168
+ * @Description : 术后注意事项未填写
+ * @Author : wsy
+ * @Date: 2021-01-07 13:39
+ */
+@Component
+public class INVA03168 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<InvasiveOperationDoc> invasiveOperationDocs = inputInfo.getInvasiveOperationDocs();
+        if(ListUtil.isEmpty(invasiveOperationDocs)||invasiveOperationDocs.size()==0){
+                return;
+        }
+        for (InvasiveOperationDoc invasiveOperationDoc : invasiveOperationDocs) {
+            String noteThatAfter = invasiveOperationDoc.getStructureMap().get("术后注意");
+            if(StringUtil.isBlank(noteThatAfter)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+
+}

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03137.java

@@ -44,6 +44,9 @@ public class THR03137 extends QCCatalogue {
                             if(!Content.cancellationOrderList.contains(adviceState)){
                                 //医嘱若是包含  转*科/科*转则为一个转科患者
                                 String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
+                                if(StringUtil.isBlank(medicalOrderName)) {
+                                    continue;
+                                }
                                 String rex1="[\\s\\S]*(?=转)[\\s\\S]{0,6}(?=科)[\\s\\S]*";
                                 String rex2="[\\s\\S]*(?=科)[\\s\\S]{0,6}(?=转)[\\s\\S]*";
                                 if(medicalOrderName.matches(rex1)||medicalOrderName.matches(rex2)) {

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03138.java

@@ -44,6 +44,9 @@ public class THR03138 extends QCCatalogue {
                             if(!Content.cancellationOrderList.contains(adviceState)){
                                 //医嘱若是包含  转*科/科*转则为一个转科患者
                                 String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
+                                if(StringUtil.isBlank(medicalOrderName)) {
+                                    continue;
+                                }
                                 String rex1="[\\s\\S]*(?=转)[\\s\\S]{0,6}(?=科)[\\s\\S]*";
                                 String rex2="[\\s\\S]*(?=科)[\\s\\S]{0,6}(?=转)[\\s\\S]*";
                                 if(medicalOrderName.matches(rex1)||medicalOrderName.matches(rex2)) {

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

@@ -32,7 +32,8 @@ public class THR03147 extends QCCatalogue {
         /**
          * 出院时间前48小时,48小时内找上级医师同意出院的病程记录
          *
-         * 以患者病案首页【出院时间】找前48小时内【查房记录】,查房记录标题或查房记录内容或医生签字包含【上级/主任/主治/主治及以上医师姓名】和查房记录内容包含【出院】同时存在
+         * 以患者病案首页【出院时间】找前48小时内【查房记录】,查房记录标题或查房记录内容或医生签字包含【/主任/主治/主治及以上医师姓名】和查房记录内容包含【出院】同时存在
+         * 医生签名加上审核医师和记录医师
          */
         status.set("0");
         if(inputInfo.getFirstPageRecordDoc()==null || inputInfo.getFirstPageRecordDoc().getStructureMap()==null){
@@ -124,6 +125,20 @@ public class THR03147 extends QCCatalogue {
                             break;
                         }
                     }
+                    //记录医师判断
+                    String recordsPhysicians = structureMap.get("记录医师");
+                    if (StringUtil.isNotEmpty(recordsPhysicians)) {
+                        for (String superior : superiorList) {
+                            if (recordsPhysicians.contains(superior)) {
+                                flag=true;
+                                break;
+                            }
+                        }
+                        if(judgeContainsDoctor(recordsPhysicians)){
+                            flag=true;
+                            break;
+                        }
+                    }
                 }
                 }
             }

+ 79 - 34
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03149.java

@@ -7,14 +7,12 @@ 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.model.doc.FirstCourseRecordDoc;
-import com.lantone.qc.pub.model.doc.RescueDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.*;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.SpringContextUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -36,51 +34,98 @@ public class THR03149 extends QCCatalogue {
         /**
          * 【抢救开始时间】时间延后6小时内,找标题为【主任*查房】或【主任级别的姓名查房】,若无报出
          *
-         * 1.先判断是否是抢救患者p6,并无【死亡记录】,是则找2.【抢救记录】内【抢救开始时间】标题或抢救过程中抢救开始时间延后6小时内
-         * 找标题为【主任*查房】或【主任级别的姓名查房】,若有不报,若无 3.去【首次病程记录/抢救记录】内找是否有包含【请示*上级医生/请示*上级医师】,若无报出
+         * 1.先判断是否是抢救患者p6,排除死亡患者p9,排除出院时间和抢救记录时间为同一天。2.找抢救时间p10,延后6小时内,是否有上级医师查房p11
+         * 若有不报,若无3.去【抢救记录】内找是否有包含【上级医师姓名/【主任】字段,若无报出
          *
-         * 判断该病人是否属于抢救病人  1.【临时医嘱/长期医嘱】包含【抢救】医嘱或2.【抢救记录】文书
+         * 符合下列情况的任意一种则成立:
+         * 1.病历包含【死亡记录】
+         * 2.【临时医嘱】包含【死亡】医嘱
+         *
+         * 符合下列情况的任意一种则成立:
+         * 1.【抢救记录】标题【抢救时间】
+         * 2.【抢救记录】抢救过程包含【抢救时间及措施】
+         *
+         * 【查房记录】标题为【主任*查房】或【主任级别的姓名查房】
          */
-        boolean flag = false;
+        status.set("0");
+        boolean falg=false;
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         List<RescueDoc> rescueDocs = inputInfo.getRescueDocs();
-        if(ListUtil.isNotEmpty(rescueDocs)){
-            flag=true;
+        //死亡记录不为空
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if(deathRecordDoc!=null){
+            return;
+        }
+        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
+
+        if(ListUtil.isNotEmpty(doctorAdviceDocs)){
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                //取长期临时医嘱,不为作废医嘱
+                if(doctorAdviceDoc.getStructureMap()==null) {
+                    continue;
+                }
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String adviceType = doctorAdviceDocStructureMap.get(Content.doctorAdviceType);
+                if (StringUtil.isEmpty(adviceType)) {
+                    continue;
+                }
+                if (adviceType.equals(Content.standingOrder) || adviceType.equals(Content.statOrder)) {
+                    String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);
+                    if (StringUtil.isEmpty(adviceState)) {
+                        continue;
+                    }
+                    if (!Content.cancellationOrderList.contains(adviceState)) {
+                        //死亡医嘱
+                        String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
+                        if(StringUtil.isBlank(medicalOrderName)) {
+                            continue;
+                        }
+                            if (medicalOrderName.contains("死亡")) {
+                                return;
+                            }
+                            if (medicalOrderName.contains("抢救")) {
+                                falg = true;
+                            }
+                    }
+                }
+            }
         }
         //为一个抢救患者
         if(ListUtil.isNotEmpty(rescueDocs)){
+            falg=true;
+        }
+        if(falg){
             //获取抢救时间
+            if(ListUtil.isEmpty(rescueDocs)){
+                return;
+            }
             for (RescueDoc rescueDoc : rescueDocs) {
                 String saveTime = rescueDoc.getStructureMap().get("抢救开始时间");
                 if(StringUtil.isBlank(saveTime)){
                     continue;
                 }
                 Date saveDate = StringUtil.parseDateTime(saveTime);
-                if(!getAllSaveDoctor(inputInfo,outputInfo,saveDate)){
-                    //去【首次病程记录/抢救记录】内找是否有包含【请示*上级医生/请示*上级医师】
-                }
-            }
-        }
+                if(medicalRecordInfoDoc!=null){
+                    //获取出院时间
+                    String leaveHospitalTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+                    if(StringUtil.isNotBlank(leaveHospitalTime)){
+                        Date leaveHospitalDate = StringUtil.parseDateTime(leaveHospitalTime);
+                        if(DateUtils.isSameDay(leaveHospitalDate, saveDate)){
+                            //出院和抢救记录为同一天则跳过
+                            continue;
+                        }
+                    }
 
-        if(ListUtil.isNotEmpty(doctorAdviceDocs)){
-            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.standingOrder) || adviceType.equals(Content.statOrder)) {
-                            String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);
-                            if (StringUtil.isNotEmpty(adviceState)) {
-                                if (!Content.cancellationOrderList.contains(adviceState)) {
-                                    //医嘱若是包含  转*科/科*转则为一个转科患者
-                                    String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
-                                    if (medicalOrderName.contains("抢救")) {
-                                        flag = true;
-                                        break;
-                                    }
-                                }
-                            }
+                }
+                if(getAllSaveDoctor(inputInfo,outputInfo,saveDate)){
+                    return;
+                }else {
+                    //去【抢救记录】内找是否有包含【上级医师姓名】/【主任】字段,若无报出
+                    String text = rescueDoc.getText();
+                    if(StringUtil.isNotBlank(text)){
+                        if(!text.contains("主任")&&!judgeContainsDoctor(text)){
+                            status.set("-1");
+                            return;
                         }
                     }
                 }

+ 219 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03150.java

@@ -0,0 +1,219 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+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.*;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03150
+ * @Description :  危重患者上级医师(副高及以上)查房记录不及时
+ * @Author : Mark
+ * @Date: 2020-04-07 17:06
+ */
+@Component
+public class THR03150 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 如果有未在6小时内完成的去首次病程里找有没有,请示**上级医生,字段,如果没有就算他未及时
+         *
+         * 1.先判断是否是危重患者p5,排除死亡患者p9,排除出院时间和病危时间为同一天。2.医嘱内下达【病危/病重】开始时间,延后6小时内,是否有上级医师查房p11,
+         *   若有不报,若无3.去【首次病程记录/抢救记录】内找是否有包含【上级医师姓名】/【主任】字段,若无报出
+         *p5
+         * 1.【临时医嘱/长期医嘱】包含【病危/病重】医嘱
+         * 或2.【病危通知书/病重通知书】文书
+         *p9
+         * 符合下列情况的任意一种则成立:
+         * 1.病历包含【死亡记录】
+         * 2.【临时医嘱】包含【死亡】医嘱
+         *p11
+         * 【查房记录】标题为【主任*查房】或【主任级别的姓名查房】
+         */
+        status.set("0");
+        boolean falg=false;
+        String doctorStartTime="";
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        //病危通知书
+        List<CriticallyIllNoticeDoc> criticallyIllNoticeDocs = inputInfo.getCriticallyIllNoticeDocs();
+        //病重通知书
+        List<SeriouslyIllNoticeDoc> seriouslyIllNoticeDocs = inputInfo.getSeriouslyIllNoticeDocs();
+        //死亡记录不为空
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if(deathRecordDoc!=null){
+            return;
+        }
+        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
+
+        if(ListUtil.isNotEmpty(doctorAdviceDocs)){
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                //取长期临时医嘱,不为作废医嘱
+                if(doctorAdviceDoc.getStructureMap()==null) {
+                    continue;
+                }
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String adviceType = doctorAdviceDocStructureMap.get(Content.doctorAdviceType);
+                if (StringUtil.isEmpty(adviceType)) {
+                    continue;
+                }
+                if (adviceType.equals(Content.standingOrder) || adviceType.equals(Content.statOrder)) {
+                    String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);
+                    if (StringUtil.isEmpty(adviceState)) {
+                        continue;
+                    }
+                    if (!Content.cancellationOrderList.contains(adviceState)) {
+                        //死亡医嘱
+                        String medicalOrderName = doctorAdviceDoc.getStructureMap().get(Content.medicalOrderName);
+                        if(StringUtil.isBlank(medicalOrderName)) {
+                            continue;
+                        }
+                        if (medicalOrderName.contains("死亡")) {
+                            return;
+                        }
+                        //医嘱中判断为病危病重患者
+                        if (medicalOrderName.contains("病危")||medicalOrderName.contains("病重")) {
+                            falg=true;
+                            //获取医嘱开始时间
+                            doctorStartTime = doctorAdviceDocStructureMap.get("医嘱开始时间");
+                            if(StringUtil.isBlank(doctorStartTime)){
+                                continue;
+                            }
+                            Date doctorStartDate = StringUtil.parseDateTime(doctorStartTime);
+                            //判断与出院时间是否为同一天
+                            if(medicalRecordInfoDoc!=null){
+                                //获取出院时间
+                                String leaveHospitalTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+                                if(StringUtil.isNotBlank(leaveHospitalTime)){
+                                    Date leaveHospitalDate = StringUtil.parseDateTime(leaveHospitalTime);
+                                    if(DateUtils.isSameDay(leaveHospitalDate, doctorStartDate)){
+                                        //出院和下达病危、病重为同一天则跳过
+                                        doctorStartTime="";
+                                        continue;
+                                    }else {
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if(ListUtil.isNotEmpty(criticallyIllNoticeDocs)||ListUtil.isNotEmpty(seriouslyIllNoticeDocs)){
+            //为一个病危病重患者
+            falg=true;
+            if(StringUtil.isBlank(doctorStartTime)){
+                if(ListUtil.isNotEmpty(criticallyIllNoticeDocs)){
+                    doctorStartTime = criticallyIllNoticeDocs.get(0).getStructureMap().get("审核日期");
+                }
+                if(ListUtil.isNotEmpty(seriouslyIllNoticeDocs)){
+                    doctorStartTime = seriouslyIllNoticeDocs.get(0).getStructureMap().get("审核日期");
+                }
+            }
+        }
+        if(falg){
+                if(StringUtil.isBlank(doctorStartTime)){
+                    return;
+                }
+                Date doctorStartDate = StringUtil.parseDateTime(doctorStartTime);
+                if(getAllSaveDoctor(inputInfo,outputInfo,doctorStartDate)){
+                    return;
+                }else {
+                    //去【抢救记录】内找是否有包含【上级医师姓名】/【主任】字段,若无报出
+                    List<RescueDoc> rescueDocs = inputInfo.getRescueDocs();
+                    if(ListUtil.isNotEmpty(rescueDocs)) {
+                        for (RescueDoc rescueDoc : rescueDocs) {
+                            String text = rescueDoc.getText();
+                            if (StringUtil.isNotBlank(text)) {
+                                if (!text.contains("主任") && !judgeContainsDoctor(text)) {
+                                    status.set("-1");
+                                    return;
+                                }
+                            }
+                        }
+                    }
+                    //首次病程录
+                    FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+                    if(firstCourseRecordDoc!=null){
+                        String text = firstCourseRecordDoc.getText();
+                        if (StringUtil.isNotBlank(text)) {
+                            if (!text.contains("主任") && !judgeContainsDoctor(text)) {
+                                status.set("-1");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+    //抢救6小时内 找标题为【主任*查房】或【主任级别的姓名查房】
+    public  boolean getAllSaveDoctor(InputInfo inputInfo, OutputInfo outputInfo,Date saveDate ) {
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if (ListUtil.isEmpty(threeLevelWardDocs)) {
+            return false;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        if (ListUtil.isEmpty(allDoctorWradDocs)) {
+            return false;
+        }
+        for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+            Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
+            String checkTime = structureMap.get("查房日期");
+            if(StringUtil.isBlank(checkTime)){
+                continue;
+            }
+            if (!CatalogueUtil.compareTime(
+                    saveDate,
+                    StringUtil.parseDateTime(checkTime),
+                    Long.valueOf(6 * 60))) {
+                //不大于抢救开始时间6小时内,取查房标题
+                String wardRoundTitle = structureMap.get("查房标题");
+                //【主任*查房】或【主任级别的姓名查房】
+                if(StringUtil.isBlank(wardRoundTitle)){
+                    continue;
+                }
+                if(wardRoundTitle.contains("主任")){
+                    return true;
+                }
+                if(judgeContainsDoctor(wardRoundTitle)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    //判断是否含有主任医师姓名
+    private boolean judgeContainsDoctor(String string) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return false;
+        }
+        for (String keyStr : hospitalDoctorMap.keySet()) {
+            if (string.contains(keyStr)) {
+                Object professor = hospitalDoctorMap.get(keyStr).get("professor");
+                if (professor != null) {
+                        if (professor.toString().contains("主任")) {
+                            return true;
+                        }
+                }
+            }
+        }
+        return false;
+    }
+}

+ 96 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03151.java

@@ -0,0 +1,96 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+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.MedicalRecordInfoDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03151
+ * @Description :  缺副高以上医师(医疗组长)查房记录
+ * @Author : Mark
+ * @Date: 2020-04-07 17:06
+ */
+@Component
+public class THR03151 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 首先确认住院天数是否超过72小时,然后取查房标题,判断标题是否为主任查房
+         *
+         * 确认住院天数已超过【72小时/3天】,【查房记录】内找标题为【主任*查房】或【主任级别的姓名查房】,若无报出
+         */
+        status.set("0");
+        boolean flag=false;
+        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
+        if (medicalRecordInfoDoc != null && medicalRecordInfoDoc.getStructureMap() != null) {
+            //入院日期
+            String admisTime = medicalRecordInfoDoc.getStructureMap().get("behospitalDate");
+            //出院日期
+            String dischargeTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+            if (CatalogueUtil.isEmpty(admisTime) || CatalogueUtil.isEmpty(dischargeTime)) {
+                return;
+            }
+            //如果住院天数小于2天则不判断该条规则
+            if (DateUtil.parseDate(dischargeTime) != null &&
+                    !CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (72 * 60))) {
+                return;
+            } else {
+               flag=true;
+            }
+        }
+        if(flag){
+            //判断查房
+            status.set("-1");
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+            if(ListUtil.isEmpty(threeLevelWardDocs)){
+                return;
+            }
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            if(ListUtil.isEmpty(allDoctorWradDocs)){
+                return;
+            }
+            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                String wardRoundTitle = allDoctorWradDoc.getStructureMap().get("查房标题");
+                if(StringUtil.isNotBlank(wardRoundTitle)){
+                    if(wardRoundTitle.contains("主任")||judgeContainsDoctor(wardRoundTitle)){
+                        status.set("0");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    //判断是否含有主任医师姓名
+    private boolean judgeContainsDoctor(String string) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return false;
+        }
+        for (String keyStr : hospitalDoctorMap.keySet()) {
+            if (string.contains(keyStr)) {
+                Object professor = hospitalDoctorMap.get(keyStr).get("professor");
+                if (professor != null) {
+                    if (professor.toString().contains("主任")) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+}

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

@@ -8,7 +8,9 @@
 package com.lantone.qc.pub;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class Content {
 
@@ -418,6 +420,33 @@ public class Content {
     public static List<String>  indicationsAboveList= Arrays.asList(
             "主任","主治","副主任"
     );
+    public static List<String>  physicalCheckList= Arrays.asList(
+            "体格检查","查体","体温","脉搏","呼吸","血压"
+    );
+    public static List<String>  auxiliaryExaminationList= Arrays.asList(
+            "辅助检查","辅检"
+    );
+    //台州有创目录
+    public static List<String>  haveOperationList= Arrays.asList(
+            "腰椎穿刺术","胸膜腔穿刺术","腹膜腔穿刺术","肝脏穿刺活体组织检查术","肝脏抽脓术","肺脏穿刺活体组织检查术",
+            "肾脏穿刺活体组织检查术","心包穿刺术","骨髓穿刺术","鼻窦置换疗法","中心静脉穿刺导管置入术","淋巴结穿刺术及活组织检查术",
+            "骨组织穿刺活检术","胃肠镜检查","胸腔闭式引流术","气管切开术","气管内插管术","支气管镜检查术","子宫镜检查术","诊断性刮宫术",
+            "膀胱镜检查术","体外震波碎石","尿道扩张术","腹水超滤回输","血液透析","食道电生理检查","食道静脉曲张硬化剂注射治疗","急性心梗急症溶栓治疗",
+            "胃底静脉曲张组织胶注射","内镜下食道静脉曲张套扎术","乳头切开手术(EST)","逆行胰导管造影(ERCP)","内镜下肉毒碱注射治疗",
+            "食道狭窄内镜下气囊扩张术","经窦道胆道镜取石","三腔两囊管压迫止血","内镜下高频电射频微波息肉切除术",
+            "血管造影","深静脉造影","经食道超声心动图","运动平板试验","化学治疗"
+    );
+    //台州职务目录
+    public static Map<String,String> positionMap=new HashMap<String, String>(){
+        {
+            put("罗建华","科室主任");
+            put("罗万余","科室主任");
+            put("潘君素","科室主任");
+            put("冯继红","科室主任");
+            put("花京剩","科室主任");
+            put("王宏刚","科室主任");
+        }
+    };
     //抗菌药物目录
     public static List<String> antimicrobialDrugList = Arrays.asList(
             "多西环素","二维四环素甲氧苄啶","复方四环素","复方四环素泼尼松","胍甲环素","美他环素","米诺环素","四环素","替加环素","土霉素","琥珀氯霉素","甲砜霉素","甲砜霉素甘氨酸酯","氯霉素",

+ 2 - 0
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouRescueDocTrans.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.model.doc.RescueDoc;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
 
 import java.util.List;
@@ -43,6 +44,7 @@ public class TaiZhouRescueDocTrans extends ModelDocTrans {
 
         RescueDoc rescueDoc = new RescueDoc();
         rescueDoc.setStructureMap(structureMap);
+        rescueDoc.setText(CommonAnalysisUtil.html2String(content));
         rescueDoc.setPageData((Map) structureMap);
 
         return rescueDoc;