浏览代码

Merge branch 'beilun/dev' into beilun/master

wangsy 4 年之前
父节点
当前提交
4f58086b37
共有 74 个文件被更改,包括 1448 次插入191 次删除
  1. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH0024.java
  2. 5 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH0032.java
  3. 81 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/crisisvaluereport/CRI0382.java
  4. 47 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/FIRP03110.java
  5. 68 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03112.java
  6. 69 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03114.java
  7. 100 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03116.java
  8. 50 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0160.java
  9. 48 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0589.java
  10. 99 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/OPE03111.java
  11. 67 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03115.java
  12. 102 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03117.java
  13. 18 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03118.java
  14. 69 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR3113.java
  15. 8 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE0369.java
  16. 21 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/preoperativediscussion/PRE0328.java
  17. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR0134.java
  18. 25 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR0139.java
  19. 34 16
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR03090.java
  20. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0024.java
  21. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0025.java
  22. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0026.java
  23. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0028.java
  24. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0029.java
  25. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0030.java
  26. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0031.java
  27. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0042.java
  28. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0043.java
  29. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0047.java
  30. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0053.java
  31. 2 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0058.java
  32. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0375.java
  33. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0376.java
  34. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0397.java
  35. 9 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0439.java
  36. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0454.java
  37. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/firstcourserecord/FIRC0095.java
  38. 4 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/firstpagerecord/FIRP02972.java
  39. 7 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02891.java
  40. 7 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02892.java
  41. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02897.java
  42. 7 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02898.java
  43. 12 27
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02930.java
  44. 21 8
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0369.java
  45. 12 12
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0628.java
  46. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0630.java
  47. 11 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/preoperativediscussion/PRE0328.java
  48. 23 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0125.java
  49. 21 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0126.java
  50. 9 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0144.java
  51. 17 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR02900.java
  52. 12 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR03090.java
  53. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0601.java
  54. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/behospitalized/BEH0407.java
  55. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/behospitalized/BEH0414.java
  56. 6 6
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/firstpagerecord/FIRP0161.java
  57. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/firstpagerecord/FIRP0222.java
  58. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/threelevelward/THR0126.java
  59. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/threelevelward/THR0127.java
  60. 16 0
      kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java
  61. 2 2
      public/src/main/java/com/lantone/qc/pub/Content.java
  62. 2 2
      public/src/main/java/com/lantone/qc/pub/model/entity/Pacs.java
  63. 85 18
      public/src/main/java/com/lantone/qc/pub/util/DateUtil.java
  64. 2 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicalBloodDocTrans.java
  65. 1 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstCourseRecordDocTrans.java
  66. 37 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunPacsDocTrans.java
  67. 5 1
      trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java
  68. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiOperationDocTrans.java
  69. 64 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiBeHospitalizedHtmlAnalysis.java
  70. 3 3
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCrisisValueReportHtmlAnalysis.java
  71. 3 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiFirstCourseRecordHtmlAnalysis.java
  72. 26 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiLeaveHospitalHtmlAnalysis.java
  73. 32 6
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiOperationRecordHtmlAnalysis.java
  74. 23 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuThreeLevelWardDocTrans.java

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH0024.java

@@ -48,7 +48,8 @@ public class BEH0024 extends QCCatalogue {
         }
         //硬规则匹配
         String pastLabelText = pastLabel.getText();
-        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见原病历") || pastLabelText.contains("骨折")) {
+        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见原病历") || pastLabelText.contains("骨折")
+                || pastLabelText.contains("右跟骨手术")) {
             status.set("0");
         }
     }

+ 5 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH0032.java

@@ -57,7 +57,11 @@ public class BEH0032 extends QCCatalogue {
                         continue;
                     }
                 }
-                wtDiagList.add(wtDiagName);
+                //由于crf模型将 40年前摔伤致腰背部这段文字解析成(腰背部)疾病,故在此加条件过滤该问题
+                if(!"摔伤致腰背部".contains(wtDiagName))
+                {
+                    wtDiagList.add(wtDiagName);
+                }
             }
         }
 

+ 81 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/crisisvaluereport/CRI0382.java

@@ -1,12 +1,19 @@
 package com.lantone.qc.kernel.catalogue.beilun.crisisvaluereport;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.CrisisInfoDoc;
 import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.model.entity.Annotation;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
 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.ArrayList;
@@ -20,7 +27,8 @@ import java.util.List;
  */
 @Component
 public class CRI0382 extends QCCatalogue {
-
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
     @Override
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
@@ -42,7 +50,6 @@ public class CRI0382 extends QCCatalogue {
                 }
             }
         }
-        ;
         if (isOutTime == false) {   //所有文书都未超过6小时,规则直接通过
             return;
         }
@@ -79,12 +86,16 @@ public class CRI0382 extends QCCatalogue {
                     for (CrisisValueReportDoc crisisValueReportDoc : crisisValueReportDocs) {
                         String recordTimeStr = crisisValueReportDoc.getStructureMap().get("病历日期");
                         String docReptContent = crisisValueReportDoc.getStructureMap().get("病情分析及处理");
+                        //超声:添加文本相似度去比较病情分析及处理
+                        boolean flag = getLikeRate(submitContent(StringUtil.removeBlank(docReptContent))
+                                                        ,StringUtil.removeBlank(crisisName));
                         if ((StringUtil.parseDateTime(recordTimeStr, dateFormats).getTime() - StringUtil.parseDateTime(reptTime, dateFormats).getTime()) < timeCha
                                 && (StringUtil.removeBlank(docReptContent).contains(StringUtil.removeBlank(crisisName)) ||
                                 (StringUtil.isNotBlank(crisisNm) && StringUtil.isNotBlank(companyNum)
                                         && StringUtil.removeBlank(docReptContent).contains(StringUtil.removeBlank(crisisNm))
                                         && StringUtil.removeBlank(docReptContent).contains(StringUtil.removeBlank(companyNum))
-                                ))) {
+                                ))
+                            ||flag) {
                             findCrisises.add(reptTime);
                             break;
                         }
@@ -113,5 +124,72 @@ public class CRI0382 extends QCCatalogue {
             });
         }
     }
+    /**
+     * @Author songxl
+     * @Description 内容截取
+     * @Date  2021/3/29
+     * @Param [content]
+     * @Return java.lang.String
+     * @MethodName submitContent
+     */
+    private String submitContent(String content) {
+        if(StringUtil.isNotBlank(content))
+        {
+            if(content.contains("具体为"))
+            {
+                content = content.split("具体为")[1];
+            }
+            if(content.contains("处理意见"))
+            {
+                content = content.split("处理意见")[0];
+            }
+        }
+        return content;
+
+    }
 
+    /**
+     * @Author songxl
+     * @Description 获取文本相似度
+     * @Date  2021/3/29
+     * @Param [text_1, text_2]
+     * @Return boolean
+     * @MethodName getFlag
+     */
+    private boolean getLikeRate(String text_1, String text_2) {
+        if(text_1.contains("超声"))
+        {
+            JSONArray similarContent = new JSONArray();
+            JSONObject detailContent = new JSONObject();
+            detailContent.put("text_1", text_1);
+            detailContent.put("text_2", text_2);
+            similarContent.add(detailContent);
+            //存储CRF完整所需结构数据
+            SimilarityVo similarityVo = new SimilarityVo();
+            similarityVo.setData(similarContent);
+            //获取CRF模型返回数据
+            JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+            double likeRate = 0d;
+            if (data.size() > 0) {
+                JSONObject dataContent = data.getJSONObject(0);
+                likeRate = dataContent.getDoubleValue("like_rate");
+            }
+            if(likeRate>0.8)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
 }

+ 47 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/FIRP03110.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03110
+ * @Description : 病案首页未在患者出院院24小时内完成
+ * @Author : zhanghang
+ * @Date: 2021-03-31 11:12
+ */
+@Component
+public class FIRP03110 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageRecordMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String admisDate = firstPageRecordMap.get(Content.dischargeTime);
+            String recordTime = firstPageRecordMap.get("创建时间");
+            if (CatalogueUtil.isEmpty(admisDate) || CatalogueUtil.isEmpty(recordTime)) {
+                return;
+            }
+            if(!CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(DateUtil.nowString()),
+                    Long.valueOf(24 * 60))){//如果出院还未过24小时规则不判断
+                return;
+            }
+
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(recordTime),
+                    Long.valueOf(24 * 60))) {
+                status.set("-1");
+            }
+        }
+    }
+
+}

