浏览代码

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

lipc 3 年之前
父节点
当前提交
43a8c6e0ee
共有 100 个文件被更改,包括 2672 次插入224 次删除
  1. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0007.java
  2. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0009.java
  3. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0024.java
  4. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0025.java
  5. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0026.java
  6. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0028.java
  7. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0029.java
  8. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0043.java
  9. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0045.java
  10. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0046.java
  11. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0047.java
  12. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0048.java
  13. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0049.java
  14. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0053.java
  15. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0054.java
  16. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0056.java
  17. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0058.java
  18. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0073.java
  19. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02966.java
  20. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0372.java
  21. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0375.java
  22. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0376.java
  23. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0378.java
  24. 4 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0397.java
  25. 32 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI03063.java
  26. 5 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0182.java
  27. 15 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0209.java
  28. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0210.java
  29. 6 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0211.java
  30. 6 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0214.java
  31. 5 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0247.java
  32. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0249.java
  33. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02837.java
  34. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02905.java
  35. 58 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/behospitalized/BEH0072.java
  36. 58 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/firstpagerecord/FIRP0184.java
  37. 51 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/operationdiscussion/OPE0322.java
  38. 17 13
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/operationdiscussion/OPE0369.java
  39. 23 11
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/preoperativediscussion/PRE0328.java
  40. 44 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/preoperativediscussion/PRE0330.java
  41. 42 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0008.java
  42. 50 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0041.java
  43. 71 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0042.java
  44. 47 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0052.java
  45. 68 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH02966.java
  46. 116 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0376.java
  47. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/firstpagerecord/FIRP0163.java
  48. 92 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/leavehospital/LEA0149.java
  49. 4 18
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/operationdiscussion/OPE02930.java
  50. 10 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/operationdiscussion/OPE0369.java
  51. 9 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/preoperativediscussion/PRE0328.java
  52. 6 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR02900.java
  53. 1 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03090.java
  54. 44 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0008.java
  55. 78 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0372.java
  56. 88 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/leavehospital/LEA0149.java
  57. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/operationdiscussion/OPE0369.java
  58. 15 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR02900.java
  59. 70 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0025.java
  60. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0026.java
  61. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0030.java
  62. 69 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0031.java
  63. 79 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH02902.java
  64. 37 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0408.java
  65. 35 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0424.java
  66. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0454.java
  67. 126 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/clinicalblood/CLI03063.java
  68. 30 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/deathrecord/DEAR0343.java
  69. 1 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/deathrecord/DEAR0344.java
  70. 212 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/dutyshiftsystem/DUT0296.java
  71. 43 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/leavehospital/LEA0156.java
  72. 11 42
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/operationdiscussion/OPE02930.java
  73. 215 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0127.java
  74. 98 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0134.java
  75. 99 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0139.java
  76. 69 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR02931.java
  77. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03126.java
  78. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03127.java
  79. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03128.java
  80. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03129.java
  81. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03130.java
  82. 46 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03131.java
  83. 63 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03132.java
  84. 1 1
      kernel/src/main/resources/logback-spring.xml
  85. 1 0
      public/src/main/java/com/lantone/qc/pub/Content.java
  86. 5 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoBeHospitalizedDocTrans.java
  87. 2 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoFirstCourseRecordDocTrans.java
  88. 1 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoLeaveHospitalDocTrans.java
  89. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOperationDocTrans.java
  90. 28 35
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoBeHospitalizedHtmlAnalysis.java
  91. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicBloodEffectHtmlAnalysis.java
  92. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicalBloodHtmlAnalysis.java
  93. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationHtmlAnalysis.java
  94. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationRecordHtmlAnalysis.java
  95. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCrisisValueReportHtmlAnalysis.java
  96. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis.java
  97. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathCaseDiscussHtmlAnalysis.java
  98. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathRecordHtmlAnalysis.java
  99. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis.java
  100. 0 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java

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

