Parcourir la source

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

chengyao il y a 3 ans
Parent
commit
29e8adf10c
39 fichiers modifiés avec 2597 ajouts et 14 suppressions
  1. 72 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC03146.java
  2. 58 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathrecord/DEAR03145.java
  3. 53 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF03148.java
  4. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF0554.java
  5. 86 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0085.java
  6. 107 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC03152.java
  7. 71 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03153.java
  8. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03154.java
  9. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03155.java
  10. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03156.java
  11. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03157.java
  12. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03158.java
  13. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03159.java
  14. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03160.java
  15. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03161.java
  16. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03162.java
  17. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03163.java
  18. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03164.java
  19. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03165.java
  20. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03166.java
  21. 41 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03167.java
  22. 36 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/invasiveoperation/INVA03168.java
  23. 5 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03119.java
  24. 73 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03142.java
  25. 53 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03143.java
  26. 68 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03144.java
  27. 47 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE03141.java
  28. 48 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0575.java
  29. 95 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0580.java
  30. 81 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03137.java
  31. 5 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03138.java
  32. 201 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03139.java
  33. 191 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03140.java
  34. 172 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03147.java
  35. 190 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03149.java
  36. 219 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03150.java
  37. 96 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03151.java
  38. 50 2
      public/src/main/java/com/lantone/qc/pub/Content.java
  39. 2 0
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouRescueDocTrans.java

+ 72 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathcasediscuss/DEAC03146.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.kernel.catalogue.deathcasediscuss;
+
+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;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : DEAC03146
+ * @Description :  死亡病例讨论未由科主任主持讨论
+ * @Author :kwz
+ * @Date: 2021-08-23 15:38
+ */
+@Component
+public class DEAC03146 extends QCCatalogue {
+    /**
+     * 死亡病例讨论记录存在       【主任人】为科室主任姓名
+     * @param inputInfo
+     * @param outputInfo
+     */
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getDeathCaseDiscussDoc() != null) {
+            Map<String, String> deathCaseDiscussStructureMap = inputInfo.getDeathCaseDiscussDoc().getStructureMap();
+            if(deathCaseDiscussStructureMap!=null) {
+                //其中有个字段为  职务-->科主任
+                String recordDoctor = deathCaseDiscussStructureMap.get("讨论主持人");
+                if (CatalogueUtil.isEmpty(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");
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+    }
+    //判断姓名是否为科室主任
+    private boolean findDirectorDoctor(String recordDoctor) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return false;
+        }
+        if (hospitalDoctorMap.containsKey(recordDoctor)) {
+            Object professor = hospitalDoctorMap.get(recordDoctor).get("professor");
+            if (professor != null) {
+                if(professor.toString().contains("主任")) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}

+ 58 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathrecord/DEAR03145.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.kernel.catalogue.deathrecord;
+
+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.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @ClassName : DEAR03145
+ * @Description : 死亡记录未由上级医师(主治及以上)签名
+ * 主治及以上-----主治,主任,副主任
+ * @Author : 胡敬
+ * @Date: 2020-03-18 18:38
+ */
+@Component
+public class DEAR03145 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getDeathRecordDoc() == null) {
+            status.set("0");
+            return;
+        }
+        Map<String, String> deathRecordStructure = inputInfo.getDeathRecordDoc().getStructureMap();
+        String recordDoctor = deathRecordStructure.get("审核人");
+        if (StringUtil.isNotBlank(recordDoctor)) {
+            if (findDirectorDoctor(recordDoctor)) {
+                status.set("0");
+            }
+        }
+    }
+
+    private boolean findDirectorDoctor(String recordDoctor) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return false;
+        }
+        if (hospitalDoctorMap.containsKey(recordDoctor)) {
+            Object professor = hospitalDoctorMap.get(recordDoctor).get("professor");
+            if (professor != null) {
+                if(professor.toString().contains("主治")||professor.toString().contains("主任")||professor.toString().contains("副主任")) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}

+ 53 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF03148.java

@@ -0,0 +1,53 @@
+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;
+import com.lantone.qc.pub.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : DIF03148
+ * @Description : 	疑难病例讨论未由科主任组织讨论
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:2
+ */
+@Component
+public class DIF03148 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 疑难病例讨论主任人为科主任姓名      【疑难病例讨论记录】主持人填写处是科主任姓名
+         */
+        status.set("0");
+        List<DifficultCaseDiscussDoc> difficultCaseDiscussDocs = inputInfo.getDifficultCaseDiscussDocs();
+        if(ListUtil.isEmpty(difficultCaseDiscussDocs)){
+            return;
+        }
+        if(difficultCaseDiscussDocs != null && difficultCaseDiscussDocs.size()>0){
+            for (DifficultCaseDiscussDoc dcdd:difficultCaseDiscussDocs) {
+                Map<String, String> dcddStructureMap = dcdd.getStructureMap();
+                String diisDate = dcddStructureMap.get("主持人");
+                if(CatalogueUtil.isEmpty(diisDate)){
+                  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;
+                        }
+                    }
+                }
+
+            }
+        }
+    }
+}