+ 68 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03112.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : MEDI03112
+ * @Description :  医嘱存在MR,报告单未记录
+ * @Author : zh
+ * @Date: 2021-04-06 17:06
+ */
+public class MEDI03112 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int ctNum = 0;
+        int bcNum = 0;
+        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
+        if (ListUtil.isNotEmpty(doctorAdviceDocsList)) {
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                    //ct取临时医嘱
+                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                    if (StringUtil.isNotEmpty(doctorAsks)) {
+                        if ("临时医嘱".equals(doctorAsks)) {
+                            //取医嘱项目名称
+                            String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                            if (daItemName.contains("磁共振") || daItemName.contains("MR")) {
+                                if (!daItemName.contains("IMRT") && !daItemName.contains("mrs评分")) {
+                                    ctNum++;
+
+                                    continue;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
+            if(ListUtil.isNotEmpty(pacsDocs)){
+                if(pacsDocs.size()>0) {
+                    for (PacsDoc pacsDoc : pacsDocs) {
+                        String pacsDocStr = pacsDoc.getStructureMap().get("报告名称");
+                        if (StringUtil.isNotEmpty(pacsDocStr) && pacsDocStr.contains("MR")) {
+                            bcNum++;
+                        }
+                    }
+                }
+            }
+            if (ctNum != bcNum) {
+                status.set("-1");
+            }
+
+        }
+    }
+}

+ 69 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03114.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : MEDI03114
+ * @Description :接受CT情况下报告单缺少CT报告
+ * @Author : zh
+ * @Date: 2021-04-06 17:06
+ */
+public class MEDI03114 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int ctNum = 0;
+        int bcNum = 0;
+        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
+        if (ListUtil.isNotEmpty(doctorAdviceDocsList)) {
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                    //ct取临时医嘱
+                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                    if (StringUtil.isNotEmpty(doctorAsks)) {
+                        if ("临时医嘱".equals(doctorAsks)) {
+                            //取医嘱项目名称
+                            String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                            if (daItemName.contains("CT") || daItemName.contains("X线")) {
+                                if ((!daItemName.contains("ATCH") && !daItemName.contains("TCT") && !daItemName.contains("HCT") && !daItemName.contains("OCT") && !daItemName.contains("NCT") && !daItemName.contains("LCT") && !daItemName.contains("ACT")) || (daItemName.contains("停"))) {
+                                    //都不包含为CT
+                                    ctNum++;
+                                    continue;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
+            if(ListUtil.isNotEmpty(pacsDocs)){
+                if(pacsDocs.size()>0) {
+                    for (PacsDoc pacsDoc : pacsDocs) {
+                        String pacsDocStr = pacsDoc.getStructureMap().get("报告名称");
+                        if (StringUtil.isNotEmpty(pacsDocStr) && pacsDocStr.contains("CT")) {
+                            bcNum++;
+                        }
+                    }
+                }
+            }
+            if (ctNum != bcNum) {
+                status.set("-1");
+            }
+
+        }
+    }
+}

+ 100 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03116.java

@@ -0,0 +1,100 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+import com.google.common.collect.Maps;
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.LisDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+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;
+
+/**
+ * @ClassName : MEDI03116
+ * @Description: 病理检查缺少病理检查报告单
+ * @author: zh
+ * @time: 2021/04/06 11:22
+ */
+
+@Component
+public class MEDI03116 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            //病案首页为空判断医嘱
+            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+            if(ListUtil.isEmpty(doctorAdviceDocs)){
+                return;
+            }
+            if (doctorAdviceDocs.size() == 0) {
+                return;
+            }
+            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
+                Map<String, String> structureMap = dad.getStructureMap();
+                String state = structureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                    String name = structureMap.get("医嘱项目名称");
+                    if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
+                            || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
+                        continue;
+                    }
+                    if (name.contains("手术")) {
+                        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                            String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
+                            if (adviceDocName.contains("病理")) {
+                                status.set("-1");
+                                List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
+                                for (PacsDoc pacsDoc : pacsDocs) {
+                                    Map<String, String> pacsDocStructureMap = pacsDoc.getStructureMap();
+                                    String pacsDocStr = pacsDocStructureMap.get("报告名称");
+                                    if (pacsDocStr.contains("病理")) {
+                                        status.set("0");
+                                        return;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        Map<String, String> firstPageRecordDocStructureMap = firstPageRecordDoc.getStructureMap();
+        String pathologyMoneyStr = firstPageRecordDocStructureMap.get("病理诊断费");
+        String operationMoneyStr = firstPageRecordDocStructureMap.get("手术费");
+        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
+            return;
+        }
+        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
+            return;
+        }
+            double a = Double.parseDouble(pathologyMoneyStr);
+            double b = Double.parseDouble(operationMoneyStr);
+            if (a > Content.pathologicalFee && b > 0) {
+                status.set("-1");
+                List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
+                for (PacsDoc pacsDoc : pacsDocs) {
+                    Map<String, String> pacsDocStructureMap = pacsDoc.getStructureMap();
+                    String pacsDocStr = pacsDocStructureMap.get("报告名称");
+                    if (pacsDocStr.contains("病理")) {
+                        status.set("0");
+                        return;
+                    }
+
+                }
+            }
+        }
+
+}

+ 50 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0160.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.LisDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+/**
+ * @ClassName : MI0160
+ * @Description: 病程记录缺少细菌培养结果
+ * @author: zh
+ * @time: 2021/04/06 11:22
+ */
+
+public class MI0160 extends QCCatalogue {
+        public void start(InputInfo inputInfo, OutputInfo outputInfo){
+            status.set("0");
+            List<DoctorAdviceDoc> doctorAdviceDocList = inputInfo.getDoctorAdviceDocs();
+            if(ListUtil.isNotEmpty(doctorAdviceDocList)){
+                for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocList) {
+                    Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                    if("临时医嘱".equals(doctorAsks)){
+                        String doctorAsksName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                        if(StringUtil.isNotEmpty(doctorAsksName)&&doctorAsksName.contains("细菌培养")){
+                            status.set("-1");
+                            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
+                            if(ListUtil.isNotEmpty(allDoctorWradDocs)&&allDoctorWradDocs.size()>0){
+                                for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                                    String allDoctorStr = allDoctorWradDoc.getStructureMap().get("病情记录");
+                                    if(allDoctorStr.contains("细菌培养")){
+                                        status.set("0");
+                                        return;
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                }
+            }
+        }
+}

+ 48 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0589.java

@@ -0,0 +1,48 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.LisDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : MI0589
+ * @Description: 报告单缺少细菌培养记录
+ * @author: zh
+ * @time: 2021/04/06 11:22
+ */
+
+public class MI0589 extends QCCatalogue {
+        public void start(InputInfo inputInfo, OutputInfo outputInfo){
+            status.set("0");
+            List<DoctorAdviceDoc> doctorAdviceDocList = inputInfo.getDoctorAdviceDocs();
+            if(ListUtil.isNotEmpty(doctorAdviceDocList)){
+                for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocList) {
+                    Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                    if("临时医嘱".equals(doctorAsks)){
+                        String doctorAsksName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                        if(StringUtil.isNotEmpty(doctorAsksName)&&doctorAsksName.contains("细菌培养")){
+                            status.set("-1");
+                            List<LisDoc> lisDocs = inputInfo.getLisDocs();
+                            if(ListUtil.isNotEmpty(lisDocs)){
+                                for (LisDoc lisDoc : lisDocs) {
+                                    String lisDocStr = lisDoc.getStructureMap().get("报告名称");
+                                    if(StringUtil.isNotEmpty(lisDocStr)&&lisDocStr.contains("细菌培养")){
+                                        status.set("0");
+                                        return;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+}

+ 99 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/OPE03111.java

@@ -0,0 +1,99 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : OPE03111
+ * @Description: 手术病理检查存在手术记录中无病理相关记录
+ * @author: zh
+ * @time: 2021/04/06 11:22
+ */
+@Component
+public class OPE03111 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            //病案首页为空判断医嘱
+            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+            if (doctorAdviceDocs.size() == 0) {
+                return;
+            }
+            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
+                Map<String, String> dadStructureMap = dad.getStructureMap();
+                String state = dadStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                    String name = dadStructureMap.get("医嘱项目名称");
+                    if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
+                            || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
+                        continue;
+                    }
+                    if (name.contains("手术")) {
+                        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                            String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
+                            if (adviceDocName.contains("病理")) {
+                                status.set("-1");
+                                //判断有无手术记录
+                                List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+                                if (operationDocs != null && operationDocs.size() > 0) {
+                                    //有手术记录的情况下,手术记录中应该出现体现有标本
+                                    String operationDocsStr = operationDocs.get(0).getOperationRecordDoc().getStructureMap().get("手术经过及处理");
+                                    if (StringUtil.isNotBlank(operationDocsStr)) {
+                                        if (operationDocsStr.contains("标本")) {
+                                            status.set("0");
+                                            return;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        Map<String, String> structureMap = firstPageRecordDoc.getStructureMap();
+        String pathologyMoneyStr = structureMap.get("病理诊断费");
+        String operationMoneyStr = structureMap.get("手术费");
+        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
+            return;
+        }
+        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
+            return;
+        }
+        double a = Double.parseDouble(pathologyMoneyStr);
+        double b = Double.parseDouble(operationMoneyStr);
+        if (a > Content.pathologicalFee && b > 0) {
+                status.set("-1");
+                //判断有无手术记录
+                List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+                if (operationDocs != null && operationDocs.size() > 0) {
+                //有手术记录的情况下,手术记录中应该出现体现有标本
+                    String operationDocsStr = operationDocs.get(0).getOperationRecordDoc().getStructureMap().get("手术经过及处理");
+                    if(StringUtil.isNotBlank(operationDocsStr)){
+                        if(operationDocsStr.contains("标本")){
+                            status.set("0");
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+}

+ 67 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03115.java

@@ -0,0 +1,67 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.MapUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03115
+ * @Description :  接受CT情况下病程记录缺少CT检查记录
+ * @Author : zh
+ * @Date: 2021-04-06 17:06
+ */
+public class THR03115 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int ctNum=0;
+        int bcNum=0;
+        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
+        if(ListUtil.isNotEmpty(doctorAdviceDocsList)) {
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                //ct取临时医嘱
+                String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                if ("临时医嘱".equals(doctorAsks)) {
+                    //取医嘱项目名称
+                    String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                    if (daItemName.contains("CT") || daItemName.contains("X线")) {
+                        if ((!daItemName.contains("ATCH") && !daItemName.contains("TCT") && !daItemName.contains("HCT") && !daItemName.contains("OCT") && !daItemName.contains("NCT") && !daItemName.contains("LCT") && !daItemName.contains("ACT")) || (daItemName.contains("停"))) {
+                            //都不包含为CT
+                            ctNum++;
+                            continue;
+                        }
+                    }
+                }
+                }
+            }
+            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
+            if(ListUtil.isNotEmpty(allDoctorWradDocs)&&allDoctorWradDocs.size()>0){
+                for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                    Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
+                    String records = structureMap.get("病情记录");
+                    if (records.contains("CT")&&StringUtil.isNotEmpty(records)) {
+                        bcNum++;
+                    }
+                }
+            }
+            if(ctNum!=bcNum){
+                status.set("-1");
+            }
+
+        }
+    }
+
+}

+ 102 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03117.java

@@ -0,0 +1,102 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import io.netty.util.internal.ObjectUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03117
+ * @Description :  病理检查存在病程记录中无病理报告结果
+ * @Author : zh
+ * @Date: 2021-04-02 17:06
+ */
+public class THR03117 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if(firstPageRecordDoc==null){
+            //病案首页为空判断医嘱
+            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+            if (doctorAdviceDocs.size() == 0) {
+                return;
+            }
+            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
+                Map<String, String> dadStructureMap = dad.getStructureMap();
+                String state = dadStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                String name = dadStructureMap.get("医嘱项目名称");
+                if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
+                        || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
+                    continue;
+                }
+                if (name.contains("手术")) {
+                    for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+                        String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
+                        if (adviceDocName.contains("病理")) {
+                            status.set("-1");
+                            //查房记录查找病理报告
+                            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+                            //所有查房记录
+                            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+                            if(ListUtil.isEmpty(allDoctorWradDocs)){
+                                return;
+                            }
+                            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                                String pathographyStr = allDoctorWradDoc.getStructureMap().get("病情记录");
+                                if(pathographyStr.contains("病理报告")){
+                                    status.set("0");
+                                    return;
+                                }
+                            }
+
+                        }
+                    }
+                    }
+                }
+            }
+        }
+        Map<String, String> structureMap = firstPageRecordDoc.getStructureMap();
+        String pathologyMoneyStr = structureMap.get("病理诊断费");
+        String operationMoneyStr = structureMap.get("手术费");
+        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
+            return;
+        }
+        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
+            return;
+        }
+        double a = Double.parseDouble(pathologyMoneyStr);
+        double b = Double.parseDouble(operationMoneyStr);
+        if (a > Content.pathologicalFee && b > 0) {
+            status.set("-1");
+            //查房记录查找病理报告
+            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+            //所有查房记录
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+            if(ListUtil.isEmpty(allDoctorWradDocs)){
+                return;
+            }
+            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                String pathographyStr = allDoctorWradDoc.getStructureMap().get("病情记录");
+                if(pathographyStr.contains("病理报告")){
+                    status.set("0");
+                    return;
+                }
+            }
+        }
+
+    }
+}

+ 18 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03118.java

@@ -0,0 +1,18 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.FirstPageRecordDoc;
+
+/**
+ * @ClassName : THR03118
+ * @Description :  病程记录未记录恶性肿瘤化学治疗相关信息
+ * @Author : zh
+ * @Date: 2021-04-019 17:06
+ */
+public class THR03118 extends QCCatalogue{
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+    }
+}

+ 69 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR3113.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR3113
+ * @Description :  接受MR情况下病程记录缺少MR检查记录
+ * @Author : zh
+ * @Date: 2021-04-06 17:06
+ */
+public class THR3113 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        int ctNum=0;
+        int bcNum=0;
+        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
+        if(ListUtil.isNotEmpty(doctorAdviceDocsList)) {
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
+                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
+                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
+                if(StringUtil.isEmpty(state)){
+                    continue;
+                }
+                if(state.equals("在用")) {
+                //ct取临时医嘱
+                String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
+                if (StringUtil.isNotEmpty(doctorAsks)) {
+                    if ("临时医嘱".equals(doctorAsks)) {
+                        //取医嘱项目名称
+                        String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
+                        if (daItemName.contains("磁共振") || daItemName.contains("MR")) {
+                            if (!daItemName.contains("IMRT") && !daItemName.contains("mrs评分")) {
+                                ctNum++;
+                                continue;
+                            }
+                        }
+                    }
+                    }
+                }
+            }
+            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
+            if(ListUtil.isNotEmpty(allDoctorWradDocs)) {
+                if (allDoctorWradDocs.size() > 0) {
+                    for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                        Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
+                        String records = structureMap.get("病情记录");
+                        if (records.contains("MR") && StringUtil.isNotEmpty(records)) {
+                            bcNum++;
+                        }
+                    }
+                }
+            }
+            if(ctNum!=bcNum){
+                status.set("-1");
+            }
+
+        }
+    }
+
+}

