Browse Source

Merge branch 'his/xszyy' into hb/debug

# Conflicts:
#	dbanaly/src/main/resources/application-local.yml
#	kernel/src/main/resources/bootstrap.yml
chengyao 3 years ago
parent
commit
0e5deeaefd
100 changed files with 5697 additions and 45 deletions
  1. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0009.java
  2. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0010.java
  3. 18 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0011.java
  4. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0029.java
  5. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0058.java
  6. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0072.java
  7. 4 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0372.java
  8. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0441.java
  9. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/crisisvaluereport/CRI0382.java
  10. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathrecord/DEAR0347.java
  11. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF0119.java
  12. 21 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0095.java
  13. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC03086.java
  14. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0160.java
  15. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0161.java
  16. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0162.java
  17. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0166.java
  18. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0175.java
  19. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0209.java
  20. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0248.java
  21. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0250.java
  22. 72 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03196.java
  23. 74 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03197.java
  24. 222 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhenhai/threelevelward/THR0127.java
  25. 58 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/behospitalized/BEH0022.java
  26. 78 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/behospitalized/BEH0034.java
  27. 30 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/deathrecord/DEAR0347.java
  28. 34 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/firstpagerecord/FIRP0178.java
  29. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/behospitalized/BEH02902.java
  30. 59 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/firstpagerecord/FIRP0190.java
  31. 115 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/leavehospital/LEA0149.java
  32. 133 0
      kernel/src/main/resources/cache/11/concept_clinic_bodypart_properties.dict
  33. 0 0
      kernel/src/main/resources/cache/11/concept_diag_properties.dict
  34. 0 0
      kernel/src/main/resources/cache/11/hospital_diag_info.dict
  35. 0 0
      kernel/src/main/resources/cache/11/hospital_doctor_info.dict
  36. 133 0
      kernel/src/main/resources/cache/21/concept_clinic_bodypart_properties.dict
  37. 0 0
      kernel/src/main/resources/cache/21/concept_diag_properties.dict
  38. 0 0
      kernel/src/main/resources/cache/21/hospital_diag_info.dict
  39. 0 0
      kernel/src/main/resources/cache/21/hospital_doctor_info.dict
  40. 133 0
      kernel/src/main/resources/cache/22/concept_clinic_bodypart_properties.dict
  41. 0 0
      kernel/src/main/resources/cache/22/concept_diag_properties.dict
  42. 0 0
      kernel/src/main/resources/cache/22/hospital_diag_info.dict
  43. 0 0
      kernel/src/main/resources/cache/22/hospital_doctor_info.dict
  44. 133 0
      kernel/src/main/resources/cache/23/concept_clinic_bodypart_properties.dict
  45. 0 0
      kernel/src/main/resources/cache/23/concept_diag_properties.dict
  46. 0 0
      kernel/src/main/resources/cache/23/hospital_diag_info.dict
  47. 0 0
      kernel/src/main/resources/cache/23/hospital_doctor_info.dict
  48. 133 0
      kernel/src/main/resources/cache/24/concept_clinic_bodypart_properties.dict
  49. 0 0
      kernel/src/main/resources/cache/24/concept_diag_properties.dict
  50. 0 0
      kernel/src/main/resources/cache/24/hospital_diag_info.dict
  51. 0 0
      kernel/src/main/resources/cache/24/hospital_doctor_info.dict
  52. 3 3
      kernel/src/main/resources/kernel.properties
  53. 2 2
      trans/src/main/java/com/lantone/qc/trans/ningbozhenhai/util/OperationRecordHtmlAnalysis.java
  54. 6 21
      trans/src/main/java/com/lantone/qc/trans/ningbozhongyi/util/NingBoZhongYiLeaveHospitalHtmlAnalysis.java
  55. 1 0
      trans/src/main/java/com/lantone/qc/trans/shengzhouyy/ClinicalBloodDocTrans.java
  56. 46 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/AnesthesiaRecordDocTrans.java
  57. 52 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunADLGradeDocTrans.java
  58. 81 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunBeHospitalizedDocTrans.java
  59. 72 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunClinicBloodEffectDocTrans.java
  60. 76 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunClinicalBloodDocTrans.java
  61. 275 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunConsultationDocTrans.java
  62. 36 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisInfoDocTrans.java
  63. 73 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisValueReportDocTrans.java
  64. 77 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCriticallyIllNoticeDocTrans.java
  65. 64 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDeathCaseDiscussDocTrans.java
  66. 64 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDeathRecordDocTrans.java
  67. 93 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDifficultCaseDiscussDocTrans.java
  68. 36 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDoctorAdviceDocTrans.java
  69. 72 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDutyShiftSystemDocTrans.java
  70. 81 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstCourseRecordDocTrans.java
  71. 58 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstPageRecordDocTrans.java
  72. 72 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLeaveHospitalDocTrans.java
  73. 36 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLisDocTrans.java
  74. 26 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunMedicalRecordInfoDocTrans.java
  75. 452 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOperationDocTrans.java
  76. 40 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOutDepDocTrans.java
  77. 37 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunPacsDocTrans.java
  78. 73 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunRescueDocTrans.java
  79. 74 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunStagesSummaryDocTrans.java
  80. 358 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunThreeLevelWardDocTrans.java
  81. 305 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunTransferRecordDocTrans.java
  82. 55 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunVTEGradeDocTrans.java
  83. 90 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeilunInformedConsentDocTrans.java
  84. 76 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeilunInvasiveOperationDocTrans.java
  85. 331 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/XszyyDocTrans.java
  86. 42 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunADLGradeHtmlAnalysis.java
  87. 160 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunBeHospitalizedHtmlAnalysis.java
  88. 71 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunClinicBloodEffectHtmlAnalysis.java
  89. 56 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunClinicalBloodHtmlAnalysis.java
  90. 120 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunConsultationHtmlAnalysis.java
  91. 50 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunConsultationRecordHtmlAnalysis.java
  92. 52 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunCrisisValueReportHtmlAnalysis.java
  93. 67 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunCriticallyIllNoticeHtmlAnalysis.java
  94. 64 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathCaseDiscussHtmlAnalysis.java
  95. 49 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathRecordHtmlAnalysis.java
  96. 69 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDifficultCaseDiscussHtmlAnalysis.java
  97. 56 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDutyShiftSystemHtmlAnalysis.java
  98. 50 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java
  99. 14 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunHtmlAnalysis.java
  100. 0 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunInformedHtmlAnalysis.java

+ 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/BEH0010.java

@@ -21,7 +21,7 @@ import java.util.List;
 @Component
 public class BEH0010 extends QCCatalogue {
     private List<String> containList = Arrays.asList("癌", "瘤", "复诊", "术后", "化疗后", "发现", "体检", "检查", "确诊"
-            , "诊断", "复查", "复发", "示", "超", "CT", "血透", "血液透析");
+            , "诊断", "复查", "复发", "示", "超", "CT", "血透", "血液透析", "治疗后");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");

+ 18 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0011.java

@@ -12,6 +12,7 @@ import com.lantone.qc.pub.model.entity.GeneralDesc;
 import com.lantone.qc.pub.model.label.DiagLabel;
 import com.lantone.qc.pub.model.label.PastLabel;
 import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -98,9 +99,26 @@ public class BEH0011 extends QCCatalogue {
                 }
             }
         }