+ 6 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF0554.java

@@ -1,11 +1,14 @@
 package com.lantone.qc.kernel.catalogue.difficultcasediscuss;
 
+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.DifficultCaseDiscussDoc;
 import com.lantone.qc.pub.util.ListUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -19,12 +22,15 @@ import java.util.Map;
  */
 @Component
 public class DIF0554 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         List<DifficultCaseDiscussDoc> difficultCaseDiscussDocs = inputInfo.getDifficultCaseDiscussDocs();
         if(ListUtil.isEmpty(difficultCaseDiscussDocs)){
             return;
         }
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
         if(difficultCaseDiscussDocs != null && difficultCaseDiscussDocs.size()>0){
             for (DifficultCaseDiscussDoc dcdd:difficultCaseDiscussDocs) {
                 Map<String, String> dcddStructureMap = dcdd.getStructureMap();

+ 86 - 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,86 @@ 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;
+        Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
+        String characteristics  = structureMap.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(structureMap.get("现病史")!=null){
+                medicalHistory=true;
+            }
+            if(structureMap.get("体格检查")!=null||structureMap.get("查体")!=null||structureMap.get("体温")!=null||structureMap.get("脉搏")!=null||structureMap.get("呼吸")!=null||structureMap.get("血压")!=null){
+                medicalHistory=true;
+            }
+            if(structureMap.get("辅助检查结果")!=null){
+                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;
+        }
     }
-
-
 }

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