@@ -41,7 +41,7 @@ public class BEH0007 extends QCCatalogue {
             status.set("0");
         } else {
             List<Clinical> clinicals = chiefLabel.getClinicals();
-            if (clinicals.size() > 0) {
+            if (clinicals != null && clinicals.size() > 0) {
                 Clinical clinical = clinicals.get(0);
                 List<PD> timestamp = clinical.getTimestamp();
                 if (timestamp.size() > 0) {

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

@@ -22,7 +22,7 @@ import java.util.List;
 @Component
 public class BEH0009 extends QCCatalogue {
     private List<String> containList = Arrays.asList("检查", "术后", "药物", "发现", "误服", "确诊", "经", "异常", "诊断"
-            , "示", "超", "伤", "术", "复查", "体检", "血透", "血液透析");
+            , "示", "超", "伤", "术", "复查", "体检", "血透", "血液透析","孕");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         if (inputInfo.getBeHospitalizedDoc() == null) {

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

@@ -48,7 +48,7 @@ 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("见既往病历") || pastLabelText.contains("右根骨手术")) {
             status.set("0");
         }

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

@@ -61,7 +61,7 @@ public class BEH0025 extends QCCatalogue {
         }
         //规则硬匹配
         String pastLabelText = pastLabel.getText();
-        if (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/behospitalized/BEH0026.java

@@ -39,7 +39,7 @@ public class BEH0026 extends QCCatalogue {
             return;
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("食物过敏史") || pastText.contains("详见原病历")|| 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/behospitalized/BEH0028.java

@@ -39,7 +39,7 @@ public class BEH0028 extends QCCatalogue {
             return;
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("输血") || pastText.contains("详见原病历")|| 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/behospitalized/BEH0029.java

@@ -48,7 +48,7 @@ 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;
@@ -63,7 +63,7 @@ public class BEH0029 extends QCCatalogue {
         }
         if (personalLabel != null) {
             String personText = personalLabel.getText();
-            if (StringUtil.isNotBlank(personText) && (personText.contains("详见原病历") || personText.contains("预防接种"))) {
+            if (StringUtil.isNotBlank(personText) && (personText.contains("详见") || personText.contains("预防接种"))) {
                 status.set("0");
                 return;
             }

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

@@ -43,7 +43,7 @@ public class BEH0043 extends QCCatalogue {
         }
         String text = personalLabel.getText();
         if (StringUtil.isBlank(text) || text.contains("居住") || text.contains("生长") || text.contains("生活") || 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/behospitalized/BEH0045.java

@@ -37,7 +37,7 @@ public class BEH0045 extends QCCatalogue {
             return;
         }
         String personalText = personalLabel.getText();
-        if (personalText.contains("冶游史") || personalText.contains("详见原病历")) {
+        if (personalText.contains("冶游史") || personalText.contains("详见")) {
             status.set("0");
             return;
         }

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

@@ -38,7 +38,7 @@ public class BEH0046 extends QCCatalogue {
         }
         String personalText = personalLabel.getText();
         if (StringUtil.isBlank(personalText) || personalText.contains("偶有") || personalText.contains("烟")
-                || personalText.contains("详见原病历")) {
+                || personalText.contains("详见")) {
             status.set("0");
             return;
         }

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

@@ -36,7 +36,7 @@ public class BEH0047 extends QCCatalogue {
             return;
         }
         String pastText = personalLabel.getText();
-        if (pastText.contains("饮酒") || pastText.contains("详见原病历")|| 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/behospitalized/BEH0048.java

@@ -37,7 +37,7 @@ public class BEH0048 extends QCCatalogue {
             return;
         }
         String personalText = personalLabel.getText();
-        if (personalText.contains("详见原病历")) {
+        if (personalText.contains("详见")) {
             status.set("0");
             return;
         }

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

@@ -28,7 +28,7 @@ public class BEH0049 extends QCCatalogue {
             return;
         }
         String personalText = personalLabel.getText();
-        if (personalText.contains("详见原病历") || personalText.contains("特殊嗜好")) {
+        if (personalText.contains("详见") || personalText.contains("特殊嗜好")) {
             status.set("0");
             return;
         }

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

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

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

@@ -33,7 +33,7 @@ public class BEH0054 extends QCCatalogue {
             return;
         }
         if ("未婚".equals(marry) || StringUtil.isBlank(maritalLabel.getText()) || maritalLabel.getText().contains("未婚")
-                || maritalLabel.getText().contains("详见原病历")) {
+                || maritalLabel.getText().contains("详见")) {
             status.set("0");
             return;
         }

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

@@ -44,7 +44,7 @@ public class BEH0056 extends QCCatalogue {
         String text = maritalLabel.getText();
         if (StringUtil.isNotBlank(text)) {
             if (text.contains("未婚") || text.contains("离异") || text.contains("离婚") || text.contains("丧偶")
-                    || "未婚".equals(marry) || text.contains("详见原病历")) {
+                    || "未婚".equals(marry) || text.contains("详见")) {
                 status.set("0");
                 return;
             }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/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");

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

@@ -39,7 +39,7 @@ public class BEH0073 extends QCCatalogue {
             return;
         }
         String familyText = familyLabel.getText();
-        if (familyText.contains("肝炎") || familyText.contains("结核") || familyText.contains("详见原病历")) {
+        if (familyText.contains("肝炎") || familyText.contains("结核") || familyText.contains("详见")) {
             status.set("0");
             return;
         }

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

@@ -39,7 +39,7 @@ public class BEH02966 extends QCCatalogue {
         } else if (gender.contains("女")) {
             /* 女性不合理词 */
             noMatchWords = Lists.newArrayList("睾丸", "阴茎", "精索", "包皮", "附睾", "输精管",
-                    "射精管", "尿道海绵体", "冠状沟", "精阜", "精囊腺");
+                    "射精管", "尿道海绵体", "冠状沟", "精阜", "精囊腺", "阴囊");
         }
         if (noMatchWords == null || noMatchWords.size() == 0) {
             return;

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

@@ -28,7 +28,7 @@ public class BEH0372 extends QCCatalogue {
         if (StringUtil.isBlank(bhbasicInfoStatus)) {
             bhbasicInfoStatus = inputInfo.getBeHospitalizedDoc().getStructureMap().get("婚姻");
         }
-        if (StringUtil.isBlank(basicInfoStatus) || StringUtil.isBlank(bhbasicInfoStatus)) {
+        if (StringUtil.isBlank(basicInfoStatus) || basicInfoStatus.contains("详见") || StringUtil.isBlank(bhbasicInfoStatus)) {
             status.set("0");
             return;
         }
@@ -49,7 +49,7 @@ public class BEH0372 extends QCCatalogue {
 
         if (bhbasicInfoStatus.equals("丧偶") &&
                 (basicInfoStatus.contains("已故") || basicInfoStatus.contains("丧偶") || basicInfoStatus.contains("去世") ||
-                        basicInfoStatus.contains("亡故") || basicInfoStatus.contains("已逝"))) {
+                        basicInfoStatus.contains("亡故") || basicInfoStatus.contains("已逝") || basicInfoStatus.contains("死"))) {
             status.set("0");
             return;
         }

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

@@ -47,7 +47,7 @@ public class BEH0375 extends QCCatalogue {
                         || maritalLabel.getText().contains("亡故")
                         || maritalLabel.getText().contains("已逝")
                         || maritalLabel.getText().contains("丧偶")
-                        || maritalLabel.getText().contains("详见原病历")
+                        || maritalLabel.getText().contains("详见")
                         || maritalLabel.getText().contains("见旧病历")
                         || maritalLabel.getText().contains("见既往病历")
                 )
@@ -101,7 +101,7 @@ public class BEH0375 extends QCCatalogue {
         String marrytext=inputInfo.getBeHospitalizedDoc().getMaritalLabel().getText();
         if (StringUtil.isNotBlank(marrytext)
                 && ((marrytext.contains("爱人") || marrytext.contains("配偶") || marrytext.contains("妻子") || marrytext.contains("丈夫"))
-                || (marrytext.contains("详见原病历") || marrytext.contains("已故") || marrytext.contains("体健") || marrytext.contains("去世")))) {
+                || (marrytext.contains("详见") || marrytext.contains("已故") || marrytext.contains("体健") || marrytext.contains("去世")))) {
             status.set("0");
             return;
         }

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

@@ -55,7 +55,7 @@ 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)) {

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0378.java

@@ -48,6 +48,9 @@ public class BEH0378 extends QCCatalogue {
         }
         if (maritalLabel != null && maritalLabel.getFamily() != null) {
             familiesMl = maritalLabel.getFamily();
+            if (familiesMl == null) {
+                return;
+            }
             for (Family family : familiesMl) {
                 if (family.getDead() != null && family.getName() != null) {
                     String maritalText = maritalLabel.getText();

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

@@ -59,9 +59,11 @@ 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("详见") || familyText.contains("见旧病历") || familyText.contains("见既往病历"))
                 || (StringUtil.isNotBlank(maritalText) && ((maritalText.contains("父") || maritalText.contains("双亲") || maritalText.contains("母"))
-                && (maritalText.contains("详见原病历") || maritalText.contains("见旧病历") || maritalText.contains("见既往病历") || maritalText.contains("已故") || maritalText.contains("体健") || maritalText.contains("去世") || familyText.contains("健康")))))) {
+                && (maritalText.contains("已故") || maritalText.contains("体健") || maritalText.contains("去世") || familyText.contains("健康"))
+                || maritalText.contains("详见") || maritalText.contains("见旧病历") || maritalText.contains("见既往病历"))))) {
             status.set("0");
             return;
         }

+ 32 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI03063.java

@@ -63,26 +63,43 @@ public class CLI03063 extends QCCatalogue {
                         .compareTo(o2.getStructureMap().get(key));
             }
         });
-        if (clinicalBloodDocs.size() != clinicBloodEffectDocs.size()) {
+        if (clinicalBloodDocs.size() > clinicBloodEffectDocs.size()) {
             status.set("-1");
             return;
         }
-        for (ClinicalBloodDoc clinicalBloodDoc : clinicalBloodDocs) {
-            for (ClinicBloodEffectDoc clinicBloodEffectDoc : clinicBloodEffectDocs) {
+
+        for (int i = 0; i < clinicalBloodDocs.size(); i++) {
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(clinicalBloodDocs.get(i).getStructureMap().get(key)),
+                    StringUtil.parseDateTime(clinicBloodEffectDocs.get(i).getStructureMap().get(key)),
+                    Long.valueOf(1))) {//结果单时间要比申请单大的
                 if (CatalogueUtil.compareTime(
-                        StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
-                        StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
-                        Long.valueOf(1))) {//结果单时间要比申请单大的
-                    if (CatalogueUtil.compareTime(
-                            StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
-                            StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
-                            Long.valueOf(24 * 60))) {//未超过24小时
-                        status.set("-1");
-                        return ;
-                    }
+                        StringUtil.parseDateTime(clinicalBloodDocs.get(i).getStructureMap().get(key)),
+                        StringUtil.parseDateTime(clinicBloodEffectDocs.get(i).getStructureMap().get(key)),
+                        Long.valueOf(24 * 60))) {//未超过24小时
+                    status.set("-1");
+                    return;
                 }
             }
         }
+
+
+//        for (ClinicalBloodDoc clinicalBloodDoc : clinicalBloodDocs) {
+//            for (ClinicBloodEffectDoc clinicBloodEffectDoc : clinicBloodEffectDocs) {
+//                if (CatalogueUtil.compareTime(
+//                        StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
+//                        StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
+//                        Long.valueOf(1))) {//结果单时间要比申请单大的
+//                    if (CatalogueUtil.compareTime(
+//                            StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
+//                            StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
+//                            Long.valueOf(24 * 60))) {//未超过24小时
+//                        status.set("-1");
+//                        return;
+//                    }
+//                }
+//            }
+//        }
         /*
         if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
             for (ClinicBloodEffectDoc cliB : clinicBloodEffectDocs) {
@@ -96,9 +113,9 @@ public class CLI03063 extends QCCatalogue {
 
          */
     }
+
     private String getKeyByHospitalId() {
-        switch (Content.hospital_Id)
-        {
+        switch (Content.hospital_Id) {
             case "7":               //厦门
             case "20":
                 return "病历日期";

+ 5 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0182.java

@@ -25,6 +25,11 @@ public class FIRP0182 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String bingDiag = firstpageStructureMap.get(Content.pathologyDiagnose);
+            String cost = firstpageStructureMap.get(Content.pathologyDiagnoseCost);
+            if (StringUtil.isBlank(cost)) {
+                status.set("0");
+                return;
+            }
             if (StringUtil.isNotBlank(bingDiag) && !bingDiag.equals("[]")) {
                 status.set("0");
             }

+ 15 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0209.java

@@ -7,6 +7,8 @@ import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,15 +19,26 @@ import java.util.Map;
  */
 @Component
 public class FIRP0209 extends QCCatalogue {
+
+    private List<String> containList = Arrays.asList("农民", "家务", "自由职业者", "个体经营者", "无业人员", "儿童");
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String dischargeTime = firstpageStructureMap.get(Content.work_unit);
-            if(StringUtil.isBlank(dischargeTime)){
+            String job = firstpageStructureMap.get(Content.job);
+            if (StringUtil.isBlank(job)) {
+                return;
+            }
+            for (String str : containList) {
+                if (str.contains(job)) {
+                    return;
+                }
+            }
+            if (StringUtil.isBlank(dischargeTime) || "—".equals(dischargeTime)) {
                 status.set("-1");
             }
-
         }
     }
 }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0210.java

@@ -10,7 +10,7 @@ import org.springframework.stereotype.Component;
 import java.util.Map;
 
 /**
- * @ClassName : FIRP0211
+ * @ClassName : FIRP0210
  * @Description : 居住电话未填写
  * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28ss

+ 6 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0211.java

@@ -22,7 +22,12 @@ public class FIRP0211 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String dischargeTime = firstpageStructureMap.get(Content.work_unit_phone);
-            if(StringUtil.isBlank(dischargeTime)){
+            //工作单位 (无工作单位者无需填写单位邮编、电话及地址)
+            String workUnit = firstpageStructureMap.get(Content.work_unit);
+            if (StringUtil.isBlank(workUnit) || "—".equals(workUnit)) {
+                return;
+            }
+            if (StringUtil.isBlank(dischargeTime) || "—".equals(dischargeTime)) {
                 status.set("-1");
             }
 

+ 6 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0214.java

@@ -22,7 +22,12 @@ public class FIRP0214 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String dischargeTime = firstpageStructureMap.get(Content.work_unit_zipcode);
-            if(StringUtil.isBlank(dischargeTime)){
+            //工作单位 (无工作单位者无需填写单位邮编、电话及地址)
+            String workUnit = firstpageStructureMap.get(Content.work_unit);
+            if (StringUtil.isBlank(workUnit) || "—".equals(workUnit)) {
+                return;
+            }
+            if (StringUtil.isBlank(dischargeTime) || "—".equals(dischargeTime)) {
                 status.set("-1");
             }
 

+ 5 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0247.java

@@ -18,10 +18,13 @@ import java.util.Map;
 public class FIRP0247 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        if (inputInfo.getRescueDocs() == null || inputInfo.getRescueDocs().size() == 0) {
+            return;
+        }
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            if(firstpageStructureMap != null){
-                if(StringUtils.isEmpty(firstpageStructureMap.get("病人抢救次数"))){
+            if (firstpageStructureMap != null) {
+                if (StringUtils.isEmpty(firstpageStructureMap.get("病人抢救次数"))) {
                     status.set("-1");
                 }
             }

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0249.java

@@ -18,6 +18,9 @@ import java.util.Map;
 public class FIRP0249 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        if (inputInfo.getRescueDocs() == null || inputInfo.getRescueDocs().size() == 0) {
+            return;
+        }
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             if(firstpageStructureMap != null){

+ 3 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02837.java

@@ -25,7 +25,9 @@ public class FIRP02837 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String age = firstpageStructureMap.get(Content.age);
-            if (!CatalogueUtil.isEmpty(age)) {
+            String newbornAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
+            String newbornAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
+            if (!CatalogueUtil.isEmpty(age) || !CatalogueUtil.isEmpty(newbornAgeMonths) || !CatalogueUtil.isEmpty(newbornAgeDays)) {
                 status.set("0");
             }
         }

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02905.java

@@ -5,6 +5,7 @@ import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -24,7 +25,13 @@ public class FIRP02905 extends QCCatalogue {
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String outWay = firstpageStructureMap.get(Content.outWay);
             String name = firstpageStructureMap.get(Content.receivingOrganization);
+            //医嘱离院不需要接受机构(宁海一院)
+            if (StringUtil.isNotBlank(outWay) && "医嘱离院".equals(outWay)) {
+                status.set("0");
+                return;
+            }
             if (!CatalogueUtil.isEmpty(name)) {
                 status.set("0");
             }

+ 58 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/behospitalized/BEH0072.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.kernel.catalogue.hospital.beilun.behospitalized;
+
+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.entity.Dead;
+import com.lantone.qc.pub.model.entity.Family;
+import com.lantone.qc.pub.model.label.FamilyLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : BEH0072
+ * @Description : 家属有死亡者,未记录死亡原因
+ * @Author : 胡敬
+ * @Date: 2020-03-11 16:44
+ */
+@Component
+public class BEH0072 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getFamilyLabel() != null) {
+            FamilyLabel familyLabel = inputInfo.getBeHospitalizedDoc().getFamilyLabel();
+            if (familyLabel == null) {
+                return;
+            }
+            String familyText = familyLabel.getText();
+            if (StringUtil.isNotBlank(familyText)) {
+                if (familyText.contains("死因") || familyText.contains("原因") || familyText.contains("详")
+                        || familyText.contains("因") || familyText.contains("死于")) {
+                    return;
+                }
+            }
+            List<Family> families = familyLabel.getFamilies();
+            if (ListUtil.isEmpty(families)) {
+                return;
+            }
+            for (Family family : families) {
+                if (family.getDead() != null) {
+                    Dead dead = family.getDead();
+                    if (family.getName().contains("年迈") || dead.getNegative() != null) {
+                        continue;
+                    }
+                    if (dead.getDeadReason() != null || dead.getUnknow() != null) {
+                        return;
+                    } else {
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 58 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/firstpagerecord/FIRP0184.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.kernel.catalogue.hospital.beilun.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.entity.AllergyMedicine;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0184
+ * @Description :药物过敏史未填写
+ * @Author : 胡敬
+ * @Date: 2020-03-16 20:18
+ */
+@Component
+public class FIRP0184 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (inputInfo.getFirstPageRecordDoc() == null || beHospitalizedDoc == null) {
+            return;
+        }
+        Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+        PastLabel pastLabel = beHospitalizedDoc.getPastLabel();
+        if (pastLabel == null) {
+            return;
+        }
+        List<AllergyMedicine> allergyMedicines = pastLabel.getAllergyMedicines();
+        if (allergyMedicines == null) {
+            return;
+        }
+
+        long count = allergyMedicines.stream().filter(allergyMedicine -> {
+            boolean flag = false;
+            if (allergyMedicine.getNegative() == null
+                    && StringUtil.isNotBlank(allergyMedicine.getName())) {
+                flag = true;
+            }
+            return flag;
+        }).count();
+
+        if (count > 0 && firstpageStructureMap != null) {
+            String drugAllergy = firstpageStructureMap.get(Content.drugAllergy);
+            if (CatalogueUtil.isEmpty(drugAllergy)) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 51 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/operationdiscussion/OPE0322.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.kernel.catalogue.hospital.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 手术患者无手术记录
+ * @author: Mark
+ * @time: 2020/04/04 11:22
+ */
+@Component
+public class OPE0322 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //先判断医嘱里有无手术
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        if (doctorAdviceDocs.size() == 0) {
+            return;
+        }
+        long cou = inputInfo.getOperationDocs().stream().map(OperationDoc::getOperationRecordDoc).filter(Objects::nonNull).count();
+        for (DoctorAdviceDoc dad : doctorAdviceDocs) {
+            String name = dad.getStructureMap().get("医嘱项目名称");
+            String daPrescriptionType = dad.getStructureMap().get("医嘱处方类型");
+            String daStartDateStr = dad.getStructureMap().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 (daPrescriptionType.contains("手术") && name.contains("术") && cou == 0) {
+                info.set("医嘱时间" + daStartDateStr);
+                status.set("-1");
+                return;
+            }
+        }
+        /*long cou = inputInfo.getOperationDocs().stream().map(i -> i.getOperationRecordDoc()).filter(i -> i != null).count();
+        if (cou == 0) {
+            status.set("-1");
+        }*/
+    }
+
+}

+ 17 - 13
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/operationdiscussion/OPE0369.java

@@ -1,4 +1,4 @@
-package com.lantone.qc.kernel.catalogue.hospital.beilun.operationdiscussion;
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
 
 import com.alibaba.druid.support.json.JSONUtils;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
@@ -47,9 +47,6 @@ public class OPE0369 extends QCCatalogue {
                 return;
             }
         }
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-        System.out.println(JSONUtils.toJSONString(firstPageRecordDoc));
-        String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
         //先判断是否有手术记录
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         if (operationDocs == null || operationDocs.size() == 0) {
@@ -58,8 +55,12 @@ public class OPE0369 extends QCCatalogue {
         //北仑传入急诊标志,在首次病程录中
         if (inputInfo.getFirstCourseRecordDoc() != null) {
             Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
-            String title = structureMap.get("标题");
-            if (StringUtil.isNotBlank(title) && title.contains("急诊")) {
+            String EDStr = structureMap.get("病例特点");
+            if (StringUtil.isNotBlank(EDStr) && EDStr.contains("急诊")) {
+                return;
+            }
+            EDStr = structureMap.get("诊疗计划");
+            if (StringUtil.isNotBlank(EDStr) && EDStr.contains("急诊")) {
                 return;
             }
         }
@@ -92,13 +93,16 @@ public class OPE0369 extends QCCatalogue {
                         }
 
                         //急诊手术处理【入院途径:急诊,且第一次手术时间和入院时间相差1小时】
-                        if(StringUtil.isNotBlank(behospitalWay)&&"急诊".equals(behospitalWay)
-                        &&!CatalogueUtil.compareTime(
-                                StringUtil.parseDateTime(admisTime),
-                                StringUtil.parseDateTime(operationStartDate),
-                                Long.valueOf(60)))
-                        {
-                            continue;
+                        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+                        if (firstPageRecordDoc != null) {
+                            String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
+                            if (StringUtil.isNotBlank(behospitalWay) && "急诊".equals(behospitalWay)
+                                    && !CatalogueUtil.compareTime(
+                                    StringUtil.parseDateTime(admisTime),
+                                    StringUtil.parseDateTime(operationStartDate),
+                                    Long.valueOf(60))) {
+                                continue;
+                            }
                         }
                         operDateList.add(StringUtil.parseDateTime(operationStartDate));
                     } else {//取不到手术时间

+ 23 - 11
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/preoperativediscussion/PRE0328.java

@@ -1,4 +1,4 @@
-package com.lantone.qc.kernel.catalogue.hospital.beilun.preoperativediscussion;
+package com.lantone.qc.kernel.catalogue.beilun.preoperativediscussion;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.kernel.util.CatalogueUtil;
@@ -42,9 +42,6 @@ public class PRE0328 extends QCCatalogue {
             return;
         }
         boolean emergencyOperation = false;
-
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-        String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
         if (inputInfo.getBeHospitalizedDoc() != null) {
             Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
             String admisTime = beHospitalStructureMap.get("入院日期");
@@ -64,18 +61,33 @@ public class PRE0328 extends QCCatalogue {
                 }
 
                 //判断是否是急诊手术;[判断入院途径:急诊,这种情况不用术前讨论]
-                if(StringUtil.isNotBlank(behospitalWay)&&"急诊".equals(behospitalWay)
-                        &&!CatalogueUtil.compareTime(
-                        StringUtil.parseDateTime(admisTime),
-                        StringUtil.parseDateTime(startTime),
-                        Long.valueOf(60)))
-                {
-                    emergencyOperation = true;
+                FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+                if (firstPageRecordDoc != null) {
+                    String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
+                    if (StringUtil.isNotBlank(behospitalWay) && "急诊".equals(behospitalWay)
+                            && !CatalogueUtil.compareTime(
+                            StringUtil.parseDateTime(admisTime),
+                            StringUtil.parseDateTime(startTime),
+                            Long.valueOf(60))) {
+                        emergencyOperation = true;
 
+                    }
                 }
             }
         }
         //北仑传入急诊标志,在首次病程录中
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
+            String EDStr = structureMap.get("病例特点");
+            if (StringUtil.isNotBlank(EDStr) && EDStr.contains("急诊")) {
+                return;
+            }
+            EDStr = structureMap.get("诊疗计划");
+            if (StringUtil.isNotBlank(EDStr) && EDStr.contains("急诊")) {
+                return;
+            }
+        }
+        //北仑传入急诊标志,在首次病程录中
         if (inputInfo.getFirstCourseRecordDoc() != null) {
             Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
             String title = structureMap.get("标题");

+ 44 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/beilun/preoperativediscussion/PRE0330.java

@@ -0,0 +1,44 @@
+package com.lantone.qc.kernel.catalogue.hospital.beilun.preoperativediscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 术前讨论记录无拟行术式
+ * @author: rengb
+ * @time: 2020/3/23 15:09
+ */
+@Component
+public class PRE0330 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs == null || operationDocs.size() == 0) {
+            return;
+        }
+        for (OperationDoc operationDoc : operationDocs) {
+            if (operationDoc.getPreoperativeDiscussionDoc() != null) {
+                Map<String, String> structureMap = operationDoc.getPreoperativeDiscussionDoc().getStructureMap();
+                if (structureMap != null
+                        && structureMap.get("拟施手术方式、名称及可能的变更与禁忌症") != null) {
+                    return;
+                }
+                if (StringUtil.isEmpty(structureMap.get("拟行术式")) && StringUtil.isEmpty(structureMap.get("可能的变更"))
+                        && StringUtil.isEmpty(structureMap.get("其他术前相关情况"))) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

+ 42 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0008.java

@@ -0,0 +1,42 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+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.entity.Clinical;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * @ClassName : BEH0008
+ * @Description :主诉症状超过3个
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class BEH0008 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
+        if (chiefLabel == null) {
+            return;
+        }
+        String chiefText = chiefLabel.getText();
+        if (StringUtil.isBlank(chiefText)) {
+            return;
+        }
+        List<Clinical> clinicals = chiefLabel.getClinicals();
+        if (clinicals != null && clinicals.size() > 3) {
+            status.set("-1");
+            return;
+        }
+
+    }
+}

+ 50 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0041.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+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.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 个人史未填写
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0041 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if(inputInfo.getBeHospitalizedDoc() == null){
+            status.set("0");
+            return;
+        }
+        //宁还妇幼新生儿不判断此规则
+        if(inputInfo.getFirstPageRecordDoc() != null){
+            Map<String, String> firstPageRecordStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            if(StringUtil.isNotBlank(firstPageRecordStructureMap.get("新生儿出生天数"))){
+                return;
+            }
+        }
+
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        //以台州为例,个人史细分很多结构化信息,取其一
+        if (StringUtils.isNotEmpty(structureMap.get("出生、生长史"))
+                || StringUtils.isNotEmpty(structureMap.get("疫区居留史"))
+                || StringUtils.isNotEmpty(structureMap.get("冶游史"))
+                || StringUtils.isNotEmpty(structureMap.get("工作性质"))
+                || StringUtils.isNotEmpty(structureMap.get("化学及放射性毒物接触史"))) {
+            status.set("0");
+            return;
+        }
+
+        if (StringUtil.isNotBlank(inputInfo.getBeHospitalizedDoc().getPersonalLabel().getText())) {
+            status.set("0");
+        }
+    }
+
+}

+ 71 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0042.java

@@ -0,0 +1,71 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+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.entity.Address;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 出生地未描述
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0042 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if(inputInfo.getBeHospitalizedDoc() == null){
+            status.set("0");
+            return;
+        }
+        //宁还妇幼新生儿不判断此规则
+        if(inputInfo.getFirstPageRecordDoc() != null){
+            Map<String, String> firstPageRecordStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            if(StringUtil.isNotBlank(firstPageRecordStructureMap.get("新生儿出生天数"))){
+                return;
+            }
+        }
+
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if (StringUtils.isNotEmpty(structureMap.get("出生地"))) {
+            status.set("0");
+            return;
+        }
+
+        String text = inputInfo.getBeHospitalizedDoc().getPersonalLabel().getText();
+        if (StringUtil.isBlank(text)) {
+            return;
+        }
+        List<Address> addresses = inputInfo.getBeHospitalizedDoc().getPersonalLabel().getAddresses();
+        if (ListUtil.isNotEmpty(addresses)) {
+            long count = addresses.stream().filter(i -> {
+                boolean flag = false;
+                if (i != null && StringUtil.isNotBlank(i.getName())) {
+                    if (i.getName().indexOf("出生") > -1) {
+                        flag = true;
+                    } else {
+                        Pattern pattern = Pattern.compile("[\\s\\S]*(出生|生长)[\\s\\S]{0,5}" + i.getName() + "[\\s\\S]*");
+                        flag = pattern.matcher(text).matches();
+                    }
+                }
+                return flag;
+            }).count();
+            if (count > 0) {
+                status.set("0");
+            }
+        }
+        if (text.contains("出生")|| text.contains("见旧病历") || text.contains("见既往病历")) {
+            status.set("0");
+        }
+    }
+
+}

+ 47 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0052.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 婚育史未填写
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0052 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        //宁还妇幼新生儿不判断此规则
+        if(inputInfo.getFirstPageRecordDoc() != null){
+            Map<String, String> firstPageRecordStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            if(StringUtil.isNotBlank(firstPageRecordStructureMap.get("新生儿出生天数"))){
+                return;
+            }
+        }
+        Map<String, String> BehStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        String marry = BehStructureMap.get("婚姻");
+        if (StringUtil.isBlank(marry)) {
+            marry = BehStructureMap.get("婚姻状况");
+        }
+        if (StringUtil.isNotBlank(marry) && marry.contains("未婚")) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getBeHospitalizedDoc().getMaritalLabel() == null
+                || StringUtil.isNotBlank(inputInfo.getBeHospitalizedDoc().getMaritalLabel().getText())) {
+            status.set("0");
+        }
+    }
+
+}

+ 68 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH02966.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+import com.google.common.collect.Lists;
+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.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : BEH02966
+ * @Description :  患者病历书写与性别不符(入院记录)
+ * @Author : 胡敬
+ * @Date: 2020-06-13 15:51
+ */
+@Component
+public class BEH02966 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+
+        //宁还妇幼新生儿不判断此规则
+        if(inputInfo.getFirstPageRecordDoc() != null){
+            Map<String, String> firstPageRecordStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            if(StringUtil.isNotBlank(firstPageRecordStructureMap.get("新生儿出生天数"))){
+                return;
+            }
+        }
+
+        Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        String gender = beHospitalStructureMap.get("性别");
+        if (StringUtil.isBlank(gender)) {
+            return;
+        }
+        List<String> noMatchWords = null;
+        if (gender.contains("男")) {
+            /* 男性不合理词 */
+            noMatchWords = Lists.newArrayList("阴道", "宫颈", "子宫", "宫底", "胎位", "胎数", "胎心",
+                    "宫缩", "宫口", "输卵管", "卵巢", "输卵管", "阴唇", "阴蒂", "阴道前庭", "前庭大腺", "处女膜");
+        } else if (gender.contains("女")) {
+            /* 女性不合理词 */
+            noMatchWords = Lists.newArrayList("睾丸", "阴茎", "精索", "包皮", "附睾", "输精管",
+                    "射精管", "尿道海绵体", "冠状沟", "精阜", "精囊腺");
+        }
+        if (noMatchWords == null || noMatchWords.size() == 0) {
+            return;
+        }
+
+        List<String> keys = Lists.newArrayList("主诉", "现病史", "既往史", "个人史", "体格检查", "一般情况"
+                , "初步诊断", "专科体格检查", "神经系统检查", "实验室检查", "影像学检查");
+        String text = CatalogueUtil.structureMapJoin(beHospitalStructureMap, keys);
+
+        for (String noMatchWord : noMatchWords) {
+            if (text.contains(noMatchWord)) {
+                status.set("-1");
+                info.set(noMatchWord);
+                return;
+            }
+        }
+    }
+}

+ 116 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0376.java

@@ -0,0 +1,116 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+import com.google.common.collect.Lists;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.entity.Family;
+import com.lantone.qc.pub.model.label.MaritalLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 子女健康状况未描述
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0376 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        MaritalLabel maritalLabel = beHospitalizedDoc.getMaritalLabel();
+        //台州市结构化的
+        Map<String, String> structureMap_beh = beHospitalizedDoc.getStructureMap();
+        if (StringUtils.isNotEmpty(structureMap_beh.get("子女健康状况"))) {
+            status.set("0");
+            return;
+        }
+        if (maritalLabel == null || StringUtils.isEmpty(maritalLabel.getText())) {
+            status.set("0");
+            return;
+        }
+        //硬规则 匹配未育
+        String marry = structureMap_beh.get(Content.marry);
+        if (StringUtil.isBlank(marry)) {
+            marry = structureMap_beh.get("婚姻状况");
+        }
+        if ("未婚".equals(marry)) {
+            status.set("0");
+            return;
+        }
+        String maritalText = maritalLabel.getText();
+        if (StringUtil.isNotBlank(maritalText)) {
+            List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女", "详见原病历",
+                    "无子女", "见旧病历", "见既往病历");
+            for (String word : words) {
+                if (maritalText.contains(word)) {
+                    status.set("0");
+                    return;
+                }
+            }
+            String regex = ".*\\d+-\\d+-\\d+-0.*";
+            if (maritalText.matches(regex)) {
+                status.set("0");
+                return;
+            }
+            if (maritalText.contains("孕 次")) {
+                maritalText = maritalText.substring(maritalText.indexOf("孕 次"));
+                if (maritalText.contains("健")) {
+                    status.set("0");
+                    return;
+                }
+            }
+        }
+        //未婚 无子女
+        if (maritalLabel.getMaritalStatus() != null && maritalLabel.getMaritalStatus().getName().contains("未婚")) {
+            status.set("0");
+            return;
+        }
+        List<Family> familyList = Lists.newArrayList();
+        List<Family> familiesFl = inputInfo.getBeHospitalizedDoc().getFamilyLabel().getFamilies();
+        List<Family> familiesMl = inputInfo.getBeHospitalizedDoc().getMaritalLabel().getFamily();
+        if (ListUtil.isNotEmpty(familiesFl)) {
+            familyList.addAll(familiesFl);
+        }
+        if (ListUtil.isNotEmpty(familiesMl)) {
+            familyList.addAll(familiesMl);
+        }
+
+        Pattern p = Pattern.compile("[儿子女兄弟姐妹]");
+        List<Family> filterFamilies = familyList
+                .stream()
+                .filter(
+                        i -> i != null
+                                && StringUtil.isNotBlank(i.getName())
+                                && p.matcher(i.getName()).find()).collect(Collectors.toList());
+
+        for (Family family : filterFamilies) {
+            if (family.getDead() != null) {
+                status.set("0");
+                return;
+            } else if (family.getHealthCondition() != null && StringUtil.isNotBlank(family.getHealthCondition().getName())) {
+                status.set("0");
+                return;
+            } else if (family.getDiags() != null && family.getDiags().size() > 0) {
+                status.set("0");
+                return;
+            }
+        }
+    }
+
+}

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/firstpagerecord/FIRP0163.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0163
+ * @Description : 身份证项没有填写
+ * @Author : 胡敬
+ * @Date: 2020-03-14 17:28
+ */
+@Component
+public class FIRP0163 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String idNumber = firstpageStructureMap.get(Content.idNumber);
+            String dept = firstpageStructureMap.get("入院科别");
+            if (StringUtil.isNotBlank(dept) && "NICU".equals(dept)) {
+                status.set("0");
+                return;
+            }
+            if (!CatalogueUtil.isEmpty(idNumber)) {
+                status.set("0");
+            }
+        }
+    }
+}

+ 92 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/leavehospital/LEA0149.java

@@ -0,0 +1,92 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.leavehospital;
+
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 出院记录内容缺主诉
+ * @author: rengb
+ * @time: 2020/3/10 13:53
+ */
+@Component
+public class LEA0149 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (leaveHospitalDoc == null || beHospitalizedDoc == null) {
+            status.set("0");
+            return;
+        }
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if (deathRecordDoc != null) {
+            status.set("0");
+            return;
+        }
+        Map<String, String> lhStructureMap = leaveHospitalDoc.getStructureMap();
+        ChiefLabel chiefLabel = beHospitalizedDoc.getChiefLabel();
+        if (lhStructureMap != null && chiefLabel != null) {
+            String bhChief = CatalogueUtil.int2ChineseNum(chiefLabel.getText().replaceAll("[\\p{Punct}\\pP。-]", ""));
+            String leaveChief = lhStructureMap.get("主诉");
+            String bhThings = lhStructureMap.get("入院情况");
+            String reThings = lhStructureMap.get("诊治经过");   //宁海妇幼主诉在入院原因内
+            if (StringUtil.isNotBlank(bhThings)) {
+                bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhThings.contains("\n")) {
+                    bhThings = bhThings.replace("\n", "");
+                }
+            }
+            if (StringUtil.isNotBlank(reThings)) {
+                reThings = CatalogueUtil.int2ChineseNum(reThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (reThings.contains("\n")) {
+                    reThings = reThings.replace("\n", "");
+                }
+            }
+
+            //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
+            if (StringUtil.isNotBlank(leaveChief)) {
+                leaveChief = CatalogueUtil.int2ChineseNum(leaveChief.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhChief.equals(leaveChief)) {
+                    status.set("0");
+                    return;
+                }
+            }
+            if (StringUtil.isNotBlank(bhThings) && bhThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                status.set("0");
+                return;
+            }
+            //宁海妇幼主诉在入院原因内
+            if (StringUtil.isNotBlank(reThings) && reThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                status.set("0");
+                return;
+            }
+            if (StringUtils.isNotBlank(bhThings)) {
+                Pattern compile = Pattern.compile("(?<=2.).*(?=3.体格检查)");
+                Matcher matcher = compile.matcher(bhThings);
+                while (matcher.find()) {
+                    String number = matcher.group(0);
+                    if (CatalogueUtil.isEmpty(number)) {
+                        status.set("-1");
+                    }
+                }
+                //处理台州的
+                if (bhThings.contains("患者因")) {
+                    status.set("0");
+                }
+            }
+        }
+    }
+}

+ 4 - 18
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/operationdiscussion/OPE02930.java

@@ -38,12 +38,12 @@ public class OPE02930 extends QCCatalogue {
                 continue;
             }
             Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = operationRecordStructureMap.get("手术日期");
-            String operationEndDateStr = operationRecordStructureMap.get("手术日期");
+            String operationStartDateStr = operationRecordStructureMap.get("手术开始时间");
+            String operationEndDateStr = operationRecordStructureMap.get("手术结束时间");
             if (StringUtil.isEmpty(operationStartDateStr) || StringUtil.isEmpty(operationEndDateStr)) {
                 continue;
             }
-            if (!isDate(operationStartDateStr) || !isDate(operationEndDateStr)) {
+            if (StringUtil.parseDateTime(operationEndDateStr) == null) {
                 continue;
             }
             Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
@@ -60,7 +60,7 @@ public class OPE02930 extends QCCatalogue {
                     return;
                 }
 
-                if (!isDate(discussionRecordDateStr)) {
+                if (StringUtil.parseDateTime(discussionRecordDateStr) == null) {
                     status.set("0");
                     return;
                 }
@@ -74,18 +74,4 @@ public class OPE02930 extends QCCatalogue {
             }
         }
     }
-
-    /**
-     * 判断是否为日期
-     *
-     * @param dateStr
-     */
-    private boolean isDate(String dateStr) {
-        try {
-            StringUtil.parseDateTime(dateStr);
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
 }

+ 10 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/operationdiscussion/OPE0369.java

@@ -64,8 +64,8 @@ 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("年月日")) {
+                    operationStartDate = operationDocStructureMap.get("手术开始时间");
+                    if (StringUtil.parseDateTime(operationStartDate) == null) {
                         continue;
                     }
                     if (StringUtil.isNotBlank(operationStartDate)) {
@@ -107,9 +107,9 @@ public class OPE0369 extends QCCatalogue {
                             if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(recordDateStr), date, Long.valueOf(24 * 60))
                                     && (
                                     ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主刀")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主刀")))
-                                    ||((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主任")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主任")))
-                                    ||((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("三级")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("三级")))
-                                    || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前"))|| (StringUtil.isNotBlank(writTitle) && writTitle.contains("术前")))
+                                            || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主任")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主任")))
+                                            || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("三级")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("三级")))
+                                            || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("术前")))
                             )) {
                                 operateCount++;
                             }