+ 8 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE0369.java

@@ -48,6 +48,14 @@ public class OPE0369 extends QCCatalogue {
         if (operationDocs == null || operationDocs.size() == 0) {
             return;
         }
+        //北仑传入急诊标志,在首次病程录中
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
+            String title = structureMap.get("标题");
+            if (StringUtil.isNotBlank(title) && title.contains("急诊")) {
+                return;
+            }
+        }
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
         int operationCount = getOperationSum(operationDocs); // 获取手术记录次数
 //        long operationCount = operationDocs.stream().filter(operationDoc -> operationDoc.getOperationRecordDoc() != null).count();

+ 21 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/preoperativediscussion/PRE0328.java

@@ -55,6 +55,15 @@ public class PRE0328 extends QCCatalogue {
                 }
             }
         }
+        //北仑传入急诊标志,在首次病程录中
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
+            String title = structureMap.get("标题");
+            String diagPlan = structureMap.get("诊疗计划");
+            if (StringUtil.isNotBlank(title) && title.contains("急诊") && StringUtil.isNotBlank(diagPlan) && diagPlan.contains("介入")) {
+                return;
+            }
+        }
 
         int i = getOperationSum(operationDocs); // 获取手术记录次数
         int j = 0;  // 获取术前讨论、术前小结次数
@@ -70,14 +79,23 @@ public class PRE0328 extends QCCatalogue {
             }
         }
         //医嘱中包含“冠状动脉造影术”,且无术前讨论.则报规则
+        boolean OPSFlag = false;
+        boolean INFlag = false;
         for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
             Map<String, String> doctorAdviceStructuerMap = doctorAdviceDoc.getStructureMap();
             String advicename = doctorAdviceStructuerMap.get("医嘱项目名称");
-            if (StringUtil.isNotBlank(advicename) && advicename.contains("冠状动脉造影术") && j == 0) {
-                status.set("-1");
-                info.set("手术记录不一致");
+            if (StringUtil.isNotBlank(advicename) && advicename.contains("冠状动脉造影术")) {
+                OPSFlag = true;
+            }
+            if (StringUtil.isNotBlank(advicename) && advicename.contains("介入")) {
+                INFlag = true;
             }
         }
+        //如果存在冠状动脉造影术,不存在介入治疗
+        if (OPSFlag && !INFlag && j == 0) {
+            status.set("-1");
+            info.set("手术记录不一致");
+        }
 
         if (i > 0 && i > j) {
             status.set("-1");

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR0134.java

@@ -41,7 +41,7 @@ public class THR0134 extends QCCatalogue {
         String content = firstAttendStructureMap.get("病情记录");
         if (content.contains("诊断明确") || content.contains("目前诊断") || content.contains("目前考虑") || content.contains("当前诊断") ||
                 content.contains("考虑诊断") || content.contains("诊断考虑") || content.contains("诊断基本明确") || content.contains("初步诊断") ||
-                content.contains("诊断为") || regexFind(content, "诊断", "基本明确")) {
+                content.contains("诊断为") || regexFind(content, "诊断", "基本明确")|| content.contains("查房认为")) {
             status.set("0");
             return;
         }

+ 25 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR0139.java

@@ -4,6 +4,7 @@ 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.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
 import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
@@ -77,6 +78,30 @@ public class THR0139 extends QCCatalogue {
                 }
             }
         }
+        //===========三级医师相当于主治医生==========
+        ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+        List<ThreeLevelWardDoc>  allDoctorWradDocs =  threeLevelWardDoc.getAllDoctorWradDocs();
+        if(allDoctorWradDocs.size()>0)
+        {
+
+            for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
+                Map<String, String> structureMap = threeLevelWard.getStructureMap();
+                String makeTitle = structureMap.get("查房标题");
+                if(StringUtil.isNotBlank(makeTitle)&&makeTitle.contains("三级"))
+                {
+                    String recordDateStrs = structureMap.get("查房日期");
+                    if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisDateStr),
+                            StringUtil.parseDateTime(recordDateStrs), 72 * 60L)) {
+
+                        status.set("0");
+                    }
+                    return;
+                }
+            }
+
+
+        }
+
         ThreeLevelWardLabel firstDirectLabel = firstDirectDoc.getThreeLevelWardLabel();
         if (firstDirectLabel == null) {
             return;

+ 34 - 16
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR03090.java

@@ -8,6 +8,7 @@ import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
@@ -19,6 +20,7 @@ import java.util.*;
  * @Date: 2021-01-11 10:39
  */
 @Component
+@Slf4j
 public class THR03090 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
@@ -35,27 +37,43 @@ public class THR03090 extends QCCatalogue {
         if (operationDocs == null || operationDocs.size() == 0) {
             return;
         }
-        String operationStartDate = "";
-        if (operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc() != null) {
-            Map<String, String> operationDocStructureMap = operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc().getStructureMap();
-            operationStartDate = operationDocStructureMap.get("手术开始时间");
-            if (operationStartDate.contains("年月日")) {
-                operationStartDate = DateUtil.nowString();
+
+        //北仑传入急诊标志,在首次病程录中
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
+            String title = structureMap.get("标题");
+            if (StringUtil.isNotBlank(title) && title.contains("急诊")) {
+                return;
             }
         }
 
-        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
-        for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
-            Map<String, String> structureMap = threeLevelWard.getStructureMap();
-            String makeTitle = structureMap.get("查房标题");
-            String writTitle = structureMap.get("文书标题");
-            String makeDate = structureMap.get("查房日期");
-            if (StringUtil.isNotBlank(makeDate) && StringUtil.parseDateTime(makeDate).before(StringUtil.parseDateTime(operationStartDate))) {
-                if (((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主刀")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主刀"))
-                        || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("术前"))))) {
-                    return;
+        String operationStartDate = "";
+        try {
+            if (operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc() != null) {
+                Map<String, String> operationDocStructureMap = operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc().getStructureMap();
+                operationStartDate = operationDocStructureMap.get("手术开始时间");
+                if (operationStartDate.contains("年月日")) {
+                    operationStartDate = DateUtil.nowString();
                 }
             }
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
+                Map<String, String> structureMap = threeLevelWard.getStructureMap();
+                String makeTitle = structureMap.get("查房标题");
+                String writTitle = structureMap.get("文书标题");
+                String makeDate = structureMap.get("查房日期");
+                if (StringUtil.isNotBlank(makeDate) && StringUtil.parseDateTime(makeDate).before(StringUtil.parseDateTime(operationStartDate))) {//时间为空会报错
+                    if (((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主刀")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主刀"))
+                            || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("术前"))))) {
+                        return;
+                    }
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            log.error(this.getClass().getName()+"error:"+e.toString());
+            return;
         }
 
         //判断医嘱里有无手术

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0024.java

@@ -48,7 +48,8 @@ public class BEH0024 extends QCCatalogue {
         }
         //硬规则匹配
         String pastLabelText = pastLabel.getText();
-        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见原病历") || pastLabelText.contains("骨折")) {
+        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见原病历")
+                || pastLabelText.contains("见旧病历") || pastLabelText.contains("见既往病历") || pastLabelText.contains("骨折")) {
             status.set("0");
         }
     }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0025.java

@@ -62,7 +62,7 @@ public class BEH0025 extends QCCatalogue {
         //规则硬匹配
         String pastLabelText = pastLabel.getText();
         if (pastLabelText.contains("手术") || pastLabelText.contains("详见原病历")
-                || pastLabelText.contains("体外碎石")) {
+                || pastLabelText.contains("见旧病历") || pastLabelText.contains("见既往病历")|| pastLabelText.contains("体外碎石")) {
             status.set("0");
         }
     }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0026.java