+        if(presentPastDiags!= null && presentPastDiags.size()>0){
+            List<String> markStr = Arrays.asList("病以来", "病来");
+            String text = presentLabel.getText();
+            for (String str : markStr) {
+                if(text.contains(str)){
+                    String textStr = text.substring(text.lastIndexOf(str));
+                    presentPastDiags = presentPastDiags.stream().filter(obj->textStr.contains(obj)).collect(Collectors.toSet());
+                    break;
+                }
+            }
+        }
         /* 取既往史中疾病名称 */
         if (pastLabel != null && StringUtils.isNotEmpty(pastLabel.getText())) {
             List<Diag> pastDiags = pastLabel.getDiags();
+            String text = pastLabel.getText();
+            String pattern = "[\\s\\S]*(?=妊娠).{0,4}((?=高血压)|(?=糖尿病))[\\s\\S]*";
+            if(text.matches(pattern) && ListUtil.isNotEmpty(pastDiags)){
+                List<String> dis = Arrays.asList("高血压", "糖尿病");
+                pastDiags = pastDiags.stream().filter(obj -> !dis.contains(obj.getHospitalDiagName())).collect(Collectors.toList());
+            }
             addDiagHospitalName(presentPastDiags, pastDiags, pastLabel.getText());
         } else {            //结构化数据
             List<Diag> pastDiags = new ArrayList<>();

+ 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("预防接种") || pastText.contains("预防免疫接种")
+            if (StringUtil.isNotBlank(pastText) && (pastText.contains("详见") || pastText.contains("接种")|| 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("接种")|| personText.contains("预防接种"))) {
                 status.set("0");
                 return;
             }

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

@@ -80,7 +80,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/BEH0072.java

@@ -32,7 +32,7 @@ public class BEH0072 extends QCCatalogue {
             if (StringUtil.isNotBlank(familyText)) {
                 familyText = familyText.substring(0, Math.min(15, familyText.length()));
                 if (familyText.contains("死因") || familyText.contains("原因") || familyText.contains("详")
-                || familyText.contains("因") || familyText.contains("死于")) {
+                || familyText.contains("因") || familyText.contains("死于")|| familyText.contains("自然死")) {
                     return;
                 }
             }

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

@@ -28,11 +28,12 @@ public class BEH0372 extends QCCatalogue {
         if (StringUtil.isBlank(bhbasicInfoStatus)) {
             bhbasicInfoStatus = inputInfo.getBeHospitalizedDoc().getStructureMap().get("婚姻");
         }
-        if (StringUtil.isBlank(basicInfoStatus) || basicInfoStatus.contains("详见") || StringUtil.isBlank(bhbasicInfoStatus)) {
+        if (StringUtil.isBlank(basicInfoStatus) || basicInfoStatus.contains("详见")
+                || basicInfoStatus.contains("见旧病历")|| basicInfoStatus.contains("见既往病历")|| StringUtil.isBlank(bhbasicInfoStatus)) {
             status.set("0");
             return;
         }
-
+        bhbasicInfoStatus = bhbasicInfoStatus.replace(" ", "");
         if (bhbasicInfoStatus.equals("未婚") && (basicInfoStatus.contains("未婚") || basicInfoStatus.contains("未结婚"))) {
             status.set("0");
             return;
@@ -51,7 +52,7 @@ public class BEH0372 extends QCCatalogue {
         }
 
         if ((bhbasicInfoStatus.equals("离婚") || bhbasicInfoStatus.equals("离异")) &&
-                (basicInfoStatus.contains("离异") || basicInfoStatus.equals("离婚"))) {
+                (basicInfoStatus.contains("离异") || basicInfoStatus.contains("离婚"))) {
             status.set("0");
             return;
         }

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

@@ -34,7 +34,7 @@ public class BEH0441 extends QCCatalogue {
             return;
         }
         List<String> words = Lists.newArrayList("胃纳", "食纳", "食欲", "未纳", "纳眠", "饮食", "睡眠"
-                , "禁食", "未食", "鼻饲", "饮", "未进食");
+                , "禁食", "未食", "鼻饲", "饮", "未进食", "开奶", "吃奶", "胃管");
         String presentText = presentLabel.getText();
         if (StringUtil.isNotBlank(presentText)) {
             for (String word : words) {

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

@@ -78,6 +78,9 @@ public class CRI0382 extends QCCatalogue {
                     companyNum = companyNum.replaceAll("单位:", "");
                 }
             }
+            if (crisisName.matches("[\\s\\S]*[(?==)][^,;,;。]{0,8}(?=秒)[\\s\\S]*")) {
+                crisisName = crisisName.split("=")[0];
+            }
             allCrisises.add(reptTime);
             if (StringUtils.isNotEmpty(reptTime)) {
                 //当前时间和报告时间未超过6小时,规则通过

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/deathrecord/DEAR0347.java

@@ -20,7 +20,7 @@ public class DEAR0347 extends QCCatalogue {
         status.set("0");
         if (inputInfo.getDeathRecordDoc() != null && inputInfo.getDeathRecordDoc().getStructureMap() != null) {
             Map<String, String> deathRecordStructureMap = inputInfo.getDeathRecordDoc().getStructureMap();
-            if (CatalogueUtil.isEmpty(deathRecordStructureMap.get("死亡时间"))) {
+            if (CatalogueUtil.isEmpty(deathRecordStructureMap.get("死亡时间")) && CatalogueUtil.isEmpty(deathRecordStructureMap.get("死亡日期"))) {
                 status.set("-1");
             }
         }

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF0119.java

@@ -43,6 +43,8 @@ public class DIF0119 extends QCCatalogue {
         {
             case "5":
                 return "参加人员的姓名及专业技术职务";
+            case "20":
+                return "参加人员的姓名及专业技术职务";
             default:
                 return "参加人员";
         }

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

@@ -12,6 +12,7 @@ import com.lantone.qc.pub.model.entity.GeneralDesc;
 import com.lantone.qc.pub.model.label.DiagLabel;
 import com.lantone.qc.pub.model.label.PastLabel;
 import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,7 +79,7 @@ public class FIRC0095 extends QCCatalogue {
                 /* 取现病史中一般情况之后的疾病名称 */
                 if (StringUtil.isNotBlank(presentText) && presentDiags.size() > 0) {
                     String lastGeneral = generals.get(generals.size() - 1).getName();
-                    int lastGeneralIndex = presentText.indexOf(lastGeneral);
+                    int lastGeneralIndex = presentText.lastIndexOf(lastGeneral);
                     for (Diag presentDiag : presentDiags) {
                         if (presentDiag.getNegative() != null || presentDiag.getHospitalDiagName().contains("否认")) {
                             continue;
@@ -93,9 +94,28 @@ public class FIRC0095 extends QCCatalogue {
                 }
             }
         }
+
+        if(presentPastDiags!= null && presentPastDiags.size()>0){
+            List<String> markStr = Arrays.asList("病以来", "病来");
+            String text = initialDiagLabel.getText();
+            for (String str : markStr) {
+                if(text.contains(str)){
+                    String textStr = text.substring(text.lastIndexOf(str));
+                    presentPastDiags = presentPastDiags.stream().filter(obj->textStr.contains(obj)).collect(Collectors.toSet());
+                    break;
+                }
+            }
+        }
+
         /* 取既往史中疾病名称 */
         if (pastLabel != null && StringUtils.isNotEmpty(pastLabel.getText())) {
             List<Diag> pastDiags = pastLabel.getDiags();
+            String text = pastLabel.getText();
+            String pattern = "[\\s\\S]*(?=妊娠).{0,4}((?=高血压)|(?=糖尿病))[\\s\\S]*";
+            if(text.matches(pattern) && ListUtil.isNotEmpty(pastDiags)){
+                List<String> dis = Arrays.asList("高血压", "糖尿病");
+                pastDiags = pastDiags.stream().filter(obj -> !dis.contains(obj.getHospitalDiagName())).collect(Collectors.toList());
+            }
             addDiagHospitalName(presentPastDiags, pastDiags, pastLabel.getText());
         } else {            //结构化数据
             List<Diag> pastDiags = new ArrayList<>();

+ 3 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC03086.java

@@ -41,7 +41,9 @@ public class FIRC03086 extends QCCatalogue {
             return;
         }
         //规则匹配增加
-        if (structureV.contains("护理") && (structureV.contains("一级") || structureV.contains("二级") || structureV.contains("三级") || structureV.contains("Ⅰ级") || structureV.contains("Ⅱ级") || structureV.contains("Ⅲ级"))) {
+        if (structureV.contains("护理") && (structureV.contains("一级") || structureV.contains("二级") || structureV.contains("三级") ||
+                structureV.contains("Ⅰ级") || structureV.contains("Ⅱ级") || structureV.contains("Ⅲ级") ||
+                structureV.contains("I级") || structureV.contains("II级") || structureV.contains("III级"))) {
             status.set("0");
             return;
         }

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0160.java

@@ -29,6 +29,8 @@ public class FIRP0160 extends QCCatalogue {
             if (StringUtil.isBlank(firstAdmissionGender) || StringUtil.isBlank(admissionGender)){
                 return;
             }
+            firstAdmissionGender = firstAdmissionGender.replace("性","");
+            admissionGender = admissionGender.replace("性","");
             if (!CatalogueUtil.compareToken(firstAdmissionGender,admissionGender)) {
                 status.set("-1");
             }

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

@@ -46,6 +46,9 @@ public class FIRP0161 extends QCCatalogue {
             if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("岁")) {
                 admissAge = admissionAge.substring(0, admissionAge.indexOf("岁"));
             }
+            if (StringUtil.isNotBlank(admissionAge) && !admissionAge.contains("岁")) {
+                admissAge = admissionAge;
+            }
             String firstadmissAge = "";
             if (StringUtil.isNotBlank(firstAdmissionAge) && firstAdmissionAge.contains("岁")) {
                 firstadmissAge = firstAdmissionAge.substring(0, firstAdmissionAge.indexOf("岁"));

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

@@ -19,7 +19,7 @@ import java.util.Map;
  */
 @Component
 public class FIRP0162 extends QCCatalogue {
-    private List<String> containList = Arrays.asList("-", "—", "拒", "无", "不详", "未上户口");
+    private List<String> containList = Arrays.asList("-", "—", "拒", "无", "不详", "未上户口","未提供");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0166.java

@@ -29,6 +29,8 @@ public class FIRP0166 extends QCCatalogue {
             if (StringUtil.isBlank(firstAdmissionMarry) || StringUtil.isBlank(admissionMarry)) {
                 return;
             }
+            firstAdmissionMarry = firstAdmissionMarry.replace("离异","离婚");
+            admissionMarry = admissionMarry.replace("离异","离婚");
             if (!CatalogueUtil.compareToken(firstAdmissionMarry, admissionMarry)) {
                 status.set("-1");
             }

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

@@ -55,6 +55,9 @@ public class FIRP0175 extends QCCatalogue {
                         if (firstpageleaveDiag.contains("伴")) {
                             firstpageleaveDiag = firstpageleaveDiag.substring(0, firstpageleaveDiag.indexOf("伴"));
                         }
+                        if(diags.contains(firstpageleaveDiag)){
+                            firstpageleaveDiag = firstpageleaveDiag.replaceAll("^[0-9]", "");
+                        }
                     }
                     break;
                 }

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

@@ -20,7 +20,7 @@ import java.util.Map;
 @Component
 public class FIRP0209 extends QCCatalogue {
 
-    private List<String> containList = Arrays.asList("农民", "家务", "自由职业者", "个体经营者", "无业人员", "儿童");
+    private List<String> containList = Arrays.asList("退(离)休人员","农民", "家务", "自由职业者", "个体经营者", "无业人员", "儿童");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0248.java

@@ -5,6 +5,8 @@ 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.RescueDoc;
+import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 

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

@@ -73,7 +73,8 @@ public class FIRP0250 extends QCCatalogue {
             // 跟医学部确认,从抢救措施中读取数据
             String key = getKeyByHospitalId();
             String qjgc = structureMap.get(key);
-            if (StringUtil.isNotBlank(qjgc) && !qjgc.contains("死亡")) {
+            String detail = structureMap.get("抢救结果");
+            if ((StringUtil.isNotBlank(qjgc) && !qjgc.contains("死亡")) ||  (StringUtil.isNotBlank(detail) && detail.equals("成功"))) {
                 i++;
             }
         }

+ 72 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03196.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03196
+ * @Description :  主要手术及操作麻醉方式未填写
+ * @Author : wsy
+ * @Date: 2022-2-9 15:51
+ */
+@Component
+public class FIRP03196 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            return;
+        }
+        Map<String, Object> structureExtMap = firstPageRecordDoc.getStructureExtMap();
+        if (structureExtMap == null) {
+            return;
+        }
+        String operativeName = "";
+        String anesthesiaMode = "";
+        List<Map<String, String>> operative_information = (List<Map<String, String>>) structureExtMap.get(Content.operative_information);
+        if (operative_information == null || operative_information.size() == 0) {
+            return;
+        }
+        //手术名称
+        operativeName = operative_information.get(0).get(Content.operative_name);
+        //麻醉方式
+        anesthesiaMode = operative_information.get(0).get(Content.anesthesia_mode);
+
+        if (StringUtil.isNotBlank(anesthesiaMode)) {
+            return;
+        }
+
+        if (StringUtil.isBlank(operativeName)) {
+            return;
+        }
+
+        List<String> noMatchWords = Lists.newArrayList("其他周围血管药物洗脱支架置入","经皮降主动脉药物洗脱支架置入术","经皮周围动脉药物洗脱支架置入术",
+                "经皮周围静脉药物洗脱支架置入术","经皮尺动脉药物洗脱支架置入术","经皮腓动脉药物洗脱支架置入术","经皮肱动脉药物洗脱支架置入术","经皮桡动脉药物洗脱支架置入术",
+                "经皮上肢静脉药物洗脱支架置入术","经皮头臂静脉药物洗脱支架置入术","经皮外周动脉可降解支架置入术","锁骨下动脉药物洗脱支架置入术","股总动脉药物洗脱支架置入术",
+                "表浅股动脉药物洗脱支架置入","经皮股动脉药物洗脱支架置入术","颅外血管经皮血管成形术","经皮颈总动脉球囊扩张成形术","经皮颈静脉球囊扩张成形术","经皮颈动脉球囊扩张成形术",
+                "经皮椎动脉球囊扩张成形术","颅内血管经皮血管成形术","经皮大脑中动脉球囊扩张成形术","经皮大脑前动脉球囊扩张成形术","经皮大脑后动脉球囊扩张成形术","经皮椎动脉颅内段球囊扩张成形术",
+                "经皮颈内动脉颅内段球囊扩张成形术","经皮基底动脉球囊扩张成形术","经皮交通动脉血管球囊扩张成形术","颈动脉支架经皮置入术","经皮颈动脉远端保护装置置入术","经皮颈动脉覆膜支架置入术",
+                "经皮颈动脉药物洗脱支架置入术","脑保护伞下颈动脉支架置入术","其他颅外动脉支架经皮置入","经皮基底动脉支架置入术","经皮椎动脉支架置入术","经皮颅外动脉远端保护装置置入术",
+                "经皮椎动脉药物洗脱支架置入术","经皮椎动脉覆膜支架置入术","经皮椎动脉非药物洗脱支架置入术","颅内血管支架经皮置入","经皮颅内动脉支架置入术","经皮颅内动脉远端保护装置置入术",
+                "经皮颅内静脉窦支架置入术","经皮大脑前动脉支架置入术","经皮大脑后动脉支架置入术","经皮大脑中动脉支架置入术","经皮冠状动脉腔内血管成形术[PTCA]","经皮冠状动脉球囊扩张成形术",
+                "经皮冠状动脉药物球囊扩张成形术");
+
+        for (String noMatchWord : noMatchWords) {
+            if (operativeName.contains(noMatchWord) && StringUtil.isBlank(anesthesiaMode)) {
+                status.set("-1");
+                info.set(noMatchWord);
+                return;
+            }
+        }
+    }
+}

+ 74 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03197.java

@@ -0,0 +1,74 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03197
+ * @Description :  其他手术及操作麻醉方式未填写
+ * @Author : wsy
+ * @Date: 2022-2-9 15:51
+ */
+@Component
+public class FIRP03197 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> noMatchWords = Lists.newArrayList("其他周围血管药物洗脱支架置入","经皮降主动脉药物洗脱支架置入术","经皮周围动脉药物洗脱支架置入术",
+                "经皮周围静脉药物洗脱支架置入术","经皮尺动脉药物洗脱支架置入术","经皮腓动脉药物洗脱支架置入术","经皮肱动脉药物洗脱支架置入术","经皮桡动脉药物洗脱支架置入术",
+                "经皮上肢静脉药物洗脱支架置入术","经皮头臂静脉药物洗脱支架置入术","经皮外周动脉可降解支架置入术","锁骨下动脉药物洗脱支架置入术","股总动脉药物洗脱支架置入术",
+                "表浅股动脉药物洗脱支架置入","经皮股动脉药物洗脱支架置入术","颅外血管经皮血管成形术","经皮颈总动脉球囊扩张成形术","经皮颈静脉球囊扩张成形术","经皮颈动脉球囊扩张成形术",
+                "经皮椎动脉球囊扩张成形术","颅内血管经皮血管成形术","经皮大脑中动脉球囊扩张成形术","经皮大脑前动脉球囊扩张成形术","经皮大脑后动脉球囊扩张成形术","经皮椎动脉颅内段球囊扩张成形术",
+                "经皮颈内动脉颅内段球囊扩张成形术","经皮基底动脉球囊扩张成形术","经皮交通动脉血管球囊扩张成形术","颈动脉支架经皮置入术","经皮颈动脉远端保护装置置入术","经皮颈动脉覆膜支架置入术",
+                "经皮颈动脉药物洗脱支架置入术","脑保护伞下颈动脉支架置入术","其他颅外动脉支架经皮置入","经皮基底动脉支架置入术","经皮椎动脉支架置入术","经皮颅外动脉远端保护装置置入术",
+                "经皮椎动脉药物洗脱支架置入术","经皮椎动脉覆膜支架置入术","经皮椎动脉非药物洗脱支架置入术","颅内血管支架经皮置入","经皮颅内动脉支架置入术","经皮颅内动脉远端保护装置置入术",
+                "经皮颅内静脉窦支架置入术","经皮大脑前动脉支架置入术","经皮大脑后动脉支架置入术","经皮大脑中动脉支架置入术","经皮冠状动脉腔内血管成形术[PTCA]","经皮冠状动脉球囊扩张成形术",
+                "经皮冠状动脉药物球囊扩张成形术");
+
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            return;
+        }
+        Map<String, Object> structureExtMap = firstPageRecordDoc.getStructureExtMap();
+        if (structureExtMap == null) {
+            return;
+        }
+        String operativeName = "";
+        String anesthesiaMode = "";
+        List<Map<String, String>> operative_information = (List<Map<String, String>>) structureExtMap.get(Content.operative_information);
+        if (operative_information == null || operative_information.size() == 0) {
+            return;
+        }
+
+        for (int i = 1; i < operative_information.size(); i++) {
+            //手术名称
+            operativeName = operative_information.get(i).get(Content.operative_name);
+            //麻醉方式
+            anesthesiaMode = operative_information.get(i).get(Content.anesthesia_mode);
+            if (StringUtil.isNotBlank(anesthesiaMode)) {
+                return;
+            }
+
+            if (StringUtil.isBlank(operativeName)) {
+                return;
+            }
+
+            for (String noMatchWord : noMatchWords) {
+                if (operativeName.contains(noMatchWord) && StringUtil.isBlank(anesthesiaMode)) {
+                    status.set("-1");
+                    info.set(noMatchWord);
+                    return;
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,222 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhenhai.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(DateUtil.addDay(sixDate, -1));
+                    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 "多学科联合";
+            case "35":               //长沙湘雅
+                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(title)){
+                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);
+            }
+            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 "";
+    }
+}

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

@@ -0,0 +1,58 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.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.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.entity.General;
+import com.lantone.qc.pub.model.entity.GeneralDesc;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : BEH0022
+ * @Description :  现病史缺少发病以来一般情况描述
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class BEH0022 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        PresentLabel presentLabel = inputInfo.getBeHospitalizedDoc().getPresentLabel();
+        if (presentLabel == null || StringUtil.isBlank(presentLabel.getText())) {
+            status.set("0");
+            return;
+        }
+        String presentText = presentLabel.getText();
+        if (presentText.contains("发病以来")) {
+            status.set("0");
+            return;
+        }
+        List<GeneralDesc> generals = presentLabel.getGenerals();
+        if (generals != null && generals.size() > 0) {
+            status.set("0");
+            return;
+        }
+        List<General> gens = inputInfo.getBeHospitalizedDoc().getPresentLabel().getGens();
+        if (gens != null && gens.size() > 0) {
+            status.set("0");
+            return;
+        }
+        //增加强判断,现病史有无"病来..."
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        Map<String, String> beHospitalizedDocStructureMap = beHospitalizedDoc.getStructureMap();
+        if (beHospitalizedDocStructureMap.get("现病史") != null && (beHospitalizedDocStructureMap.get("现病史").contains("病来")
+                || beHospitalizedDocStructureMap.get("现病史").contains("孕来"))) {
+            status.set("0");
+            return;
+        }
+    }
+}

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

@@ -0,0 +1,78 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.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 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.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 手术名称未标引号
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0034 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        List<Operation> operations = pastLabel.getOperations();
+        if (ListUtil.isEmpty(operations)) {
+            return;
+        }
+        List<String> wtOperationNames = CatalogueUtil.noInQuotes(
+                operations.stream()
+                        .filter(i ->
+                                i != null && StringUtil.isNotBlank(i.getName()) && i.getNegative() == null
+                                        && !"手术史".equals(i.getName()) && !"手术".equals(i.getName()) && !"手术治疗".equals(i.getName())
+                                        && !"手术无手术史".equals(i.getName())&& !"手术处理".equals(i.getName())&& !"其他手术史".equals(i.getName())
+                        )
+                        .map(i -> i.getName())
+                        .distinct()
+                        .collect(Collectors.toList()),
+                pastLabel.getText().replace("“", "\"").replace("”", "\"")
+        );
+        if (ListUtil.isNotEmpty(wtOperationNames)) {
+            String pastLabelText = pastLabel.getText();
+            for (String wtOperationName : wtOperationNames) {
+                if (isASMark(pastLabelText, wtOperationName)) {
+                    continue;
+                }
+                status.set("-1");
+                info.set(info.get() + wtOperationName + " ");
+            }
+        }
+    }
+
+    private boolean isASMark(String pastLabelText, String wtOperationName) {
+        String operName = wtOperationName.replace("手术", "");
+        Pattern pattern = Pattern.compile("[0-9][(?=次)][\\s\\S]*");
+        Matcher matcher = pattern.matcher(operName);
+        if (matcher.find()) {
+            operName = operName.substring(0, matcher.start());
+        }
+        int index = pastLabelText.indexOf(operName);
+        if (index != -1 && index + operName.length() != pastLabelText.length()) {
+            String substring = pastLabelText.substring(index + operName.length(), index + operName.length() + 1);
+            if (substring.equals("\"") || substring.equals("”")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

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

@@ -0,0 +1,30 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.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 com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : DEAR0347
+ * @Description : 死亡记录无死亡时间
+ * @Author : 胡敬
+ * @Date: 2020-03-18 18:38
+ */
+@Component
+public class DEAR0347 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 deathDate = deathRecordStructureMap.get("死亡日期");
+            if (StringUtil.isEmpty(deathDate)){
+                status.set("-1");
+            }
+        }
+    }
+}

+ 34 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/firstpagerecord/FIRP0178.java

@@ -9,6 +9,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.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,7 +50,7 @@ public class FIRP0178 extends QCCatalogue {
             if (ListUtil.isEmpty(firstpageLeaveDiags)) {
                 return;
             }
-
+            List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
             /*DiagLabel leaveDiagLabel = inputInfo.getLeaveHospitalDoc().getLeaveDiagLabel();
             if (leaveDiagLabel == null) {
                 return;
@@ -87,6 +88,26 @@ public class FIRP0178 extends QCCatalogue {
                 status.set("-1");
                 info.set(infoStr);
             }
+            //补记病理
+            if(ListUtil.isNotEmpty(threeLevelWardDocs)){
+                for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+                    List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+                    if(ListUtil.isNotEmpty(allDoctorWradDocs)){
+                        for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                            String text = allDoctorWradDoc.getText();
+                            if(StringUtil.isBlank(text)){
+                                Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
+                                text = structureMap.get("病情记录");
+                            }
+                            if( isHavePathology(text)){
+                                status.set("0");
+                                info.remove();
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
 
@@ -122,6 +143,9 @@ public class FIRP0178 extends QCCatalogue {
     private List<String> cut(String leaveDiag, String mainDiagnosis) {
         List<String> diags = new ArrayList<>();
         if (leaveDiag != null) {
+            if(leaveDiag.contains("西医诊断:")){
+                leaveDiag = leaveDiag.substring(leaveDiag.indexOf("西医诊断:"));
+            }
             String[] leaveDiags = leaveDiag.split(",?,?[0-9]\\.");
             for (String string : leaveDiags) {
                 if (!string.isEmpty()) {
@@ -138,4 +162,13 @@ public class FIRP0178 extends QCCatalogue {
         }
         return diags;
     }
+
+    public boolean isHavePathology(String text){
+        String rex = "[\\s\\S]*(?=补)[\\s\\S].{0,5}(?=病理)[\\s\\S]*";
+        String rex2 = "[\\s\\S]*(?=病理)[\\s\\S].{0,5}(?=补)[\\s\\S]*";
+        if(StringUtil.isNotBlank(text) && (text.matches(rex) ||  text.matches(rex2))){
+            return true;
+        }
+        return false;
+    };
 }

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

@@ -65,8 +65,8 @@ public class BEH02902 extends QCCatalogue {
 
         /* 如果模型没找到时间实体,则直接取辅助检查前20个字,判断有没有院字 */
         if (!findPlace) {
-            String prefixText = pacsText.substring(0, Math.min(25, pacsText.length()));
-            if (prefixText.contains("院")) {
+            String prefixText = pacsText.trim().substring(0, Math.min(35, pacsText.length()));
+            if (prefixText.contains("院") || prefixText.contains("当地") || prefixText.contains("嵊州市") || prefixText.contains("科")) {
                 findPlace = true;
             }
         }

+ 59 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/shengzhouyy/firstpagerecord/FIRP0190.java

@@ -0,0 +1,59 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.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.ClinicalBloodDoc;
+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;
+
+/**
+ * @ClassName : FIRP0190
+ * @Description :Rh填写错误
+ * @Author : 胡敬
+ * @Date: 2020-03-18 13:35
+ */
+@Component
+public class FIRP0190 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() == null || inputInfo.getFirstPageRecordDoc().getStructureMap() == null
+                || inputInfo.getClinicalBloodDocs().size() == 0) {
+            return;
+        }
+        Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+        List<ClinicalBloodDoc> clinicalBloodDocList = inputInfo.getClinicalBloodDocs();
+        String rhFactor = firstpageStructureMap.get(Content.rhFactor);
+        if (CatalogueUtil.isEmpty(rhFactor)) {
+            return;
+        }
+        int matchSum = 0, noRhSum = 0;
+        for (ClinicalBloodDoc clinicalBloodDoc : clinicalBloodDocList) {
+            String text = clinicalBloodDoc.getText();
+            if (StringUtils.isEmpty(text)) {
+                continue;
+            }
+
+            String pattern = "[\\s\\S]*(?=RH)[^,;,;。]{0,3}((?=阴)|(?=阳))[\\s\\S]*";
+            if(!text.matches(pattern)){
+                noRhSum++;
+            }else{
+                matchSum++;
+                return;
+            }
+        }
+        /* 如果所有输血记录都没有rh记录(阴、阳),则不报错 */
+        if (noRhSum == clinicalBloodDocList.size()){
+            return;
+        }
+        if (matchSum == 0) {
+            status.set("-1");
+        }
+    }
+}

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

@@ -0,0 +1,115 @@
+package com.lantone.qc.kernel.catalogue.hospital.shengzhouyy.leavehospital;
+
+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.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 key = getKeyByHospitalId();
+            String bhThings = lhStructureMap.get(key);
+            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 (StringUtil.isNotBlank(bhThings) && (bhThings.replace(" ", "").contains(bhChief.replace(" ", ""))
+                    || bhThings.replace(" ", "").contains(bhChief.replace(" ", "").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");
+                }
+            }
+
+
+            //                    bhThings = bhThings.replaceAll("[\\p{Punct}\\pP]", "");
+            //                    if (bhThings.indexOf(bhChief) < 0) {
+            //                        status.set("-1");
+            //                    }
+        }
+    }
+    private String getKeyByHospitalId() {
+        switch (Content.hospital_Id)
+        {
+            case "7":               //厦门
+                return "病史摘要";
+            default:
+                return "入院情况";
+        }
+    }
+}

+ 133 - 0
kernel/src/main/resources/cache/11/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

+ 0 - 0
kernel/src/main/resources/cache/11/concept_diag_properties.dict


+ 0 - 0
kernel/src/main/resources/cache/11/hospital_diag_info.dict


+ 0 - 0
kernel/src/main/resources/cache/11/hospital_doctor_info.dict


+ 133 - 0
kernel/src/main/resources/cache/21/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

+ 0 - 0
kernel/src/main/resources/cache/21/concept_diag_properties.dict


+ 0 - 0
kernel/src/main/resources/cache/21/hospital_diag_info.dict


+ 0 - 0
kernel/src/main/resources/cache/21/hospital_doctor_info.dict


+ 133 - 0
kernel/src/main/resources/cache/22/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

+ 0 - 0
kernel/src/main/resources/cache/22/concept_diag_properties.dict


+ 0 - 0
kernel/src/main/resources/cache/22/hospital_diag_info.dict


+ 0 - 0
kernel/src/main/resources/cache/22/hospital_doctor_info.dict


+ 133 - 0
kernel/src/main/resources/cache/23/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

+ 0 - 0
kernel/src/main/resources/cache/23/concept_diag_properties.dict


+ 0 - 0
kernel/src/main/resources/cache/23/hospital_diag_info.dict


+ 0 - 0
kernel/src/main/resources/cache/23/hospital_doctor_info.dict


+ 133 - 0
kernel/src/main/resources/cache/24/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

+ 0 - 0
kernel/src/main/resources/cache/24/concept_diag_properties.dict


+ 0 - 0
kernel/src/main/resources/cache/24/hospital_diag_info.dict


+ 0 - 0
kernel/src/main/resources/cache/24/hospital_doctor_info.dict


+ 3 - 3
kernel/src/main/resources/kernel.properties

@@ -1,7 +1,7 @@
 ################################ database ###################################
-mysql.redis.user = teamdata
-mysql.redis.password = jiO2rfnYhg
-mysql.redis.url = jdbc:mysql://192.168.2.121:3306/qc?useUnicode=true&characterEncoding=UTF-8&useSSL=false
+mysql.redis.user = root
+mysql.redis.password = LangT0ng@lt
+mysql.redis.url = jdbc:mysql://192.168.2.125:3307/qc?useUnicode=true&characterEncoding=UTF-8&useSSL=false
 
 mysql.test.user = root
 mysql.test.password = lantone

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/ningbozhenhai/util/OperationRecordHtmlAnalysis.java

@@ -41,11 +41,11 @@ public class OperationRecordHtmlAnalysis implements HtmlAnalysis {
 
     private void analysisGeneral(Element bigDivElement, Map<String, String> map) {
         String text = HtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        text = text.replaceAll("第1页", "")
+        text = text.replaceAll("第1页", "").replace(" ", "")
                 .replace("(包括体位、切口处理经过,病灶所见及手术步骤等):", "");
         List<String> titles = Lists.newArrayList(
                 "姓名", "病区", "科室", "床号", "床位", "住院号", "手术开始时间", "手术结束时间", "术前诊断", "术 前 诊  断",
-                "手术名称", "手 术 名  称", "术中诊断", "术(中)后诊断", "手术人员", "手术主刀医师", "手 术 主 刀 医 师", "麻醉方式",
+                "手术名称", "手 术 名  称", "术中诊断", "术(中)后诊断", "手术人员", "手术主刀医师", "手 术 主 刀 医 师", "一助", "二助", "麻醉方式",
                 "麻 醉 方  式", "麻醉人员", "麻 醉 医  师", "手术风险评估(可选)", "NNIS分级", "手术类别(可选)", "手术标本", "冰冻切片结果",
                 "术中并发症", "术中失血量", "手术经过", "手术经过及处理(包括患者的体位、切口处理、病灶所见及手术步骤等)", "记录者签字", "主刀签字", "主刀医师签名",
                 "记录日期", "日期", "时间"

+ 6 - 21
trans/src/main/java/com/lantone/qc/trans/ningbozhongyi/util/NingBoZhongYiLeaveHospitalHtmlAnalysis.java

@@ -59,27 +59,12 @@ public class NingBoZhongYiLeaveHospitalHtmlAnalysis implements NingBoZhongYiHtml
                 String discharge = structureMap.get("出院诊断");
                 StringBuilder sb = new StringBuilder();
                 int num =0;
-                if(discharge.contains("中医诊断") && !discharge.contains("西医诊断")){
-                    String zdischarge = discharge.split("中医诊断")[1].replace(":","");
-                    num = extractDischarge(num, sb, zdischarge);
-
-                }
-                if(discharge.contains("中医诊断") && discharge.contains("西医诊断")){
-                    String zdischarge = discharge.split("西医诊断")[0].split("中医诊断")[1].replace(":","");
+                if(discharge.contains("西医诊断")){
                     String xdischarge = discharge.split("西医诊断")[1].replace(":","");
-                    num = extractDischarge(num,sb,zdischarge);
-                    String[] xleaveDiags = xdischarge.split(",?,?[0-9]\\.");
-                    for (String leaveDiag : xleaveDiags) {
-                        leaveDiag = leaveDiag.trim();
-                        if(StringUtil.isNotBlank(leaveDiag)){
-                            num++;
-                            sb.append(num+"."+leaveDiag.trim());
-                        }
+                    String sbStr = extractDischarge(num, sb, xdischarge);
+                    if(StringUtil.isNotBlank(sbStr)){
+                        structureMap.put("出院诊断规则",sbStr);
                     }
-
-                }
-                if(StringUtil.isNotBlank(sb.toString())){
-                    structureMap.put("出院诊断规则",sb.toString());
                 }
             }
             CommonAnalysisUtil.extractDateByTitle(structureMap, "时间");
@@ -90,7 +75,7 @@ public class NingBoZhongYiLeaveHospitalHtmlAnalysis implements NingBoZhongYiHtml
         return structureMap;
     }
 
-    public int extractDischarge( int num, StringBuilder sb,String zdischarge){
+    public String extractDischarge( int num, StringBuilder sb,String zdischarge){
         String rex =",?,?[0-9]\\.";
         boolean matches = zdischarge.matches(rex);
         String[] zleaveDiags = null;
@@ -110,6 +95,6 @@ public class NingBoZhongYiLeaveHospitalHtmlAnalysis implements NingBoZhongYiHtml
                 }
             }
         }
-        return num;
+        return sb.toString();
     }
 }

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/shengzhouyy/ClinicalBloodDocTrans.java

@@ -48,6 +48,7 @@ public class ClinicalBloodDocTrans extends ModelDocTrans {
         }
 
         ClinicalBloodDoc clinicalBloodDoc = new ClinicalBloodDoc();
+        clinicalBloodDoc.setText(structureMap.get("原始文本"));
         clinicalBloodDoc.setStructureMap(structureMap);
         clinicalBloodDoc.setPageData((Map) structureMap);
         return clinicalBloodDoc;

+ 46 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/AnesthesiaRecordDocTrans.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.ADLGradeDoc;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunADLGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: AnesthesiaRecordDocTrans
+ * @Description: 手麻记录解析
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Slf4j
+public class AnesthesiaRecordDocTrans extends ModelDocTrans {
+    @Override
+    public List<AnesthesiaRecordDoc> extract(MedrecVo medrecVo) {
+        List<AnesthesiaRecordDoc> anesList = Lists.newArrayList();
+        try {
+            //1.获取mrqc medrecVo content数据
+            List<String> anesthesiaList = (List<String>)medrecVo.getContent().get("content");
+            //2.装载到AnesthesiaRecordDoc
+            anesthesiaList.forEach(anesthesiaStr->{
+                AnesthesiaRecordDoc anesthesiaTemp =JSONObject.parseObject
+                        (anesthesiaStr,AnesthesiaRecordDoc.class);
+                anesList.add(anesthesiaTemp);
+            });
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return anesList;
+    }
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunADLGradeDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.lantone.qc.pub.model.doc.ADLGradeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunADLGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunADLGradeDocTrans
+ * @Description: ADL评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunADLGradeDocTrans extends ModelDocTrans {
+    @Override
+    public ADLGradeDoc extract(MedrecVo medrecVo) {
+        ADLGradeDoc adlGradeDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunADLGradeHtmlAnalysis adlGradeHtmlAnalysis = new BeiLunADLGradeHtmlAnalysis();
+                Map<String, String> sourceMap = adlGradeHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap.putAll(sourceMap);
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                              ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                adlGradeDoc = ModelDocGenerate.adlGradeDocGen(structureMap);
+                adlGradeDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return adlGradeDoc;
+    }
+}

+ 81 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunBeHospitalizedDocTrans.java

@@ -0,0 +1,81 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunBeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/5 15:47
+ */
+@Slf4j
+public class BeiLunBeHospitalizedDocTrans extends ModelDocTrans {
+
+    @Override
+    public BeHospitalizedDoc extract(MedrecVo medrecVo) {
+        BeHospitalizedDoc beHospitalizedDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunBeHospitalizedHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    //初步诊断特殊处理
+                    if (structureMap.containsKey("初步诊断")) {
+                        String initDiag = structureMap.get("初步诊断");
+                        if (initDiag.contains("<img")) {
+                            initDiag = initDiag.split("<img")[0];
+                            structureMap.put("初步诊断", initDiag);
+                        }
+                    }
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                beHospitalizedDoc = ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                beHospitalizedDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return beHospitalizedDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "姓 名=姓名",
+            "职 业=职业",
+            "性 别=性别",
+            "年 龄=年龄",
+            "婚 姻=婚姻",
+            "出生地=籍贯",
+            "专项 评估=专项评估",
+            "主 诉=主诉",
+            "体 格 检 查=体格检查",
+            "体 格 检 查 表 ( 一 )=体格检查",
+            "补充及专科检查=专科检查",
+            "辅 助 检 查=辅助检查",
+            "入 院 诊 断=入院诊断",
+            "初步诊断=入院诊断"
+    );
+
+}

+ 72 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunClinicBloodEffectDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunClinicBloodEffectHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 王宇
+ * @create 2020-04-30 12:39
+ * @desc 输血后效果评价
+ **/
+@Slf4j
+public class BeiLunClinicBloodEffectDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ClinicBloodEffectDoc> extract(MedrecVo medrecVo) {
+        List<ClinicBloodEffectDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                ClinicBloodEffectDoc clinicBloodEffectDoc = getClinicalBloodDoc(contentMap);
+                if (clinicBloodEffectDoc != null) {
+                    retList.add(clinicBloodEffectDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private ClinicBloodEffectDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunClinicBloodEffectHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            ClinicBloodEffectDoc clinicBloodEffectDoc = ModelDocGenerate.clinicBloodEffectDoc(structureMap);
+            clinicBloodEffectDoc.setPageData((Map) structureMap);
+            return clinicBloodEffectDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病情记录=病历内容"
+    );
+
+}

+ 76 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunClinicalBloodDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunClinicalBloodHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 输血/血制品病程记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:21
+ */
+@Slf4j
+public class BeiLunClinicalBloodDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ClinicalBloodDoc> extract(MedrecVo medrecVo) {
+        List<ClinicalBloodDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                ClinicalBloodDoc clinicalBloodDoc = getClinicalBloodDoc(contentMap);
+                if (clinicalBloodDoc != null) {
+                    retList.add(clinicalBloodDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunClinicalBloodHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            ClinicalBloodDoc clinicalBloodDoc = ModelDocGenerate.clinicalBloodDocGen(structureMap);
+            clinicalBloodDoc.setText(CommonAnalysisUtil.html2String(content));
+            clinicalBloodDoc.setPageData((Map) structureMap);
+            return clinicalBloodDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病历标题=标题",
+            "病情记录=病历内容",
+            "书写医师=记录医生"
+    );
+
+}

+ 275 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunConsultationDocTrans.java

@@ -0,0 +1,275 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunConsultationHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunConsultationRecordHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 会诊文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+@Slf4j
+public class BeiLunConsultationDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ConsultationDoc> extract(MedrecVo medrecVo) {
+        List<ConsultationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<Object>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+
+        Map<String, ConsultationRecordDoc> consultationRecordDocMap = getConsultationRecordDocMap((List) contentMap.get("会诊记录"));
+        Map<String, ConsultationResultsDoc> consultationResultsDocMap = getConsultationResultsDocMap((List) contentMap.get("会诊结果单"));
+        Map<String, ConsultationApplicationDoc> consultationApplicationDocMap = getConsultationApplicationDocMap((List) contentMap.get("会诊申请单"));
+
+        Set<String> consultationNameSet = Sets.newHashSet();
+        consultationNameSet.addAll(consultationRecordDocMap.keySet());
+        consultationNameSet.addAll(consultationResultsDocMap.keySet());
+        consultationNameSet.addAll(consultationApplicationDocMap.keySet());
+
+        consultationNameSet.forEach(consultationName -> {
+            ConsultationDoc consultationDoc = new ConsultationDoc();
+            consultationDoc.setConsultationName(consultationName);
+            consultationDoc.setConsultationRecordDoc(consultationRecordDocMap.get(consultationName));
+            consultationDoc.setConsultationResultsDoc(consultationResultsDocMap.get(consultationName));
+            consultationDoc.setConsultationApplicationDoc(consultationApplicationDocMap.get(consultationName));
+            retList.add(consultationDoc);
+        });
+
+        return retList;
+    }
+
+
+    /**************************************************会诊记录*********************************************************/
+    private Map<String, ConsultationRecordDoc> getConsultationRecordDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                ConsultationRecordDoc consultationRecordDoc = getConsultationRecordDoc(contentMap);
+                if (consultationRecordDoc != null) {
+                    consultationName = index + "";
+                    consultationRecordDoc.setConsultationName(consultationName);
+                    retMap.put(consultationName, consultationRecordDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private ConsultationRecordDoc getConsultationRecordDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunConsultationRecordHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationRecord_keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            ConsultationRecordDoc consultationRecordDoc = ModelDocGenerate.consultationRecordDocGen(structureMap);
+            consultationRecordDoc.setPageData((Map) structureMap);
+            return consultationRecordDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
+            "会诊的目的=会诊目的",
+            "申请会诊医师签名=申请医生"
+    );
+
+
+    /**************************************************会诊结果单*******************************************************/
+    private Map<String, ConsultationResultsDoc> getConsultationResultsDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationResultsDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                ConsultationResultsDoc consultationResultsDoc = getConsultationResultsDoc(contentMap);
+                if (consultationResultsDoc != null) {
+                    consultationName = index + "";
+                    consultationResultsDoc.setConsultationName(consultationName);
+                    retMap.put(consultationName, consultationResultsDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private ConsultationResultsDoc getConsultationResultsDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunConsultationHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationResults_pageDataTitles);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (StringUtil.isNotBlank(structureMap.get("会诊科室"))) {
+            structureMap.put("会诊科室", structureMap.get("会诊科室").replaceAll("XXXX", "").trim());
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            ConsultationResultsDoc consultationResultsDoc = ModelDocGenerate.consultationResultsDocGen(structureMap);
+            consultationResultsDoc.setPageData((Map) structureMap);
+            return consultationResultsDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> consultationResults_pageDataTitles = Lists.newArrayList(
+            "科室=科别",
+            "专业=科别",
+            "申请会诊科别=申请科室",
+            "申请时间=申请日期",
+            "会诊日期=申请日期",
+            //"会诊诊断=当前诊断",
+            "患者病情及诊疗经过、申请会诊的理由及目的=会诊目的",
+            "病情摘要=会诊目的",
+            "出生年月=出生日期",
+            "床位=床号",
+            "外来专家意见=会诊意见",
+            "由受邀医生填写,本次会诊是否必要=由受邀医生填写本次会诊是否必要",
+            "单位=会诊医师所在医疗机构名称",
+            "记录医师"
+    );
+
+
+    /**************************************************会诊申请单*******************************************************/
+    private Map<String, ConsultationApplicationDoc> getConsultationApplicationDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationApplicationDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationApplicationDoc consultationApplicationDoc = getConsultationApplicationDoc(contentMap);
+            consultationApplicationDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationApplicationDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationApplicationDoc getConsultationApplicationDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunConsultationHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationApplication_keyContrasts);
+            structureMap.put("记录编号", contentMap.get("recId").toString());
+            structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+        }
+
+        ConsultationApplicationDoc consultationApplicationDoc = ModelDocGenerate.consultationApplicationDocGen(structureMap);
+        consultationApplicationDoc.setText(content);
+        consultationApplicationDoc.setPageData((Map) structureMap);
+
+        return consultationApplicationDoc;
+    }
+
+    private List<String> consultationApplication_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "简要病情及诊疗",
+            "申请理由目的",
+            "受邀科室",
+            "会诊分类",
+            "会诊时间",
+            "会诊地点",
+            "签名"
+    );
+
+    private List<String> consultationApplication_keyContrasts = Lists.newArrayList(
+            "++++姓名=姓名",
+            "申请时间=申请日期",
+            "性别=性别",
+            "++++病区=病区",
+            "床号=",
+            "++++病案号=病案号",
+            "新会诊-简要病情及诊疗=简要病情及诊疗",
+            "新会诊-申请理由目的=会诊目的",
+            "新会诊-受邀科室=受邀科室",
+            "新会诊-会诊分类=会诊分类",
+            "新会诊-会诊时间=会诊时间",
+            "新会诊-会诊地点=会诊地点",
+            "新会诊-接待医生=会诊医师",
+            "新会诊-会诊意见=会诊意见",
+            "新会诊-会诊科室=会诊科室",
+            "签名++++=签名",
+            "++++会诊医师=会诊医师"
+    );
+
+}

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisInfoDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.CrisisInfoDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 危急值结构化信息
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunCrisisInfoDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CrisisInfoDoc> extract(MedrecVo medrecVo) {
+        List<CrisisInfoDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getCrisisInfoDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private CrisisInfoDoc getCrisisInfoDoc(Map<String, String> content) {
+        CrisisInfoDoc crisisInfoDoc = new CrisisInfoDoc();
+        crisisInfoDoc.setStructureMap(content);
+        crisisInfoDoc.setPageData((Map) content);
+        return crisisInfoDoc;
+    }
+
+}

+ 73 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisValueReportDocTrans.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunCrisisValueReportHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 危急值记录文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+@Slf4j
+public class BeiLunCrisisValueReportDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CrisisValueReportDoc> extract(MedrecVo medrecVo) {
+        List<CrisisValueReportDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                CrisisValueReportDoc crisisValueReportDoc = getCrisisValueReportDoc(contentMap);
+                if (crisisValueReportDoc != null) {
+                    retList.add(crisisValueReportDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private CrisisValueReportDoc getCrisisValueReportDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunCrisisValueReportHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            CrisisValueReportDoc crisisValueReportDoc = ModelDocGenerate.crisisValueReportDocGen(structureMap);
+            crisisValueReportDoc.setPageData((Map) structureMap);
+            return crisisValueReportDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病情记录=病历内容",
+            "书写医师=记录医生"
+    );
+
+}

+ 77 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCriticallyIllNoticeDocTrans.java

@@ -0,0 +1,77 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunCriticallyIllNoticeHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病危通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+@Slf4j
+public class BeiLunCriticallyIllNoticeDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CriticallyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<CriticallyIllNoticeDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                CriticallyIllNoticeDoc criticallyIllNoticeDoc = getCriticallyIllNoticeDoc(contentMap);
+                if (criticallyIllNoticeDoc != null) {
+                    retList.add(criticallyIllNoticeDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunCriticallyIllNoticeHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            CriticallyIllNoticeDoc criticallyIllNoticeDoc = ModelDocGenerate.criticallyIllNoticeDocGen(structureMap);
+            criticallyIllNoticeDoc.setText(CommonAnalysisUtil.html2String(content));
+            criticallyIllNoticeDoc.setPageData((Map) structureMap);
+            return criticallyIllNoticeDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "尊敬的患者家属或患者的法定监护人、授权委托人=尊敬的患者家属或患者的法定监护人授权委托人",
+            "虽经医护人员积极救治,但目前患者病情危重,并且病情有可能进一步恶化,随时会出现以下一种或多种危及患者生命的并发症=并发症",
+            "患者监护人或授权家属签名=患方签名",
+            "经治医师签名=告知医师签名"
+    );
+
+}

+ 64 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDeathCaseDiscussDocTrans.java

@@ -0,0 +1,64 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DeathCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunDeathCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+@Slf4j
+public class BeiLunDeathCaseDiscussDocTrans extends ModelDocTrans {
+
+    @Override
+    public DeathCaseDiscussDoc extract(MedrecVo medrecVo) {
+        DeathCaseDiscussDoc deathCaseDiscussDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunDeathCaseDiscussHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                deathCaseDiscussDoc = ModelDocGenerate.deathCaseDiscussDocGen(structureMap);
+                deathCaseDiscussDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return deathCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "讨论日期=讨论时间",
+            "参加人员姓名及专业技术职称=参加人员",
+            "讨论意见=病史简介",
+            "主持人小结意见=主持人小结",
+            "记录者签名=记录医生"
+    );
+
+}

+ 64 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDeathRecordDocTrans.java

@@ -0,0 +1,64 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunDeathRecordHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+@Slf4j
+public class BeiLunDeathRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public DeathRecordDoc extract(MedrecVo medrecVo) {
+        DeathRecordDoc deathRecordDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunDeathRecordHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                deathRecordDoc = ModelDocGenerate.deathRecordDocGen(structureMap);
+                deathRecordDoc.setText(CommonAnalysisUtil.html2String(content));
+                deathRecordDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return deathRecordDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "入院时基本情况=入院情况",
+            "诊治经过=诊疗经过",
+            "医生签名=记录医生"
+    );
+
+}

+ 93 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDifficultCaseDiscussDocTrans.java

@@ -0,0 +1,93 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunDifficultCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+@Slf4j
+public class BeiLunDifficultCaseDiscussDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DifficultCaseDiscussDoc> extract(MedrecVo medrecVo) {
+        List<DifficultCaseDiscussDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                DifficultCaseDiscussDoc difficultCaseDiscussDoc = getDifficultCaseDiscussDoc(contentMap);
+                if (difficultCaseDiscussDoc != null) {
+                    retList.add(difficultCaseDiscussDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunDifficultCaseDiscussHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (!sourceMap.containsKey("具体讨论意见") && sourceMap.containsKey("参加人员")) {
+                String participant = sourceMap.get("参加人员");
+                if (participant.contains("医师汇报病史")) {
+                    String parCrew = "";
+                    //参加人员
+                    if (participant.indexOf("医师汇报病史") > 2) {
+                        parCrew = participant.substring(0, participant.indexOf("医师汇报病史") - 2);
+                    }
+                    //具体讨论意见
+                    String SpeDiscussion = participant.substring(Math.max(0, participant.indexOf("医师汇报病史") - 2));
+                    sourceMap.put("参加人员", parCrew);
+                    sourceMap.put("具体讨论意见", SpeDiscussion);
+                }
+            }
+
+
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            DifficultCaseDiscussDoc difficultCaseDiscussDoc = ModelDocGenerate.difficultCaseDiscussDocGen(structureMap);
+            difficultCaseDiscussDoc.setPageData((Map) structureMap);
+            return difficultCaseDiscussDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "主 持 人=主持人",
+            "参加人员姓名及专业技术职称=参加人员的姓名及专业技术职务",
+            "报告病史=汇报病史",
+            "讨论意见内容记录=具体讨论意见",
+            "主持人小结意见=主持人小结",
+            "记录者签名=记录医生"
+    );
+
+}

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDoctorAdviceDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 医嘱信息文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunDoctorAdviceDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DoctorAdviceDoc> extract(MedrecVo medrecVo) {
+        List<DoctorAdviceDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getDoctorAdviceDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private DoctorAdviceDoc getDoctorAdviceDoc(Map<String, String> content) {
+        DoctorAdviceDoc doctorAdviceDoc = new DoctorAdviceDoc();
+        doctorAdviceDoc.setStructureMap(content);
+        doctorAdviceDoc.setPageData((Map) content);
+        return doctorAdviceDoc;
+    }
+
+}

+ 72 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunDutyShiftSystemDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DutyShiftSystemDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunDutyShiftSystemHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 值班交接制度文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:24
+ */
+@Slf4j
+public class BeiLunDutyShiftSystemDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DutyShiftSystemDoc> extract(MedrecVo medrecVo) {
+        List<DutyShiftSystemDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                DutyShiftSystemDoc dutyShiftSystemDoc = getDutyShiftSystemDoc(contentMap);
+                if (dutyShiftSystemDoc != null) {
+                    retList.add(dutyShiftSystemDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private DutyShiftSystemDoc getDutyShiftSystemDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunDutyShiftSystemHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            DutyShiftSystemDoc dutyShiftSystemDoc = ModelDocGenerate.dutyShiftSystemDocGen(structureMap);
+            dutyShiftSystemDoc.setPageData((Map) structureMap);
+            return dutyShiftSystemDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+
+    );
+
+}

+ 81 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstCourseRecordDocTrans.java

@@ -0,0 +1,81 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunFirstCourseRecordHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.lantone.qc.trans.comsis.ModelDocGenerate.structureMapJoin;
+
+/**
+ * @Description: 首次病程录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+@Slf4j
+public class BeiLunFirstCourseRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public FirstCourseRecordDoc extract(MedrecVo medrecVo) {
+        FirstCourseRecordDoc firstCourseRecordDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunFirstCourseRecordHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    sourceMap = removeSerialNumber(sourceMap);
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    structureMap.put("标题", recTitle);
+                }
+            }
+            if (StringUtil.isNotBlank(structureMap.get("医生签名"))) {
+                structureMap.put("医生签名", structureMap.get("医生签名").replaceAll("医生签名", ""));
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                firstCourseRecordDoc = ModelDocGenerate.firstCourseRecordDocGen(structureMap);
+                firstCourseRecordDoc.setText(CommonAnalysisUtil.html2String(content));
+                firstCourseRecordDoc.setPageData((Map) structureMap);
+                List<String> keys = Lists.newArrayList("需求评估", "预期目标", "诊疗计划", "治疗监测计划");
+                String treatPlanJoin = structureMapJoin(structureMap, keys);
+                firstCourseRecordDoc.getTreatPlanLabel().setAiText(treatPlanJoin);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return firstCourseRecordDoc;
+    }
+
+    private Map<String, String> removeSerialNumber(Map<String, String> sourceMap) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        sourceMap.forEach((key, value) -> structureMap.put(key.replaceAll("[一二三四五六()().123456]", ""), value));
+        return structureMap;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "诊疗方案=诊疗计划",
+            "医师签名=记录医生"
+    );
+
+}

+ 58 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstPageRecordDocTrans.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病案首页文档生成
+ * @author: 胡敬
+ * @time: 2020/3/16 17:47
+ */
+public class BeiLunFirstPageRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public FirstPageRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, String> content = (Map) medrecVo.getContent();
+        FirstPageRecordDoc firstPageRecordDoc = new FirstPageRecordDoc();
+        firstPageRecordDoc.setStructureMap(content);
+
+        Map<String, Object> structureExtMap = Maps.newHashMap();
+        structureExtMap.putAll(content);
+        structureExtMap.put(Content.diagnose_cts, FastJsonUtils.getJsonToBean(content.get(Content.diagnose_cts), Object.class));
+        //        structureExtMap.put(Content.outpatientEmergencyDiag, FastJsonUtils.getJsonToBean(content.get(Content.outpatientEmergencyDiag), Object.class));
+        structureExtMap.put(Content.operative_information, FastJsonUtils.getJsonToBean(content.get(Content.operative_information), Object.class));
+        structureExtMap.put(Content.dischargeDiag, FastJsonUtils.getJsonToBean(content.get(Content.dischargeDiag), Object.class));
+        //        structureExtMap.put(Content.pathologyDiagnose, FastJsonUtils.getJsonToBean(content.get(Content.pathologyDiagnose), Object.class));
+        firstPageRecordDoc.setStructureExtMap(structureExtMap);
+        //病案首页出院诊断页面信息只保留主要诊断和其他诊断
+        /*List<Map<String, String>> list = (List<Map<String, String>>) FastJsonUtils.getJsonToBean(content.get(Content.dischargeDiag), Object.class);
+        if (ListUtil.isNotEmpty(list)) {
+            Iterator<Map<String, String>> iterator = list.iterator();
+            Map<String, String> map = new HashMap<>();
+            while (iterator.hasNext()) {
+                map = new HashMap<>();
+                map = iterator.next();
+                if (!((map.get("诊断类别") != null && map.get("诊断类别").equals("主要诊断"))
+                        || (map.get("诊断类别") != null && map.get("诊断类别").equals("其他诊断")))) {
+                    iterator.remove();
+                }
+            }
+            medrecVo.getContent().put("出院诊断", list.toString());
+        }*/
+        medrecVo.getContent().put("mode_id", ModuleMappingUtil.getStandardModuleId("6"));
+        firstPageRecordDoc.setPageData(medrecVo.getContent());
+        return firstPageRecordDoc;
+    }
+
+}

+ 72 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLeaveHospitalDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.label.LeaveHospitalDoctorAdviceLabel;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunLeaveHospitalHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 出院小结文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+@Slf4j
+public class BeiLunLeaveHospitalDocTrans extends ModelDocTrans {
+
+    @Override
+    public LeaveHospitalDoc extract(MedrecVo medrecVo) {
+        LeaveHospitalDoc leaveHospitalDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunLeaveHospitalHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                leaveHospitalDoc = ModelDocGenerate.leaveHospitalDocGen(structureMap);
+                if (StringUtils.isNotEmpty(structureMap.get("出院医嘱"))) {
+                    LeaveHospitalDoctorAdviceLabel leaveHospitalDoctorAdviceLabel = new LeaveHospitalDoctorAdviceLabel();
+                    leaveHospitalDoctorAdviceLabel.setText(structureMap.get("出院医嘱"));
+                    leaveHospitalDoctorAdviceLabel.setAiText(structureMap.get("出院医嘱"));
+                    leaveHospitalDoc.setLeaveHospitalDoctorAdviceLabel(leaveHospitalDoctorAdviceLabel);
+                }
+                leaveHospitalDoc.setText(CommonAnalysisUtil.html2String(content));
+                leaveHospitalDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return leaveHospitalDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "入院时间=入院日期",
+            "医师签名=记录医生",
+            "日期=医师签名日期"
+    );
+
+}

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLisDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.LisDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 化验信息文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunLisDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<LisDoc> extract(MedrecVo medrecVo) {
+        List<LisDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getDoctorAdviceDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private LisDoc getDoctorAdviceDoc(Map<String, String> content) {
+        LisDoc doctorAdviceDoc = new LisDoc();
+        doctorAdviceDoc.setStructureMap(content);
+        doctorAdviceDoc.setPageData((Map) content);
+        return doctorAdviceDoc;
+    }
+
+}

+ 26 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunMedicalRecordInfoDocTrans.java

@@ -0,0 +1,26 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.lantone.qc.pub.model.doc.MedicalRecordInfoDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 住院病历信息
+ * @author: 胡敬
+ * @time: 2020/6/3 15:45
+ */
+public class BeiLunMedicalRecordInfoDocTrans extends ModelDocTrans {
+
+    @Override
+    public MedicalRecordInfoDoc extract(MedrecVo medrecVo) {
+        Map<String, String> content = (Map) ((List) medrecVo.getContent().get("content")).get(0);
+        MedicalRecordInfoDoc medicalRecordInfoDoc = new MedicalRecordInfoDoc();
+        medicalRecordInfoDoc.setStructureMap(content);
+        medicalRecordInfoDoc.setPageData(medrecVo.getContent());
+        return medicalRecordInfoDoc;
+    }
+
+}

+ 452 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOperationDocTrans.java

@@ -0,0 +1,452 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.pub.model.doc.operation.*;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.*;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.xszyy.util.XszyyHtmlAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.jsoup.Jsoup;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
+ */
+@Slf4j
+public class BeiLunOperationDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<OperationDoc> extract(MedrecVo medrecVo) {
+        List<OperationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+
+        Map<String, OperationDiscussionDoc> operationDiscussionDocMap = getOperationDiscussionDocMap((List) contentMap.get("术后首次病程及谈话记录"));
+        Map<String, OperationRecordDoc> operationRecordDocMap = getOperationRecordDocMap((List) contentMap.get("手术记录"));
+        Map<String, PreoperativeDiscussionDoc> preoperativeDiscussionDocMap = getPreoperativeDiscussionDocMap((List) contentMap.get("术前讨论、术前小结"));
+        Map<String, OperationInformedConsentDoc> operationInformedConsentDocMap = getOperationInformedConsentDocMap((List) contentMap.get("手术知情同意书"));
+        Map<String, OperationSafetyChecklistDoc> operationSafetyChecklistDocMap = getOperationSafetyChecklistDocMap((List) contentMap.get("手术安全核查表"));
+
+        Set<String> operationNameSet = Sets.newHashSet();
+        operationNameSet.addAll(operationDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationRecordDocMap.keySet());
+        operationNameSet.addAll(preoperativeDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationInformedConsentDocMap.keySet());
+
+        operationNameSet.forEach(operationName -> {
+            OperationDoc operationDoc = new OperationDoc();
+            operationDoc.setOperationName(operationName);
+            operationDoc.setOperationDiscussionDoc(operationDiscussionDocMap.get(operationName));
+            operationDoc.setOperationRecordDoc(operationRecordDocMap.get(operationName));
+            operationDoc.setPreoperativeDiscussionDoc(preoperativeDiscussionDocMap.get(operationName));
+            operationDoc.setOperationInformedConsentDoc(operationInformedConsentDocMap.get(operationName));
+            operationDoc.setOperationSafetyChecklistDoc(operationSafetyChecklistDocMap.get(operationName));
+            retList.add(operationDoc);
+        });
+
+        return retList;
+    }
+
+
+    /*******************************************术后首次病程及谈话记录***************************************************/
+    private Map<String, OperationDiscussionDoc> getOperationDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                OperationDiscussionDoc operationDiscussionDoc = getOperationDiscussionDoc(contentMap);
+                if (operationDiscussionDoc != null) {
+                    operationName = index + "";
+                    operationDiscussionDoc.setOperationName(operationName);
+                    retMap.put(operationName, operationDiscussionDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private OperationDiscussionDoc getOperationDiscussionDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        OperationDiscussionDoc operationDiscussionDoc = new OperationDiscussionDoc();
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            if (MapUtils.isNotEmpty(structureMap)) {
+                operationDiscussionDoc = ModelDocGenerate.operationDiscussionDocGen(structureMap);
+                operationDiscussionDoc.setText(content);
+                operationDiscussionDoc.setPageData((Map) structureMap);
+                return operationDiscussionDoc;
+            } else {
+                return null;
+            }
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunOperationHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                operationDiscussionDoc = ModelDocGenerate.operationDiscussionDocGen(structureMap);
+                String text = XszyyHtmlAnalysisUtil.blockDivToStr(Jsoup.parse(content).selectFirst("body").child(0), true);
+                operationDiscussionDoc.setText(text);
+                operationDiscussionDoc.setPageData((Map) structureMap);
+                return operationDiscussionDoc;
+            } else {
+                return null;
+            }
+        }
+    }
+
+    private List<String> operationDiscussion_keyContrasts = Lists.newArrayList(
+            "主刀医师=记录医生",
+            "医师签名=记录医生",
+            "病情记录=手术简要经过",
+            "病历标题=标题"
+    );
+
+
+    /**********************************************手术记录*************************************************************/
+    private Map<String, OperationRecordDoc> getOperationRecordDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                OperationRecordDoc operationRecordDoc = getOperationRecordDoc(contentMap);
+                if (operationRecordDoc != null) {
+                    operationName = index + "";
+                    operationRecordDoc.setOperationName(operationName);
+                    retMap.put(operationName, operationRecordDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private OperationRecordDoc getOperationRecordDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunOperationRecordHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            //含有手术情况知情书时间特殊处理
+            if (sourceMap.containsKey("时间") && sourceMap.get("时间").contains("宁波市北仑区人民医院")) {
+                sourceMap.put("时间", sourceMap.get("时间").substring(0, sourceMap.get("时间").indexOf("宁波市北仑区人民医院")));
+            }
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationRecord_keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+            List<String> titles = Lists.newArrayList("手术开始时间", "手术结束时间");
+            for (String title : titles) {
+                eliminateDate(structureMap, title);
+            }
+            if (structureMap.containsKey("麻醉人员")) {
+                structureMap.put("麻醉人员", structureMap.get("麻醉人员").replace("\n", "").replaceAll("麻醉人员签名", ""));
+            }
+            if (structureMap.containsKey("接生者")) {
+                structureMap.put("接生者", structureMap.get("接生者").replace("\n", "").replaceAll("接生者签名", ""));
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            OperationRecordDoc operationRecordDoc = ModelDocGenerate.operationRecordDocGen(structureMap);
+            operationRecordDoc.setPageData((Map) structureMap);
+            return operationRecordDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> operationRecord_keyContrasts = Lists.newArrayList(
+            "术后诊断=术中后诊断",
+            "麻醉人员=麻醉医师",
+            "手术经过=手术经过及处理",
+            "主刀医师签名=主刀医师",
+            "记录医师签名=记录医生",
+            "记录医师=记录医生",
+            "手术时间=手术日期"
+    );
+
+
+    /**********************************************术前讨论、术前小结****************************************************/
+    private Map<String, PreoperativeDiscussionDoc> getPreoperativeDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, PreoperativeDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
+                if (preoperativeDiscussionDoc != null) {
+                    operationName = index + "";
+                    preoperativeDiscussionDoc.setOperationName(operationName);
+                    retMap.put(operationName, preoperativeDiscussionDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private PreoperativeDiscussionDoc getPreoperativeDiscussionDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunPreoperativeHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        List<String> titles = Lists.newArrayList("讨论时间", "手术指征", "注意事项", "术前诊断", "医生签名", "风险及防范措施", "可替代方案", "术前准备", "参加人员");
+        if (structureMap.containsKey("简要病情")) {
+            String value = structureMap.get("简要病情").replaceAll("医师姓名", "").replaceAll("简要病情描述", "");
+            structureMap.put("简要病情", value);
+        }
+        if (structureMap.containsKey("可替代的方案")) {
+            String value = structureMap.get("可替代的方案").replaceAll("可替代方案", "");
+            structureMap.put("可替代的方案", value);
+        }
+        if (structureMap.containsKey("拟施麻醉方式")) {
+            String value = structureMap.get("拟施麻醉方式").replaceAll("麻醉方式", "");
+            structureMap.put("拟施麻醉方式", value);
+        }
+        if (structureMap.containsKey("其他术前相关情况")) {
+            String value = structureMap.get("其他术前相关情况").replaceAll("术者术前查看患者的相关情况", "");
+            structureMap.put("其他术前相关情况", value);
+        }
+        if (structureMap.containsKey("手术指征与禁忌")) {
+            String value = structureMap.get("手术指征与禁忌").replaceAll("手术指征与禁忌征", "");
+            structureMap.put("手术指征与禁忌", value);
+        }
+        for (String title : titles) {
+            eliminateDate(structureMap, title);
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = ModelDocGenerate.preoperativeDiscussionDocGen(structureMap);
+            preoperativeDiscussionDoc.setPageData((Map) structureMap);
+            return preoperativeDiscussionDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private void eliminateDate(Map<String, String> structureMap, String text) {
+        if (structureMap.containsKey(text)) {
+            String value = structureMap.get(text).replaceAll(text, "");
+            structureMap.put(text, value);
+        }
+    }
+
+    private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
+            "书写医师=记录医生",
+            "讨论日期=讨论时间",
+            "主 持 人=主持人",
+            "参加人员姓名及专业技术职称=参加人员",
+            "报告病史=简要病情",
+            "讨论意见内容记录=具体讨论意见",
+            "记录者签名=记录医生",
+            "记录者签名=记录医生"
+
+    );
+
+    /**********************************************手术知情同意书****************************************************/
+    private Map<String, OperationInformedConsentDoc> getOperationInformedConsentDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationInformedConsentDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationInformedConsentDoc operationInformedConsentDoc = getOperationInformedConsentDoc(contentMap);
+            operationInformedConsentDoc.setOperationName(operationName);
+            retMap.put(operationName, operationInformedConsentDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationInformedConsentDoc getOperationInformedConsentDoc(Map<String, Object> contentMap) {
+        String modeId = "16";
+        Map<String, String> structureMap = new HashMap<>();
+        String content = contentMap.get("xmlText").toString();
+        OperationInformedConsentDoc operationInformedConsentDoc = new OperationInformedConsentDoc();
+        String recTitle = contentMap.get("recTitle").toString();
+        String recTypeId = contentMap.get("recTypeId").toString();
+        BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunOperationInformedHtmlAnalysis();
+        Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+        if (MapUtils.isNotEmpty(sourceMap)) {
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+            structureMap.put("病历标题", contentMap.get("recTitle").toString());
+            structureMap.put("记录编号", contentMap.get("recId").toString());
+            structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            operationInformedConsentDoc = ModelDocGenerate.operationInformedDocGen(structureMap);
+            operationInformedConsentDoc.setText(CommonAnalysisUtil.html2String(content));
+            operationInformedConsentDoc.setPageData((Map) structureMap);
+        }
+
+        return operationInformedConsentDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "术种使用的植入性材料或高值耗材及风险=使用植入性材料"
+    );
+
+    private List<String> operationInformedConsent_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "手术医生",
+            "目前诊断",
+            "手术名称",
+            "手术指征",
+            "风险及并发症",
+            "保守治疗",
+            "其他手术",
+            "签名",
+            "签名时间"
+    );
+
+    private List<String> operationInformedConsent_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=病区",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "手术医生=",
+            "目前诊断=",
+            "手术名称=",
+            "手术指征=",
+            "风险及并发症=",
+            "++++保守治疗=保守治疗",
+            "++++其他手术=其他手术",
+            "签名++++=签名",
+            "签名时间=签名时间"
+    );
+
+    /**********************************************手术安全核查表****************************************************/
+    private Map<String, OperationSafetyChecklistDoc> getOperationSafetyChecklistDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationSafetyChecklistDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationSafetyChecklistDoc operationSafetyChecklistDoc = getOperationSafetyChecklistDoc(contentMap);
+            operationSafetyChecklistDoc.setOperationName(operationName);
+            retMap.put(operationName, operationSafetyChecklistDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(Map<String, Object> contentMap) {
+        String modeId = "21";
+//        String content = contentMap.get("xmlText").toString();
+//        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+//        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+//        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+//        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationSafetyChecklist_keyContrasts, modeId);
+//
+//        String text = CxXmlUtil.getXmlText(content);
+//        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationSafetyChecklist_sourceTitles, text);
+//        cutWordMap.putAll(structureMap);
+
+//        OperationSafetyChecklistDoc operationSafetyChecklistDoc = ModelDocGenerate.operationSafetyChecklistDocGen(cutWordMap);
+        OperationSafetyChecklistDoc operationSafetyChecklistDoc = new OperationSafetyChecklistDoc();
+//        operationSafetyChecklistDoc.setText(text);
+//        operationSafetyChecklistDoc.setPageData((Map) cutWordMap);
+
+        return operationSafetyChecklistDoc;
+    }
+
+    private List<String> operationSafetyChecklist_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "签名"
+    );
+
+    private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号++++住院号=病案号",
+            "签名++++=签名"
+    );
+}

+ 40 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOutDepDocTrans.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 门诊入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunOutDepDocTrans extends ModelDocTrans {
+
+    @Override
+    public BeHospitalizedDoc extract(MedrecVo medrecVo) {
+        BeHospitalizedDoc beHospitalizedDoc = new BeHospitalizedDoc();
+        Map<String, String> structureMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+
+        ChiefLabel chiefLabel = new ChiefLabel();
+        chiefLabel.setText(structureMap.get("主诉"));
+        beHospitalizedDoc.setChiefLabel(chiefLabel);
+
+        PresentLabel presentLabel = new PresentLabel();
+        presentLabel.setText(structureMap.get("现病史"));
+        beHospitalizedDoc.setPresentLabel(presentLabel);
+
+        PastLabel pastLabel = new PastLabel();
+        pastLabel.setText(structureMap.get("既往史"));
+        beHospitalizedDoc.setPastLabel(pastLabel);
+
+        return beHospitalizedDoc;
+    }
+
+}

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

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

+ 73 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunRescueDocTrans.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.RescueDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunRescueHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 抢救记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 17:34
+ */
+@Slf4j
+public class BeiLunRescueDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<RescueDoc> extract(MedrecVo medrecVo) {
+        List<RescueDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                RescueDoc rescueDoc = getRescueDoc(contentMap);
+                if (rescueDoc != null) {
+                    retList.add(rescueDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private RescueDoc getRescueDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunRescueHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            RescueDoc rescueDoc = ModelDocGenerate.rescueDocGen(structureMap);
+            rescueDoc.setPageData((Map) structureMap);
+            return rescueDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病情变化情况及抢救过程=抢救内容",
+            "书写医师=记录医生"
+    );
+
+}

+ 74 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunStagesSummaryDocTrans.java

@@ -0,0 +1,74 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunStagesSummaryHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 阶段小结文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+@Slf4j
+public class BeiLunStagesSummaryDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<StagesSummaryDoc> extract(MedrecVo medrecVo) {
+        List<StagesSummaryDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                StagesSummaryDoc stagesSummaryDoc = getStagesSummaryDoc(contentMap);
+                if (stagesSummaryDoc != null) {
+                    retList.add(stagesSummaryDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        return retList;
+    }
+
+    private StagesSummaryDoc getStagesSummaryDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunStagesSummaryHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            StagesSummaryDoc stagesSummaryDoc = ModelDocGenerate.stagesSummaryDocGen(structureMap);
+            stagesSummaryDoc.setPageData((Map) structureMap);
+            return stagesSummaryDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "主 诉=主诉",
+            "下一步诊疗计划=诊疗计划",
+            "书写医师=记录医生"
+    );
+
+}

+ 358 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunThreeLevelWardDocTrans.java

@@ -0,0 +1,358 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.GeneralDoctorWardDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunThreeLevelWardHtmlAnalysis;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+
+/**
+ * @Description: 查房记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+@Slf4j
+@Setter
+public class BeiLunThreeLevelWardDocTrans extends ModelDocTrans {
+
+    private List<OperationDoc> operationDocs;
+
+    @Override
+    public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
+        List<ThreeLevelWardDoc> retList = Lists.newArrayList();
+        ThreeLevelWardDoc threeLevelWardDoc = new ThreeLevelWardDoc();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            try {
+                classifyThreeLevelWardDoc(threeLevelWardDoc, contentMap);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        });
+        retList.add(threeLevelWardDoc);
+        return retList;
+    }
+
+    private void classifyThreeLevelWardDoc(ThreeLevelWardDoc threeLevelWardDoc, Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunThreeLevelWardHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        if (MapUtils.isEmpty(structureMap)) {
+            return;
+        }
+
+        if (structureMap.containsKey("病情记录")) {
+            structureMap.put("病情记录", structureMap.get("病情记录").replace(" ", ""));
+        }
+        //structureMap.put("查房日期", structureMap.get("记录时间"));
+        /*Map<String, String> cutWordMap = Maps.newHashMap();
+        String text = CxXmlUtil.getXmlText(content);
+        if (StringUtil.isNotBlank(text)) {
+            if (StringUtil.isBlank(structureMap.get("病情记录"))) {
+                structureMap.put("病情记录", text);
+            }
+            cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+            if (StringUtil.isBlank(structureMap.get("记录医师"))) {
+                Pattern p = Pattern.compile("^[^\\u4e00-\\u9fa5]+$");//分词结果如果不包含中文为日期,则不覆盖
+                if (StringUtil.isNotEmpty(cutWordMap.get("医师签名"))) {
+                    Matcher m = p.matcher(cutWordMap.get("医师签名"));
+                    if (!m.matches()) {
+                        structureMap.put("记录医师", cutWordMap.get("医师签名"));
+                    }
+                }
+                if (StringUtil.isNotEmpty(cutWordMap.get("记录医生"))) {
+                    Matcher m = p.matcher(cutWordMap.get("记录医生"));
+                    if (!m.matches()) {
+                        structureMap.put("记录医师", cutWordMap.get("记录医生"));
+                    }
+                }
+            }
+        }
+         */
+
+        //总的查房记录 汇总
+        ThreeLevelWardDoc allDoctorWradDoc = new ThreeLevelWardDoc();
+        allDoctorWradDoc.setStructureMap(structureMap);
+        allDoctorWradDoc.setPageData((Map) structureMap);
+        threeLevelWardDoc.addAllDoctorWradDoc(allDoctorWradDoc);
+
+        //主任医师查房
+        DirectorDoctorWardDoc directorDoctorWardDoc = findDirectorDoctorWardDoc(structureMap);
+        if (directorDoctorWardDoc != null) {
+            threeLevelWardDoc.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
+        }
+        //主治医师查房
+        AttendingDoctorWardDoc attendingDoctorWardDoc = findAttendingDoctorWardDoc(structureMap);
+        if (attendingDoctorWardDoc != null) {
+            threeLevelWardDoc.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
+        }
+        //普通医师查房
+        if (directorDoctorWardDoc == null && attendingDoctorWardDoc == null) {
+            GeneralDoctorWardDoc generalDoctorWardDoc = new GeneralDoctorWardDoc();
+            generalDoctorWardDoc.setStructureMap(structureMap);
+            generalDoctorWardDoc.setPageData((Map) structureMap);
+            threeLevelWardDoc.addGeneralDoctorWardDoc(generalDoctorWardDoc);
+        }
+
+    }
+
+    /**
+     * 主任医师查房
+     *
+     * @param structureMap
+     */
+    private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String content = structureMap.get("病情记录");
+        String writTitle = structureMap.get("文书标题");
+        String recordDateStr = structureMap.get("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        //标题有代字
+        DirectorDoctorWardDoc directorDoctorWardDoc = null;
+        if (StringUtil.isNotBlank(title)) {
+            if (title.contains("主刀") || title.contains("术后第")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) || findDirector(content)
+                    || title.contains("三级") || endocrinologyTitle(title)) {
+                directorDoctorWardDoc = new DirectorDoctorWardDoc();
+                directorDoctorWardDoc.setStructureMap(structureMap);
+                directorDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+
+        if (StringUtil.isNotBlank(writTitle)) {
+            if (writTitle.contains("主刀") || writTitle.contains("术后第")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                writTitle = writTitle.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (writTitle.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                writTitle = writTitle.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(writTitle)) && subTitle(writTitle).contains("主任")) || findDirector(content)
+                    || writTitle.contains("三级") || endocrinologyTitle(writTitle)) {
+                directorDoctorWardDoc = new DirectorDoctorWardDoc();
+                directorDoctorWardDoc.setStructureMap(structureMap);
+                directorDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return directorDoctorWardDoc;
+    }
+
+    /**
+     * 主治医师查房
+     *
+     * @param structureMap
+     */
+    private AttendingDoctorWardDoc findAttendingDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String writTitle = structureMap.get("文书标题");
+        String content = structureMap.get("病情记录");
+        String recordDateStr = structureMap.get("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        AttendingDoctorWardDoc attendingDoctorWardDoc = null;
+        //标题有代字
+        if (StringUtil.isNotBlank(title)) {
+            if (title.contains("主刀") || title.contains("术后第")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治"))
+                    || findAttend(content) || title.contains("三级") || endocrinologyTitle(title)) {
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+
+        //文书标题和模板标题不一致
+        if (StringUtil.isNotBlank(writTitle)) {
+            if (writTitle.contains("主刀") || writTitle.contains("术后第")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                writTitle = writTitle.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (writTitle.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                writTitle = writTitle.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(writTitle)) && subTitle(writTitle).contains("主治"))
+                    || findAttend(content) || writTitle.contains("三级") || endocrinologyTitle(writTitle)) {
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return attendingDoctorWardDoc;
+    }
+
+    /**
+     * 北仑内分泌科主任主治处理
+     *
+     * @param title
+     * @return
+     */
+    private boolean endocrinologyTitle(String title) {
+        String regex = ".*主任.*主任.*主治.*";
+        return title.matches(regex);
+    }
+
+    /**
+     * 共同照护讨论记录中找主任查房
+     *
+     * @param content
+     * @return
+     */
+    private boolean findDirector(String content) {
+//        String director = "";
+//        if (content.indexOf(",") != -1) {
+//            director = content.substring(0, content.indexOf(","));
+//        }
+        return content.contains("主任");
+    }
+
+    /**
+     * 共同照护讨论记录中找主治查房
+     *
+     * @param content
+     * @return
+     */
+    private boolean findAttend(String content) {
+//        String director = "";
+//        if (content.indexOf(",") != -1) {
+//            director = content.substring(0, content.indexOf(","));
+//        }
+        return content.contains("主治");
+    }
+
+    private String subTitle(String srcText) {
+        if (StringUtil.isNotBlank(srcText) && srcText.contains("代") && srcText.indexOf("代") != srcText.length() - 1) {
+            srcText = srcText.substring(srcText.lastIndexOf("代") + 1);
+        }
+        return srcText;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病历日期=查房日期",
+            "病历标题=查房标题",
+            "书写医师=记录医生"
+    );
+
+    /**
+     * 获取主刀医师/一助职称(取距离查房记录时间最近的一次手术记录)
+     *
+     * @param operationDocs
+     * @return
+     */
+    public static String getDoctorTitle(List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+        String title = "";
+        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
+        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String chiefSurgeon = structureMap.get(findTitle);
+            String operatorEndDateStr = structureMap.get("手术结束时间");
+            if (StringUtil.isBlank(chiefSurgeon)) {
+                chiefSurgeon = structureMap.get("手术者及助手名称");
+                if (StringUtil.isNotBlank(chiefSurgeon) && chiefSurgeon.contains("、")) {
+                    chiefSurgeon = chiefSurgeon.split("、")[0].replace("主刀:", "");
+                }
+            }
+            if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                continue;
+            }
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+            if (doctor != null) {
+                String professor = doctor.get("professor");
+                Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                if (operatorEndDate != null) {
+                    long timeDifference = timeDifference(operatorEndDate, recordDate);
+                    if (timeDifference == 0) {
+                        continue;
+                    }
+                    if (timeDiff == 0 || timeDiff > timeDifference) {
+                        /* 取距离此次主刀医师查房最近的一次手术时间 */
+                        timeDiff = timeDifference;
+                        title = professor;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+    public static long timeDifference(Date firstDate, Date secondDate) {
+        long timeDifference = 0L;
+        if (firstDate == null || secondDate == null) {
+            return timeDifference;
+        }
+        boolean flag = false;
+        if (firstDate.before(secondDate)) {
+            flag = true;
+        }
+        Calendar calendarS = Calendar.getInstance();
+        Calendar calendarE = Calendar.getInstance();
+        long timeS, timeE;
+        try {
+            calendarS.setTime(firstDate);
+            calendarE.setTime(secondDate);
+
+            timeS = calendarS.getTimeInMillis();
+            timeE = calendarE.getTimeInMillis();
+
+            if (flag) {
+                timeDifference = (timeE - timeS) / (1000 * 60);
+            } else {
+                timeDifference = (timeS - timeE) / (1000 * 60);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return timeDifference;
+    }
+
+}

+ 305 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunTransferRecordDocTrans.java

@@ -0,0 +1,305 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunTransferIntoHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunTransferOutHtmlAnalysis;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.*;
+
+/**
+ * @Description: 转科记录文档生成
+ * @author: rengb
+ * @time: 2020/3/20 16:10
+ */
+@Slf4j
+public class BeiLunTransferRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public TransferRecordDoc extract(MedrecVo medrecVo) {
+        TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return transferRecordDoc;
+        }
+        List<Map<String, Object>> into = (List) contentMap.get("转入记录");
+        List<Map<String, Object>> out = (List) contentMap.get("转出记录");
+        List<Map<String, Object>> all = new ArrayList<>();
+
+        Map<String, TransferIntoDoc> transferIntoDocMap = new HashMap<>();
+        Map<String, TransferOutDoc> transferOutDocMap = new HashMap<>();
+        if (into != null) {
+            all.addAll(into);
+            transferIntoDocMap = getTransferIntoDocMap(into);
+        }
+        if (out != null) {
+            all.addAll(out);
+            transferOutDocMap = getTransferOutDocMap(out);
+        }
+        Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
+
+        //转入
+        Map<Date, TransferIntoDoc> dateRecordIn = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
+            Map<String, String> structureMap = transferIntoDoc.getStructureMap();
+            String inDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(inDateStr)) {
+                inDateStr = structureMap.get("病历日期");
+            }
+            Date inDate = StringUtil.parseDateTime(inDateStr);
+            if (inDate == null) {
+                continue;
+            }
+            dateRecordIn.put(inDate, transferIntoDoc);
+        }
+        transferRecordDoc.setTransferIntoDocs(new ArrayList<>(dateRecordIn.values()));
+        //转出
+        Map<Date, TransferOutDoc> dateRecordOut = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
+            Map<String, String> structureMap = transferOutDoc.getStructureMap();
+            String outDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(outDateStr)) {
+                outDateStr = structureMap.get("病历日期");
+            }
+            Date outDate = StringUtil.parseDateTime(outDateStr);
+            if (outDate == null) {
+                continue;
+            }
+            dateRecordOut.put(outDate, transferOutDoc);
+        }
+        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                transferDateStr = structureMap.get("病历日期");
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
+
+        return transferRecordDoc;
+    }
+
+
+    /**************************************************转入*******************************************************/
+    private Map<String, TransferIntoDoc> getTransferIntoDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferIntoDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                TransferIntoDoc transferIntoDoc = getTransferIntoDoc(contentMap);
+                if (transferIntoDoc != null) {
+                    transferRecordName = index + "";
+                    transferIntoDoc.setTransferRecordName(transferRecordName);
+                    retMap.put(transferRecordName, transferIntoDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private TransferIntoDoc getTransferIntoDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = new HashMap<>();
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunTransferIntoHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        //存入转入时间
+        getTransDate(contentMap.get("transferInDate"), "转入时间", structureMap);
+        if (MapUtils.isNotEmpty(structureMap)) {
+            TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+            transferIntoDoc.setStructureMap(structureMap);
+            transferIntoDoc.setPageData((Map) structureMap);
+            return transferIntoDoc;
+        } else {
+            return null;
+        }
+    }
+
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                TransferRecordDoc transferRecordDoc = getTransferAllDoc(contentMap);
+                if (transferRecordDoc != null) {
+                    transferRecordName = index + "";
+                    transferRecordDoc.setTransferRecordName(transferRecordName);
+                    retMap.put(transferRecordName, transferRecordDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = new HashMap<>();
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunTransferOutHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        //存入转入时间
+        getTransDate(contentMap.get("transferInDate"), "转入时间", structureMap);
+        //存入转出时间
+        getTransDate(contentMap.get("transferOutDate"), "转出时间", structureMap);
+        if (MapUtils.isNotEmpty(structureMap)) {
+            TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+            transferAllDoc.setStructureMap(structureMap);
+            transferAllDoc.setPageData((Map) structureMap);
+            return transferAllDoc;
+        } else {
+            return null;
+        }
+    }
+
+
+    /**************************************************转出*******************************************************/
+    private Map<String, TransferOutDoc> getTransferOutDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferOutDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                TransferOutDoc transferOutDoc = getTransferOutDoc(contentMap);
+                if (transferOutDoc != null) {
+                    transferRecordName = index + "";
+                    transferOutDoc.setTransferRecordName(transferRecordName);
+                    retMap.put(transferRecordName, transferOutDoc);
+                    index++;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return retMap;
+    }
+
+    private TransferOutDoc getTransferOutDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = new HashMap<>();
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunTransferOutHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+        }
+        //存入转出时间
+        getTransDate(contentMap.get("transferOutDate"), "转出时间", structureMap);
+        if (MapUtils.isNotEmpty(structureMap)) {
+            TransferOutDoc transferOutDoc = new TransferOutDoc();
+            transferOutDoc.setStructureMap(structureMap);
+            transferOutDoc.setPageData((Map) structureMap);
+            return transferOutDoc;
+        } else {
+            return null;
+        }
+    }
+
+    //存入转入转出时间
+    private void getTransDate(Object transferDates, String dateStr, Map<String, String> structureMap) {
+        if (transferDates != null) {
+            structureMap.put(dateStr, transferDates.toString());
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "主 诉=主诉",
+            "目前情况=目前病情",
+            "转入诊疗计划=诊疗计划",
+            "书写医师=记录医生"
+    );
+
+}

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunVTEGradeDocTrans.java

@@ -0,0 +1,55 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.VTEGradeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunBeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunVTEGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunVTEGradeDocTrans
+ * @Description: VTE评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunVTEGradeDocTrans extends ModelDocTrans {
+    @Override
+    public VTEGradeDoc extract(MedrecVo medrecVo) {
+        VTEGradeDoc vteGradeDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunVTEGradeHtmlAnalysis vteGradeHtmlAnalysis = new BeiLunVTEGradeHtmlAnalysis();
+                Map<String, String> sourceMap = vteGradeHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap.putAll(sourceMap);
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                              ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                vteGradeDoc = ModelDocGenerate.vteGradeDocGen(structureMap);
+                vteGradeDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return vteGradeDoc;
+    }
+}

+ 90 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeilunInformedConsentDocTrans.java

@@ -0,0 +1,90 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.InformedConsentDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunInformedHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 知情同意书
+ * @author: cy
+ * @time: 2021/4/18 17:48
+ */
+@Slf4j
+public class BeilunInformedConsentDocTrans extends ModelDocTrans {
+    @Override
+    public List<InformedConsentDoc> extract(MedrecVo medrecVo) {
+        List<InformedConsentDoc> retList = Lists.newArrayList();
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+        for (Map.Entry<String, List<String>> entry : contentMap.entrySet()) {
+            InformedConsentDoc informedConsentDoc = getInformedConsentDoc((List) entry.getValue());
+            retList.add(informedConsentDoc);
+        }
+        return retList;
+
+    }
+
+    private InformedConsentDoc getInformedConsentDoc(List<Map<String, Object>> contentMaps) {
+        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return informedConsentDoc;
+        }
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            try {
+                String content = contentMap.get("xmlText").toString();
+                Map<String, String> structureMap = null;
+                if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                    structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+                } else {
+                    String recTitle = contentMap.get("recTitle").toString();
+                    String recTypeId = contentMap.get("recTypeId").toString();
+                    BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunInformedHtmlAnalysis();
+                    Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                    if (MapUtils.isNotEmpty(sourceMap)) {
+                        structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                        structureMap.put("记录编号", contentMap.get("recId").toString());
+                        structureMap.put("标题", recTitle);
+                        structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    }
+                }
+                if (MapUtils.isNotEmpty(structureMap)) {
+                    informedConsentDoc = ModelDocGenerate.informedConsentDocGen(structureMap);
+                    informedConsentDoc.setText(CommonAnalysisUtil.html2String(content));
+                    informedConsentDoc.setPageData((Map) structureMap);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        return informedConsentDoc;
+    }
+
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "患者签名=患方签名",
+            "患方手写意见=患方签名",
+            "患方手写意见患方签名=患方签名",
+            "患方或受托代理人签名=患方或受托代理人签名",
+            "代理人签名=被授权人签名",
+            "被授权人签名=被授权人签名"
+    );
+}

+ 76 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeilunInvasiveOperationDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.InvasiveOperationDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.xszyy.util.BeiLunInvasiveOperationHtmlAnalysis;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 有创操作
+ * @author: cy
+ * @time: 2021/8/27 16:12
+ */
+@Slf4j
+public class BeilunInvasiveOperationDocTrans extends ModelDocTrans {
+    @Override
+    public List<InvasiveOperationDoc> extract(MedrecVo medrecVo) {
+        List<InvasiveOperationDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getInvasiveOperationDoc(contentMap));
+        });
+        return retList;
+
+    }
+
+    private InvasiveOperationDoc getInvasiveOperationDoc(Map<String, Object> contentMap) {
+        InvasiveOperationDoc invasiveOperationDoc = new InvasiveOperationDoc();
+        if (MapUtils.isEmpty(contentMap)) {
+            return invasiveOperationDoc;
+        }
+        if(contentMap.get("htmlText") == null && contentMap.get("xmlText") != null){
+            contentMap.put("xmlText",contentMap.get("xmlText"));
+        }
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                return invasiveOperationDoc;
+            }
+            try {
+                String content = contentMap.get("xmlText").toString();
+                Map<String, String> structureMap = null;
+                if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                    structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+                } else {
+                    String recTitle = contentMap.get("recTitle").toString();
+                    String recTypeId = contentMap.get("recTypeId").toString();
+                    BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunInvasiveOperationHtmlAnalysis();
+                    Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                    if (MapUtils.isNotEmpty(sourceMap)) {
+                        structureMap.put("记录编号", contentMap.get("recId").toString());
+                        structureMap.put("标题", recTitle);
+                        structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    }
+                }
+                if (MapUtils.isNotEmpty(structureMap)) {
+                    invasiveOperationDoc.setStructureMap(structureMap);
+                    invasiveOperationDoc.setPageData((Map) structureMap);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+
+        return invasiveOperationDoc;
+    }
+
+
+
+}

+ 331 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/XszyyDocTrans.java

@@ -0,0 +1,331 @@
+package com.lantone.qc.trans.xszyy;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.model.vo.QueryVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.DocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BeiLunDocTrans
+ * @Description :
+ * @Author : 楼辉荣
+ * @Date: 2020-03-03 19:47
+ */
+@Slf4j
+public class XszyyDocTrans extends DocTrans {
+
+    @Override
+    protected InputInfo extract(QueryVo queryVo) {
+        InputInfo inputInfo = new InputInfo();
+        for (MedrecVo i : queryVo.getMedrec()) {
+            if (i.getTitle() != null) {
+                if (i.getTitle().equals("会诊")) {
+                    BeiLunConsultationDocTrans consultationDocTrans = new BeiLunConsultationDocTrans();
+                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("手术")) {
+                    BeiLunOperationDocTrans operationDocTrans = new BeiLunOperationDocTrans();
+                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("转科")) {
+                    BeiLunTransferRecordDocTrans transferRecordDocTrans = new BeiLunTransferRecordDocTrans();
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("入院记录")) {
+                    BeiLunBeHospitalizedDocTrans beHospitalizedDocTrans = new BeiLunBeHospitalizedDocTrans();
+                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血/血制品病程记录")) {
+                    BeiLunClinicalBloodDocTrans clinicalBloodDocTrans = new BeiLunClinicalBloodDocTrans();
+                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血后效果评价")) {
+                    BeiLunClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new BeiLunClinicBloodEffectDocTrans();
+                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值记录")) {
+                    BeiLunCrisisValueReportDocTrans crisisValueReportDocTrans = new BeiLunCrisisValueReportDocTrans();
+                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值")) {
+                    BeiLunCrisisInfoDocTrans crisisInfoDocTrans = new BeiLunCrisisInfoDocTrans();
+                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("病危通知书")) {
+                    BeiLunCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new BeiLunCriticallyIllNoticeDocTrans();
+                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡病例讨论记录")) {
+                    BeiLunDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new BeiLunDeathCaseDiscussDocTrans();
+                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡记录")) {
+                    BeiLunDeathRecordDocTrans deathRecordDocTrans = new BeiLunDeathRecordDocTrans();
+                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("疑难病例讨论记录")) {
+                    BeiLunDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new BeiLunDifficultCaseDiscussDocTrans();
+                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("医嘱信息")) {
+                    BeiLunDoctorAdviceDocTrans doctorAdviceDocTrans = new BeiLunDoctorAdviceDocTrans();
+                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("值班交接制度")) {
+                    BeiLunDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new BeiLunDutyShiftSystemDocTrans();
+                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("首次病程录")) {
+                    BeiLunFirstCourseRecordDocTrans firstCourseRecordDocTrans = new BeiLunFirstCourseRecordDocTrans();
+                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("病案首页")) {
+                    BeiLunFirstPageRecordDocTrans firstPageRecordDocTrans = new BeiLunFirstPageRecordDocTrans();
+                    inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("出院小结")) {
+                    BeiLunLeaveHospitalDocTrans leaveHospitalDocTrans = new BeiLunLeaveHospitalDocTrans();
+                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("抢救记录")) {
+                    BeiLunRescueDocTrans rescueDocTrans = new BeiLunRescueDocTrans();
+                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("阶段小结")) {
+                    BeiLunStagesSummaryDocTrans stagesSummaryDocTrans = new BeiLunStagesSummaryDocTrans();
+                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("查房记录")) {
+                    BeiLunThreeLevelWardDocTrans threeLevelWardDocTrans = new BeiLunThreeLevelWardDocTrans();
+                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("住院病历信息")) {
+                    BeiLunMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new BeiLunMedicalRecordInfoDocTrans();
+                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("化验")) {
+                    BeiLunLisDocTrans lisDocTrans = new BeiLunLisDocTrans();
+                    inputInfo.setLisDocs(lisDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("辅检")) {
+                    BeiLunPacsDocTrans pacsDocTrans = new BeiLunPacsDocTrans();
+                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("门诊")) {
+                    BeiLunOutDepDocTrans outDepDocTrans = new BeiLunOutDepDocTrans();
+                    inputInfo.setBeHospitalizedDoc(outDepDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("知情同意书")) {
+                    BeilunInformedConsentDocTrans informedConsentDocTrans = new BeilunInformedConsentDocTrans();
+                    inputInfo.setInformedConsentDoc(informedConsentDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("有创操作")) {
+                    BeilunInvasiveOperationDocTrans invasiveOperationDocTrans = new BeilunInvasiveOperationDocTrans();
+                    inputInfo.setInvasiveOperationDocs(invasiveOperationDocTrans.extract(i));
+                }
+                /*******************************VTE评分 trans解析*****************************************/
+                if (i.getTitle().equals("VTE评分")) {
+                    BeiLunVTEGradeDocTrans vteGradeDocTrans = new BeiLunVTEGradeDocTrans();
+                    inputInfo.setVteGradeDoc(vteGradeDocTrans.extract(i));
+                }
+                /*******************************ADL评分 trans解析*****************************************/
+                if (i.getTitle().equals("ADL评分")) {
+                    BeiLunADLGradeDocTrans adlGradeDocTrans = new BeiLunADLGradeDocTrans();
+                    inputInfo.setAdlGradeDoc(adlGradeDocTrans.extract(i));
+                }
+                /*******************************手麻记录 trans解析*****************************************/
+                if (i.getTitle().equals("手麻记录")) {
+                    AnesthesiaRecordDocTrans anesthesiaRecordDocTrans= new AnesthesiaRecordDocTrans();
+                    inputInfo.setAnesthesiaRecordDocs(anesthesiaRecordDocTrans.extract(i));
+                }
+                /*******************************VTE评分 trans解析*****************************************/
+                if (i.getTitle().equals("VTE评分")) {
+                    BeiLunVTEGradeDocTrans vteGradeDocTrans = new BeiLunVTEGradeDocTrans();
+                    inputInfo.setVteGradeDoc(vteGradeDocTrans.extract(i));
+                }
+                /*******************************ADL评分 trans解析*****************************************/
+                if (i.getTitle().equals("ADL评分")) {
+                    BeiLunADLGradeDocTrans adlGradeDocTrans = new BeiLunADLGradeDocTrans();
+                    inputInfo.setAdlGradeDoc(adlGradeDocTrans.extract(i));
+                }
+                /*******************************手麻记录 trans解析*****************************************/
+                if (i.getTitle().equals("手麻记录")) {
+                    AnesthesiaRecordDocTrans anesthesiaRecordDocTrans= new AnesthesiaRecordDocTrans();
+                    inputInfo.setAnesthesiaRecordDocs(anesthesiaRecordDocTrans.extract(i));
+                }
+            }
+        }
+        pageDataHandle(inputInfo);
+        return inputInfo;
+    }
+
+    private void pageDataHandle(InputInfo inputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() != null) {
+            inputInfo.getPageData().put("入院记录", Lists.newArrayList(inputInfo.getBeHospitalizedDoc().getPageData()));
+        }
+        if (inputInfo.getDeathCaseDiscussDoc() != null) {
+            inputInfo.getPageData().put("死亡病例讨论记录", Lists.newArrayList(inputInfo.getDeathCaseDiscussDoc().getPageData()));
+        }
+        if (inputInfo.getDeathRecordDoc() != null) {
+            inputInfo.getPageData().put("死亡记录", Lists.newArrayList(inputInfo.getDeathRecordDoc().getPageData()));
+        }
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            inputInfo.getPageData().put("首次病程录", Lists.newArrayList(inputInfo.getFirstCourseRecordDoc().getPageData()));
+        }
+        if (inputInfo.getLeaveHospitalDoc() != null) {
+            inputInfo.getPageData().put("出院小结", Lists.newArrayList(inputInfo.getLeaveHospitalDoc().getPageData()));
+        }
+        if (inputInfo.getFirstPageRecordDoc() != null) {
+            inputInfo.getPageData().put("病案首页", Lists.newArrayList(inputInfo.getFirstPageRecordDoc().getPageData()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
+            inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+//            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).collect(Collectors.toList()));
+        }
+//        if (inputInfo.getInformedConsentDoc() != null) {
+//            inputInfo.getPageData().put("知情同意书", Lists.newArrayList(inputInfo.getInformedConsentDoc().getPageData()));
+//        }
+        if (ListUtil.isNotEmpty(inputInfo.getInformedConsentDoc())) {
+            inputInfo.getPageData().put("知情同意书", inputInfo.getInformedConsentDoc().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
+            inputInfo.getPageData().put(
+                    "输血后效果评价",
+                    inputInfo.getClinicBloodEffectDocs()
+                            .stream()
+                            .map(i -> i.getPageData())
+                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy-MM-dd HH:mm"))
+                            .collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
+            inputInfo.getPageData().put("危急值记录", inputInfo.getCrisisValueReportDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCriticallyIllNoticeDocs())) {
+            inputInfo.getPageData().put("病危通知书", inputInfo.getCriticallyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDifficultCaseDiscussDocs())) {
+            inputInfo.getPageData().put("疑难病例讨论记录", inputInfo.getDifficultCaseDiscussDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDutyShiftSystemDocs())) {
+            inputInfo.getPageData().put("值班交接制度", inputInfo.getDutyShiftSystemDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getRescueDocs())) {
+            inputInfo.getPageData().put("抢救记录", inputInfo.getRescueDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getStagesSummaryDocs())) {
+            inputInfo.getPageData().put("阶段小结", inputInfo.getStagesSummaryDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getThreeLevelWardDocs())) {
+            inputInfo.getPageData().put("查房记录", inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
+            List<Map<String, Object>> crPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(crPd)) {
+                inputInfo.getPageData().put("会诊记录", crPd);
+            }
+
+            List<Map<String, Object>> caPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(caPd)) {
+                inputInfo.getPageData().put("会诊申请单", caPd);
+            }
+
+            List<Map<String, Object>> ctPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(ctPd)) {
+                inputInfo.getPageData().put("会诊结果单", ctPd);
+            }
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getOperationDocs())) {
+            List<Map<String, Object>> odPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationDiscussionDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(odPageDataList)) {
+                inputInfo.getPageData().put("术后首次病程及谈话记录", odPageDataList);
+            }
+
+            List<Map<String, Object>> orPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationRecordDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationRecordDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(orPageDataList)) {
+                inputInfo.getPageData().put("手术记录", orPageDataList);
+            }
+
+            List<Map<String, Object>> InformedDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationInformedConsentDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationInformedConsentDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(InformedDataList)) {
+                inputInfo.getPageData().put("手术知情同意书", InformedDataList);
+            }
+
+            List<Map<String, Object>> pdPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getPreoperativeDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getPreoperativeDiscussionDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(pdPageDataList)) {
+                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
+            }
+        }
+        if (inputInfo.getTransferRecordDocs() != null) {
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferIntoDocs())) {
+                inputInfo.getPageData().put(
+                        "转入记录",
+                        inputInfo.getTransferRecordDocs().getTransferIntoDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferOutDocs())) {
+                inputInfo.getPageData().put(
+                        "转出记录",
+                        inputInfo.getTransferRecordDocs().getTransferOutDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getInvasiveOperationDocs())) {
+            inputInfo.getPageData().put(
+                    "有创操作",
+                    inputInfo.getInvasiveOperationDocs()
+                            .stream()
+                            .filter(i -> i != null)
+                            .map(i -> i.getPageData())
+                            .collect(Collectors.toList())
+            );
+        }
+    }
+}

+ 42 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunADLGradeHtmlAnalysis.java

@@ -0,0 +1,42 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.Content;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunADLGradeHtmlAnalysis
+ * @Description: ADL评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunADLGradeHtmlAnalysis implements BeiLunHtmlAnalysis{
+    private String modeId = "0";//模块id待定
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+
+            Document doc = Jsoup.parse(html);
+            //评估日期
+            Elements spanES = doc.getElementById("table2").nextElementSiblings().get(1).getElementsByTag("span");
+            String time = spanES.text().split(Content.adl_grade_time)[1]
+                    .replaceAll(":","").trim();
+            map.put(Content.adl_grade_time,time);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 160 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunBeHospitalizedHtmlAnalysis.java

@@ -0,0 +1,160 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/15 16:28
+ */
+@Slf4j
+public class BeiLunBeHospitalizedHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "1";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+
+            if (recTitle.contains("24")) {
+                analysis24h(doc, map);
+            } else if (recTitle.contains("日间病历")) {
+                analysisDay(doc, map);
+            } else {
+                analysisGeneral(doc, recTitle, map);
+            }
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    //一般模板
+    private void analysisGeneral(Document doc, String recTitle, Map<String, String> map) {
+        List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号码","入 院 记 录","住 院 大 病 历",
+                "姓 名", "职 业", "性 别", "入院日期","年 龄", "记录日期", "婚 姻","病史陈述者", "出生地","可靠程度",
+                "民 族","身份证号码","发病节气","病案号","单位或住址","主 诉","现病史","既往史","个人史","婚育史","家族史",
+                "专项 评估","专项评估",
+                "体 格 检 查","体 格 检 查 表 ( 一 )","补充及专科检查","辅 助 检 查", "入 院 诊 断","初步诊断",
+                "书写医生","医师签名","书写医师","修正诊断"
+        );
+        String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+        if (StringUtil.isNotBlank(htmlContent)) {
+            //有冒号版本
+//            XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
+            //无冒号版本
+            XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+        }
+        //书写医生中包含书写时间
+        if(map.containsKey("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医生"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医生")));
+            map.put("书写医生",map.get("书写医生").substring(0,map.get("书写医生").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("医师签名")&&XszyyCommonAnalysisUtil.extractDate(map.get("医师签名"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("医师签名")));
+            map.put("书写医生",map.get("医师签名").substring(0,map.get("医师签名").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("书写医师")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医师"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医师")));
+            map.put("书写医生",map.get("书写医师").substring(0,map.get("书写医师").indexOf(map.get("书写时间"))));
+        }
+        //修正诊断中包含修正医生和修正时间
+        if(map.containsKey("修正诊断")&&map.get("修正诊断").contains("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断"))!=null){
+            map.put("修正时间",XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断")));
+            map.put("修正医生",map.get("修正诊断").substring(map.get("修正诊断").indexOf("书写医生")+"书写医生".length(),map.get("修正诊断").indexOf(map.get("修正时间"))));
+            map.put("修正诊断",map.get("修正诊断").substring(0,map.get("修正诊断").indexOf("书写医生")));
+        }
+    }
+
+    //24小时出入院记录、24小时出入院记录(全院)、24小时入出院记录(全院通用)、24小时内入院死亡记录(全院通用)
+    private void analysis24h(Document doc, Map<String, String> map) {
+        List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号码","入 院 记 录","住 院 大 病 历",
+                "姓 名", "职 业", "性 别", "入院日期","年 龄", "记录日期", "婚 姻","病史陈述者", "出生地","可靠程度",
+                "民 族","身份证号码","发病节气","病案号","单位或住址","主 诉","现病史","既往史","个人史","婚育史","家族史",
+                "专项 评估","专项评估",
+                "体 格 检 查","体 格 检 查 表 ( 一 )","补充及专科检查","辅 助 检 查", "入 院 诊 断","初步诊断",
+                "书写医生","医师签名","书写医师","修正诊断"
+        );
+        String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+        if (StringUtil.isNotBlank(htmlContent)) {
+            //有冒号版本
+//            XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
+            //无冒号版本
+            XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+        }
+        //书写医生中包含书写时间
+        if(map.containsKey("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医生"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医生")));
+            map.put("书写医生",map.get("书写医生").substring(0,map.get("书写医生").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("医师签名")&&XszyyCommonAnalysisUtil.extractDate(map.get("医师签名"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("医师签名")));
+            map.put("书写医生",map.get("医师签名").substring(0,map.get("医师签名").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("书写医师")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医师"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医师")));
+            map.put("书写医生",map.get("书写医师").substring(0,map.get("书写医师").indexOf(map.get("书写时间"))));
+        }
+        //修正诊断中包含修正医生和修正时间
+        if(map.containsKey("修正诊断")&&map.get("修正诊断").contains("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断"))!=null){
+            map.put("修正时间",XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断")));
+            map.put("修正医生",map.get("修正诊断").substring(map.get("修正诊断").indexOf("书写医生")+"书写医生".length(),map.get("修正诊断").indexOf(map.get("修正时间"))));
+            map.put("修正诊断",map.get("修正诊断").substring(0,map.get("修正诊断").indexOf("书写医生")));
+        }
+
+    }
+
+    //原-日间病历入出院记录、日间病历-性早熟
+    private void analysisDay(Document doc, Map<String, String> map) {
+        List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号码","入 院 记 录","住 院 大 病 历",
+                "姓 名", "职 业", "性 别", "入院日期","年 龄", "记录日期", "婚 姻","病史陈述者", "出生地","可靠程度",
+                "民 族","身份证号码","发病节气","病案号","单位或住址","主 诉","现病史","既往史","个人史","婚育史","家族史",
+                "专项 评估","专项评估",
+                "体 格 检 查","体 格 检 查 表 ( 一 )","补充及专科检查","辅 助 检 查", "入 院 诊 断","初步诊断",
+                "书写医生","医师签名","书写医师","修正诊断"
+        );
+        String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+        if (StringUtil.isNotBlank(htmlContent)) {
+            //有冒号版本
+//            XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
+            //无冒号版本
+            XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+        }
+        //书写医生中包含书写时间
+        if(map.containsKey("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医生"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医生")));
+            map.put("书写医生",map.get("书写医生").substring(0,map.get("书写医生").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("医师签名")&&XszyyCommonAnalysisUtil.extractDate(map.get("医师签名"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("医师签名")));
+            map.put("书写医生",map.get("医师签名").substring(0,map.get("医师签名").indexOf(map.get("书写时间"))));
+        }
+        if(map.containsKey("书写医师")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医师"))!=null){
+            map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医师")));
+            map.put("书写医生",map.get("书写医师").substring(0,map.get("书写医师").indexOf(map.get("书写时间"))));
+        }
+        //修正诊断中包含修正医生和修正时间
+        if(map.containsKey("修正诊断")&&map.get("修正诊断").contains("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断"))!=null){
+            map.put("修正时间",XszyyCommonAnalysisUtil.extractDate(map.get("修正诊断")));
+            map.put("修正医生",map.get("修正诊断").substring(map.get("修正诊断").indexOf("书写医生")+"书写医生".length(),map.get("修正诊断").indexOf(map.get("修正时间"))));
+            map.put("修正诊断",map.get("修正诊断").substring(0,map.get("修正诊断").indexOf("书写医生")));
+        }
+    }
+
+
+}

+ 71 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunClinicBloodEffectHtmlAnalysis.java

@@ -0,0 +1,71 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 19:41
+ */
+@Slf4j
+public class BeiLunClinicBloodEffectHtmlAnalysis implements BeiLunHtmlAnalysis {
+    List<String> titles = Lists.newArrayList("输血前症状", "输血前实验室指标", "输血目的", "输注成分", "输血时间",
+            "开始时间", "结束时间", "输血过程");
+
+    private String modeId = "32";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
+            analysisGeneral(recTitle,bigDivElement, map);
+            if (map.containsKey("病情记录")) {
+                String content = map.get("病情记录");
+                CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
+            }
+        /*titles.remove(5);
+        titles.forEach(i -> {
+                    if (map.get(i).length() > 2) {
+                        map.put(i, map.get(i).substring(0, map.get(i).length() - 2));
+                    }
+                }
+        );
+
+         */
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+        if (bigDivElement.childNodeSize() == 1) {
+            bigDivElement = bigDivElement.child(0);
+        }
+        if (bigDivElement.selectFirst("hr") != null) {
+            bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+        }
+        String text = XszyyHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.extractWardInfo(recTitle,text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

+ 56 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunClinicalBloodHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 17:56
+ */
+@Slf4j
+public class BeiLunClinicalBloodHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+
+    private String modeId = "10";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+            if (StringUtil.isNotBlank(htmlContent)) {
+                XszyyCommonAnalysisUtil.xszyyCommonlyExtractWardInfo(recTitle, htmlContent, map);
+                //病情记录存在副主任医师和书写医师字段
+                if(map.containsKey("病情记录")){
+                    String bqtext = map.get("病情记录");
+
+                    //无冒号版本
+                    List<String> titles = Lists.newArrayList("书写医师"
+                    );
+                    XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,bqtext,map);
+                    map.put("病情记录",bqtext.substring(0,bqtext.lastIndexOf("书写医师")));
+                }
+            }
+
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 120 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunConsultationHtmlAnalysis.java

@@ -0,0 +1,120 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/12 13:53
+ */
+@Slf4j
+public class BeiLunConsultationHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "31";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+
+        try {
+            List<String> titles = Lists.newArrayList("姓名", "性别", "出生日期", "科别", "病区", "床号", "住院号",
+                    "会诊类型", "被邀医院", "被邀科室", "被邀医师", "申请时间", "患者病情及诊疗经过、申请会诊的理由及目的", "申请会诊科别",
+                    "被邀会诊科别", "申请会诊医师", "会诊意见", "会诊时间", "科主任", "会诊到达时间", "查体", "会诊建议",
+                    "会诊诊断", "由受邀医生填写,本次会诊是否必要","会诊科室", "会诊医师", "外院会诊医师所在医疗机构名称", "会诊医师所在医疗机构名称");
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            String htmlContent = null;
+            Document doc = Jsoup.parse(html);
+            if ("外院专家会诊申请单".equals(recTitle)) {
+                htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "");
+                    CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                }
+            } else if ("协定方会诊".equals(recTitle)) {
+                htmlContent = XszyyHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "");
+                    CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                }
+                if (StringUtil.isNotBlank(structureMap.get("会诊时间"))) {
+                    String[] strArr = structureMap.get("会诊时间").split(" ");
+                    structureMap.put("会诊意见", strArr[strArr.length - 1]);
+                    structureMap.put("会诊时间", strArr[0]);
+                }
+                CommonAnalysisUtil.extractDateByTitle(structureMap, "申请时间");
+            } else if ("MDT会诊申请表".equals(recTitle) || "新-MDT会诊三合一".equals(recTitle)) {
+                titles = Lists.newArrayList("姓名", "性别", "出生日期", "联系电话",
+                        "申请科室", "入院/首诊时间", "住院号", "病情概述(含主诉、病史、诊断、诊治过程等)", "拟申请MDT时间、地点",
+                        "拟请MDT参加科室", "MDT目的", "申请人签名", "申请递交时间", "科主任签字", "专家诊治建议", "专家科室", "签名",
+                        "填写时间", "主持科室小结(MDT的最终诊治决议)", "科主任(主持人)签名", "记录人(主管医师)签字", "日期");
+                htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("住院/门诊号", "").replace("第1页", "");
+                    StringBuffer sbf = new StringBuffer();
+                    List<String> distinctText = Lists.newArrayList(htmlContent.split(" ")).stream().distinct().collect(Collectors.toList());
+                    for (String text : distinctText) {
+                        sbf.append(text).append(" ");
+                    }
+                    CommonAnalysisUtil.html2StructureMapNoColon(titles, sbf.toString(), structureMap);
+                }
+                if (StringUtil.isNotBlank(structureMap.get("主持科室小结(MDT的最终诊治决议)"))) {
+                    String[] valueArray = structureMap.get("主持科室小结(MDT的最终诊治决议)").split(" ");
+                    structureMap.put("主持科室小结(MDT的最终诊治决议)", valueArray[1]);
+                    String v = valueArray[2];
+                    String[] vArr = v.split(":");
+                    if (vArr.length > 1) {
+                        structureMap.put(vArr[0], vArr[1]);
+                    }
+                }
+            } else if ("(外地专家)会诊邀请函".equals(recTitle)) {
+                titles = Lists.newArrayList("姓名", "出生年月", "病区", "床位", "住院号", "病情摘要", "会诊日期", "被邀医师", "专业",
+                        "职称", "单位", "会诊费用", "会诊科室", "医师签名", "医生签名", "科主任 签名", "患方意见", "签字", "外来专家 意见", "签字",
+                        "邀请医院(钉钉审批后盖章)");
+                htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "").replace("年   月   日   时   分", "");
+                    CommonAnalysisUtil.html2StructureMapNoColon(titles, htmlContent, structureMap);
+                }
+                if (structureMap.containsKey("外来专家意见")) {
+                    structureMap.put("外来专家意见", structureMap.get("外来专家意见").replaceAll("签字:", ""));
+                }
+                if (structureMap.containsKey("被邀医师")) {
+                    structureMap.put("会诊医师", structureMap.get("被邀医师"));
+                }
+
+            } else {
+                htmlContent = XszyyHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+                //htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "");
+                    CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                }
+            }
+            if (structureMap.containsKey("会诊到达时间")) {
+                String arriveDateStr = CommonAnalysisUtil.extractDate(structureMap.get("会诊到达时间"));
+                if (StringUtil.isNotBlank(arriveDateStr)) {
+                    structureMap.put("会诊意见", structureMap.get("会诊到达时间").replace(arriveDateStr, "").trim());
+                    structureMap.put("会诊到达时间", arriveDateStr);
+                }
+            }
+            CommonAnalysisUtil.processType(structureMap, "会诊类型");
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

+ 50 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunConsultationRecordHtmlAnalysis.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 20:12
+ */
+@Slf4j
+public class BeiLunConsultationRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "7";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            List<String> titles = Lists.newArrayList("姓名","科别","床号","住院号",
+                    "请求会诊日期","简要病情及诊疗经过","患者目前存在主要问题","会诊的目的","申请会诊医师签名","会 诊 记 录",
+                    "会诊时间","会诊情况及处理意见","会诊医师签名"
+            );
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+            if (StringUtil.isNotBlank(htmlContent)) {
+                //无冒号版本
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+            }
+
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunCrisisValueReportHtmlAnalysis.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 19:48
+ */
+@Slf4j
+public class BeiLunCrisisValueReportHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "23";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+            XszyyCommonAnalysisUtil.xszyyCommonlyExtractWardInfo(recTitle, htmlContent, map);
+            //病情记录存在副主任医师和书写医师字段
+            if(map.containsKey("病情记录")){
+                String bqtext = map.get("病情记录");
+                //无冒号版本
+                List<String> titles = Lists.newArrayList("书写医师"
+                );
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,bqtext,map);
+                map.put("病情记录",bqtext.substring(0,bqtext.lastIndexOf("书写医师")));
+            }
+
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+}

File diff suppressed because it is too large
+ 67 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunCriticallyIllNoticeHtmlAnalysis.java


+ 64 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathCaseDiscussHtmlAnalysis.java

@@ -0,0 +1,64 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/17 14:27
+ */
+@Slf4j
+public class BeiLunDeathCaseDiscussHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "3";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号",
+                    "讨论日期","讨论地点","主持人","参加人员姓名及专业技术职称",
+                    "讨论意见","死亡原因","死亡诊断",
+                    "主持人小结意见","记录者签名"
+            );
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+
+            if (StringUtil.isNotBlank(htmlContent)) {
+                //无冒号版本
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+                //死亡诊断包含医师发言
+                if(map.containsKey("死亡诊断")&&map.get("死亡诊断").contains("主任医师")){
+                    String swzd = map.get("死亡诊断");
+                    map.put("死亡诊断",swzd.substring(0,swzd.indexOf("主任医师")));
+                    map.put("医师发言",swzd.substring(swzd.indexOf("主任医师")));
+                }
+                //住院号包含死亡病例讨论记录
+                if(map.containsKey("住院号")&&map.get("住院号").contains("死亡病例讨论记录")){
+                    String zyh = map.get("住院号");
+                    map.put("住院号",zyh.substring(0,zyh.indexOf("死亡病例讨论记录")));
+                }
+            }
+
+
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathRecordHtmlAnalysis.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡记录html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:41
+ */
+@Slf4j
+public class BeiLunDeathRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "24";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号","死 亡 记 录",
+                    "入院日期","死亡日期","入院时基本情况","入院诊断","诊治经过","死亡原因","死亡诊断","医生签名"
+            );
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+
+            if (StringUtil.isNotBlank(htmlContent)) {
+                //无冒号版本
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+            }
+
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 69 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDifficultCaseDiscussHtmlAnalysis.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难、危重病例讨论记录html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:41
+ */
+@Slf4j
+public class BeiLunDifficultCaseDiscussHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "19";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+            if (StringUtil.isNotBlank(htmlContent)) {
+                //无冒号版本
+                List<String> titles = Lists.newArrayList("入院日期","讨论日期","讨论地点","主 持 人",
+                        "参加人员姓名及专业技术职称","报告病史","讨论意见内容记录","主持人小结意见","记录者签名","主持人签名"
+                );
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles, htmlContent, structureMap);
+            }
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+    /**
+     * 去除value中最后的逗号
+     *
+     * @param structureMap
+     */
+    private void removeLast(Map<String, String> structureMap) {
+        for (Map.Entry<String, String> entry : structureMap.entrySet()) {
+            structureMap.put(entry.getKey(), findLast(entry.getValue()));
+        }
+    }
+
+    private String findLast(String value) {
+        if (StringUtil.isNotBlank(value)) {
+            if (value.lastIndexOf(",") != value.length() - 1) {
+                return value;
+            }
+            value = value.substring(0, value.length() - 1);
+            findLast(value);
+        }
+        return value;
+    }
+}