@@ -143,22 +143,22 @@ public class OPE0369 extends QCCatalogue {
                 continue;
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = structureMap.get("手术日期");
-            if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+            String operationStartDateStr = structureMap.get("手术开始时间");
+            if (StringUtil.isNotBlank(operationStartDateStr) && StringUtil.parseDateTime(operationStartDateStr) != null) {
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {
                     /* 放第一个手术记录的日期到operationDateList */
                     if (operationDateList.size() == 0) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术日期", operationStartDate);
+                        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 +166,7 @@ public class OPE0369 extends QCCatalogue {
                     }
                     if (!findInnerOperation) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术日期", operationStartDate);
+                        operationDate.put("手术开始时间", operationStartDate);
                         operationDateList.add(operationDate);
                     }
                 }

+ 9 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/preoperativediscussion/PRE0328.java

@@ -5,10 +5,12 @@ import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
@@ -43,11 +45,11 @@ 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("年月日")) {
+                    StringUtil.parseDateTime(startTime) != null) {
                 if (!CatalogueUtil.compareTime(
                         StringUtil.parseDateTime(admisTime),
                         StringUtil.parseDateTime(startTime),
@@ -101,22 +103,22 @@ public class PRE0328 extends QCCatalogue {
                 continue;
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = structureMap.get("手术日期");
-            if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+            String operationStartDateStr = structureMap.get("手术开始时间");
+            if (StringUtil.isNotBlank(operationStartDateStr) && StringUtil.parseDateTime(operationStartDateStr) != null) {
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {
                     /* 放第一个手术记录的日期到operationDateList */
                     if (operationDateList.size() == 0) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术日期", operationStartDate);
+                        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;
@@ -124,7 +126,7 @@ public class PRE0328 extends QCCatalogue {
                     }
                     if (!findInnerOperation) {
                         operationDate = new HashMap<>();
-                        operationDate.put("手术日期", operationStartDate);
+                        operationDate.put("手术开始时间", operationStartDate);
                         operationDateList.add(operationDate);
                     }
                 }

+ 6 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR02900.java

@@ -68,13 +68,16 @@ public class THR02900 extends QCCatalogue {
             } else {
                 firstAssistant = structureMap.get("一助");
                 //取得手术时间截取结束时间(格式 2020-07-24 10:30-2020-07-24 11:45)
-                opeEndTime = structureMap.get("手术日期");
-                if (StringUtil.isBlank(opeEndTime) || opeEndTime.contains("年月日")) {
+                opeEndTime = structureMap.get("手术结束时间");
+                if (StringUtil.isBlank(opeEndTime) || StringUtil.parseDateTime(opeEndTime) == null) {
                     continue;
                 }
             }
             String chiefSurgeon = structureMap.get("主刀医师");
-            if (chiefSurgeon.contains("、")) {
+            if (StringUtil.isBlank(chiefSurgeon)) {
+                chiefSurgeon = structureMap.get("手术人员");
+            }
+            if (StringUtil.isNotBlank(chiefSurgeon) && chiefSurgeon.contains("、")) {
                 chiefSurgeon = chiefSurgeon.split("、")[0];
             }
             Date opeEndDate = CatalogueUtil.parseStringDate(opeEndTime);

+ 1 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03090.java

@@ -40,16 +40,7 @@ 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 (StringUtil.isNotBlank(operationStartDate)) {
-                if (operationStartDate.contains("结束")) {
-                    operationStartDate = operationStartDate.substring(0, operationStartDate.indexOf("结束")).replace("开始:", "");
-                }
-                if (operationStartDate.contains("年月日")) {
-                    operationStartDate = DateUtil.nowString();
-                }
-            }
-
+            operationStartDate = operationDocStructureMap.get("手术开始时间");
         }
 
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();

+ 44 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0008.java

@@ -0,0 +1,44 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaiyiyi.behospitalized;
+
+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.entity.Clinical;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * @ClassName : BEH0008
+ * @Description :主诉症状超过3个
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class BEH0008 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
+        if (chiefLabel == null) {
+            return;
+        }
+        String chiefText = chiefLabel.getText();
+        if (StringUtil.isBlank(chiefText)) {
+            return;
+        }
+        List<Clinical> clinicals = chiefLabel.getClinicals();
+        if (clinicals == null) {
+            return;
+        }
+        if (clinicals.size() > 3) {
+            status.set("-1");
+        }
+
+    }
+}

+ 78 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0372.java

@@ -0,0 +1,78 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaiyiyi.behospitalized;
+
+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.entity.MaritalStatus;
+import com.lantone.qc.pub.model.label.MaritalLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 婚姻状况前后不一致
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0372 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+
+        String basicInfoStatus = inputInfo.getBeHospitalizedDoc().getStructureMap().get("婚育史");
+        String bhbasicInfoStatus = inputInfo.getBeHospitalizedDoc().getStructureMap().get("婚姻状况");
+        if (StringUtil.isBlank(bhbasicInfoStatus)) {
+            bhbasicInfoStatus = inputInfo.getBeHospitalizedDoc().getStructureMap().get("婚姻");
+        }
+        if (StringUtil.isBlank(basicInfoStatus) || StringUtil.isBlank(bhbasicInfoStatus)) {
+            return;
+        }
+
+        if (bhbasicInfoStatus.equals("未婚") && basicInfoStatus.contains("结婚")) {
+            status.set("-1");
+            return;
+        }
+
+        if (bhbasicInfoStatus.equals("未婚") && basicInfoStatus.contains("未婚")) {
+            return;
+        }
+
+        if (StringUtil.isNotBlank(bhbasicInfoStatus) && basicInfoStatus.equals("其他")) {
+            return;
+        }
+
+        if (bhbasicInfoStatus.equals("丧偶") &&
+                (basicInfoStatus.contains("已故") || basicInfoStatus.contains("丧偶") || basicInfoStatus.contains("去世") ||
+                        basicInfoStatus.contains("亡故") || basicInfoStatus.contains("已逝"))) {
+            return;
+        }
+
+        if ((bhbasicInfoStatus.equals("离婚") || bhbasicInfoStatus.equals("离异")) &&
+                (basicInfoStatus.contains("离异") || bhbasicInfoStatus.equals("离婚"))) {
+            return;
+        }
+
+        if (bhbasicInfoStatus.equals("已婚") && (basicInfoStatus.contains("结婚") || basicInfoStatus.contains("再婚") || basicInfoStatus.contains("已婚") || basicInfoStatus.contains("配偶") )) {
+            return;
+        }
+
+        MaritalStatus mts = inputInfo.getBeHospitalizedDoc().getMaritalLabel().getMaritalStatus();
+        if (mts != null && StringUtil.isNotBlank(mts.getName())) {
+            String maritalStatus = mts.getName();
+            if (basicInfoStatus.equals(maritalStatus)) {
+                return;
+            }
+        }
+
+        //无婚育史
+        MaritalLabel maritalLabel = inputInfo.getBeHospitalizedDoc().getMaritalLabel();
+        if (maritalLabel == null || maritalLabel.getText() == null) {
+            return;
+        }
+    }
+
+}

+ 88 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/leavehospital/LEA0149.java

@@ -0,0 +1,88 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaiyiyi.leavehospital;
+
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 出院记录内容缺主诉
+ * @author: rengb
+ * @time: 2020/3/10 13:53
+ */
+@Component
+public class LEA0149 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (leaveHospitalDoc == null || beHospitalizedDoc == null) {
+            return;
+        }
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if (deathRecordDoc != null) {
+            return;
+        }
+        Map<String, String> lhStructureMap = leaveHospitalDoc.getStructureMap();
+        ChiefLabel chiefLabel = beHospitalizedDoc.getChiefLabel();
+        if (lhStructureMap != null && chiefLabel != null && StringUtil.isNotBlank(chiefLabel.getText())) {
+            String bhChief = CatalogueUtil.int2ChineseNum(chiefLabel.getText().replaceAll("[\\p{Punct}\\pP。-]", ""));
+            String leaveChief = lhStructureMap.get("主诉");
+            String bhThings = lhStructureMap.get("入院情况");
+            String reThings = lhStructureMap.get("病史摘要");   //宁海一院主诉在病史摘要内
+            if (StringUtil.isNotBlank(bhThings)) {
+                bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhThings.contains("\n")) {
+                    bhThings = bhThings.replace("\n", "");
+                }
+            }
+            if (StringUtil.isNotBlank(reThings)) {
+                reThings = CatalogueUtil.int2ChineseNum(reThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (reThings.contains("\n")) {
+                    reThings = reThings.replace("\n", "");
+                }
+            }
+
+            //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
+            if (StringUtil.isNotBlank(leaveChief)) {
+                leaveChief = CatalogueUtil.int2ChineseNum(leaveChief.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhChief.equals(leaveChief)) {
+                    return;
+                }
+            }
+            if (StringUtil.isNotBlank(bhThings) && bhThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                return;
+            }
+            //宁海一院主诉在病史摘要内
+            if (StringUtil.isNotBlank(reThings) && reThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                return;
+            }
+            if (StringUtils.isNotBlank(bhThings)) {
+                Pattern compile = Pattern.compile("(?<=2.).*(?=3.体格检查)");
+                Matcher matcher = compile.matcher(bhThings);
+                while (matcher.find()) {
+                    String number = matcher.group(0);
+                    if (CatalogueUtil.isEmpty(number)) {
+                        status.set("-1");
+                    }
+                }
+                //处理台州的
+                if (bhThings.contains("患者因")) {
+                    return;
+                }
+            }
+        }
+    }
+}

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