@@ -39,7 +39,7 @@ public class BEH0026 extends QCCatalogue {
             return;
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("食物过敏史") || pastText.contains("详见原病历")) {
+        if (pastText.contains("食物过敏史") || pastText.contains("详见原病历")|| pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0028.java

@@ -39,7 +39,7 @@ public class BEH0028 extends QCCatalogue {
             return;
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("输血") || pastText.contains("详见原病历")) {
+        if (pastText.contains("输血") || pastText.contains("详见原病历")|| pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0029.java

@@ -48,7 +48,8 @@ public class BEH0029 extends QCCatalogue {
         }
         if (pastLabel != null) {
             String pastText = pastLabel.getText();
-            if (StringUtil.isNotBlank(pastText) && (pastText.contains("详见原病历") || pastText.contains("预防接种"))) {
+            if (StringUtil.isNotBlank(pastText) && (pastText.contains("详见原病历") || pastText.contains("预防接种")
+                    || pastText.contains("见旧病历") || pastText.contains("见既往病历"))) {
                 status.set("0");
                 return;
             }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0030.java

@@ -48,7 +48,7 @@ public class BEH0030 extends QCCatalogue {
         }
         String pastText = pastLabel.getText();
         if (pastText.contains("肝炎") || pastText.contains("结核") || pastText.contains("详见原病历")
-                || pastText.contains("乙肝")) {
+                || pastText.contains("见旧病历") || pastText.contains("见既往病历") || pastText.contains("乙肝")) {
             status.set("0");
         }
     }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0031.java

@@ -52,7 +52,7 @@ public class BEH0031 extends QCCatalogue {
                         , "肺结核", "腹膜透析", "慢性阻塞性肺病", "精神分裂症", "分裂情感性精神病", "双相情感障碍,目前为缓解状态", "前列腺增生"
                         , "高脂血症", "高低密度脂蛋白胆固醇血症", "高胆固醇血症", "高甘油三酯血症", "骨质疏松", "慢性乙型病毒性肝炎"
                         , "慢性庚型肝炎", "慢性肝炎", "慢性丁型肝炎", "慢性病毒性肝炎", "慢性丙型病毒性肝炎", "酒精性肝病", "脂肪肝"
-                        , "肝硬化", "肝恶性肿瘤", "肝恶性细胞瘤", "肝病", "类风湿性关节炎", "心脑血管", "内分泌");
+                        , "肝硬化", "肝恶性肿瘤", "肝恶性细胞瘤", "肝病", "类风湿性关节炎", "心脑血管", "内分泌","见旧病历","见既往病历");
                 for (String word : words) {
                     if (text.contains(word)) {
                         status.set("0");

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0042.java

@@ -55,7 +55,7 @@ public class BEH0042 extends QCCatalogue {
                 status.set("0");
             }
         }
-        if (text.contains("出生")) {
+        if (text.contains("出生")|| text.contains("见旧病历") || text.contains("见既往病历")) {
             status.set("0");
         }
     }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0043.java

@@ -42,8 +42,8 @@ public class BEH0043 extends QCCatalogue {
             return;
         }
         String text = personalLabel.getText();
-        if (StringUtil.isBlank(text) || text.contains("居住") || text.contains("生长") || text.contains("生活")
-                || text.contains("详见原病历")) {
+        if (StringUtil.isBlank(text) || text.contains("居住") || text.contains("生长") || text.contains("生活") || text.contains("本地")
+                || text.contains("详见原病历")|| text.contains("见旧病历") || text.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0047.java

@@ -36,7 +36,7 @@ public class BEH0047 extends QCCatalogue {
             return;
         }
         String pastText = personalLabel.getText();
-        if (pastText.contains("饮酒") || pastText.contains("详见原病历")) {
+        if (pastText.contains("饮酒") || pastText.contains("详见原病历")|| pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0053.java

@@ -46,8 +46,8 @@ public class BEH0053 extends QCCatalogue {
         }
         String maritalText = maritalLabel.getText();
         if ("未婚".equals(marry) || maritalText.contains("未婚") || maritalText.contains("详见原病历")
-                || maritalText.contains("离婚") || maritalText.contains("离异") || maritalText.contains("适龄结婚")
-                || maritalText.contains("丧偶")) {
+                || maritalText.contains("离婚") || maritalText.contains("离异") || maritalText.contains("结婚")
+                || maritalText.contains("丧偶")|| maritalText.contains("见旧病历") || maritalText.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 2 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0058.java

@@ -67,7 +67,7 @@ public class BEH0058 extends QCCatalogue {
         }
         if (StringUtil.isNotBlank(maritalText)) {
             List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女"
-                    , "0-0-0-0", "详见原病历", "0-0-0-0");
+                    , "0-0-0-0", "详见原病历", "0-0-0-0","见旧病历","见既往病历");
             for (String word : words) {
                 if (maritalText.contains(word)) {
                     status.set("0");
@@ -86,7 +86,7 @@ public class BEH0058 extends QCCatalogue {
         if (ListUtil.isNotEmpty(familiesMl)) {
             familyList.addAll(familiesMl);
         }
-        Pattern p = Pattern.compile("[儿子女]");
+        Pattern p = Pattern.compile(".*[儿||女].*");
         if (StringUtil.isNotBlank(familyMembersHealth)) {
             if (p.matcher(familyMembersHealth).find()) {
                 status.set("0");
@@ -98,7 +98,6 @@ public class BEH0058 extends QCCatalogue {
                 .filter(
                         i -> i != null
                                 && StringUtil.isNotBlank(i.getName())
-                                && StringUtil.isContainNumber(i.getName())
                                 && p.matcher(i.getName()).find()
                 )
                 .count();

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0375.java

@@ -48,6 +48,8 @@ public class BEH0375 extends QCCatalogue {
                         || maritalLabel.getText().contains("已逝")
                         || maritalLabel.getText().contains("丧偶")
                         || maritalLabel.getText().contains("详见原病历")
+                        || maritalLabel.getText().contains("见旧病历")
+                        || maritalLabel.getText().contains("见既往病历")
                 )
                 )
         ) {

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0376.java

@@ -55,7 +55,8 @@ public class BEH0376 extends QCCatalogue {
         }
         String maritalText = maritalLabel.getText();
         if (StringUtil.isNotBlank(maritalText)) {
-            List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女", "详见原病历", "无子女");
+            List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女", "详见原病历",
+                    "无子女","见旧病历","见既往病历");
             for (String word : words) {
                 if (maritalText.contains(word)) {
                     status.set("0");

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0397.java

@@ -59,9 +59,9 @@ public class BEH0397 extends QCCatalogue {
         }
         if ((StringUtil.isNotBlank(familyText)
                 && ((familyText.contains("父") || familyText.contains("双亲") || familyText.contains("母"))
-                && (familyText.contains("详见原病历") || familyText.contains("已故") || familyText.contains("体健") || familyText.contains("去世") || familyText.contains("健康")))
+                && (familyText.contains("详见原病历") || familyText.contains("见旧病历") || familyText.contains("见既往病历") || familyText.contains("已故") || familyText.contains("体健") || familyText.contains("去世") || familyText.contains("健康")))
                 || (StringUtil.isNotBlank(maritalText) && ((maritalText.contains("父") || maritalText.contains("双亲") || maritalText.contains("母"))
-                && (maritalText.contains("详见原病历") || maritalText.contains("已故") || maritalText.contains("体健") || maritalText.contains("去世") || familyText.contains("健康")))))) {
+                && (maritalText.contains("详见原病历") || maritalText.contains("见旧病历") || maritalText.contains("见既往病历") || maritalText.contains("已故") || maritalText.contains("体健") || maritalText.contains("去世") || familyText.contains("健康")))))) {
             status.set("0");
             return;
         }

+ 9 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0439.java

@@ -4,7 +4,8 @@ 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.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -28,14 +29,19 @@ public class BEH0439 extends QCCatalogue {
         if (bhMap != null && fprMap != null) {
             String birthDate_bh = bhMap.get("出生日期");
             String birthDate_fpr = fprMap.get("出生日期");
+            String[] dateFormats = new String[]{"yyyy年MM月dd日", "yyyy-MM-dd"};
             if (birthDate_bh != null && birthDate_fpr != null) {
                 if (!CatalogueUtil.isEmpty(birthDate_bh) && !CatalogueUtil.isEmpty(birthDate_fpr)) {
-                    if (!DateUtil.format(DateUtil.parseDate(birthDate_bh), DateUtil.DATE_FORMAT).equals(DateUtil.format(DateUtil.parseDate(birthDate_fpr), DateUtil.DATE_FORMAT))) {
+                    if(!DateUtils.isSameInstant(StringUtil.parseDateTime(birthDate_bh, dateFormats)
+                            ,StringUtil.parseDateTime(birthDate_fpr, dateFormats)))
+                    {
                         status.set("-1");
                     }
+//                    if (!DateUtil.format(DateUtil.parseDate(birthDate_bh), DateUtil.DATE_FORMAT).equals(DateUtil.format(DateUtil.parseDate(birthDate_fpr), DateUtil.DATE_FORMAT))) {
+//                        status.set("-1");
+//                    }
                 }
             }
         }
-
     }
 }

+ 3 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/behospitalized/BEH0454.java

@@ -38,8 +38,10 @@ public class BEH0454 extends QCCatalogue {
             return;
         }
         if (StringUtils.isNotEmpty(pastLabel.getHeathCondition()) || pastLabel.getText().contains("既往")
-                || pastLabel.getText().contains("详见原病历")) {
+                || pastLabel.getText().contains("详见原病历") || pastLabel.getText().contains("健康状况")
+                || pastLabel.getText().contains("见旧病历")) {
             status.set("0");
+            return;
         }
         //既往有任一阳性疾病名称,则认为有健康状况
         List<Diag> diags = pastLabel.getDiags();

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/firstcourserecord/FIRC0095.java

@@ -41,7 +41,7 @@ public class FIRC0095 extends QCCatalogue {
     private List<String> filterList = Arrays.asList("心脏病", "低血糖", "急性", ";");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if (inputInfo.getFirstCourseRecordDoc() == null) {
+        if (inputInfo.getFirstCourseRecordDoc() == null || inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
             return;
         }

+ 4 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/firstpagerecord/FIRP02972.java

@@ -25,7 +25,10 @@ public class FIRP02972 extends QCCatalogue {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String address = firstpageStructureMap.get(Content.current_address);
             if (!CatalogueUtil.isEmpty(address)) {
-                String suffix = (address.length()<=5)?address:(address.substring(address.length()-5));
+                String suffix = (address.length() <= 5) ? address : (address.substring(address.length() - 5));
+                if (suffix.contains("村")) {
+                    return;
+                }
                 Pattern p = Pattern.compile("[0-9一二三四五六七八九0123456789]");
                 Matcher m = p.matcher(suffix);
                 if (!m.find()) {

+ 7 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02891.java

@@ -39,7 +39,7 @@ public class OPE02891 extends QCCatalogue {
         for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
             Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
             String anesOperationName = anesthesiaStructureMap.get("手术名称");
-            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术开始时间");
+            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术日期");
             if (StringUtil.isBlank(anesOperationName)) {
                 continue;
             }
@@ -52,8 +52,8 @@ public class OPE02891 extends QCCatalogue {
                 continue;
             }
             Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
-            if (startEndDate.get("手术开始时间") != null) {
-                Date operationStartDate = startEndDate.get("手术开始时间");
+            if (startEndDate.get("手术日期") != null) {
+                Date operationStartDate = startEndDate.get("手术日期");
                 if (!operationStartDate.equals(anesOperationStartDate)) {
                     status.set("-1");
                     return;
@@ -80,8 +80,8 @@ public class OPE02891 extends QCCatalogue {
             }
             Map<String, String> operationStructureMap = operationRecordDoc.getStructureMap();
             String operationName = operationStructureMap.get("手术名称");
-            String operationStartDateStr = operationStructureMap.get("手术开始时间");
-            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            String operationStartDateStr = operationStructureMap.get("手术日期");
+            String operationEndDateStr = operationStructureMap.get("手术日期");
             if (StringUtil.isBlank(operationName)) {
                 continue;
             }
@@ -100,10 +100,10 @@ public class OPE02891 extends QCCatalogue {
             }
         }
         if (startDate != null) {
-            startEndDateMap.put("手术开始时间", startDate);
+            startEndDateMap.put("手术日期", startDate);
         }
         if (endDate != null) {
-            startEndDateMap.put("手术结束时间", endDate);
+            startEndDateMap.put("手术日期", endDate);
         }
         return startEndDateMap;
     }

+ 7 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02892.java

@@ -39,7 +39,7 @@ public class OPE02892 extends QCCatalogue {
         for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
             Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
             String anesOperationName = anesthesiaStructureMap.get("手术名称");
-            String anesOperationEndDateStr = anesthesiaStructureMap.get("手术结束时间");
+            String anesOperationEndDateStr = anesthesiaStructureMap.get("手术日期");
             if (StringUtil.isBlank(anesOperationName)) {
                 continue;
             }
@@ -52,8 +52,8 @@ public class OPE02892 extends QCCatalogue {
                 continue;
             }
             Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
-            if (startEndDate.get("手术结束时间") != null) {
-                Date operationEndDate = startEndDate.get("手术结束时间");
+            if (startEndDate.get("手术日期") != null) {
+                Date operationEndDate = startEndDate.get("手术日期");
                 if (!operationEndDate.equals(anesOperationEndDate)) {
                     status.set("-1");
                     return;
@@ -80,8 +80,8 @@ public class OPE02892 extends QCCatalogue {
             }
             Map<String, String> operationStructureMap = operationRecordDoc.getStructureMap();
             String operationName = operationStructureMap.get("手术名称");
-            String operationStartDateStr = operationStructureMap.get("手术开始时间");
-            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            String operationStartDateStr = operationStructureMap.get("手术日期");
+            String operationEndDateStr = operationStructureMap.get("手术日期");
             if (StringUtil.isBlank(operationName)) {
                 continue;
             }
@@ -100,10 +100,10 @@ public class OPE02892 extends QCCatalogue {
             }
         }
         if (startDate != null) {
-            startEndDateMap.put("手术开始时间", startDate);
+            startEndDateMap.put("手术日期", startDate);
         }
         if (endDate != null) {
-            startEndDateMap.put("手术结束时间", endDate);
+            startEndDateMap.put("手术日期", endDate);
         }
         return startEndDateMap;
     }

+ 4 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02897.java

@@ -80,8 +80,8 @@ public class OPE02897 extends QCCatalogue {
             }
             Map<String, String> operationStructureMap = operationDiscussionDoc.getStructureMap();
             String operationName = operationStructureMap.get("手术名称");
-            String operationStartDateStr = operationStructureMap.get("手术开始时间");
-            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            String operationStartDateStr = operationStructureMap.get("手术日期");
+            String operationEndDateStr = operationStructureMap.get("手术日期");
             if (StringUtil.isBlank(operationName)) {
                 continue;
             }
@@ -100,10 +100,10 @@ public class OPE02897 extends QCCatalogue {
             }
         }
         if (startDate != null) {
-            startEndDateMap.put("手术开始时间", startDate);
+            startEndDateMap.put("手术日期", startDate);
         }
         if (endDate != null) {
-            startEndDateMap.put("手术结束时间", endDate);
+            startEndDateMap.put("手术日期", endDate);
         }
         return startEndDateMap;
     }

+ 7 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02898.java

@@ -39,7 +39,7 @@ public class OPE02898 extends QCCatalogue {
         for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
             Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
             String anesOperationName = anesthesiaStructureMap.get("手术名称");
-            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术开始时间");
+            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术日期");
             if (StringUtil.isBlank(anesOperationName)) {
                 continue;
             }
@@ -52,8 +52,8 @@ public class OPE02898 extends QCCatalogue {
                 continue;
             }
             Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
-            if (startEndDate.get("手术开始时间") != null) {
-                Date operationStartDate = startEndDate.get("手术开始时间");
+            if (startEndDate.get("手术日期") != null) {
+                Date operationStartDate = startEndDate.get("手术日期");
                 if (!operationStartDate.equals(anesOperationStartDate)) {
                     status.set("-1");
                     return;
@@ -80,8 +80,8 @@ public class OPE02898 extends QCCatalogue {
             }
             Map<String, String> operationStructureMap = operationDiscussionDoc.getStructureMap();
             String operationName = operationStructureMap.get("手术名称");
-            String operationStartDateStr = operationStructureMap.get("手术开始时间");
-            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            String operationStartDateStr = operationStructureMap.get("手术日期");
+            String operationEndDateStr = operationStructureMap.get("手术日期");
             if (StringUtil.isBlank(operationName)) {
                 continue;
             }
@@ -100,10 +100,10 @@ public class OPE02898 extends QCCatalogue {
             }
         }
         if (startDate != null) {
-            startEndDateMap.put("手术开始时间", startDate);
+            startEndDateMap.put("手术日期", startDate);
         }
         if (endDate != null) {
-            startEndDateMap.put("手术结束时间", endDate);
+            startEndDateMap.put("手术日期", endDate);
         }
         return startEndDateMap;
     }

+ 12 - 27
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE02930.java

@@ -38,16 +38,17 @@ public class OPE02930 extends QCCatalogue {
                 continue;
             }
             Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = operationRecordStructureMap.get("手术开始时间");
-            String operationEndDateStr = operationRecordStructureMap.get("手术结束时间");
-            if (StringUtil.isEmpty(operationStartDateStr) || StringUtil.isEmpty(operationEndDateStr)) {
+            String operationDateStr = operationRecordStructureMap.get("手术日期");
+            if (StringUtil.isBlank(operationDateStr)) {
                 continue;
             }
-            if (!isDate(operationStartDateStr) || !isDate(operationEndDateStr)) {
+            if (operationDateStr.contains("结束")) {
+                operationDateStr = operationDateStr.substring(0, operationDateStr.indexOf("结束")).replace("开始:", "");
+            }
+            Date operationDate = StringUtil.parseDateTime(operationDateStr);
+            if(operationDate == null){
                 continue;
             }
-            Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
-            Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
             for (OperationDoc o : operationDocs) {
                 OperationDiscussionDoc operationDiscussionDoc = o.getOperationDiscussionDoc();
                 if (operationDiscussionDoc == null) {
@@ -59,14 +60,12 @@ public class OPE02930 extends QCCatalogue {
                     status.set("0");
                     return;
                 }
-
-                if (!isDate(discussionRecordDateStr)) {
-                    status.set("0");
-                    return;
-                }
                 Date discussionRecordDate = StringUtil.parseDateTime(discussionRecordDateStr);
-                if (operationEndDate.before(discussionRecordDate) || DateUtils.isSameDay(operationEndDate, discussionRecordDate)) {
-                    if (CatalogueUtil.compareTime(operationEndDate, discussionRecordDate, 2 * 60L)) {
+                if(discussionRecordDate == null){
+                    continue;
+                }
+                if (operationDate.before(discussionRecordDate) || DateUtils.isSameDay(operationDate, discussionRecordDate)) {
+                    if (CatalogueUtil.compareTime(operationDate, discussionRecordDate, 2 * 60L)) {
                         status.set("-1");
                         return;
                     }
@@ -74,18 +73,4 @@ public class OPE02930 extends QCCatalogue {
             }
         }
     }
-
-    /**
-     * 判断是否为日期
-     *
-     * @param dateStr
-     */
-    private boolean isDate(String dateStr) {
-        try {
-            StringUtil.parseDateTime(dateStr);
-            return true;
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
-    }
 }

+ 21 - 8
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0369.java

@@ -68,11 +68,18 @@ public class OPE0369 extends QCCatalogue {
             for (OperationDoc operationDoc : operationDocs) {
                 if (operationDoc.getOperationRecordDoc() != null) {
                     Map<String, String> operationDocStructureMap = operationDoc.getOperationRecordDoc().getStructureMap();
-                    operationStartDate = operationDocStructureMap.get("手术开始时间");
-                    if (operationStartDate.contains("年月日")) {
-                        continue;
-                    }
+                    operationStartDate = operationDocStructureMap.get("手术日期");
                     if (StringUtil.isNotBlank(operationStartDate)) {
+                        if (operationStartDate.contains("年月日")) {
+                            continue;
+                        }
+                        if (operationStartDate.contains("结束")) {
+                            operationStartDate = operationStartDate.substring(0, operationStartDate.indexOf("结束")).replace("开始:", "");
+                        }
+                        //取不到时间不判断规则
+                        if (StringUtil.parseDateTime(operationStartDate) == null) {
+                            continue;
+                        }
                         if (!CatalogueUtil.compareTime(
                                 StringUtil.parseDateTime(admisTime),
                                 StringUtil.parseDateTime(operationStartDate),
@@ -143,22 +150,28 @@ public class OPE0369 extends QCCatalogue {
                 continue;
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = structureMap.get("手术开始时间");
+            String operationStartDateStr = structureMap.get("手术日期");
             if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+                if (operationStartDateStr.contains("结束")) {
+                    operationStartDateStr = operationStartDateStr.substring(0, operationStartDateStr.indexOf("结束")).replace("开始:", "");
+                }
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                if(operationStartDate == null){
+                    continue;
+                }
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {
                     /* 放第一个手术记录的日期到operationDateList */
                     if (operationDateList.size() == 0) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDate.put("手术开始日期", operationStartDate);
                         operationDateList.add(operationDate);
                         continue;
                     }
                     /* 如果其中一个手术记录的开始时间到结束时间之间还包含另一个手术,就不往operationDateList里加 */
                     boolean findInnerOperation = false;
                     for (Map<String, Date> date : operationDateList) {
-                        Date listStartDate = DateUtil.dateZeroClear(date.get("手术开始时间"));
+                        Date listStartDate = DateUtil.dateZeroClear(date.get("手术开始日期"));
                         if (listStartDate.equals(operationStartDate)) {
                             findInnerOperation = true;
                             break;
@@ -166,7 +179,7 @@ public class OPE0369 extends QCCatalogue {
                     }
                     if (!findInnerOperation) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDate.put("手术开始日期", operationStartDate);
                         operationDateList.add(operationDate);
                     }
                 }

+ 12 - 12
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0628.java

@@ -24,25 +24,25 @@ public class OPE0628 extends QCCatalogue {
         status.set("0");
 //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
 //        if (isOperativePatient) {
-            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         if(operationDocs == null || operationDocs.size() == 0){
             status.set("0");
             return;
         }
-            if (ListUtil.isNotEmpty(operationDocs)) {
-                long count = operationDocs.stream().filter(operationDoc -> {
-                    boolean flag = false;
-                    if (operationDoc.getOperationRecordDoc() != null
-                            && StringUtil.isBlank(operationDoc.getOperationRecordDoc().getStructureMap().get("手术开始时间"))) {
-                        flag = true;
-                    }
-                    return flag;
-                }).count();
-                if (count > 0) {
-                    status.set("-1");
+        if (ListUtil.isNotEmpty(operationDocs)) {
+            long count = operationDocs.stream().filter(operationDoc -> {
+                boolean flag = false;
+                if (operationDoc.getOperationRecordDoc() != null
+                        && StringUtil.isBlank(operationDoc.getOperationRecordDoc().getStructureMap().get("手术日期"))) {
+                    flag = true;
                 }
+                return flag;
+            }).count();
+            if (count > 0) {
+                status.set("-1");
             }
         }
+    }
 //    }
 
 }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/operationdiscussion/OPE0630.java

@@ -37,7 +37,7 @@ public class OPE0630 extends QCCatalogue {
                 if (operationDoc.getOperationRecordDoc() == null){
                     continue;
                 }
-                String operationStartDateStr = operationDoc.getOperationRecordDoc().getStructureMap().get("手术开始时间");
+                String operationStartDateStr = operationDoc.getOperationRecordDoc().getStructureMap().get("手术日期");
                 if (CatalogueUtil.isEmpty(operationStartDateStr)) {
                     continue;
                 }

+ 11 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/preoperativediscussion/PRE0328.java

@@ -47,7 +47,7 @@ public class PRE0328 extends QCCatalogue {
             OperationRecordDoc operationRecordDoc = operationDocs.get(0).getOperationRecordDoc();
             String startTime = "";
             if (operationRecordDoc != null) {
-                startTime = operationRecordDoc.getStructureMap().get("手术开始时间");
+                startTime = operationRecordDoc.getStructureMap().get("手术日期");
             }
             if (StringUtil.isNotBlank(startTime) && StringUtil.isNotBlank(admisTime) &&
                     !startTime.contains("年月日")) {
@@ -104,22 +104,28 @@ public class PRE0328 extends QCCatalogue {
                 continue;
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = structureMap.get("手术开始时间");
+            String operationStartDateStr = structureMap.get("手术日期");
             if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+                if (operationStartDateStr.contains("结束")) {
+                    operationStartDateStr = operationStartDateStr.substring(0, operationStartDateStr.indexOf("结束")).replace("开始:", "");
+                }
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                if (operationStartDate == null) {
+                    continue;
+                }
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {
                     /* 放第一个手术记录的日期到operationDateList */
                     if (operationDateList.size() == 0) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDate.put("手术日期", operationStartDate);
                         operationDateList.add(operationDate);
                         continue;
                     }
                     /* 如果其中一个手术记录的开始时间到结束时间之间还包含另一个手术,就不往operationDateList里加 */
                     boolean findInnerOperation = false;
                     for (Map<String, Date> date : operationDateList) {
-                        Date listStartDate = DateUtil.dateZeroClear(date.get("手术开始时间"));
+                        Date listStartDate = DateUtil.dateZeroClear(date.get("手术日期"));
                         if (listStartDate.equals(operationStartDate)) {
                             findInnerOperation = true;
                             break;
@@ -127,7 +133,7 @@ public class PRE0328 extends QCCatalogue {
                     }
                     if (!findInnerOperation) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术开始时间", operationStartDate);
+                        operationDate.put("手术日期", operationStartDate);
                         operationDateList.add(operationDate);
                     }
                 }

+ 23 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0125.java

@@ -13,6 +13,7 @@ import org.springframework.stereotype.Component;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @ClassName : THR0125
@@ -87,6 +88,28 @@ public class THR0125 extends QCCatalogue {
                 return;
             }
 
+            //===========三级医师相当于主治医生==========
+            List<ThreeLevelWardDoc>  allDoctorWradDocs =  threeLevelWardDoc.getAllDoctorWradDocs();
+            if(allDoctorWradDocs.size()>0)
+            {
+
+                for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
+                    Map<String, String> structureMap = threeLevelWard.getStructureMap();
+                    String makeTitle = structureMap.get("查房标题");
+                    if(StringUtil.isNotBlank(makeTitle)&&makeTitle.contains("三级"))
+                    {
+                        String recordDateStr = structureMap.get("查房日期");
+                        if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime),
+                                StringUtil.parseDateTime(recordDateStr), 72 * 60L)) {
+                            status.set("0");
+                        }
+                        return;
+                    }
+                }
+
+
+            }
+
             /* 如果存在手术记录,判断主刀医生是否为主治医生 */
 //            String operatorName = "";
 //            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();

+ 21 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0126.java

@@ -106,6 +106,27 @@ public class THR0126 extends QCCatalogue {
                 status.set("0");//没有主治医师查房,若入院时间和系统当前时间对比,相差48小时则报错
                 return;
             }
+            //===========三级医师相当于主治医生==========
+            List<ThreeLevelWardDoc>  allDoctorWradDocs =  threeLevelWardDoc.getAllDoctorWradDocs();
+            if(allDoctorWradDocs.size()>0)
+            {
+
+                for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
+                    Map<String, String> structureMap = threeLevelWard.getStructureMap();
+                    String makeTitle = structureMap.get("查房标题");
+                    if(StringUtil.isNotBlank(makeTitle)&&makeTitle.contains("三级"))
+                    {
+                        String recordDateStr = structureMap.get("查房日期");
+                        if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime),
+                                StringUtil.parseDateTime(recordDateStr), 48 * 60L)) {
+                            status.set("0");
+                        }
+                        return;
+                    }
+                }
+
+
+            }
 
             /* 如果存在手术记录,判断主刀医生是否为主治医生 */
 //            String operatorName = "";

+ 9 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0144.java

@@ -93,13 +93,20 @@ public class THR0144 extends QCCatalogue {
                 return;
             }
             //普通查房 内容需要包含“上级”和“出院”
-            if (StringUtil.isBlank(title)
-                    || (title.contains("日常查房记录") || title.contains("普通查房记录") || title.contains("日常病程记录"))
+            if (StringUtil.isNotBlank(title)
+                    && (title.contains("日常查房记录") || title.contains("普通查房记录") || title.contains("日常病程记录"))
                     && (title.contains("上级") || conditionRecord.contains("上级"))
                     && (conditionRecord.contains("出院") || treatmentPlan.contains("出院"))) {
                 status.set("0");
                 return;
             }
+            // =====添加三级医师查房算出院查房=====
+            if (StringUtil.isNotBlank(title)&& (title.contains("三级"))
+                    && (conditionRecord.contains("出院") || treatmentPlan.contains("出院"))) {
+                status.set("0");
+                return;
+            }
+
             // 添加硬规则,最后一个记录包含“医院”或 “离院”就不报错
             if (lastFlag == true) {
                 if (conditionRecord.contains("医院") || conditionRecord.contains("离院") || conditionRecord.contains("出院")) {

+ 17 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR02900.java

@@ -35,6 +35,16 @@ public class THR02900 extends QCCatalogue {
         if (inputInfo.getThreeLevelWardDocs() != null && inputInfo.getThreeLevelWardDocs().size() > 0) {
             allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
         }
+        //宁海第一人民医院存在术后24小时模板
+        if (ListUtil.isNotEmpty(allDoctorWradDocs)) {
+            for (ThreeLevelWardDoc wardDoc : allDoctorWradDocs) {
+                Map<String, String> wardStructureMap = wardDoc.getStructureMap();
+                String recordTitle = wardStructureMap.get("查房标题");
+                if (StringUtil.isNotBlank(recordTitle) && recordTitle.contains("术后24小时")) {
+                    return;
+                }
+            }
+        }
         //标题
         String allTitle = "";
         //病情记录
@@ -54,16 +64,18 @@ public class THR02900 extends QCCatalogue {
             if (StringUtil.isNotBlank(opeAssName)) {
                 split = opeAssName.split("、");
                 firstAssistant = structureMap.get("助手");
-                opeEndTime = structureMap.get("手术结束时间");
+                opeEndTime = structureMap.get("手术日期");
             } else {
                 firstAssistant = structureMap.get("一助");
                 //取得手术时间截取结束时间(格式 2020-07-24 10:30-2020-07-24 11:45)
-                opeEndTime = structureMap.get("手术时间");
-                opeEndTime = opeEndTime.substring(17);
+                opeEndTime = structureMap.get("手术日期");
+                if (StringUtil.isBlank(opeEndTime) || opeEndTime.contains("年月日")) {
+                    continue;
+                }
             }
             String chiefSurgeon = structureMap.get("主刀医师");
-            if (opeEndTime.contains("年月日")) {
-                continue;
+            if (chiefSurgeon.contains("、")) {
+                chiefSurgeon = chiefSurgeon.split("、")[0];
             }
             Date opeEndDate = CatalogueUtil.parseStringDate(opeEndTime);
             if (opeEndDate == null) {

+ 12 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR03090.java

@@ -40,9 +40,18 @@ public class THR03090 extends QCCatalogue {
         String operationStartDate = "";
         if (operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc() != null) {
             Map<String, String> operationDocStructureMap = operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc().getStructureMap();
-            operationStartDate = operationDocStructureMap.get("手术开始时间");
-            if (operationStartDate.contains("年月日")) {
-                operationStartDate = DateUtil.nowString();
+            operationStartDate = operationDocStructureMap.get("手术日期");
+            if (StringUtil.isNotBlank(operationStartDate)) {
+                if (operationStartDate.contains("结束")) {
+                    operationStartDate = operationStartDate.substring(0, operationStartDate.indexOf("结束")).replace("开始:", "");
+                }
+                if (operationStartDate.contains("年月日")) {
+                    operationStartDate = DateUtil.nowString();
+                }
+                //取不到时间不判断规则
+                if (StringUtil.parseDateTime(operationStartDate) == null) {
+                    return;
+                }
             }
         }
 

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/ninghaiyiyi/threelevelward/THR0601.java

@@ -111,6 +111,13 @@ public class THR0601 extends QCCatalogue {
                 }
             }
 
+            //=======如果是三级医师查房算主治医生查房=======
+            if (StringUtil.isNotBlank(operatorName) && (title.contains("三级") || record.contains("三级"))) {
+                findIndications = true;
+                break;
+            }
+
+
         }
         if (!findIndications) {
             status.set("-1");

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/behospitalized/BEH0407.java

@@ -14,7 +14,7 @@ import java.util.Map;
 
 
 /**
- * @ClassName : BEH0407
+ * @ClassName :     BEH0407
  * @Description : 入院记录婚姻未填写
  * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28

+ 4 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/behospitalized/BEH0414.java

@@ -42,18 +42,18 @@ public class BEH0414 extends QCCatalogue {
                 status.set("0");
                 return;
             }
-            String admissAge = "";
+//            String admissAge = "";
             if (StringUtil.isNotBlank(admissionAge)) {
                 if (admissionAge.contains("岁")) {
-                    admissAge = admissionAge.substring(0, admissionAge.indexOf("岁"));
+                    admissionAge = admissionAge.substring(0, admissionAge.indexOf("岁"));
                 } else if (admissionAge.contains("天")) {
-                    admissAge = admissionAge.substring(0, admissionAge.indexOf("天"));
+                    admissionAge = admissionAge.substring(0, admissionAge.indexOf("天"));
                 }
             }
             // int firstAdmissionAgeNum = removalUnit(firstAdmissionAge);
             // int admissionAgeNum = removalUnit(admissionAge);
             // 只比较年龄前的数值
-            if (!admissAge.equals(firstAdmissionAge)) {
+            if (!admissionAge.equals(firstAdmissionAge)) {
                 status.set("-1");
                 return;
             }

+ 6 - 6
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/firstpagerecord/FIRP0161.java

@@ -42,18 +42,18 @@ public class FIRP0161 extends QCCatalogue {
                 status.set("0");
                 return;
             }
-            String admissAge = "";
+//            String admissAge = "";
             if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("岁")) {
-                admissAge = admissionAge.substring(0, admissionAge.indexOf("岁"));
+                admissionAge = admissionAge.substring(0, admissionAge.indexOf("岁"));
             }
             if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("天")) {
-                admissAge = admissionAge.substring(0, admissionAge.indexOf("天"));
+                admissionAge = admissionAge.substring(0, admissionAge.indexOf("天"));
             }
             if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("分")) {
-                admissAge = admissionAge.substring(0, admissionAge.indexOf("分"));
+                admissionAge = admissionAge.substring(0, admissionAge.indexOf("分"));
             }
             if (StringUtil.isNotBlank(admissionAge) && (admissionAge.contains("时") || admissionAge.contains("小时"))) {
-                admissAge = admissionAge.contains("小时") ? admissionAge.substring(0, admissionAge.indexOf("小")) : admissionAge.substring(0, admissionAge.indexOf("时"));
+                admissionAge = admissionAge.contains("小时") ? admissionAge.substring(0, admissionAge.indexOf("小")) : admissionAge.substring(0, admissionAge.indexOf("时"));
             }
             if (StringUtil.isNotBlank(firstAdmissionAge) && firstAdmissionAge.contains("岁")) {
                 firstAdmissionAge = firstAdmissionAge.substring(0, firstAdmissionAge.indexOf("岁"));
@@ -70,7 +70,7 @@ public class FIRP0161 extends QCCatalogue {
             // int firstAdmissionAgeNum = removalUnit(firstAdmissionAge);
             // int admissionAgeNum = removalUnit(admissionAge);
             // 只比较年龄前的数值
-            if (!admissAge.equals(firstAdmissionAge)) {
+            if (!admissionAge.equals(firstAdmissionAge)) {
                 status.set("-1");
                 Map<String, Object> structureExtMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
                 String xmlId = CatalogueUtil.getXmlId(structureExtMap, Content.age);

+ 6 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/firstpagerecord/FIRP0222.java

@@ -37,6 +37,12 @@ public class FIRP0222 extends QCCatalogue {
         Map<String, String> medStructureMap = medicalRecordInfoDoc.getStructureMap();
         String admitDept = firpStructureMap.get(Content.admitDept);
         String behDeptId = medStructureMap.get("behDeptName");
+        if (StringUtil.isNotBlank(admitDept) && (admitDept.contains("儿科") || admitDept.contains("妇科") || admitDept.contains("乳腺外科"))) {
+            return;
+        }
+        if (StringUtil.isNotBlank(behDeptId) && (behDeptId.contains("儿科") || behDeptId.contains("妇科") || behDeptId.contains("乳腺外科"))) {
+            return;
+        }
         if ("产科".equals(admitDept) && ("产一".equals(behDeptId) || "产二".equals(behDeptId))) {
             return;
         }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/threelevelward/THR0126.java

@@ -155,11 +155,11 @@ public class THR0126 extends QCCatalogue {
      */
     private void visitingPhysicianHouse(String operatorName, String titlePathography) {
         if (StringUtil.isNotBlank(titlePathography)) {
-            if (titlePathography.contains("主治")) {
+            if (titlePathography.contains("主治")||titlePathography.contains("主任")) {
                 status.set("0");
             } else if (StringUtil.isNotBlank(operatorName) && (titlePathography.contains(operatorName) || titlePathography.contains("主刀"))) {
                 String operationProfessor = getFirstCourseProfessor(operatorName);
-                if (operationProfessor.contains("主治")) {
+                if (operationProfessor.contains("主治")||titlePathography.contains("主任")) {
                     status.set("0");
                 }
             }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/yiwu/threelevelward/THR0127.java

@@ -86,8 +86,8 @@ public class THR0127 extends QCCatalogue {
             }
             List<String> resultInfos = new ArrayList<>();
             for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
-                int directorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.director);
-                int dept_doctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.dept_doctor);
+                int directorNum = CatalogueUtil.appearNumberNotSub(roundRecordEveryWeek.get(j).split(","), Content.director);
+                int dept_doctorNum = CatalogueUtil.appearNumberNotSub(roundRecordEveryWeek.get(j).split(","), Content.dept_doctor);
                 if (directorNum + dept_doctorNum < 2) {
                     //每周无2次主任医师查房记录/科主任查房记录
                     status.set("-1");

+ 16 - 0
kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java

@@ -279,6 +279,22 @@ public class CatalogueUtil {
         return count;
     }
 
+    /**
+     * 获取指定字符串出现的次数
+     *
+     * @param srcText  源字符串
+     * @param findText 要查找的字符串
+     * @return
+     */
+    public static int appearNumberNotSub(String[] srcText, String findText) {
+        int count = 0;
+        for (String title : srcText) {
+            if (title.contains(findText)) {
+                count++;
+            }
+        }
+        return count;
+    }
     /**
      * 只保留Date数组中精确到分的格式
      *

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

@@ -231,8 +231,8 @@ public class Content {
     public static final String daCode="医嘱转院机构名称";
     public static final String reHospitalization="三十一天内再住院计划";
 
-
-
+    //病理诊疗最低费用
+    public static final double pathologicalFee= 68.00;
 
 
     public static final String type = "性";

+ 2 - 2
public/src/main/java/com/lantone/qc/pub/model/entity/Pacs.java

@@ -17,8 +17,8 @@ import java.util.List;
 @Getter
 public class Pacs extends General{
     private PD pd;  //时间
-    private PacsValue pacsValues;
-    private BodyPart bodyPart;
+    private PacsValue pacsValues; //辅助检查描述
+    private BodyPart bodyPart; //部位
     private OuterCourtyard outerCourtyard; //外院
     private List<Diag> diags = new ArrayList<>();//疾病
 }

+ 85 - 18
public/src/main/java/com/lantone/qc/pub/util/DateUtil.java

@@ -178,6 +178,59 @@ public class DateUtil {
     public static Date now() {
         return new Date();
     }
+    /**
+     * 获取字符串时间的format
+     * @param time
+     * @return
+     */
+    public static String getTimeFormat(String time)
+    {
+        if(StringUtil.isBlank(time))
+        {
+            return null;
+        }
+        String regex = "\\d+";
+        time = time.replaceAll(regex,"");
+        switch (time)
+        {
+            //===========yyyy年MM月dd日HH时mm分ss秒============
+            case "年月日 时分秒":
+                return "yyyy年MM月dd日 HH时mm分ss秒";
+            case "年月日时分秒":
+                return "yyyy年MM月dd日HH时mm分ss秒";
+            case "年月日 时分":
+                return "yyyy年MM月dd日HH时mm分";
+            case "年月日时分":
+                return "yyyy年MM月dd日HH时mm分";
+            case "年月日 时":
+                return "yyyy年MM月dd日 HH时";
+            case "年月日时":
+                return "yyyy年MM月dd日HH时";
+            case "年月日":
+                return "yyyy年MM月dd日";
+            //===========yyyy-MM-dd HH:mm:ss============
+            case "-- ::":
+                return "yyyy-MM-dd HH:mm:ss";
+            case "-- :":
+                return "yyyy-MM-dd HH:mm";
+            case "-- ":
+                return "yyyy-MM-dd HH";
+            case "--":
+                return "yyyy-MM-dd";
+            //===========yyyy/MM/dd HH:mm:ss============
+            case "// ::":
+                return "yyyy/MM/dd HH:mm:ss";
+            case "// :":
+                return "yyyy/MM/dd HH:mm";
+            case "// ":
+                return "yyyy/MM/dd HH";
+            case "//":
+                return "yyyy/MM/dd";
+            default:
+                break;
+        }
+        return null;
+    }
 
     /**
      * 将日期转换成为字符(yyyy-MM-dd HH:mm:ss.SSS)
@@ -199,24 +252,6 @@ public class DateUtil {
         return null == object ? null : (Date) object;
     }
 
-    /**
-     * 按指定的格式,将字符转换为日期
-     *
-     * @param dateString 日期
-     * @param format     格式
-     * @return 按指定的格式,将字符转换为日期
-     */
-    public static Date parseDate(String dateString, String format) {
-        if (isEmpty(format)) {
-            return null;
-        }
-
-        try {
-            return new SimpleDateFormat(format).parse(dateString);
-        } catch (Exception e) {
-            return null;
-        }
-    }
 
 
     /**
@@ -244,7 +279,39 @@ public class DateUtil {
     public static Date parseDate(String dateString) {
         return parseDate(dateString, DATE_FORMAT);
     }
+    /**
+     * 将字符(yyyy-MM-dd)转换为日期
+     *
+     * @param dateString
+     * @return 将字符(yyyy-MM-dd)转换为日期
+     */
+    public static Date newParseDate(String dateString) {
+        String format = getTimeFormat(dateString);
+        if(format!=null)
+        {
+            return parseDate(dateString, format);
+        }
+        return null;
+    }
 
+    /**
+     * 按指定的格式,将字符转换为日期
+     *
+     * @param dateString 日期
+     * @param format     格式
+     * @return 按指定的格式,将字符转换为日期
+     */
+    public static Date parseDate(String dateString, String format) {
+        if (isEmpty(format)) {
+            return null;
+        }
+
+        try {
+            return new SimpleDateFormat(format).parse(dateString);
+        } catch (Exception e) {
+            return null;
+        }
+    }
     /**
      * 将字符(yyyy-MM-dd HH:mm:ss)转换为日期
      *

+ 2 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicalBloodDocTrans.java

@@ -7,6 +7,7 @@ import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.trans.ModelDocTrans;
 import com.lantone.qc.trans.beilun.util.BeiLunClinicalBloodHtmlAnalysis;
 import com.lantone.qc.trans.beilun.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
 import lombok.extern.slf4j.Slf4j;
@@ -58,6 +59,7 @@ public class BeiLunClinicalBloodDocTrans extends ModelDocTrans {
         }
         if (MapUtils.isNotEmpty(structureMap)) {
             ClinicalBloodDoc clinicalBloodDoc = ModelDocGenerate.clinicalBloodDocGen(structureMap);
+            clinicalBloodDoc.setText(CommonAnalysisUtil.html2String(content));
             clinicalBloodDoc.setPageData((Map) structureMap);
             return clinicalBloodDoc;
         } else {

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstCourseRecordDocTrans.java

@@ -47,6 +47,7 @@ public class BeiLunFirstCourseRecordDocTrans extends ModelDocTrans {
                     structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
                     structureMap.put("记录编号", contentMap.get("recId").toString());
                     structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    structureMap.put("标题", recTitle);
                 }
             }
             if (StringUtil.isNotBlank(structureMap.get("医生签名"))) {

+ 37 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunPacsDocTrans.java

@@ -0,0 +1,37 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.LisDoc;
+import com.lantone.qc.pub.model.doc.PacsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 辅检信息文档生成
+ * @author: zh
+ * @time: 2021/4/7 15:41
+ */
+public class BeiLunPacsDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<PacsDoc> extract(MedrecVo medrecVo) {
+        List<PacsDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getDoctorAdviceDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private PacsDoc getDoctorAdviceDoc(Map<String, String> content) {
+        PacsDoc doctorAdviceDoc = new PacsDoc();
+        doctorAdviceDoc.setStructureMap(content);
+        doctorAdviceDoc.setPageData((Map) content);
+        return doctorAdviceDoc;
+    }
+
+}

+ 5 - 1
trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java

@@ -116,6 +116,10 @@ public class BeilunDocTrans extends DocTrans {
                     BeiLunLisDocTrans lisDocTrans = new BeiLunLisDocTrans();
                     inputInfo.setLisDocs(lisDocTrans.extract(i));
                 }
+                if (i.getTitle().equals("辅检")) {
+                    BeiLunPacsDocTrans pacsDocTrans = new BeiLunPacsDocTrans();
+                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));
+                }
                 if (i.getTitle().equals("门诊")) {
                     BeiLunOutDepDocTrans outDepDocTrans = new BeiLunOutDepDocTrans();
                     inputInfo.setBeHospitalizedDoc(outDepDocTrans.extract(i));
@@ -148,7 +152,7 @@ public class BeilunDocTrans extends DocTrans {
 
         if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
             inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
-            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).collect(Collectors.toList()));
+//            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).collect(Collectors.toList()));
         }
         if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
             inputInfo.getPageData().put(

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiOperationDocTrans.java

@@ -216,7 +216,7 @@ public class NingHaiYiYiOperationDocTrans extends ModelDocTrans {
             "手术经过=手术经过及处理",
             "手术经过(包括病人体位、切口处理、病灶所见及手术步骤等)=手术经过及处理",
             "术后诊断=术中后诊断",
-            "手术人员=主刀医师",
+            "主刀=主刀医师",
             "医师签名=记录医生",
             "患者手术后情况=患者术后情况",
             "麻醉人员=麻醉医师",

+ 64 - 2
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiBeHospitalizedHtmlAnalysis.java

@@ -5,10 +5,12 @@ import com.google.common.collect.Maps;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -51,7 +53,9 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
         NingHaiYiYiHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("header"), map);
         map.forEach((key, value) -> map.put(key, value.replace("\n", "")));
         List<String> titles = Lists.newArrayList("姓 名", "入院时间", "出生日期", "性 别", "性别", "记录时间","年 龄", "出 生 地", "职 业", "职业", "入院时间", "民 族", "民族",
-                "联系地址", "婚 姻", "婚姻", "病史陈述者", "病史可靠度", "家长姓名","住 址","联系电话", "主诉", "主 诉", "现 病 史", "既 往 史", "个 人 史", "母 孕 史", "出 生 史", "喂 养 史",
+                "联系地址", "婚 姻", "婚姻", "病史陈述者", "病史可靠度", "家长姓名","住 址","联系电话", "主诉", "主 诉", "现 病 史","现病史", "既 往 史", "个 人 史", "母 孕 史", "出 生 史", "喂 养 史",
+                "既往史", "个人史", "母孕史", "出生史", "喂养史","婚育史","家族史","年龄","姓名","出生地","住址",
+                "末次月经","身份证号","户籍地址","联 系 人","孕/产 次","预 产 期","产前检查","籍贯","",
                 "生长发育史", "预防接种史", "生活习惯史", "婚 育 史", "月经婚育史", "家 族 史", "辅助检查", "记录医生", "初步诊断", "补充诊断");
         String htmlContent = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
         if (StringUtil.isNotBlank(htmlContent)) {
@@ -59,6 +63,65 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
             CommonAnalysisUtil.html2StructureMap(titles, htmlContent, map);
             disDiagnose(map, Lists.newArrayList("初步诊断"), "医师签名:");
             disDiagnose(map, Lists.newArrayList("初步诊断医师签名:"), "时 间:");
+            //入院记录 体格检查、补充及专科情况里获取辅助检查提取
+            getAuxiliary(map,Lists.newArrayList("体格检查","补充及专科情况","补充及专科情况"),htmlContent);
+            //婚育史特殊符号处理
+//            removeSymbol(map,"□","婚育史");
+        }
+    }
+
+    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList,String htmlContent) {
+        CommonAnalysisUtil.html2StructureMapNoColon(newArrayList, htmlContent, map);
+        //家族史其他内容清理
+        if(map.keySet().contains("家族史"))
+        {
+            String fimaly = map.get("家族史");
+            if(map.keySet().contains("体格检查"))
+            {
+                removeMapVal(map,fimaly,"体格检查","家族史");
+                if(map.keySet().contains("补充及专科情况")&&StringUtil.isBlank(map.get("辅助检查")))
+                {
+                    String auxiliary = map.get("补充及专科情况");
+                    CommonAnalysisUtil.html2StructureMapNoColon(
+                            Lists.newArrayList("辅助检查"),auxiliary, map);
+                    if(map.get("辅助检查").contains("初步诊断")&&StringUtil.isNotBlank(map.get("初步诊断"))
+                            &&map.get("辅助检查").contains(map.get("初步诊断")))
+                    {
+                        String val = map.get("辅助检查");
+                        if(val.contains(map.get("初步诊断")))
+                        {
+                            val = val.split("初步诊断")[0].replaceAll("初步诊断","")
+                                    .replaceAll(":","").trim();
+                            map.put("辅助检查",val);
+
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+
+    private void removeMapVal(Map<String, String> map, String val,String mapkey,String changeKey) {
+        if(val.contains(map.get(mapkey)))
+        {
+            val = val.split(map.get(mapkey))[0].replaceAll(mapkey,"").trim();
+            map.put(changeKey,val);
+        }
+    }
+
+    /**
+     * @Author songxl
+     * @Description map中特殊符号处理
+     * @Date  2021/4/8
+     * @Param [map,symbol,key]
+     * @Return void
+     * @MethodName removeSymbol
+     */
+    private void removeSymbol(Map<String, String> map,String symbol,String key) {
+        if(map.keySet().contains(key))
+        {
+            map.put(key,map.get(key).replaceAll(symbol,"").trim());
         }
     }
 
@@ -200,5 +263,4 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
             }
         }
     }
-
 }

+ 3 - 3
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCrisisValueReportHtmlAnalysis.java

@@ -28,7 +28,7 @@ public class NingHaiYiYiCrisisValueReportHtmlAnalysis implements NingHaiYiYiHtml
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(recTitle,bigDivElement, map);
+            analysisGeneral(recTitle, bigDivElement, map);
             NingHaiYiYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -36,7 +36,7 @@ public class NingHaiYiYiCrisisValueReportHtmlAnalysis implements NingHaiYiYiHtml
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }
@@ -44,7 +44,7 @@ public class NingHaiYiYiCrisisValueReportHtmlAnalysis implements NingHaiYiYiHtml
             bigDivElement.selectFirst("hr").previousElementSiblings().remove();
         }
         String text = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        CommonAnalysisUtil.extractWardInfo(recTitle,text, map);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
         String bqjlText = "病情记录" + map.get("病情记录");
         List<String> titles = Lists.newArrayList(
                 "病情记录"

+ 3 - 2
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiFirstCourseRecordHtmlAnalysis.java

@@ -25,7 +25,7 @@ public class NingHaiYiYiFirstCourseRecordHtmlAnalysis implements NingHaiYiYiHtml
     public Map<String, String> analysis(String... args) {
         Map<String, String> structureMap = Maps.newLinkedHashMap();
         try {
-            List<String> titles = Lists.newArrayList("一. 病例特点", "二. 拟诊讨论", "三. 诊疗计划", "医师签名");
+            List<String> titles = Lists.newArrayList("一. 病例特点", "二. 拟诊讨论", "三. 诊疗计划","三、诊疗计划", "医师签名");
             Document doc = Jsoup.parse(args[0]);
             String htmlContent = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
             if (StringUtil.isNotBlank(htmlContent)) {
@@ -33,7 +33,8 @@ public class NingHaiYiYiFirstCourseRecordHtmlAnalysis implements NingHaiYiYiHtml
             }
             if (structureMap.containsKey("二.拟诊讨论")) {
                 List<String> listTitle = CommonAnalysisUtil.sortTitles(
-                        Lists.newArrayList("1.初步诊断", "2.诊断依据", "3.鉴别诊断"), structureMap.get("二.拟诊讨论")
+                        Lists.newArrayList("1.初步诊断", "2.诊断依据", "3.鉴别诊断"
+                                ,"诊断依据","鉴别诊断","初步诊断"), structureMap.get("二.拟诊讨论")
                 );
                 CommonAnalysisUtil.cutByTitles(structureMap.get("二.拟诊讨论"), listTitle, 0, structureMap);
             }

+ 26 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiLeaveHospitalHtmlAnalysis.java

@@ -28,7 +28,7 @@ public class NingHaiYiYiLeaveHospitalHtmlAnalysis implements NingHaiYiYiHtmlAnal
             List<String> titles = Lists.newArrayList("姓名", "出生年月", "性别", "年龄", "出生日期", "科室", "床位", "床号", "病区", "住院号 ", "住院号",
                     "病理号", "B超", "X片号", "CT号", "MRI号", "内镜", "入院诊断", "出院诊断", "入院日期", "出院日期", "地址", "住院天数", "婚姻", "分娩日期",
                     "分娩方式", "手术指征", "入院情况", "辅助检查","诊治经过", "住院经过", "入院后检查化验结果", "入院后化验检查结果", "诊疗经过", "治疗结果", "转归情况", "出院计划",
-                    "病理检查结果","出院情况", "婴儿情况", "治疗效果", "出院医嘱", "医师签名", "日期", "时 间", "其它", "主治医师", "住院医师");
+                    "病理检查结果","出院情况","出院时情况", "婴儿情况", "治疗效果", "出院医嘱", "医师签名", "日期", "时 间", "其它", "主治医师", "住院医师");
             String html = args[0];
             String recTitle = args[1];
             String recTypeId = args[2];
@@ -49,6 +49,30 @@ public class NingHaiYiYiLeaveHospitalHtmlAnalysis implements NingHaiYiYiHtmlAnal
                 structureMap.put("出院诊断", discharge.substring(0, index));
                 structureMap.put("入院情况", discharge.substring(index + 4));
             }
+            //产科出院记录 出院时情况、诊治经过(入院情况、治疗经过及重要辅助检查) title没有 :故在此特殊处理
+            try
+            {
+                String headerContent = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("header"), true);
+                if("产科".equals(StringUtil.trim(headerContent.substring(headerContent.indexOf("科室:")+"科室:".length()
+                        ,headerContent.indexOf("床号")))))
+                {
+                    if(htmlContent.contains("诊治经过(入院情况、治疗经过及重要辅助检查)")&&htmlContent.contains("辅助检查:"))
+                    {
+                        structureMap.put("诊疗经过",htmlContent.substring(htmlContent.indexOf("诊治经过(入院情况、治疗经过及重要辅助检查)")
+                                +"诊治经过(入院情况、治疗经过及重要辅助检查)".length(),htmlContent.indexOf("辅助检查:")));
+                    }
+                    if(htmlContent.contains("出院时情况")&&htmlContent.contains("出院医嘱:"))
+                    {
+                        structureMap.put("出院情况",htmlContent.substring(htmlContent.indexOf("出院时情况")
+                                +"出院时情况".length(),htmlContent.indexOf("出院医嘱:")));
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                log.error(e.getMessage(), e);
+            }
+
             CommonAnalysisUtil.extractDateByTitle(structureMap, "时间");
             NingHaiYiYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
         } catch (Exception e) {
@@ -56,4 +80,5 @@ public class NingHaiYiYiLeaveHospitalHtmlAnalysis implements NingHaiYiYiHtmlAnal
         }
         return structureMap;
     }
+
 }

+ 32 - 6
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiOperationRecordHtmlAnalysis.java

@@ -44,6 +44,11 @@ public class NingHaiYiYiOperationRecordHtmlAnalysis implements NingHaiYiYiHtmlAn
             }
             if (map.containsKey("主刀")) {
                 map.put("主刀", map.get("主刀").replaceAll("[^\u4E00-\u9FA5]", ""));
+            } else {
+                if (StringUtil.isNotBlank(operatingCrew) && operatingCrew.contains("、")) {
+                    map.put("主刀", operatingCrew.split("、")[0]);
+                    map.put("一助", operatingCrew.split("、")[1]);
+                }
             }
             if (map.containsKey("麻醉者")) {
                 String anesthetist = map.get("麻醉者").replace("麻醉医生:", "");
@@ -62,6 +67,26 @@ public class NingHaiYiYiOperationRecordHtmlAnalysis implements NingHaiYiYiHtmlAn
                     map.put("手术结束时间", operatorDate[1]);
                 }
             }
+            //宁海产科手术记录处理
+            if (map.containsKey("开始") && map.containsKey("结束")
+                    && !map.containsKey("手术开始时间") && !map.containsKey("手术结束时间")
+                    && !map.containsKey("手术日期")) {
+                map.put("手术开始时间", map.get("开始"));
+                String endTime = map.get("结束");
+                if (endTime.contains("手术名称")) {
+                    CommonAnalysisUtil.html2StructureMapNoColon
+                            (Lists.newArrayList("手术名称", "术前诊断", "手术指征", "术后诊断"), endTime, map);
+                    endTime = endTime.split("手术名称")[0].trim();
+                }
+                map.put("手术结束时间", endTime);
+                map.put("手术日期", "开始:" + map.get("手术开始时间") + "  结束:" + map.get("手术结束时间"));
+
+            }
+
+            if (map.containsKey("手术开始时间") && map.containsKey("手术结束时间")) {
+                map.put("手术日期", "开始:" + map.get("手术开始时间") + "  结束:" + map.get("手术结束时间"));
+            }
+
             CommonAnalysisUtil.makeEmpty(map, "医生签名");
             NingHaiYiYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
@@ -77,16 +102,17 @@ public class NingHaiYiYiOperationRecordHtmlAnalysis implements NingHaiYiYiHtmlAn
         String text = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
         text = text.replaceAll("第1页", "");
         List<String> titles = Lists.newArrayList(
-                "姓名", "性别", "出生日期", "出生年月", "科别", "科室", "病区", "床号", "床位", "住院号",
-                "手术时间", "手术日期", "术前诊断", "手术指征", "手术人员", "外邀指导专家","麻醉方式", "麻醉人员", "麻 醉 者", "洗手护士", "本次手术是否属于非计划再次手术", "接生者",
+                "姓名", "性别", "出生日期", "出生年月", "科别", "科室", "病区", "床号", "床位", "住院号", "手术开始时间", "手术结束时间",
+                "手术时间", "手术日期", "术前诊断", "手术指征", "手术人员", "外邀指导专家", "麻醉方式", "麻醉人员", "麻 醉 者", "洗手护士", "本次手术是否属于非计划再次手术", "接生者",
                 "术前胎心", "手术名称", "术后诊断", "手术者及助手名称", "术中取病理标本", "麻醉方法", "手术经过(包括病人体位、切口处理、病灶所见及手术步骤等)",
-                "诊断手术/操作简要经过(包括术中有无并发症及具体描述和处理)", "手术经过","医师签名",
-                "医生签名", "记录时间", "时间", "手术/操作医生", "记录者", "术中输血", "术前宫颈准备日期", "药物名称及用法", "导管或其他", "插入深度",
-                "阴道填塞纱布条", "准备者", "取出日期", "手术方法", "术中特殊情况", "病理检查", "其他", "记录者", "手术者",
-                "检查子宫位置"
+                "诊断手术/操作简要经过(包括术中有无并发症及具体描述和处理)", "手术经过", "医师签名",
+                "医生签名", "手术/操作医生", "记录者", "记录时间", "术中输血", "术前宫颈准备日期", "药物名称及用法", "导管或其他", "插入深度",
+                "阴道填塞纱布条", "准备者", "取出日期", "手术方法", "术中特殊情况", "病理检查", "其他", "手术者",
+                "检查子宫位置", "开始", "结束"
         );
         titles = CommonAnalysisUtil.sortTitles(titles, text);
         CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+
     }
 
 }

+ 23 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuThreeLevelWardDocTrans.java

@@ -70,6 +70,8 @@ public class YiWuThreeLevelWardDocTrans extends ModelDocTrans {
             if (recTitles.contains(recTitle)) {
                 sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
             }
+            //病程内容未解析出来 则在原始文本中获取病程内容
+            addContent(sourceMap);
             structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
 
             if (StringUtils.isEmpty(structureMap.get("查房日期"))) {
@@ -111,6 +113,27 @@ public class YiWuThreeLevelWardDocTrans extends ModelDocTrans {
         }
     }
 
+    private void addContent(Map<String, String> sourceMap) {
+        try
+        {
+            if(sourceMap.containsKey("病程内容")&&StringUtil.isBlank(sourceMap.get("病程内容"))
+                    &&sourceMap.containsKey("原始文本")&&StringUtil.isNotBlank(sourceMap.get("原始文本"))
+                    &&sourceMap.containsKey("病程标题")&&StringUtil.isNotBlank(sourceMap.get("病程标题")))
+            {
+                String content = StringUtil.trim(sourceMap.get("原始文本").split(sourceMap.get("病程标题"))[1]);
+                if(content.contains("记录医师"))
+                {
+                    content = StringUtil.trim(content.split("记录医师")[0]);
+                }
+                sourceMap.put("病程内容",content);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
     /**
      * 主任医师查房
      *