+ 56 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDutyShiftSystemHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 20:00
+ */
+@Slf4j
+public class BeiLunDutyShiftSystemHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "9";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
+            analysisGeneral(recTitle,bigDivElement, map);
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+        if (bigDivElement.childNodeSize() == 1) {
+            bigDivElement = bigDivElement.child(0);
+        }
+        if (bigDivElement.selectFirst("hr") != null) {
+            bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+        }
+        String text = XszyyHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.extractWardInfo(recTitle,text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

+ 50 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: HUJING
+ * @time: 2020/9/9 11:24
+ */
+@Slf4j
+public class BeiLunFirstCourseRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "2";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            List<String> titles = Lists.newArrayList("病例特点","拟诊讨论","初步诊断","诊疗方案","医师签名"
+            );
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
+            if (StringUtil.isNotBlank(htmlContent)) {
+                //无冒号版本
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,structureMap);
+                if(XszyyCommonAnalysisUtil.extractDate(htmlContent)!=null){
+                    structureMap.put("病历日期",XszyyCommonAnalysisUtil.extractDate(htmlContent));
+                }
+            }
+            structureMap.put("标题",recTitle);
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

+ 14 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunHtmlAnalysis.java

@@ -0,0 +1,14 @@
+package com.lantone.qc.trans.xszyy.util;
+
+import java.util.Map;
+
+/**
+ * @Description: 北仑html解析
+ * @author: rengb
+ * @time: 2020/9/9 11:26
+ */
+public interface BeiLunHtmlAnalysis {
+
+    Map<String,String> analysis(String...args);
+
+}

+ 0 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunInformedHtmlAnalysis.java


Some files were not shown because too many files changed in this diff