@@ -21,7 +21,7 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * @Description: 手术患者缺术前主刀医师查房记录
+ * @Description: 主刀医师术前查房未在术前24小时内完成
  * @author: WANGSY
  * @time: 2020/11/11 11:22
  */

+ 15 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR02900.java

@@ -64,17 +64,25 @@ public class THR02900 extends QCCatalogue {
             if (StringUtil.isNotBlank(opeAssName)) {
                 split = opeAssName.split("、");
                 firstAssistant = structureMap.get("助手");
-                opeEndTime = structureMap.get("手术日期");
             } else {
                 firstAssistant = structureMap.get("一助");
-                //取得手术时间截取结束时间(格式 2020-07-24 10:30-2020-07-24 11:45)
-                opeEndTime = structureMap.get("手术日期");
-                if (StringUtil.isBlank(opeEndTime) || opeEndTime.contains("年月日")) {
-                    continue;
+            }
+            //取得手术时间截取结束时间(格式 2020-07-24 10:30-2020-07-24 11:45)
+            opeEndTime = structureMap.get("手术日期");
+            if (StringUtil.isNotBlank(opeEndTime)) {
+                if (opeEndTime.contains("结束")) {
+                    opeEndTime = opeEndTime.substring(0, opeEndTime.indexOf("结束")).replace("开始:", "");
+                }
+                if (opeEndTime.contains("年月日")) {
+                    opeEndTime = DateUtil.nowString();
+                }
+                //取不到时间不判断规则
+                if (StringUtil.parseDateTime(opeEndTime) == null) {
+                    return;
                 }
             }
             String chiefSurgeon = structureMap.get("主刀医师");
-            if (chiefSurgeon.contains("、")) {
+            if (StringUtil.isNotBlank(chiefSurgeon) && chiefSurgeon.contains("、")) {
                 chiefSurgeon = chiefSurgeon.split("、")[0];
             }
             Date opeEndDate = CatalogueUtil.parseStringDate(opeEndTime);
@@ -126,7 +134,7 @@ public class THR02900 extends QCCatalogue {
                     StringUtil.isNotBlank(firstAssistant) && !allTitle.contains(firstAssistant)) {
                 status.set("-1");
                 return;
-            } else if (StringUtil.isBlank(chiefSurgeon) && StringUtil.isBlank(firstAssistant) && split.length > 1) {
+            } else if (StringUtil.isBlank(chiefSurgeon) && StringUtil.isBlank(firstAssistant) && split != null && split.length > 1) {
                 for (int i = 0; i < split.length; i++) {
                     if (allTitle.contains(split[i])) {
                         return;

+ 70 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0025.java

@@ -0,0 +1,70 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.behospitalized;
+
+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.entity.Diag;
+import com.lantone.qc.pub.model.entity.Operation;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术史未填写
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0025 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        //台州结构化
+        Map<String, String> behStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if (StringUtils.isNotEmpty(behStructureMap.get("手术外伤史"))) {
+            status.set("0");
+            return;
+        }
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        /* 如果既往史为空或者既往史文本为空,则不报错 */
+        if (pastLabel == null || StringUtil.isBlank(pastLabel.getText())) {
+            status.set("0");
+            return;
+        }
+        List<Operation> operations = pastLabel.getOperations();
+        if (ListUtil.isNotEmpty(operations)) {
+            if (operations.stream().map(i -> i.getName()).filter(i -> StringUtil.isNotBlank(i)).count() > 0) {
+                status.set("0");
+                return;
+            }
+        }
+        /* 疾病名称:**术后**,算是有手术史 */
+        List<Diag> diags = pastLabel.getDiags();
+        for (Diag diag : diags) {
+            String hospitalDiagName = diag.getHospitalDiagName();
+            if (StringUtil.isBlank(hospitalDiagName)) {
+                continue;
+            }
+            if (hospitalDiagName.contains("术后")) {
+                status.set("0");
+                return;
+            }
+        }
+        //规则硬匹配
+        String pastLabelText = pastLabel.getText();
+        if (pastLabelText.contains("术") || pastLabelText.contains("详见")
+                || pastLabelText.contains("见旧病历") || pastLabelText.contains("见既往病历")|| pastLabelText.contains("体外碎石")) {
+            status.set("0");
+        }
+    }
+
+}

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0026.java

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

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

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

+ 69 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0031.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.behospitalized;
+
+import com.google.common.collect.Lists;
+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.label.PastLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 慢病史未填写
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0031 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if (StringUtils.isNotEmpty(structureMap.get("高血压"))) {
+            status.set("0");
+            return;
+        }
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        if (pastLabel != null && StringUtil.isNotBlank(pastLabel.getText())) {
+            if (ListUtil.isNotEmpty(
+                    CatalogueUtil.filterDiagsByNature(
+                            pastLabel.getDiags(),
+                            "chronic",
+                            "1"
+                    )
+            )) {
+                status.set("0");
+            }
+            //硬规则匹配
+            String text = pastLabel.getText();
+            if (StringUtils.isNotEmpty(text)) {
+                List<String> words = Lists.newArrayList("高血压", "糖尿病", "阿尔茨海默病", "帕金森", "冠心病心律失常型"
+                        , "冠状动脉性心脏病", "冠状动脉粥样硬化性心脏病", "慢性肾炎综合征", "肾病", "肾疾病", "慢性肾衰竭", "肾功能异常", "哮喘"
+                        , "肺结核", "腹膜透析", "慢性阻塞性肺病", "精神分裂症", "分裂情感性精神病", "双相情感障碍,目前为缓解状态", "前列腺增生"
+                        , "高脂血症", "高低密度脂蛋白胆固醇血症", "高胆固醇血症", "高甘油三酯血症", "骨质疏松", "慢性乙型病毒性肝炎"
+                        , "慢性庚型肝炎", "慢性肝炎", "慢性丁型肝炎", "慢性病毒性肝炎", "慢性丙型病毒性肝炎", "酒精性肝病", "脂肪肝"
+                        , "肝硬化", "肝恶性肿瘤", "肝恶性细胞瘤", "肝病", "肝疾病", "类风湿性关节炎", "心血管", "心脑血管", "脑血管", "内分泌", "见旧病历", "详见", "见既往病历");
+                for (String word : words) {
+                    if (text.contains(word)) {
+                        status.set("0");
+                        return;
+                    }
+                }
+            }
+        } else {
+            status.set("0");
+            return;
+        }
+    }
+
+}

+ 79 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH02902.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.behospitalized;
+
+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.entity.PD;
+import com.lantone.qc.pub.model.entity.Pacs;
+import com.lantone.qc.pub.model.label.PacsLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : BEH02902
+ * @Description : 辅助检查未注明地点
+ * @Author : 胡敬
+ * @Date: 2020-05-28 09:56
+ */
+@Component
+public class BEH02902 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+
+        String pacsText = inputInfo.getBeHospitalizedDoc().getStructureMap().get("辅助检查");
+        if (StringUtil.isBlank(pacsText)) {
+            status.set("0");
+            return;
+        }
+
+        if (StringUtil.isNotBlank(pacsText) && (pacsText.contains("暂缺") || pacsText.contains("暂无"))) {
+            status.set("0");
+            return;
+        }
+
+        PacsLabel pacsLabel = inputInfo.getBeHospitalizedDoc().getPacsLabel();
+        if (pacsLabel == null || StringUtil.isBlank(pacsLabel.getText())) {
+            status.set("0");
+            return;
+        }
+        boolean findPlace = false;
+        pacsText = pacsLabel.getText();
+        List<Pacs> pacses = pacsLabel.getPacses();
+        if (pacses != null) {
+            for (Pacs pacs : pacses) {
+                /* 时间为入院检查的时间,模型输出处理后结构为 name为空,pd不为空 */
+                if (pacs.getName() == null && pacs.getPd() != null) {
+                    /* 模型先找到时间实体,找到后再从这个时间实体开始,往前往后找 */
+                    PD pd = pacs.getPd();
+                    String name = pd.getName();
+                    int timeIndex = pacsText.indexOf(name);
+                    String beforeTimeText = pacsText.substring(Math.max(timeIndex - 5, 0), timeIndex);
+                    String afterTimeText = pacsText.substring(timeIndex + name.length(), Math.min(timeIndex + name.length() + 10, pacsText.length()));
+                    if (beforeTimeText.contains("院") || afterTimeText.contains("院")) {
+                        findPlace = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        /* 如果模型没找到时间实体,则直接取辅助检查前20个字,判断有没有院字 */
+        if (!findPlace) {
+            String prefixText = pacsText.substring(0, Math.min(25, pacsText.length()));
+            if (prefixText.contains("院")) {
+                findPlace = true;
+            }
+        }
+
+        if (findPlace) {
+            status.set("0");
+            return;
+        }
+    }
+}

+ 37 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0408.java

@@ -0,0 +1,37 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.behospitalized;
+
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+
+/**
+ * @ClassName : BEH0408
+ * @Description : 入院记录联系地址未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class BEH0408 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if (structureMap != null) {
+            String name = structureMap.get("住址");
+            if (name == null && structureMap.get("现住址") != null) {
+                name = structureMap.get("现住址");
+            }
+            if (CatalogueUtil.isEmpty(name)) {
+                status.set("-1");
+            }
+        }
+
+    }
+}

+ 35 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0424.java

@@ -0,0 +1,35 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.behospitalized;
+
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+
+/**
+ * @ClassName : BEH0424
+ * @Description :  入院记录联系电话未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class BEH0424 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if(structureMap != null){
+            String phone = structureMap.get("电话");
+            String contactNumber = structureMap.get("联系电话");
+            if(CatalogueUtil.isEmpty(phone) && CatalogueUtil.isEmpty(contactNumber)){
+                status.set("-1");
+            }
+        }
+
+    }
+}

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH0454.java

@@ -38,7 +38,7 @@ 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("详见") || pastLabel.getText().contains("健康状况")
                 || pastLabel.getText().contains("见旧病历")) {
             status.set("0");
             return;

+ 126 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/clinicalblood/CLI03063.java

@@ -0,0 +1,126 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.clinicalblood;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @ClassName : CLI0309
+ * @Description : 输血后效果评价未在24小时完成
+ * @Author : 王宇
+ * @Date: 2020-08-14 10:18
+ */
+@Component
+public class CLI03063 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();//输血记录
+        List<ClinicBloodEffectDoc> clinicBloodEffectDocs = inputInfo.getClinicBloodEffectDocs();//输血效果评价
+        if (ListUtil.isEmpty(clinicalBloodDocs)) {
+            return;
+        }
+        Iterator<ClinicalBloodDoc> clinicalBloodDocIterator = clinicalBloodDocs.iterator();
+        Iterator<ClinicBloodEffectDoc> clinicBloodEffectDocIterator = clinicBloodEffectDocs.iterator();
+        String key = getKeyByHospitalId();
+        while (clinicalBloodDocIterator.hasNext()) {
+            if (!CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(clinicalBloodDocIterator.next().getStructureMap().get(key)),
+                    StringUtil.parseDateTime(DateUtil.nowString()),
+                    Long.valueOf(24 * 60))) {//如果接收未超过24小时,规则不判断
+                clinicalBloodDocIterator.remove();
+            }
+        }
+        while (clinicBloodEffectDocIterator.hasNext()) {
+            if (!CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(clinicBloodEffectDocIterator.next().getStructureMap().get(key)),
+                    StringUtil.parseDateTime(DateUtil.nowString()),
+                    Long.valueOf(24 * 60))) {//如果接收未超过24小时,规则不判断
+                clinicBloodEffectDocIterator.remove();
+            }
+        }
+        Collections.sort(clinicalBloodDocs, new Comparator<ClinicalBloodDoc>() {
+            public int compare(ClinicalBloodDoc o1, ClinicalBloodDoc o2) {
+                return o1.getStructureMap().get(key)
+                        .compareTo(o2.getStructureMap().get(key));
+            }
+        });
+        Collections.sort(clinicBloodEffectDocs, new Comparator<ClinicBloodEffectDoc>() {
+            public int compare(ClinicBloodEffectDoc o1, ClinicBloodEffectDoc o2) {
+                return o1.getStructureMap().get(key)
+                        .compareTo(o2.getStructureMap().get(key));
+            }
+        });
+        if (clinicalBloodDocs.size() > clinicBloodEffectDocs.size()) {
+            status.set("-1");
+            return;
+        }
+
+        for (int i = 0; i < clinicalBloodDocs.size(); i++) {
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(clinicalBloodDocs.get(i).getStructureMap().get(key)),
+                    StringUtil.parseDateTime(clinicBloodEffectDocs.get(i).getStructureMap().get(key)),
+                    Long.valueOf(1))) {//结果单时间要比申请单大的
+                if (CatalogueUtil.compareTime(
+                        StringUtil.parseDateTime(clinicalBloodDocs.get(i).getStructureMap().get(key)),
+                        StringUtil.parseDateTime(clinicBloodEffectDocs.get(i).getStructureMap().get(key)),
+                        Long.valueOf(24 * 60))) {//未超过24小时
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+
+
+//        for (ClinicalBloodDoc clinicalBloodDoc : clinicalBloodDocs) {
+//            for (ClinicBloodEffectDoc clinicBloodEffectDoc : clinicBloodEffectDocs) {
+//                if (CatalogueUtil.compareTime(
+//                        StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
+//                        StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
+//                        Long.valueOf(1))) {//结果单时间要比申请单大的
+//                    if (CatalogueUtil.compareTime(
+//                            StringUtil.parseDateTime(clinicalBloodDoc.getStructureMap().get(key)),
+//                            StringUtil.parseDateTime(clinicBloodEffectDoc.getStructureMap().get(key)),
+//                            Long.valueOf(24 * 60))) {//未超过24小时
+//                        status.set("-1");
+//                        return;
+//                    }
+//                }
+//            }
+//        }
+        /*
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            for (ClinicBloodEffectDoc cliB : clinicBloodEffectDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                if (StringUtils.isEmpty(cliBStructureMap.get("输注后效果评价"))) {
+                    status.set("-1");
+                    break;
+                }
+            }
+        }
+
+         */
+    }
+
+    private String getKeyByHospitalId() {
+        switch (Content.hospital_Id) {
+            case "7":               //厦门
+            case "20":
+                return "病历日期";
+            default:
+                return "记录时间";
+        }
+    }
+}

+ 30 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/deathrecord/DEAR0343.java

@@ -0,0 +1,30 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.deathrecord;
+
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : DEAR0343
+ * @Description : 死亡记录无病情演变
+ * @Author : 胡敬
+ * @Date: 2020-03-18 17:14
+ */
+@Component
+public class DEAR0343 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getDeathRecordDoc() != null && inputInfo.getDeathRecordDoc().getStructureMap() != null) {
+            Map<String, String> deathRecordStructureMap = inputInfo.getDeathRecordDoc().getStructureMap();
+            String diagnosisTreatmentProcess = deathRecordStructureMap.get("诊疗经过");
+            if (CatalogueUtil.isEmpty(diagnosisTreatmentProcess)) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 1 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/deathrecord/DEAR0344.java

@@ -22,10 +22,8 @@ public class DEAR0344 extends QCCatalogue {
             Map<String, String> deathRecordStructureMap = inputInfo.getDeathRecordDoc().getStructureMap();
             String diagnosisTreatmentProcess = deathRecordStructureMap.get("诊疗经过");
             if (CatalogueUtil.isEmpty(diagnosisTreatmentProcess)) {
-                return;
-            }
-            if (!diagnosisTreatmentProcess.contains("救")) {
                 status.set("-1");
+                return;
             }
         }
     }