@@ -0,0 +1,107 @@
+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;
+import java.util.Map;
+
+/**
+ * @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;
+        Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
+        String characteristics  = structureMap.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(structureMap.get("现病史")!=null){
+                medicalHistory=true;
+            }
+            if(structureMap.get("体格检查")!=null||structureMap.get("查体")!=null||structureMap.get("体温")!=null||structureMap.get("脉搏")!=null||structureMap.get("呼吸")!=null||structureMap.get("血压")!=null){
+                medicalHistory=true;
+            }
+            if(structureMap.get("辅助检查结果")!=null){
+                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;
+            }
+        }
+    }
+
+}

+ 5 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03119.java

@@ -217,12 +217,12 @@ public class OPE03119 extends QCCatalogue {
         str = str.replaceAll("\\}", "\\\\}");
         str = str.replaceAll("\\|", "\\\\|");
         str = str.replaceAll("\\/", "\\\\/");
-        String rex1="[\\s\\S]*(?=人工)[\\s\\S]{0,10}(?=体)[\\s\\S]*";
-        String rex2="[\\s\\S]*(?=人工)[\\s\\S]{0,10}(?=关节)[\\s\\S]*";
-        String rex3="[\\s\\S]*(?=生物)[\\s\\S]{0,5}(?=膜)[\\s\\S]*";
+        String rex1="[\\s\\S]*(?=人工)[^,;,;。]{0,6}(?=体)[\\s\\S]*";
+        String rex2="[\\s\\S]*(?=人工)[^,;,;。]{0,6}(?=关节)[\\s\\S]*";
+        String rex3="[\\s\\S]*(?=生物)[^,;,;。]{0,6}(?=膜)[\\s\\S]*";
         String rex4="[\\s\\S]*(?=机械)[\\s\\S]*";
-        String rex5="[\\s\\S]*(?=起搏)[\\s\\S]{0,6}(?=器)[\\s\\S]*";
-        String rex6="[\\s\\S]*(?=粒子)[\\s\\S]{0,5}(?=植入)[\\s\\S]*";
+        String rex5="[\\s\\S]*(?=起搏)[^,;,;。]{0,6}(?=器)[\\s\\S]*";
+        String rex6="[\\s\\S]*(?=粒子)[^,;,;。]{0,6}(?=植入)[\\s\\S]*";
         //植入物集合
         List<String> theImplantsList = Content.theImplantsList;
         for (String theImplants : theImplantsList) {

+ 73 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03142.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录出血情况未填写
+ * @author: kwz
+ * @time: 2020/06/29 11:22
+ */
+@Component
+public class OPE03142 extends QCCatalogue {
+    /**
+     * 1.手术记录中包含文本形式【失血/出血】
+     * 或2.标题形式包含【失血/出血】判断是否为空
+     * @param inputInfo
+     * @param outputInfo
+     */
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        int operationNum=0;
+        int bleedingNum=0;
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs != null && operationDocs.size()>0){
+           ss: for (OperationDoc operationDoc : operationDocs) {
+                if(operationDoc==null){
+                    continue;
+                }
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if(operationRecordDoc!=null){
+                    operationNum++;
+                    Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                    if(structureMap==null){
+                        continue;
+                    }
+                    String lossOfBlood = structureMap.get("失血");
+                    String bleeding = structureMap.get("出血");
+                    if(StringUtil.isNotBlank(lossOfBlood)||StringUtil.isNotBlank(bleeding)){
+                        bleedingNum++;
+                        break ss;
+                    }
+                    String afterOperation = structureMap.get("手术经过");
+                    List<String> bleedingRecordList = Content.bleedingRecordList;
+                    if(StringUtil.isNotBlank(afterOperation)){
+                        for (String bleedingRecord : bleedingRecordList) {
+                            if(afterOperation.contains(bleedingRecord)){
+                                bleedingNum++;
+                                break ss;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if(operationNum!=bleedingNum){
+            status.set("-1");
+            return;
+        }
+    }
+}

+ 53 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03143.java

@@ -0,0 +1,53 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录输血情况未填写
+ * @author: kwz
+ * @time: 2020/06/29 11:22
+ */
+@Component
+public class OPE03143 extends QCCatalogue {
+    /**
+     * 标题形式包含【输血】判断是否为空
+     * @param inputInfo
+     * @param outputInfo
+     */
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs != null && operationDocs.size()>0){
+           for (OperationDoc operationDoc : operationDocs) {
+                if(operationDoc==null){
+                    continue;
+                }
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if(operationRecordDoc!=null){
+                    Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                    if(structureMap==null){
+                        continue;
+                    }
+                    String bloodTransfusion = structureMap.get("输血情况");
+                    if(StringUtil.isBlank(bloodTransfusion)){
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 68 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03144.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录无主刀医师签字
+ * @author: kwz
+ * @time: 2020/06/29 11:22
+ */
+@Component
+public class OPE03144 extends QCCatalogue {
+    /**
+     * 手术记录【主刀医师签名/审核签名】判断是否为空,任意一处和【手术医师】相同既为符合
+     * @param inputInfo
+     * @param outputInfo
+     */
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs != null && operationDocs.size()>0){
+           for (OperationDoc operationDoc : operationDocs) {
+                if(operationDoc==null){
+                    continue;
+                }
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if(operationRecordDoc!=null){
+                    Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                    if(structureMap==null){
+                        continue;
+                    }
+                    status.set("-1");
+                    //获取【手术医师】
+                    String surgeryName = structureMap.get("手术医师");
+                    String physiciansName = structureMap.get("主刀医师签名");
+                    //获取审核人
+                    String reviewerName = structureMap.get("审核人");
+                    if((StringUtil.isNotBlank(physiciansName)||StringUtil.isNotBlank(reviewerName)) && StringUtil.isNotBlank(surgeryName)){
+                        //主刀医师签名 与【手术医师】比较
+                        if(StringUtil.isNotBlank(physiciansName)) {
+                            if (surgeryName.equals(physiciansName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        if(StringUtil.isNotBlank(surgeryName)) {
+                            if (surgeryName.equals(surgeryName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 47 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE03141.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.kernel.catalogue.preoperativediscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+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;
+
+/**
+ * @Description: 术前诊断未填写
+ * @author: rengb
+ * @time: 2020/3/23 15:09
+ */
+@Component
+public class PRE03141 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(ListUtil.isEmpty(operationDocs)){
+            return;
+        }
+        for (OperationDoc operationDoc : operationDocs) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
+            if (preoperativeDiscussionDoc != null) {
+                Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+                if (structureMap == null) {
+                    continue;
+                }
+                String preoperativeDiagnosis = structureMap.get("术前诊断");
+                if (StringUtil.isBlank(preoperativeDiagnosis)) {
+                    status.set("-1");
+                    return;
+                }
+
+            }
+        }
+    }
+
+}

+ 48 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0575.java

@@ -0,0 +1,48 @@
+package com.lantone.qc.kernel.catalogue.preoperativediscussion;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 术前讨论及小结无简要病情
+ * @author: rengb
+ * @time: 2020/3/23 15:09
+ */
+@Component
+public class PRE0575 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(ListUtil.isEmpty(operationDocs)){
+            return;
+        }
+        for (OperationDoc operationDoc : operationDocs) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
+            if (preoperativeDiscussionDoc != null) {
+                Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+                if (structureMap == null) {
+                    continue;
+                }
+                String preoperativeDiagnosis = structureMap.get("简要病情");   //页面有简要病情,qc获取不到简要病情
+                if (StringUtil.isBlank(preoperativeDiagnosis)) {
+                    status.set("-1");
+                    return;
+                }
+
+            }
+        }
+    }
+
+}

+ 95 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0580.java

@@ -0,0 +1,95 @@
+package com.lantone.qc.kernel.catalogue.preoperativediscussion;
+
+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.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+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.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 术前讨论记录未记录讨论者的姓名及职称
+ * @author: rengb
+ * @time: 2020/3/23 15:09
+ */
+@Component
+public class PRE0580 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        /**
+         * 术前讨论、术前小结存在的前提       【参加人员】判断是否为空,并【姓名】加职称:【主治/助理/主任/副主任/规培/实习/住院/院长】
+         */
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(ListUtil.isEmpty(operationDocs)){
+            return;
+        }
+        for (OperationDoc operationDoc : operationDocs) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
+            if (preoperativeDiscussionDoc != null) {
+                Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+                if (structureMap == null) {
+                    continue;
+                }
+                String participants = structureMap.get("参加人员");
+                if (StringUtil.isBlank(participants)) {
+                    if(!participantsSplit(participants)) {
+                        status.set("-1");
+                        return;
+                    }
+                }
+
+            }
+        }
+    }
+
+    //对参加人员进行切割并判断
+    private boolean participantsSplit( String participants ) {
+        List<String> punctuationList = Content.punctuationList;
+        for (String punctuation : punctuationList) {
+            if(participants.contains(punctuation)){
+                String[] strings = punctuation.split(punctuation);
+                for (String string : strings) {
+                    if(!findDirectorDoctor(string)){
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    private boolean findDirectorDoctor(String string) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return true;
+        }
+        for (String keyStr : hospitalDoctorMap.keySet()) {
+            if (string.contains(keyStr)) {
+                Object professor = hospitalDoctorMap.get(keyStr).get("professor");
+                if (professor != null) {
+                    if (!string.contains(professor.toString())) {
+                        return false;
+                    }
+
+                }
+            }
+        }
+        return true;
+    }
+
+}

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

@@ -0,0 +1,81 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+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.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+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 : THR03137
+ * @Description : 缺转入记录
+ * @Author : rengb
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class THR03137 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        boolean flag=false;
+        //首先判断医嘱中是否包含转科相关信息
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        if(ListUtil.isEmpty(doctorAdviceDocs)){
+            return;
+        }
+        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(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)) {
+                                    flag = true;
+                                    break ;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        //为转科人员判断是否有转出记录
+        if(flag){
+            status.set("-1");
+            TransferRecordDoc transferRecordDocs = inputInfo.getTransferRecordDocs();
+            if(transferRecordDocs==null){
+                return;
+            }
+            List<TransferIntoDoc> transferIntoDocs = transferRecordDocs.getTransferIntoDocs();
+            if(ListUtil.isNotEmpty(transferIntoDocs) || transferIntoDocs.size()>0){
+                //转出记录存在
+                status.set("0");
+                return;
+            }
+
+        }
+
+    }
+
+
+}

+ 5 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03138.java

@@ -41,9 +41,12 @@ public class THR03138 extends QCCatalogue {
                     if(adviceType.equals(Content.standingOrder)||adviceType.equals(Content.statOrder)){
                         String adviceState = doctorAdviceDocStructureMap.get(Content.doctorAdviceState);
                         if(StringUtil.isNotEmpty(adviceState)){
-                            if(!adviceState.equals(Content.cancellationOrder)){
+                            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)) {
@@ -64,7 +67,7 @@ public class THR03138 extends QCCatalogue {
                 return;
             }
             List<TransferOutDoc> transferOutDocs = transferRecordDocs.getTransferOutDocs();
-            if(transferOutDocs!=null || transferOutDocs.size()>0){
+            if(ListUtil.isNotEmpty(transferOutDocs) || transferOutDocs.size()>0){
                 //转出记录存在
                 status.set("0");
                 return;

+ 201 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03139.java

@@ -0,0 +1,201 @@
+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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03139
+ * @Description : 术前主刀查房记录无主刀医师查房意见
+ * @Author : rengb
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class THR03139 extends QCCatalogue {
+    /**
+     * 查房记录内找是否有标题【术前*查房】,找到则判断记录内是否包含【主刀/分析/指出/认为/指示】或【主刀医师名字】:p8
+     * p8:【手术记录单/术前讨论、术前小结】内【手术医师/主刀医师签名】
+     *
+     * @param inputInfo
+     * @param outputInfo
+     */
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int preoperativeNum=0;
+        int opinionNum=0;
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if (ListUtil.isEmpty(threeLevelWardDocs) || threeLevelWardDocs.size() == 0) {
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        if (ListUtil.isEmpty(allDoctorWradDocs) || allDoctorWradDocs.size() == 0) {
+            return;
+        }
+        //获取手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        //所有查房
+        //可能有多次手术,每次手术前查房都要符合,则需要走完所有的查房,并记录次数
+        for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+            Map<String, String> docStructureMap = allDoctorWradDoc.getStructureMap();
+            if (docStructureMap == null) {
+                continue;
+            }
+            String wardRoundTitle = docStructureMap.get("查房标题");
+            if (StringUtil.isBlank(wardRoundTitle)) {
+                continue;
+            }
+            String rex = "[\\s\\S]*(?=术前)[\\s\\S]*(?=查房)[\\s\\S]*";
+            if (wardRoundTitle.matches(rex)) {
+                status.set("-1");
+                preoperativeNum++;
+                //为术前查房,判断记录内是否包含【主刀/分析/指出/认为/指示】或【主刀医师名字】
+                String illnessRecords = docStructureMap.get("病情记录");
+                if (StringUtil.isBlank(illnessRecords)) {
+                    continue;
+                }
+                List<String> cfButcherOpinionList = Content.cfButcherOpinionList;
+                for (String cfButcherOpinion : cfButcherOpinionList) {
+                    if (illnessRecords.contains(cfButcherOpinion)) {
+                        opinionNum++;
+                        continue;
+                    }
+                }
+                String recordTime = docStructureMap.get("查房日期");
+                if(StringUtil.isBlank(recordTime)){
+                    continue;
+                }
+                Date recordDate = StringUtil.parseDateTime(recordTime);
+                //获取手术记录
+                if(ListUtil.isEmpty(operationDocs) || operationDocs.size()==0){
+                    continue;
+                }
+                String doctorName = getButcherDoctorName(operationDocs, recordDate);
+                if(StringUtil.isNotBlank(doctorName)) {
+                    //包含主刀医师名字
+                    if (illnessRecords.contains(doctorName)) {
+                        opinionNum++;
+                        continue;
+                    }
+                }
+                //获取术前讨论
+                String discussDoctorName = getDiscussDoctorName(operationDocs, recordDate);
+                if(StringUtil.isNotBlank(discussDoctorName)) {
+                    if (illnessRecords.contains(discussDoctorName)) {
+                        opinionNum++;
+                        continue;
+                    }
+                }
+            }
+        }
+        if(preoperativeNum==opinionNum){
+            status.set("0");
+            return;
+        }
+    }
+
+    //获取距离查房最近一次手术主刀医师名字
+    public static String getButcherDoctorName(List<OperationDoc> operationDocs, Date recordDate) {
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        String title = "";
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            if (structureMap == null) {
+                continue;
+            }
+            String operatorEndTimeStr = structureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operatorEndTimeStr)) {
+                continue;
+            }
+            Date operatorEndDate = StringUtil.parseDateTime(operatorEndTimeStr);
+            if (operatorEndDate != null) {
+                //若是查房时间晚于手术结束时间则跳过
+                if (operatorEndDate.before(recordDate)) {
+                    continue;
+                }
+                long timeDifference = CatalogueUtil.timeDifference(operatorEndDate, recordDate);
+                if (timeDifference == 0) {
+                    continue;
+                }
+                if (timeDiff == 0 || timeDiff > timeDifference) {
+                    /* 取距离此次主刀医师查房最近的一次手术时间 */
+                    timeDiff = timeDifference;
+                    String butcherPhysicians = structureMap.get("主刀医师");
+                    String butcherPhysiciansSignature = structureMap.get("主刀医师签名");
+                    if (StringUtil.isNotEmpty(butcherPhysicians)) {
+                        title = butcherPhysicians;
+                    }
+                    if (StringUtil.isNotEmpty(butcherPhysiciansSignature)) {
+                        title = butcherPhysiciansSignature;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+    //获取距离查房最近一次手术术前讨论主刀医师名字
+    public static String getDiscussDoctorName(List<OperationDoc> operationDocs, Date recordDate) {
+        /* 用于存放术前讨论时间距离查房时间最近的一次时间差 */
+        String title = "";
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
+            if (preoperativeDiscussionDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+            if (structureMap == null) {
+                continue;
+            }
+            String discussionTime = structureMap.get("讨论时间");
+            if (StringUtil.isBlank(discussionTime)) {
+                continue;
+            }
+            Date discussionDate = StringUtil.parseDateTime(discussionTime);
+            if (discussionDate != null) {
+                //若是查房时间晚于术前讨论结束时间则跳过
+                if (discussionDate.before(recordDate)) {
+                    continue;
+                }
+                long timeDifference = CatalogueUtil.timeDifference(discussionDate, recordDate);
+                if (timeDifference == 0) {
+                    continue;
+                }
+                if (timeDiff == 0 || timeDiff > timeDifference) {
+                    /* 取距离此次主刀医师查房最近的一次手术时间 */
+                    timeDiff = timeDifference;
+                    String theHostName = structureMap.get("主持人");
+                    String butcherPhysiciansSignature = structureMap.get("主刀医师签名");
+                    if (StringUtil.isNotEmpty(theHostName)) {
+                        title = theHostName;
+                    }
+                    if (StringUtil.isNotEmpty(butcherPhysiciansSignature)) {
+                        title = butcherPhysiciansSignature;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+}

+ 191 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03140.java

@@ -0,0 +1,191 @@
+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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03140
+ * @Description : 术前主刀查房主刀医师未审核签字
+ * @Author : rengb
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class THR03140 extends QCCatalogue {
+    /**
+     * 查房记录内找是否有标题【术前*查房】,找到判断签名处是否有【主刀医师名字】:p8
+     * p8:【手术记录单/术前讨论、术前小结】内【手术医师/主刀医师签名】
+     *
+     * @param inputInfo
+     * @param outputInfo
+     */
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int preoperativeNum=0;
+        int opinionNum=0;
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if (ListUtil.isEmpty(threeLevelWardDocs) || threeLevelWardDocs.size() == 0) {
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        if (ListUtil.isEmpty(allDoctorWradDocs) || allDoctorWradDocs.size() == 0) {
+            return;
+        }
+        //获取手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        //所有查房
+        //可能有多次手术,每次手术前查房都要符合,则需要走完所有的查房,并记录次数
+        for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+            Map<String, String> docStructureMap = allDoctorWradDoc.getStructureMap();
+            if (docStructureMap == null) {
+                continue;
+            }
+            String wardRoundTitle = docStructureMap.get("查房标题");
+            if (StringUtil.isBlank(wardRoundTitle)) {
+                continue;
+            }
+            String rex = "[\\s\\S]*(?=术前)[\\s\\S]*(?=查房)[\\s\\S]*";
+            if (wardRoundTitle.matches(rex)) {
+                status.set("-1");
+                preoperativeNum++;
+                String recordTime = docStructureMap.get("查房日期");
+                if(StringUtil.isBlank(recordTime)){
+                    continue;
+                }
+                //获取医师签名
+                String reviewerName = docStructureMap.get("审核人");
+                Date recordDate = StringUtil.parseDateTime(recordTime);
+                //获取手术记录
+                if(ListUtil.isEmpty(operationDocs) || operationDocs.size()==0){
+                    continue;
+                }
+                String doctorName = getButcherDoctorName(operationDocs, recordDate);
+                //判断签名处是否有【主刀医师名字】
+                if(StringUtil.isNotBlank(doctorName)) {
+                    if (reviewerName.equals(doctorName)) {
+                        opinionNum++;
+                        continue;
+                    }
+                }
+                //获取术前讨论
+                String discussDoctorName = getDiscussDoctorName(operationDocs, recordDate);
+                if(StringUtil.isNotBlank(discussDoctorName)) {
+                    if (reviewerName.equals(discussDoctorName)) {
+                        opinionNum++;
+                        continue;
+                    }
+                }
+            }
+        }
+        if(preoperativeNum==opinionNum){
+            status.set("0");
+            return;
+        }
+    }
+
+    //获取距离查房最近一次手术主刀医师名字
+    public static String getButcherDoctorName(List<OperationDoc> operationDocs, Date recordDate) {
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        String title = "";
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            if (structureMap == null) {
+                continue;
+            }
+            String operatorEndTimeStr = structureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operatorEndTimeStr)) {
+                continue;
+            }
+            Date operatorEndDate = StringUtil.parseDateTime(operatorEndTimeStr);
+            if (operatorEndDate != null) {
+                //若是查房时间晚于手术结束时间则跳过
+                if (operatorEndDate.before(recordDate)) {
+                    continue;
+                }
+                long timeDifference = CatalogueUtil.timeDifference(operatorEndDate, recordDate);
+                if (timeDifference == 0) {
+                    continue;
+                }
+                if (timeDiff == 0 || timeDiff > timeDifference) {
+                    /* 取距离此次主刀医师查房最近的一次手术时间 */
+                    timeDiff = timeDifference;
+                    String butcherPhysicians = structureMap.get("主刀医师");
+                    String butcherPhysiciansSignature = structureMap.get("主刀医师签名");
+                    if (StringUtil.isNotEmpty(butcherPhysicians)) {
+                        title = butcherPhysicians;
+                    }
+                    if (StringUtil.isNotEmpty(butcherPhysiciansSignature)) {
+                        title = butcherPhysiciansSignature;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+    //获取距离查房最近一次手术术前讨论主刀医师名字
+    public static String getDiscussDoctorName(List<OperationDoc> operationDocs, Date recordDate) {
+        /* 用于存放术前讨论时间距离查房时间最近的一次时间差 */
+        String title = "";
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
+            if (preoperativeDiscussionDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+            if (structureMap == null) {
+                continue;
+            }
+            String discussionTime = structureMap.get("讨论时间");
+            if (StringUtil.isBlank(discussionTime)) {
+                continue;
+            }
+            Date discussionDate = StringUtil.parseDateTime(discussionTime);
+            if (discussionDate != null) {
+                //若是查房时间晚于术前讨论结束时间则跳过
+                if (discussionDate.before(recordDate)) {
+                    continue;
+                }
+                long timeDifference = CatalogueUtil.timeDifference(discussionDate, recordDate);
+                if (timeDifference == 0) {
+                    continue;
+                }
+                if (timeDiff == 0 || timeDiff > timeDifference) {
+                    /* 取距离此次主刀医师查房最近的一次手术时间 */
+                    timeDiff = timeDifference;
+                    String theHostName = structureMap.get("主持人");
+                    String butcherPhysiciansSignature = structureMap.get("主刀医师签名");
+                    if (StringUtil.isNotEmpty(theHostName)) {
+                        title = theHostName;
+                    }
+                    if (StringUtil.isNotEmpty(butcherPhysiciansSignature)) {
+                        title = butcherPhysiciansSignature;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+}

+ 172 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03147.java

@@ -0,0 +1,172 @@
+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.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.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03147
+ * @Description : 患者出院前48小时内无上级医师(主治及以上)同意出院的病程记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 13:51
+ */
+@Component
+public class THR03147 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 出院时间前48小时,48小时内找上级医师同意出院的病程记录
+         *
+         * 以患者病案首页【出院时间】找前48小时内【查房记录】,查房记录标题或查房记录内容或医生签字包含【/主任/主治/主治及以上医师姓名】和查房记录内容包含【出院】同时存在
+         * 医生签名加上审核医师和记录医师
+         */
+        status.set("0");
+        if(inputInfo.getFirstPageRecordDoc()==null || inputInfo.getFirstPageRecordDoc().getStructureMap()==null){
+            return;
+        }
+        //获取病案首页出院时间
+        String dischargeTime = inputInfo.getFirstPageRecordDoc().getStructureMap().get("出院时间");
+        if (CatalogueUtil.isEmpty(dischargeTime)) {
+            return;
+        }
+        Date dischargeDate = StringUtil.parseDateTime(dischargeTime);
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if(ListUtil.isEmpty(threeLevelWardDocs)){
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        if(ListUtil.isEmpty(allDoctorWradDocs)){
+            return;
+        }
+        if(!getAllPatientRounds(allDoctorWradDocs,dischargeDate)){
+            status.set("-1");
+            return;
+        }
+
+    }
+
+
+    //获取患者出院前48小时内所有的查房记录并判断
+    public  boolean getAllPatientRounds(List<ThreeLevelWardDoc> allDoctorWradDocs ,Date dischargeDate){
+        boolean flag=true;
+        List<String> superiorList = Content.superiorList;
+        for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+            Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
+            if(structureMap==null){
+                continue;
+            }
+            String checkTheTime = structureMap.get("查房日期");
+            if (CatalogueUtil.isEmpty(checkTheTime)) {
+                continue;
+            }
+            Date checkTheDate = StringUtil.parseDateTime(checkTheTime);
+            if(!CatalogueUtil.compareTime(
+                    checkTheDate,
+                    dischargeDate,
+                    Long.valueOf(48 * 60))){
+                flag=false;
+                //出院前48小时的查房记录
+                String illnessRecords = structureMap.get("病情记录");
+                //包含出院
+                if(StringUtil.isNotEmpty(illnessRecords)){
+                if(illnessRecords.contains("出院")) {
+                    // 查房记录标题或查房记录内容或医生签字包含【上级/主任/主治/主治及以上医师姓名】
+                    String roundTitle = structureMap.get("查房标题");
+                    //标题判断
+                    if (StringUtil.isNotEmpty(roundTitle)) {
+                        for (String superior : superiorList) {
+                            if (roundTitle.contains(superior)) {
+                                flag=true;
+                                break;
+                            }
+                        }
+                       if(judgeContainsDoctor(roundTitle)){
+                            flag=true;
+                            break;
+                        }
+                    }
+                    //查房记录判断
+                        for (String superior : superiorList) {
+                            if (illnessRecords.contains(superior)) {
+                                flag=true;
+                                break;
+                            }
+                        }
+                    if(judgeContainsDoctor(illnessRecords)){
+                        flag=true;
+                        break;
+                    }
+                    //审核人判断
+                    String reviewer = structureMap.get("审核人");
+                    if (StringUtil.isNotEmpty(reviewer)) {
+                        for (String superior : superiorList) {
+                            if (reviewer.contains(superior)) {
+                                flag=true;
+                                break;
+                            }
+                        }
+                        if(judgeContainsDoctor(reviewer)){
+                            flag=true;
+                            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;
+                        }
+                    }
+                }
+                }
+            }
+        }
+        return flag;
+    }
+
+    //判断是否含有主治及以上医师姓名
+    private boolean judgeContainsDoctor(String string) {
+        List<String> indicationsAboveList = Content.indicationsAboveList;
+        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) {
+                    for (String indicationsAbove : indicationsAboveList) {
+                        if (professor.toString().contains(indicationsAbove)) {
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+}

+ 190 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03149.java

@@ -0,0 +1,190 @@
+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.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;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03149
+ * @Description :  抢救患者上级医师(副高及以上)查房记录不及时
+ * @Author : Mark
+ * @Date: 2020-04-07 17:06
+ */
+@Component
+public class THR03149 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 【抢救开始时间】时间延后6小时内,找标题为【主任*查房】或【主任级别的姓名查房】,若无报出
+         *
+         * 1.先判断是否是抢救患者p6,排除死亡患者p9,排除出院时间和抢救记录时间为同一天。2.找抢救时间p10,延后6小时内,是否有上级医师查房p11,
+         * 若有不报,若无3.去【抢救记录】内找是否有包含【上级医师姓名】/【主任】字段,若无报出
+         *
+         * 符合下列情况的任意一种则成立:
+         * 1.病历包含【死亡记录】
+         * 2.【临时医嘱】包含【死亡】医嘱
+         *
+         * 符合下列情况的任意一种则成立:
+         * 1.【抢救记录】标题【抢救时间】
+         * 2.【抢救记录】抢救过程包含【抢救时间及措施】
+         *
+         * 【查房记录】标题为【主任*查房】或【主任级别的姓名查房】
+         */
+        status.set("0");
+        boolean falg=false;
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<RescueDoc> rescueDocs = inputInfo.getRescueDocs();
+        //死亡记录不为空
+        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(medicalRecordInfoDoc!=null){
+                    //获取出院时间
+                    String leaveHospitalTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+                    if(StringUtil.isNotBlank(leaveHospitalTime)){
+                        Date leaveHospitalDate = StringUtil.parseDateTime(leaveHospitalTime);
+                        if(DateUtils.isSameDay(leaveHospitalDate, saveDate)){
+                            //出院和抢救记录为同一天则跳过
+                            continue;
+                        }
+                    }
+
+                }
+                if(getAllSaveDoctor(inputInfo,outputInfo,saveDate)){
+                    return;
+                }else {
+                    //去【抢救记录】内找是否有包含【上级医师姓名】/【主任】字段,若无报出
+                    String text = rescueDoc.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;
+    }
+}

+ 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;
+    }
+}

+ 50 - 2
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 {
 
@@ -346,7 +348,6 @@ public class Content {
     public static final String pathological= "病理";
     public static final String pathologicalReport= "病理报告";
     public static final String specimen= "标本";
-    public static final String cancellationOrder= "作废";
     //医嘱状态
     public static List<String> cancellationOrderList= Arrays.asList(
             "作废", "删除", "取消"
@@ -399,6 +400,53 @@ public class Content {
     public static List<String>  cfAntibacterialList= Arrays.asList(
             "抗菌","抗生素","消炎","抗感染","抗炎","预防感染"
     );
+    //主刀查房是否有意见
+    public static List<String>  cfButcherOpinionList= Arrays.asList(
+            "主刀","分析","指出","认为","指示"
+    );
+    //判断手术是否有出血记录
+    public static List<String>  bleedingRecordList= Arrays.asList(
+            "失血","出血"
+    );
+    //术前讨论记录未记录讨论者的姓名及职称中对标点符号切割
+    public static List<String>  punctuationList= Arrays.asList(
+            ",",";",",",";"
+    );
+    //查房记录标题或查房记录内容或医生签字包含【上级/主任/主治】所用
+    public static List<String>  superiorList= Arrays.asList(
+            "主任","主治"
+    );
+    //主治及以上
+    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(
             "多西环素","二维四环素甲氧苄啶","复方四环素","复方四环素泼尼松","胍甲环素","美他环素","米诺环素","四环素","替加环素","土霉素","琥珀氯霉素","甲砜霉素","甲砜霉素甘氨酸酯","氯霉素",
@@ -444,7 +492,7 @@ public class Content {
             "硫唑嘌呤","紫杉醇注射液","紫杉醇(脂质体)","紫杉醇(白蛋白结合型)","帕妥珠单抗","吡咯替尼","奥拉帕利","尼拉帕利","奥希替尼","阿来替尼","卡瑞利珠单抗","信迪利单抗","特瑞普利单抗",
             "度伐利尤单抗","曲普瑞林","三氧化二砷","甲磺酸伊马替尼胶囊","甲磺酸伊马替尼片","注射用恩美曲妥珠单抗","帕妥珠单抗注射液","贝伐珠单抗注射液","马来酸吡咯替尼片","奥拉帕利片","甲苯磺酸尼拉帕利胶囊",
             "达沙替尼片","盐酸安罗替尼胶囊","吉非替尼片","马来酸阿法替尼片","甲磺酸奥希替尼片","克唑替尼胶囊","盐酸阿来替尼胶囊","西妥昔单抗注射液","甲苯磺酸索拉非尼片","瑞戈非尼片",
-            "注射用卡瑞利珠单抗","信迪利单抗注射液","特瑞普利单抗注射液","度伐利尤单抗注射液","贝伐","替雷利珠单抗注射液","替雷利珠"
+            "注射用卡瑞利珠单抗","信迪利单抗注射液","特瑞普利单抗注射液","度伐利尤单抗注射液","替雷利珠单抗注射液","替雷利珠"
     );
     //恶性肿瘤疾病
     public static List<String> TumorDiseaseList = 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;