+ 212 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/dutyshiftsystem/DUT0296.java

@@ -0,0 +1,212 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.dutyshiftsystem;
+
+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.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * @ClassName : DUT0296
+ * @Description : 无阶段小结
+ * 住院时间超过1个月需要阶段小结, 出院时间和入院时间做比较,超过一个月查找阶段小结
+ * 住院30天患者需写“阶段小结”,但在住院期间转科的患者,时间应该是从转科那天算起。
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class DUT0296 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+
+        List<StagesSummaryDoc> stagesSummaryDocs = inputInfo.getStagesSummaryDocs();
+        TransferRecordDoc transferRecordDoc = inputInfo.getTransferRecordDocs();//转科记录
+        Map<String, String> structureMap_leave = leaveHospitalDoc.getStructureMap();
+        int lengthOfStayNum = 0;
+        String beDate = null, leaveDate = null;
+        if (inputInfo.getMedicalRecordInfoDoc() != null) {
+            Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+            beDate = medicalRecordInfoStructureMap.get("behospitalDate");
+            leaveDate = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+            /* 住院天数小于30天不报错*/
+            if (StringUtil.isNotBlank(beDate) && StringUtil.isNotBlank(leaveDate)) {
+                lengthOfStayNum = dateDifference(beDate, leaveDate);
+                if (lengthOfStayNum < 30) {
+                    return;
+                }
+            }
+        }
+
+        lengthOfStayNum = getLengthOfStay(structureMap_leave);
+        if (lengthOfStayNum < 30) {
+            return;
+        }
+        if (transferRecordDoc != null) {
+            List<TransferRecordDoc> allTransferDocs = transferRecordDoc.getAllTransferDocs();
+            String firstOutRecordDate = getFirstOutRecordDate(allTransferDocs);
+            if (StringUtil.isNotBlank(firstOutRecordDate) && StringUtil.isNotBlank(beDate)) {
+                //入院时间到第一次转出时间,大于30天则报错
+                int dateDifference = dateDifference(beDate, firstOutRecordDate);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+            String lastInrecordDate = getLastInrecordDate(allTransferDocs);
+            if (StringUtil.isNotBlank(lastInrecordDate) && StringUtil.isNotBlank(leaveDate)) {
+                //最后一次转入时间到出院时间,大于30天则报错
+                int dateDifference = dateDifference(lastInrecordDate, leaveDate);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+            List<String> allRecordPairs = getAllRecordPairs(allTransferDocs);
+            for (String recordPair : allRecordPairs) {
+                String[] recordPairSplit = recordPair.split(",");
+                int dateDifference = dateDifference(recordPairSplit[0], recordPairSplit[1]);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        } else {
+            //没有转科记录,直接入院时间和出院时间比
+            if (StringUtil.isNotBlank(beDate) && StringUtil.isNotBlank(leaveDate)) {
+                int dateDifference = dateDifference(beDate, leaveDate);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                }
+                if (checkDays(stagesSummaryDocs, dateDifference)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+
+            int lengthOfStay = getLengthOfStay(structureMap_leave);
+            if (checkDays(stagesSummaryDocs, lengthOfStay)) {
+                status.set("-1");
+            }
+        }
+
+    }
+
+    private int getLengthOfStay(Map<String, String> structureMap_leave) {
+        int lengthOfStayNum = 0;
+        String lengthOfStay = structureMap_leave.get("住院天数");
+        if (StringUtil.isNotBlank(lengthOfStay)) {
+            lengthOfStayNum = onlyNum(lengthOfStay);
+        }
+        return lengthOfStayNum;
+    }
+
+    private boolean checkDays(List<StagesSummaryDoc> stagesSummaryDocs, int dateDifference) {
+        if (stagesSummaryDocs != null && stagesSummaryDocs.size() > 0) {
+            int sum = dateDifference / 30;
+            return sum > stagesSummaryDocs.size();
+        }
+        return true;
+    }
+
+    /**
+     * 获取第一条转出记录时间
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private String getFirstOutRecordDate(List<TransferRecordDoc> allTransferDocs) {
+        for (TransferRecordDoc transferDoc : allTransferDocs) {
+            Map<String, String> structureMap = transferDoc.getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isBlank(outDepartment)) {
+                //如果转出科室为空,则为转出记录
+                return structureMap.get("转科日期");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取最后一条转入记录
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private String getLastInrecordDate(List<TransferRecordDoc> allTransferDocs) {
+        for (int i = allTransferDocs.size() - 1; i > 0; i--) {
+            Map<String, String> structureMap = allTransferDocs.get(i).getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isNotBlank(outDepartment)) {
+                //如果转出科室不为空,则为转入记录
+                return structureMap.get("转科日期");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取所有转入时间-转出时间 pair
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private List<String> getAllRecordPairs(List<TransferRecordDoc> allTransferDocs) {
+        List<String> allRecordPairs = new ArrayList<>();
+        for (int i = 0; i < allTransferDocs.size(); i++) {
+            Map<String, String> structureMap = allTransferDocs.get(i).getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isNotBlank(outDepartment)) {
+                //如果转出科室不为空,则为转入记录
+                String transferDateInStr = structureMap.get("转科日期");
+                if (i + 1 < allTransferDocs.size()) {
+                    //如果转入记录下一条是转出记录
+                    Map<String, String> nextStructureMap = allTransferDocs.get(i + 1).getStructureMap();
+                    if (StringUtil.isBlank(nextStructureMap.get("转出科室"))) {
+                        //如果转出科室为空,则为转出记录
+                        String transferDateOutStr = nextStructureMap.get("转科日期");
+                        allRecordPairs.add(transferDateInStr + "," + transferDateOutStr);
+                    }
+                }
+            }
+        }
+        return allRecordPairs;
+    }
+
+    private int dateDifference(String beDate, String leaveDate) {
+        int day = 0;
+        try {
+            Date dateIn = StringUtil.parseDateTime(beDate);
+            Date dateOut = StringUtil.parseDateTime(leaveDate);
+            if (dateIn == null || dateOut == null) return 0;
+            Calendar from = Calendar.getInstance();
+            from.setTime(dateIn);
+            Calendar to = Calendar.getInstance();
+            to.setTime(dateOut);
+            long timeS,timeE,timeDiff = 0;
+            try {
+                timeS = from.getTimeInMillis();
+                timeE = to.getTimeInMillis();
+                timeDiff = (timeE - timeS) / (1000 * 60* 60 * 24);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            day = (int) timeDiff;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return day;
+    }
+
+    private int onlyNum(String str) {
+        return Integer.parseInt(str.replaceAll("[^0-9]", ""));
+    }
+}

+ 43 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/leavehospital/LEA0156.java

@@ -0,0 +1,43 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.leavehospital;
+
+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.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 出院记录内容缺出院注意事项
+ * @author: rengb
+ * @time: 2020/3/10 13:53
+ */
+@Component
+public class LEA0156 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if (deathRecordDoc == null || deathRecordDoc.getText() == null) {
+            Map<String, String> structureMap = leaveHospitalDoc.getStructureMap();
+            if (structureMap != null) {
+                if (StringUtil.isNotBlank(structureMap.get("出院注意事项"))) {
+                    return;
+                }
+                if (StringUtils.isBlank(structureMap.get("健康教育")) && StringUtils.isBlank(structureMap.get("出院医嘱"))
+                        && StringUtils.isBlank(structureMap.get("出院指导"))) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

+ 11 - 42
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/operationdiscussion/OPE02930.java

@@ -25,8 +25,6 @@ import java.util.Map;
 public class OPE02930 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
-        //        if (isOperativePatient) {
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         if (operationDocs == null || operationDocs.size() == 0) {
             status.set("0");
@@ -34,58 +32,29 @@ public class OPE02930 extends QCCatalogue {
         }
         for (OperationDoc operationDoc : operationDocs) {
             OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
-            if (operationRecordDoc == null) {
+            OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+            if (operationRecordDoc == null || operationDiscussionDoc == null) {
                 continue;
             }
             Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
-            String operationStartDateStr = operationRecordStructureMap.get("开始时间");
+            Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
             String operationEndDateStr = operationRecordStructureMap.get("结束时间");
-            if (StringUtil.isEmpty(operationStartDateStr) || StringUtil.isEmpty(operationEndDateStr)) {
+            String discussionRecordDateStr = structureMap.get("病历日期");
+            if (StringUtil.isEmpty(operationEndDateStr) || StringUtil.isBlank(discussionRecordDateStr)) {
                 continue;
             }
-            if (!isDate(operationStartDateStr) || !isDate(operationEndDateStr)) {
+            if (StringUtil.parseDateTime(operationEndDateStr) == null
+                    || StringUtil.parseDateTime(discussionRecordDateStr) == null) {
                 continue;
             }
-            Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
             Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
-            for (OperationDoc o : operationDocs) {
-                OperationDiscussionDoc operationDiscussionDoc = o.getOperationDiscussionDoc();
-                if (operationDiscussionDoc == null) {
-                    continue;
-                }
-                Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
-                String discussionRecordDateStr = structureMap.get("病历日期");
-                if (StringUtil.isBlank(discussionRecordDateStr)) {
-                    status.set("0");
-                    return;
-                }
-
-                if (!isDate(discussionRecordDateStr)) {
-                    status.set("0");
+            Date discussionRecordDate = StringUtil.parseDateTime(discussionRecordDateStr);
+            if (operationEndDate.before(discussionRecordDate) || DateUtils.isSameDay(operationEndDate, discussionRecordDate)) {
+                if (CatalogueUtil.compareTime(operationEndDate, discussionRecordDate, 2 * 60L)) {
+                    status.set("-1");
                     return;
                 }
-                Date discussionRecordDate = StringUtil.parseDateTime(discussionRecordDateStr);
-                if (operationEndDate.before(discussionRecordDate) || DateUtils.isSameDay(operationEndDate, discussionRecordDate)) {
-                    if (CatalogueUtil.compareTime(operationEndDate, discussionRecordDate, 2 * 60L)) {
-                        status.set("-1");
-                        return;
-                    }
-                }
             }
         }
     }
-
-    /**
-     * 判断是否为日期
-     *
-     * @param dateStr
-     */
-    private boolean isDate(String dateStr) {
-        try {
-            StringUtil.parseDateTime(dateStr);
-            return true;
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
-    }
 }

+ 215 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0127.java

@@ -0,0 +1,215 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.threelevelward;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.MedicalRecordInfoDoc;
+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 org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0127
+ * @Description : 每周无2次副主任医师/主任医师查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:52
+ */
+@Component
+public class THR0127 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
+        if (medicalRecordInfoDoc != null && medicalRecordInfoDoc.getStructureMap() != null) {
+            //入院日期
+            String admisTime = medicalRecordInfoDoc.getStructureMap().get("behospitalDate");
+            //出院日期
+            String dischargeTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            String presentTime = DateUtil.nowString();
+            //如果如果入院未超过7天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(presentTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(presentTime), (long) (7 * 24 * 60))) {
+                    return;
+                }
+            }
+            //如果住院天数小于7天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(dischargeTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (7 * 24 * 60))) {
+                    return;
+                }
+            } else {
+                if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+                    status.set("-1");
+                    return;
+                }
+            }
+
+            if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getThreeLevelWardDocs().size() > 0) {
+                if (CatalogueUtil.isEmpty(admisTime)) {
+                    return;
+                }
+                //开始时间(入院时间)
+                Date beginDate = StringUtil.parseDateTime(admisTime);
+                if (beginDate == null) {
+                    return;
+                }
+
+                ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+                List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+                if (allDoctorWradDocs.size() == 0) {
+                    status.set("0");
+                    return;
+                }
+                Date lastRecordDate = getLastRecordDate(allDoctorWradDocs);
+                if (lastRecordDate == null) {
+                    return;
+                }
+                int hoursPerWeek = 7 * 24 * 60;
+                String roundRecordThisWeek = "";
+                List<String> roundRecordEveryWeek = new ArrayList<>();
+                beginDate = DateUtil.dateZeroClear(beginDate);//从入院记录当天0点开始算
+                int i = 1;
+                String lastWardDateRange = "";
+                List<String> lastWardDateRangeList = new ArrayList<>();
+                //每周的病历记录
+                while (i >= 1) {
+                    roundRecordThisWeek = extractWardRecord(inputInfo, allDoctorWradDocs, beginDate, hoursPerWeek, lastRecordDate);
+                    if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                        break;
+                    }
+                    //如果6天后日期大于出院日期,跳过
+                    if (StringUtil.isBlank(dischargeTime)) {
+                        dischargeTime = presentTime;
+                    }
+                    Date sixDate = DateUtil.addDate(beginDate, 7);
+                    if (StringUtil.parseDateTime(dischargeTime).before(sixDate)) {
+                        break;
+                    }
+                    lastWardDateRange = DateUtil.formatDate(beginDate) + "    ->    " + DateUtil.formatDate(sixDate);
+                    lastWardDateRangeList.add(lastWardDateRange);
+                    roundRecordEveryWeek.add(roundRecordThisWeek);
+                    beginDate = DateUtil.addDate(beginDate, 7);
+                    i++;
+                }
+                if (roundRecordEveryWeek.size() == 0) {
+                    status.set("0");
+                    return;
+                }
+                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);
+                    //三级医师查房算一次主任查房
+                    String key = getKeyByHospitalId();
+                    int threeDoctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), key);
+                    //北仑内分泌科(主任携主任代主治)
+                    int endocrinologyTitleNum = endocrinologyTitleNum(roundRecordEveryWeek.get(j).split(","));
+                    int num = 2;
+                    if("7".equals(Content.hospital_Id)){num = 1;}
+                    if (directorNum + dept_doctorNum + threeDoctorNum + endocrinologyTitleNum < num) {
+                        //每周无2次主任医师查房记录/科主任查房记录
+                        status.set("-1");
+                        resultInfos.add(lastWardDateRangeList.get(j));
+                    }
+                }
+                if (resultInfos.size() > 0) {
+                    info.set(StringUtils.join(resultInfos.toArray(), ";"));
+                }
+            }
+        }
+    }
+    private String getKeyByHospitalId() {
+        switch (Content.hospital_Id)
+        {
+            case "7":               //厦门
+                return "多学科联合";
+            default:
+                return "三级";
+        }
+    }
+    /**
+     * 北仑内分泌科主任主治处理
+     *
+     * @param srcText
+     * @return
+     */
+    private int endocrinologyTitleNum(String[] srcText) {
+        int count = 0;
+        for (String title : srcText) {
+            String regex = ".*主任.*主任.*主治.*";
+            if (title.matches(regex)) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    private Date getLastRecordDate(List<ThreeLevelWardDoc> allDoctorWradDocs) {
+        ThreeLevelWardDoc threeLevelWardDoc = allDoctorWradDocs.get(allDoctorWradDocs.size() - 1);
+        Map<String, String> lastWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+        String wardDateStr = lastWardDocStructureMap.get("查房日期");
+        if (StringUtil.isNotBlank(wardDateStr)) {
+            return StringUtil.parseDateTime(wardDateStr);
+        }
+        return null;
+    }
+
+    /**
+     * 抽取duration分钟内所有查房标题
+     * 抽取一周内所有查房标题,若一周内记录少于6天,则返回""
+     *
+     * @param threeLevelWardDocs
+     * @param admisDate
+     * @param duration
+     * @return
+     */
+    private static String extractWardRecord(InputInfo inputInfo, List<ThreeLevelWardDoc> threeLevelWardDocs, Date admisDate, int duration, Date maxRecordDate) {
+        String recordTime = "", recordTitle = "", title = "";
+        List<Date> dateList = new ArrayList();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            title = threeLevelWardStructureMap.get("查房标题");
+            if (StringUtil.isBlank(recordTime) || StringUtil.isBlank(title)) {
+                continue;
+            }
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            /* 替换查房标题中主刀/一助的职称 */
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (title.contains("主刀") || title.contains("术后第")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            recordDate = DateUtil.dateZeroClear(recordDate);
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                recordTitle += title + ",";
+                dateList.add(recordDate);
+            }
+        }
+        if (dateList.size() > 0) {
+            //dateList.sort(Date::compareTo);
+            if (!maxRecordDate.equals(dateList.get(dateList.size() - 1)) || CatalogueUtil.compareTime(admisDate, dateList.get(dateList.size() - 1), Long.valueOf(6 * 24 * 60))) {
+                return recordTitle;
+            }
+        }
+        return "";
+    }
+}

+ 98 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0134.java

@@ -0,0 +1,98 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.threelevelward;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : THR0134
+ * @Description : 上级医师(主治医师)首次查房无初步诊断
+ * @Author : 胡敬
+ * @Date: 2020-03-23 14:16
+ */
+@Component
+public class THR0134 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getThreeLevelWardDocs().size() == 0 || inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        List<AttendingDoctorWardDoc> attendDocs = inputInfo.getThreeLevelWardDocs().get(0).getAttendingDoctorWardDocs();
+        if (attendDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        AttendingDoctorWardDoc firstAttendDoc = attendDocs.get(0);
+        //先取结构化数据判断
+        Map<String, String> firstAttendStructureMap = firstAttendDoc.getStructureMap();
+        String admisDateStr = inputInfo.getBeHospitalizedDoc().getStructureMap().get("入院日期");
+        String recordDateStr = firstAttendStructureMap.get("查房日期");
+        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, "诊断", "基本明确")) {
+            status.set("0");
+            return;
+        }
+        if (CatalogueUtil.isEmpty(admisDateStr) || CatalogueUtil.isEmpty(recordDateStr)) {
+            status.set("0");
+            return;
+        }
+        //如果首次查房超过48小时则不判断该条规则
+        if (CatalogueUtil.compareTime(StringUtil.parseDateTime(admisDateStr), StringUtil.parseDateTime(recordDateStr), 48 * 60L)) {
+            status.set("0");
+            return;
+        }
+        //如果首次查房在手术记录之后不提示规则
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs != null) {
+            for (OperationDoc operationDoc : operationDocs) {
+                if (operationDoc.getOperationRecordDoc() != null) {
+                    Map<String, String> structureMap = operationDoc.getOperationRecordDoc().getStructureMap();
+                    String opeEndDate = structureMap.get("结束时间");
+                    if (StringUtil.isBlank(opeEndDate)) {
+                        opeEndDate = structureMap.get("医师签名时间");
+                    }
+                    if (StringUtil.isBlank(opeEndDate) || StringUtil.parseDateTime(opeEndDate) == null) {
+                        continue;
+                    }
+                    if (StringUtil.isNotBlank(opeEndDate) &&
+                            StringUtil.parseDateTime(opeEndDate).before(StringUtil.parseDateTime(recordDateStr))) {
+                        status.set("0");
+                        return;
+                    }
+                }
+            }
+        }
+        ThreeLevelWardLabel firstAttendLabel = firstAttendDoc.getThreeLevelWardLabel();
+        if (firstAttendLabel == null) {
+            return;
+        }
+
+        if (firstAttendLabel.getDiags().size() != 0 || StringUtil.isNotBlank(firstAttendLabel.getDiagText())) {
+            status.set("0");
+        }
+    }
+
+    private boolean regexFind(String content, String... str) {
+        String s = "";
+        for (String word : str) {
+            s += word + ".*";
+        }
+        s = s.substring(0, s.lastIndexOf(".*"));
+        Pattern p = Pattern.compile(s);
+        Matcher m = p.matcher(content);
+        return m.find();
+    }
+}

+ 99 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR0139.java

@@ -0,0 +1,99 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.threelevelward;
+
+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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : THR0139
+ * @Description : 副主任医师/主任医师首次查房无初步诊断
+ * @Author : 胡敬
+ * @Date: 2020-03-23 14:16
+ */
+@Component
+public class THR0139 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getThreeLevelWardDocs().size() == 0 || inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        List<DirectorDoctorWardDoc> directorDocs = inputInfo.getThreeLevelWardDocs().get(0).getDirectorDoctorWardDocs();
+        if (directorDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        DirectorDoctorWardDoc firstDirectDoc = directorDocs.get(0);
+        //先取结构化数据判断
+        Map<String, String> firstDirectStructureMap = firstDirectDoc.getStructureMap();
+        String admisDateStr = inputInfo.getBeHospitalizedDoc().getStructureMap().get("入院日期");
+        String recordDateStr = firstDirectStructureMap.get("查房日期");
+        String content = firstDirectStructureMap.get("病情记录");
+        if (content.contains("诊断明确") || content.contains("目前诊断") || content.contains("目前考虑") || content.contains("当前诊断") ||
+                content.contains("考虑诊断") || content.contains("诊断考虑") || content.contains("诊断基本明确") || content.contains("初步诊断") ||
+                content.contains("诊断为") || regexFind(content, "诊断", "基本明确")) {
+            status.set("0");
+            return;
+        }
+
+        if (CatalogueUtil.isEmpty(admisDateStr) || CatalogueUtil.isEmpty(recordDateStr)) {
+            status.set("0");
+            return;
+        }
+        //如果首次查房超过72小时则不判断该条规则
+        if (CatalogueUtil.compareTime(StringUtil.parseDateTime(admisDateStr), StringUtil.parseDateTime(recordDateStr), 72 * 60L)) {
+            status.set("0");
+            return;
+        }
+        //如果首次查房在手术记录之后不提示规则
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs != null) {
+            for (OperationDoc operationDoc : operationDocs) {
+                if (operationDoc.getOperationRecordDoc() != null) {
+                    Map<String, String> structureMap = operationDoc.getOperationRecordDoc().getStructureMap();
+                    String opeEndDate = structureMap.get("结束时间");
+                    if (StringUtil.isBlank(opeEndDate)) {
+                        opeEndDate = structureMap.get("医师签名时间");
+                    }
+                    if (StringUtil.isBlank(opeEndDate) || StringUtil.parseDateTime(opeEndDate) == null) {
+                        continue;
+                    }
+                    if (StringUtil.isNotBlank(opeEndDate) &&
+                            StringUtil.parseDateTime(opeEndDate).before(StringUtil.parseDateTime(recordDateStr))) {
+                        status.set("0");
+                        return;
+                    }
+                }
+            }
+        }
+        ThreeLevelWardLabel firstDirectLabel = firstDirectDoc.getThreeLevelWardLabel();
+        if (firstDirectLabel == null) {
+            return;
+        }
+
+        if (firstDirectLabel.getDiags().size() != 0 || StringUtil.isNotBlank(firstDirectLabel.getDiagText())) {
+            status.set("0");
+        }
+    }
+
+    private boolean regexFind(String content, String... str) {
+        String s = "";
+        for (String word : str) {
+            s += word + ".*";
+        }
+        s = s.substring(0, s.lastIndexOf(".*"));
+        Pattern p = Pattern.compile(s);
+        Matcher m = p.matcher(content);
+        return m.find();
+    }
+}

+ 69 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/threelevelward/THR02931.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.threelevelward;
+
+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.DeathCaseDiscussDoc;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR02931
+ * @Description : 最后一次查房记录时间晚于患者出院时间
+ * @Author : 胡敬
+ * @Date: 2020-06-16 10:06
+ */
+@Component
+public class THR02931 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getThreeLevelWardDocs().size() == 0 || inputInfo.getLeaveHospitalDoc() == null) {
+            return;
+        }
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        DeathCaseDiscussDoc deathCaseDiscussDoc = inputInfo.getDeathCaseDiscussDoc();
+        if (deathRecordDoc != null || deathCaseDiscussDoc != null) {
+            return;
+        }
+        String leaveDateStr = null;
+        if (inputInfo.getMedicalRecordInfoDoc() != null) {
+            Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+            leaveDateStr = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+        }
+        if (StringUtil.isBlank(leaveDateStr)) {
+            return;
+        }
+        Date leaveDate = StringUtil.parseDateTime(leaveDateStr);
+        if (leaveDate == null) {
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
+        if (allDoctorWradDocs.size() == 0) {
+            return;
+        }
+        int j = 0; //最后两次查房记录
+        for (int i = allDoctorWradDocs.size() - 1; i > 0 && j < 2; i--) {
+            j++;
+            ThreeLevelWardDoc lastWardDoc = allDoctorWradDocs.get(i);
+            Map<String, String> structureMap = lastWardDoc.getStructureMap();
+            String title = structureMap.get("查房标题");
+            if (StringUtil.isBlank(title) || title.contains("病理报告")) {
+                continue;
+            }
+            String recordDateStr = structureMap.get("查房日期");
+            if (StringUtil.isNotBlank(recordDateStr)) {
+                Date recordDate = StringUtil.parseDateTime(recordDateStr);
+                if (recordDate != null && recordDate.after(leaveDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03126.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 复诊及下一步诊疗计划未填写
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03126 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null && structureMap.containsKey("1、复诊及下一步诊疗计划")) {
+            if (CatalogueUtil.isEmpty(structureMap.get("1、复诊及下一步诊疗计划"))) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03127.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 生活自理未填写
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03127 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null && structureMap.containsKey("4、生活自理")) {
+            if (CatalogueUtil.isEmpty(structureMap.get("4、生活自理"))) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03128.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 康复指导未填写
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03128 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null && structureMap.containsKey("5、康复指导")) {
+            if (CatalogueUtil.isEmpty(structureMap.get("5、康复指导"))) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03129.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 营养指导未填写
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03129 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null && structureMap.containsKey("6、营养指导")) {
+            if (CatalogueUtil.isEmpty(structureMap.get("6、营养指导"))) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03130.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 出院随访指导未填写
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03130 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null && structureMap.containsKey("7、随访指导")) {
+            if (CatalogueUtil.isEmpty(structureMap.get("7、随访指导"))) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 46 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03131.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @Description: 出院记录的住院经过不完善
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+public class LEA03131 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null) {
+            String curePass = structureMap.get("诊治经过");
+            if (CatalogueUtil.isEmpty(curePass)) {
+                return;
+            }
+            if (!curePass.contains("查") && !curePass.contains("检验")) {
+                status.set("-1");
+                info.set("住院经过缺少检验检查");
+                return;
+            }
+
+            if (!curePass.contains("治疗")) {
+                status.set("-1");
+                info.set("住院经过缺少诊治经过");
+                return;
+            }
+
+        }
+    }
+}

+ 63 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03132.java

@@ -0,0 +1,63 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+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.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 住院经过与手术记录中手术名称不一致
+ * @author: wsy
+ * @time: 2021/6/23 15:15
+ */
+@Component
+@Slf4j
+public class LEA03132 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (leaveHospitalDoc == null || operationDocs == null) {
+            return;
+        }
+
+        //获取手术名称
+        List<String> operationNameList = new ArrayList<>();
+        for (OperationDoc operationDoc : operationDocs) {
+            if (operationDoc.getOperationRecordDoc() != null) {
+                String operationName = operationDoc.getOperationRecordDoc().getStructureMap().get("手术名称");
+                if (StringUtil.isNotBlank(operationName)) {
+                    operationNameList.add(operationName);
+                }
+            }
+        }
+
+        if (operationNameList.size() == 0) {
+            return;
+        }
+
+        Map<String, String> structureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+        if (structureMap != null) {
+            String curePass = structureMap.get("诊治经过");
+            if (CatalogueUtil.isEmpty(curePass)) {
+                return;
+            }
+            for (String operationName : operationNameList) {
+                if (!curePass.contains(operationName)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 1 - 1
kernel/src/main/resources/logback-spring.xml

@@ -9,7 +9,7 @@
 
     <contextName>logback</contextName>
     <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="/opt/qc-beilun/logs" />
+    <property name="log.path" value="../qc/logs" />
 
     <!-- 彩色日志 -->
     <!-- 彩色日志依赖的渲染类 -->

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

@@ -172,6 +172,7 @@ public class Content {
     public static final String leaveHospitalDoctorAdvice = "出院医嘱";
     public static final String dp_out = "损伤、中毒外部原因";
     public static final String pathologyDiagnose = "病理诊断";
+    public static final String pathologyDiagnoseCost = "病理诊断费";
     public static final String admitPath = "入院途径";
     public static final String admisTime = "入院时间"; //病案首页用
     public static final String admitDept = "入院科别";

+ 5 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoBeHospitalizedDocTrans.java

@@ -68,10 +68,15 @@ public class NingHaiFuYaoBeHospitalizedDocTrans extends ModelDocTrans {
             "户口地址=籍贯",
             "联系地址=住址",
             "入院时间=入院日期",
+            "婚姻状况=婚姻",
             "月经婚育史=婚育史",
+            "家庭史=家族史",
             "实验室检查=辅助检查",
+            "临床诊断=初步诊断",
             "初步诊断医师签名:=初步诊断医师签名",
+            "医师签名=初步诊断医师签名",
             "初步诊断医师签名:时 间:=初步诊断签名时间",
+            "日期=初步诊断签名时间",
             "补充诊断医师签名:时 间:=补充诊断签名时间",
             "补充诊断医师签名:=补充诊断医师签名"
     );

+ 2 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoFirstCourseRecordDocTrans.java

@@ -75,8 +75,10 @@ public class NingHaiFuYaoFirstCourseRecordDocTrans extends ModelDocTrans {
     private List<String> keyContrasts = Lists.newArrayList(
             "时间=病历日期",
             "病历特点=病例特点",
+            "一. 病例特点=病例特点",
             "入院查体=查体",
             "辅助检查=辅检",
+            "入院诊断=初步诊断",
             "医师签名=医生签名",
             "2.诊断依据=诊断依据",
             "3.鉴别诊断=鉴别诊断",

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoLeaveHospitalDocTrans.java

@@ -74,6 +74,7 @@ public class NingHaiFuYaoLeaveHospitalDocTrans extends ModelDocTrans {
             "实际住院天数=住院天数",
             "入院情况=入院情况",
             "诊疗经过=诊治经过",
+            "住院经过=诊治经过",
             "诊治经过(入院情况、治疗经过及重要辅助检查)=诊治经过",
             "入院情况=病史摘要",
             "辅助检查=主要实验室检查及器械检验结果",

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOperationDocTrans.java

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

+ 28 - 35
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoBeHospitalizedHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiFuYaoBeHospitalizedHtmlAnalysis implements NingHaiFuYaoHtmlA
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
@@ -47,12 +47,12 @@ public class NingHaiFuYaoBeHospitalizedHtmlAnalysis implements NingHaiFuYaoHtmlA
         return map;
     }
 
-    //宁海第一人民医院
+    //宁海妇保医院
     private void analysisBeHospitalized(Document doc, Map<String, String> map) {
-        List<String> titles = Lists.newArrayList("姓 名","姓名","现 住 址","身份证号码","性别", "性 别","生于","父母姓名","联系电话","住址", "住 址","年 龄","年龄","电话号码",
-                "出生地", "出 生 地", "职 业", "职业", "入院时间","户籍所在地","户口地址", "入院日期","记录时间","记录日期","民 族", "民族", "病史陈述者","职 业", "联系人及关系",
-                "婚 姻", "婚姻", "联系人电话","联 系 人", "主诉", "主 诉", "现 病 史","现病史", "既 往 史", "既往史", "出生史","个 人 史", "个人史", "婚 育 史",
-                "月 经 史", "月经婚育史", "家 族 史","一般测量","实验室检查", "特殊检查","临床诊断","记录医生", "初步诊断", "补充诊断","医师签名","日 期");
+        List<String> titles = Lists.newArrayList("姓 名", "姓名", "户籍地址", "现 住 址", "身份证号码", "性别", "性 别", "生于", "父母姓名", "联系电话", "住址", "住 址", "年 龄", "年龄", "联系地址",
+                "电话号码", "出生地", "出 生 地", "职 业", "职业", "产前检查", "入院时间", "户籍所在地", "户口地址", "入院日期", "记录时间", "记录日期", "民 族", "民族", "病史陈述者", "职 业", "联系人及关系",
+                "婚 姻", "婚姻", "婚姻状况", "孕/ 产次", "末次月经", "预 产 期", "联系人电话", "联 系 人", "联系人", "身份证号", "联系方式", "主诉", "主 诉", "现 病 史", "现病史", "既 往 史", "既往史", "既 往史", "既 往史 ", "系统回顾", "出生史", "个 人 史", "个人史", "月经史", "婚 育 史",
+                "月 经 史", "月经婚育史", "婚育史", "家 族 史", "家庭史", "家族史", "一般测量", "实验室检查", "特殊检查", "临床诊断", "记录医生", "初步诊断", "补充诊断", "医师签名", "日 期");
         String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
         if (StringUtil.isNotBlank(htmlContent)) {
             htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第 ( ) 页", "");
@@ -60,35 +60,30 @@ public class NingHaiFuYaoBeHospitalizedHtmlAnalysis implements NingHaiFuYaoHtmlA
             disDiagnose(map, Lists.newArrayList("初步诊断"), "医师签名:");
             disDiagnose(map, Lists.newArrayList("初步诊断医师签名:"), "时 间:");
             //入院记录 体格检查、补充及专科情况里获取辅助检查提取
-            getAuxiliary(map,Lists.newArrayList("体格检查","补充及专科情况","补充及专科情况"),htmlContent);
+            getAuxiliary(map, Lists.newArrayList("体格检查", "补充及专科情况", "补充及专科情况"), htmlContent);
             //婚育史特殊符号处理
 //            removeSymbol(map,"□","婚育史");
         }
     }
 
-    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList,String htmlContent) {
+    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList, String htmlContent) {
         CommonAnalysisUtil.html2StructureMapNoColon(newArrayList, htmlContent, map);
         //家族史其他内容清理
-        if(map.keySet().contains("家族史"))
-        {
+        if (map.keySet().contains("家族史")) {
             String fimaly = map.get("家族史");
-            if(map.keySet().contains("体格检查"))
-            {
-                removeMapVal(map,fimaly,"体格检查","家族史");
-                if(map.keySet().contains("补充及专科情况")&&StringUtil.isBlank(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("初步诊断")))
-                    {
+                            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);
+                        if (val.contains(map.get("初步诊断"))) {
+                            val = val.split("初步诊断")[0].replaceAll("初步诊断", "")
+                                    .replaceAll(":", "").trim();
+                            map.put("辅助检查", val);
 
                         }
                     }
@@ -98,26 +93,24 @@ public class NingHaiFuYaoBeHospitalizedHtmlAnalysis implements NingHaiFuYaoHtmlA
         }
     }
 
-    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);
+    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]
+     * @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());
+    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());
         }
     }
 

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicBloodEffectHtmlAnalysis.java

@@ -26,7 +26,7 @@ public class NingHaiFuYaoClinicBloodEffectHtmlAnalysis implements NingHaiFuYaoHt
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicalBloodHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiFuYaoClinicalBloodHtmlAnalysis implements NingHaiFuYaoHtmlAn
                 "开始时间", "结束时间", "输血过程");
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationHtmlAnalysis.java

@@ -31,7 +31,7 @@ public class NingHaiFuYaoConsultationHtmlAnalysis implements NingHaiFuYaoHtmlAna
                     "会诊类型", "被邀医院", "被邀科室", "被邀医师", "申请时间", "患者病情及诊疗经过、申请会诊的理由及目的", "申请会诊科别",
                     "被邀会诊科别", "申请会诊医师", "会诊意见", "会诊时间", "科主任", "会诊到达时间", "查体", "会诊建议",
                     "会诊诊断", "由受邀医生填写,本次会诊是否必要","会诊科室", "会诊医师", "外院会诊医师所在医疗机构名称", "会诊医师所在医疗机构名称");
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             String htmlContent = null;

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationRecordHtmlAnalysis.java

@@ -24,7 +24,7 @@ public class NingHaiFuYaoConsultationRecordHtmlAnalysis implements NingHaiFuYaoH
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCrisisValueReportHtmlAnalysis.java

@@ -24,7 +24,7 @@ public class NingHaiFuYaoCrisisValueReportHtmlAnalysis implements NingHaiFuYaoHt
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis.java

@@ -29,7 +29,7 @@ public class NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis implements NingHaiFuYao
             List<String> titles = Lists.newArrayList("姓名", "性别", "年龄", "出生日期", "科室", "科别", "病区", "床号", "住院号",
                     "单位或地址", "联系电话", "初步诊断", "临床诊断", "病情摘要", "主要症状", "体格检查", "辅助检查", "告知医师签名",
                     "告知时间", "患方意见", "患方签名", "手印说明", "与患者关系", "患者(或被授权人)签名与患方关系", "医师签名", "时间", "签字时间");
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathCaseDiscussHtmlAnalysis.java

@@ -25,7 +25,7 @@ public class NingHaiFuYaoDeathCaseDiscussHtmlAnalysis implements NingHaiFuYaoHtm
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
             Element bigDivElement = doc.selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathRecordHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiFuYaoDeathRecordHtmlAnalysis implements NingHaiFuYaoHtmlAnal
         try {
             List<String> titles = Lists.newArrayList("入院日期", "入院时间", "死亡时间", "记录时间", "入院诊断", "入院情况",
                     "诊疗经过(重点记录病情演变、抢救经过)", "诊治经过", "死亡原因", "死亡诊断", "医师签字");
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis implements NingHaiFuYa
         try {
             List<String> titles = Lists.newArrayList("姓名", "性别", "年龄", "出生日期", "科别", "住址(或单位)", "讨论日期",
                     "讨论主持人", "参加讨论人", "发言记录(包括病历简要、讨论意见及结论)", "病史简介", "讨论意见", "主持人小结意见", "记录者(签名)", "科主任(签名)");
-            String html = args[0];
+            String html = args[0].replace("&nbsp;"," ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 0 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java


部分文件因为文件数量过多而无法显示