瀏覽代碼

宁海妇幼和一院合入、其他一院更新合入

rengb 4 年之前
父節點
當前提交
aeb9c0d27b
共有 72 個文件被更改,包括 5528 次插入23 次删除
  1. 14 3
      public/src/main/java/com/lantone/qc/pub/Content.java
  2. 7 0
      public/src/main/java/com/lantone/qc/pub/model/InputInfo.java
  3. 17 0
      public/src/main/java/com/lantone/qc/pub/model/doc/ADLGradeDoc.java
  4. 33 0
      public/src/main/java/com/lantone/qc/pub/model/doc/AnesthesiaRecordDoc.java
  5. 15 0
      public/src/main/java/com/lantone/qc/pub/model/doc/VTEGradeDoc.java
  6. 4 0
      public/src/main/java/com/lantone/qc/pub/util/DateUtil.java
  7. 46 0
      trans/src/main/java/com/lantone/qc/trans/beilun/AnesthesiaRecordDocTrans.java
  8. 52 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunADLGradeDocTrans.java
  9. 2 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicalBloodDocTrans.java
  10. 1 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstCourseRecordDocTrans.java
  11. 37 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunPacsDocTrans.java
  12. 55 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunVTEGradeDocTrans.java
  13. 20 1
      trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java
  14. 42 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunADLGradeHtmlAnalysis.java
  15. 41 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunVTEGradeHtmlAnalysis.java
  16. 6 0
      trans/src/main/java/com/lantone/qc/trans/comsis/CommonAnalysisUtil.java
  17. 22 0
      trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java
  18. 79 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoBeHospitalizedDocTrans.java
  19. 76 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoClinicBloodEffectDocTrans.java
  20. 76 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoClinicalBloodDocTrans.java
  21. 280 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoConsultationDocTrans.java
  22. 36 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoCrisisInfoDocTrans.java
  23. 72 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoCrisisValueReportDocTrans.java
  24. 78 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoCriticallyIllNoticeDocTrans.java
  25. 64 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDeathCaseDiscussDocTrans.java
  26. 67 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDeathRecordDocTrans.java
  27. 98 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDifficultCaseDiscussDocTrans.java
  28. 36 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDoctorAdviceDocTrans.java
  29. 72 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDutyShiftSystemDocTrans.java
  30. 86 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoFirstCourseRecordDocTrans.java
  31. 54 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoFirstPageRecordDocTrans.java
  32. 85 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoLeaveHospitalDocTrans.java
  33. 36 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoLisDocTrans.java
  34. 26 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoMedicalRecordInfoDocTrans.java
  35. 479 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOperationDocTrans.java
  36. 40 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOutDepDocTrans.java
  37. 81 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoRescueDocTrans.java
  38. 75 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoStagesSummaryDocTrans.java
  39. 368 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoThreeLevelWardDocTrans.java
  40. 305 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoTransferRecordDocTrans.java
  41. 264 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NinghaifuyaoDocTrans.java
  42. 262 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoBeHospitalizedHtmlAnalysis.java
  43. 71 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicBloodEffectHtmlAnalysis.java
  44. 72 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicalBloodHtmlAnalysis.java
  45. 120 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationHtmlAnalysis.java
  46. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationRecordHtmlAnalysis.java
  47. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCrisisValueReportHtmlAnalysis.java
  48. 54 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis.java
  49. 50 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathCaseDiscussHtmlAnalysis.java
  50. 48 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDeathRecordHtmlAnalysis.java
  51. 89 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis.java
  52. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java
  53. 50 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoFirstCourseRecordHtmlAnalysis.java
  54. 14 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoHtmlAnalysis.java
  55. 238 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoHtmlAnalysisUtil.java
  56. 84 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoLeaveHospitalHtmlAnalysis.java
  57. 61 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoOperationHtmlAnalysis.java
  58. 214 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoOperationRecordHtmlAnalysis.java
  59. 93 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoPreoperativeHtmlAnalysis.java
  60. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoRescueHtmlAnalysis.java
  61. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoStagesSummaryHtmlAnalysis.java
  62. 97 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoThreeLevelWardHtmlAnalysis.java
  63. 56 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoTransferIntoHtmlAnalysis.java
  64. 65 0
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoTransferOutHtmlAnalysis.java
  65. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiOperationDocTrans.java
  66. 64 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiBeHospitalizedHtmlAnalysis.java
  67. 3 3
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCrisisValueReportHtmlAnalysis.java
  68. 3 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiFirstCourseRecordHtmlAnalysis.java
  69. 26 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiLeaveHospitalHtmlAnalysis.java
  70. 32 6
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiOperationRecordHtmlAnalysis.java
  71. 11 4
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouBeHospitalizedDocTrans.java
  72. 23 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuThreeLevelWardDocTrans.java

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

@@ -15,7 +15,7 @@ public class Content {
     public static String title = "病历";
     public static String header = "标题";
     public static String content_lbl="内容";
-    public static String hospital_Id = "";
+
     public static String label = "content";
 
     public static String[] docname = {"病案首页","入院记录","首次病程录","病程","医嘱","出院小结"};
@@ -231,8 +231,8 @@ public class Content {
     public static final String daCode="医嘱转院机构名称";
     public static final String reHospitalization="三十一天内再住院计划";
 
-
-
+    //病理诊疗最低费用
+    public static final double pathologicalFee= 68.00;
 
 
     public static final String type = "性";
@@ -253,10 +253,13 @@ public class Content {
     public static final String timestamp = "timestamp";
 
     public static String[] dateFormats = {
+            "yyyy年MM月dd日",
             "yyyy年MM月dd日HH时mm分",
             "yyyy年MM月dd日HH:mm",
             "yyyy年MM月dd日H时mm分",
             "yyyy年MM月dd日HH时m分",
+            "yyyy年MM月dd日HH:mm",
+            "yyyy年MM月dd日 HH:mm",
             "yyyy年MM月dd日H时m分",
             "yyyy年M月dd日HH时mm分",
             "yyyy年M月dd日H时mm分",
@@ -310,9 +313,17 @@ public class Content {
             "yyyy/M/dH:m",
             "yyyy/MM/dd",
             "yyyy.MM.dd",
+            "yyyy.MM.dd HH:mm:ss",
+            "yyyy.MM.ddHH:mm",
+            "yyyy.MM.ddHH:mm",
+            "yyyy.MM.dd HH:mm",
+            "yyyy.MM.dd HH:mm",
             "yyyy-MM-ddHH:mm:ss.000",
             "yyyyMMddHH:mm",
             "yyyy-MM-dd'T'HH:mm:ss",
             "yyyy-MM-ddTHH:mm:ss",
     };
+
+    public static final String adl_grade_time = "日期";//ADL评分时间
+
 }

+ 7 - 0
public/src/main/java/com/lantone/qc/pub/model/InputInfo.java

@@ -97,6 +97,13 @@ public class InputInfo {
     private List<DailyCourseRecordDoc> dailyCourseRecordDocs = Lists.newArrayList();
     //住院病历信息
     private MedicalRecordInfoDoc medicalRecordInfoDoc;
+    //VTE评分
+    private VTEGradeDoc vteGradeDoc;
+    //ADL评分
+    private ADLGradeDoc adlGradeDoc;
+
+    //手麻信息
+    private List<AnesthesiaRecordDoc> anesthesiaRecordDocs = new ArrayList<>();
     private boolean useCrfCache;
 
     //新增记录

+ 17 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/ADLGradeDoc.java

@@ -0,0 +1,17 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName: ADLGradeDoc
+ * @Description: ADL评分信息
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Getter
+@Setter
+public class ADLGradeDoc extends ModelDoc {
+
+}

+ 33 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/AnesthesiaRecordDoc.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @ClassName: AnesthesiaRecordDoc
+ * @Description: 手麻记录文档
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Getter
+@Setter
+public class AnesthesiaRecordDoc extends ModelDoc{
+    private Long id;
+    private Long hospitalId;                        //医院ID
+    private String behospitalCode;                  //病历号
+    private Date anesStartTime;                     //开始时间
+    private String diagBeforeOperation;             //术前诊断
+    private String diagAfterOperation;              //术后诊断
+    private String operationName;                   //手术名称
+    private String anesthesiaDoctor;                //麻醉医师
+    private String bleedingAmount;                  //出血量
+    private Long did;                        //主刀医师ID
+    private String doctorName;                      //主刀医师
+    private String anesthesiaMethod;                //麻醉方式
+    private Date anesEndTime;                       //手术结束时间
+    private Date inAnesStartTime;                   //入手术时间(进入手术室时间,早于手术时间,用于术前准备)
+    private String is_deleted;                      //是否删除
+}

+ 15 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/VTEGradeDoc.java

@@ -0,0 +1,15 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : VTEGradeDoc
+ * @Description : VTE评分信息
+ * @Author : sxl
+ * @Date: 2021-03-09 15:00
+ */
+@Getter
+@Setter
+public class VTEGradeDoc extends ModelDoc {
+}

+ 4 - 0
public/src/main/java/com/lantone/qc/pub/util/DateUtil.java

@@ -38,6 +38,10 @@ public class DateUtil {
      * 日期格式:yyyy-MM-dd HH:mm:ss
      */
     public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 日期格式:yyyy/MM/dd HH:mm:ss
+     */
+    public static final String DATE_TIME_SG_FORMAT = "yyyy/MM/dd HH:mm:ss";
     /**
      * 日期格式:yyyy-MM-dd HH:mm:ss.SSS
      */

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

@@ -0,0 +1,46 @@
+package com.lantone.qc.trans.beilun;
+
+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.beilun.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/beilun/BeiLunADLGradeDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.beilun;
+
+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.beilun.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;
+    }
+}

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

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

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

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

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

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

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

@@ -0,0 +1,55 @@
+package com.lantone.qc.trans.beilun;
+
+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.beilun.util.BeiLunBeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.beilun.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;
+    }
+}

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

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

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

@@ -0,0 +1,42 @@
+package com.lantone.qc.trans.beilun.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;
+    }
+}

+ 41 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunVTEGradeHtmlAnalysis.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.beilun.util;
+
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunVTEGradeHtmlAnalysis
+ * @Description: VTE评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunVTEGradeHtmlAnalysis 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);
+            //评估日期
+            Element valuationName = doc.getElementById("table4").getElementsByTag("tr").get(2)
+                    .getElementsByTag("span").get(0);
+            Element valuationTime = doc.getElementById("table4").getElementsByTag("tr").get(2)
+                    .getElementsByTag("span").get(1);
+            map.put(valuationName.text().replaceAll(":",""),valuationTime.text());
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 6 - 0
trans/src/main/java/com/lantone/qc/trans/comsis/CommonAnalysisUtil.java

@@ -318,6 +318,12 @@ public class CommonAnalysisUtil {
                     return m2.group(0);
                 }
             }
+            Pattern pattern3 = Pattern.compile("[0-9]{4}年[0-9]+月[0-9]+日 [0-9]+:[0-9]+|[0-9]{4}年[0-9]+月[0-9]+日[0-9]+:[0-9]+");
+            Matcher matcher3 = pattern3.matcher(top);
+            if (matcher3.find()) {
+                return matcher3.group(0);
+            }
+
         }
         return null;
     }

+ 22 - 0
trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java

@@ -453,6 +453,28 @@ public class ModelDocGenerate {
         threeLevelWardDoc.setStructureMap(structureMap);
         return threeLevelWardDoc;
     }
+    /**
+     * VTE评分
+     *
+     * @param structureMap
+     * @return
+     */
+    public static VTEGradeDoc vteGradeDocGen(Map<String, String> structureMap) {
+        VTEGradeDoc vteGradeDoc = new VTEGradeDoc();
+        vteGradeDoc.setStructureMap(structureMap);
+        return vteGradeDoc;
+    }
+    /**
+     * ADL评分
+     *
+     * @param structureMap
+     * @return
+     */
+    public static ADLGradeDoc adlGradeDocGen(Map<String, String> structureMap) {
+        ADLGradeDoc adlGradeDoc = new ADLGradeDoc();
+        adlGradeDoc.setStructureMap(structureMap);
+        return adlGradeDoc;
+    }
 
     /**
      * 拼接结构化数据

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

@@ -0,0 +1,79 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoBeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoBeHospitalizedDocTrans 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("htmlText").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();
+                NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoBeHospitalizedHtmlAnalysis();
+                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(
+            "生于=出生日期",
+            "出生地=籍贯",
+            "户籍所在地=籍贯",
+            "户口地址=籍贯",
+            "联系地址=住址",
+            "入院时间=入院日期",
+            "月经婚育史=婚育史",
+            "实验室检查=辅助检查",
+            "初步诊断医师签名:=初步诊断医师签名",
+            "初步诊断医师签名:时 间:=初步诊断签名时间",
+            "补充诊断医师签名:时 间:=补充诊断签名时间",
+            "补充诊断医师签名:=补充诊断医师签名"
+    );
+
+}

+ 76 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoClinicBloodEffectDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoClinicBloodEffectHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoClinicBloodEffectDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoClinicBloodEffectHtmlAnalysis();
+            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/ninghaifuyao/NingHaiFuYaoClinicalBloodDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoClinicalBloodHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoClinicalBloodDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoClinicalBloodHtmlAnalysis();
+            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.setPageData((Map) structureMap);
+            return clinicalBloodDoc;
+        } else {
+            return null;
+        }
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "输注成分=输注种类、血型、数量",
+            "输血过程=输注过程",
+            "病情记录=病历内容",
+            "医生签名=记录医生",
+            "医师签名=记录医生"
+    );
+
+}

+ 280 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoConsultationDocTrans.java

@@ -0,0 +1,280 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoConsultationHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoConsultationRecordHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoConsultationDocTrans 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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoConsultationRecordHtmlAnalysis();
+            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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoConsultationHtmlAnalysis();
+            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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoConsultationHtmlAnalysis();
+            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/ninghaifuyao/NingHaiFuYaoCrisisInfoDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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 NingHaiFuYaoCrisisInfoDocTrans 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;
+    }
+
+}

+ 72 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoCrisisValueReportDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoCrisisValueReportHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoCrisisValueReportDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoCrisisValueReportHtmlAnalysis();
+            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(
+            "病情记录=病情分析及处理"
+    );
+
+}

+ 78 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoCriticallyIllNoticeDocTrans.java

@@ -0,0 +1,78 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoCriticallyIllNoticeDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis();
+            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/ninghaifuyao/NingHaiFuYaoDeathCaseDiscussDocTrans.java

@@ -0,0 +1,64 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoDeathCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoDeathCaseDiscussDocTrans 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("htmlText").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();
+                NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoDeathCaseDiscussHtmlAnalysis();
+                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(
+            "医生签名时间=记录时间",
+            "主持人小结意见=主持人小结",
+            "具体讨论意见=讨论内容",
+            "记录者签名=记录医生",
+            "主持人(签名)=主持人签名"
+    );
+
+}

+ 67 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDeathRecordDocTrans.java

@@ -0,0 +1,67 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoDeathRecordHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoDeathRecordDocTrans 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("htmlText").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();
+                NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoDeathRecordHtmlAnalysis();
+                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(
+            "科室=科别",
+            "住院号=病历号",
+            "死亡时间=死亡日期",
+            "入院时间=入院日期",
+            "签名时间=记录时间",
+            "诊治经过=诊疗经过"
+    );
+
+}

+ 98 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoDifficultCaseDiscussDocTrans.java

@@ -0,0 +1,98 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoDifficultCaseDiscussDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis();
+            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/ninghaifuyao/NingHaiFuYaoDoctorAdviceDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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 NingHaiFuYaoDoctorAdviceDocTrans 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/ninghaifuyao/NingHaiFuYaoDutyShiftSystemDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoDutyShiftSystemHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoDutyShiftSystemDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoDutyShiftSystemHtmlAnalysis();
+            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(
+
+    );
+
+}

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

@@ -0,0 +1,86 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoFirstCourseRecordHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+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 NingHaiFuYaoFirstCourseRecordDocTrans 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("htmlText").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();
+                NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoFirstCourseRecordHtmlAnalysis();
+                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());
+                }
+            }
+            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(
+            "时间=病历日期",
+            "病历特点=病例特点",
+            "入院查体=查体",
+            "辅助检查=辅检",
+            "医师签名=医生签名",
+            "2.诊断依据=诊断依据",
+            "3.鉴别诊断=鉴别诊断",
+            "1.初步诊断=初步诊断"
+    );
+
+}

+ 54 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoFirstPageRecordDocTrans.java

@@ -0,0 +1,54 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.trans.ModelDocTrans;
+
+import java.util.Map;
+
+/**
+ * @Description: 病案首页文档生成
+ * @author: 胡敬
+ * @time: 2020/3/16 17:47
+ */
+public class NingHaiFuYaoFirstPageRecordDocTrans 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;
+    }
+
+}

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

@@ -0,0 +1,85 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoLeaveHospitalHtmlAnalysis;
+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 NingHaiFuYaoLeaveHospitalDocTrans 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("htmlText").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();
+                NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoLeaveHospitalHtmlAnalysis();
+                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/ninghaifuyao/NingHaiFuYaoLisDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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 NingHaiFuYaoLisDocTrans 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/ninghaifuyao/NingHaiFuYaoMedicalRecordInfoDocTrans.java

@@ -0,0 +1,26 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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 NingHaiFuYaoMedicalRecordInfoDocTrans 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;
+    }
+
+}

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

@@ -0,0 +1,479 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.jsoup.Jsoup;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
+ */
+@Slf4j
+public class NingHaiFuYaoOperationDocTrans 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.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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoOperationHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                if (sourceMap.containsKey("病历标题") && sourceMap.get("病历标题").matches("[\\d]+年.*")) {
+                    sourceMap.put("病历日期", sourceMap.get("病历标题").substring(0, Math.max(0, sourceMap.get("病历标题").indexOf("术后首次"))));
+                    sourceMap.put("病历标题", sourceMap.get("病历标题").replace(sourceMap.get("病历日期"), ""));
+                }
+                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 = NingHaiFuYaoHtmlAnalysisUtil.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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoOperationRecordHtmlAnalysis();
+            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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoPreoperativeHtmlAnalysis();
+            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(
+            "一、简要病情=简要病情",
+            "1.术前诊断=术前诊断",
+            "2.手术指征与禁忌征=手术指征与禁忌",
+            "3.可替代方案=可替代的方案",
+            "4.拟施手术方式、名称及可能的变更=拟施手术方式名称及可能的变更与禁忌症",
+            "5.计划性多次手术=计划性多次手术",
+            "6.拟施麻醉方式=拟施麻醉方式",
+            "7.术前特殊准备=术前准备",
+            "8.主要术中、术后风险及防范措施=风险及防范措施",
+            "9.术中、术后注意事项(含护理事项)=术中术后注意事项",
+            "1.术前诊断=术前诊断",
+            "2.手术指征与禁忌征=手术指征与禁忌",
+            "3.可替代方案=可替代的方案",
+            "4.拟施手术方式(名称)及可能的变更方案=拟施手术方式、名称及可能的变更与禁忌症",
+            "5.计划性多次手术=计划性多次手术",
+            "6.拟施麻醉方式=拟施麻醉方式",
+            "5.拟施麻醉方式=拟施麻醉方式",
+            "5.本次手术是否属于计划性多次手术=计划性多次手术",
+            "6.术前特殊准备=术前准备",
+            "7.术前特殊准备=术前准备",
+            "7.主要术中、术后风险及防范措施=风险及防范措施",
+            "8.主要术中、术后风险及防范措施=风险及防范措施",
+            "9.术中、术后注意事项(含护理事项)=术中术后注意事项",
+            "8.术中、术后注意事项(含护理事项)=术中术后注意事项",
+            //"术中、术后注意事项(含护理事项)=术后注意事项",
+            //"拟施手术方式(名称)及可能的变更方案=拟施手术方式、名称及可能的变更与禁忌症",
+            //"术前特殊准备=术前准备",
+            //"手术指征与禁忌征=手术指征与禁忌",
+            "经治医师签名=记录医生",
+            "经治医生签字时间=记录时间",
+            "主刀医师签名=主刀医生签名",
+            "签字时间=记录时间",
+            "手术前诊断=术前诊断",
+            "手术中诊断=术中后诊断",
+            "手术后诊断=术中后诊断"
+    );
+
+    /**********************************************手术知情同意书****************************************************/
+    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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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";
+//        String content = contentMap.get("htmlText").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, operationInformedConsent_keyContrasts, modeId);
+//
+//        String text = CxXmlUtil.getXmlText(content);
+//        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationInformedConsent_sourceTitles, text);
+//        cutWordMap.putAll(structureMap);
+//
+//        OperationInformedConsentDoc operationInformedConsentDoc = ModelDocGenerate.operationInformedConsentDocGen(cutWordMap);
+        OperationInformedConsentDoc operationInformedConsentDoc = new OperationInformedConsentDoc();
+//        operationInformedConsentDoc.setText(text);
+//        operationInformedConsentDoc.setPageData((Map) cutWordMap);
+
+        return operationInformedConsentDoc;
+    }
+
+    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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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/ninghaifuyao/NingHaiFuYaoOutDepDocTrans.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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 NingHaiFuYaoOutDepDocTrans 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;
+    }
+
+}

+ 81 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoRescueDocTrans.java

@@ -0,0 +1,81 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoRescueHtmlAnalysis;
+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 NingHaiFuYaoRescueDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoRescueHtmlAnalysis();
+            Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                if (sourceMap.containsKey("抢救时间") && sourceMap.get("抢救时间").contains("-")) {
+                    String[] rescueDates = sourceMap.get("抢救时间").split("-");
+                    if (rescueDates.length > 1) {
+                        sourceMap.put("开始时间", rescueDates[0]);
+                        sourceMap.put("结束时间", rescueDates[1]);
+                    }
+                }
+                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(
+            "病历标题=标题",
+            "参加抢救人员及职称=参加抢救的医务人员姓名及专业技术职称",
+            "病情变化及抢救过程=抢救内容"
+    );
+
+}

+ 75 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoStagesSummaryDocTrans.java

@@ -0,0 +1,75 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoStagesSummaryHtmlAnalysis;
+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 NingHaiFuYaoStagesSummaryDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoStagesSummaryHtmlAnalysis();
+            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(
+            "病历标题=标题",
+            "病情记录=病历内容",
+            "医生签名=记录医生",
+            "医师签名=记录医生"
+    );
+
+}

+ 368 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoThreeLevelWardDocTrans.java

@@ -0,0 +1,368 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoThreeLevelWardHtmlAnalysis;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 查房记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+@Slf4j
+@Setter
+public class NingHaiFuYaoThreeLevelWardDocTrans 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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoThreeLevelWardHtmlAnalysis();
+            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(" ", ""));
+        }
+        if(structureMap.get("病情记录").contains("医师签名"))
+        {
+            structureMap.put("病情记录", structureMap.get("病情记录").split("医师签名")[0]);
+        }
+        //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 director.contains("主任");
+    }
+
+    /**
+     * 共同照护讨论记录中找主治查房
+     *
+     * @param content
+     * @return
+     */
+    private boolean findAttend(String content) {
+        String director = "";
+        if (content.indexOf(",") != -1) {
+            director = content.substring(0, content.indexOf(","));
+        }
+        return director.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/ninghaifuyao/NingHaiFuYaoTransferRecordDocTrans.java

@@ -0,0 +1,305 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoTransferIntoHtmlAnalysis;
+import com.lantone.qc.trans.ninghaifuyao.util.NingHaiFuYaoTransferOutHtmlAnalysis;
+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 NingHaiFuYaoTransferRecordDocTrans 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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoTransferIntoHtmlAnalysis();
+            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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoTransferOutHtmlAnalysis();
+            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("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").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("htmlText").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();
+            NingHaiFuYaoHtmlAnalysis beiLunHtmlAnalysis = new NingHaiFuYaoTransferOutHtmlAnalysis();
+            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(
+            "医师签名=记录医生",
+            "病历标题=标题",
+            "病情记录=病历内容",
+            "签名时间=记录时间"
+    );
+
+}

+ 264 - 0
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NinghaifuyaoDocTrans.java

@@ -0,0 +1,264 @@
+package com.lantone.qc.trans.ninghaifuyao;
+
+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.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BeiLunDocTrans
+ * @Description :
+ * @Author : 楼辉荣
+ * @Date: 2020-03-03 19:47
+ */
+@Slf4j
+public class NinghaifuyaoDocTrans 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("会诊")) {
+                    NingHaiFuYaoConsultationDocTrans consultationDocTrans = new NingHaiFuYaoConsultationDocTrans();
+                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("手术")) {
+                    NingHaiFuYaoOperationDocTrans operationDocTrans = new NingHaiFuYaoOperationDocTrans();
+                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("转科")) {
+                    NingHaiFuYaoTransferRecordDocTrans transferRecordDocTrans = new NingHaiFuYaoTransferRecordDocTrans();
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("入院记录")) {
+                    NingHaiFuYaoBeHospitalizedDocTrans beHospitalizedDocTrans = new NingHaiFuYaoBeHospitalizedDocTrans();
+                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血/血制品病程记录")) {
+                    NingHaiFuYaoClinicalBloodDocTrans clinicalBloodDocTrans = new NingHaiFuYaoClinicalBloodDocTrans();
+                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血后效果评价")) {
+                    NingHaiFuYaoClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new NingHaiFuYaoClinicBloodEffectDocTrans();
+                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值记录")) {
+                    NingHaiFuYaoCrisisValueReportDocTrans crisisValueReportDocTrans = new NingHaiFuYaoCrisisValueReportDocTrans();
+                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值")) {
+                    NingHaiFuYaoCrisisInfoDocTrans crisisInfoDocTrans = new NingHaiFuYaoCrisisInfoDocTrans();
+                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("病危通知书")) {
+                    NingHaiFuYaoCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new NingHaiFuYaoCriticallyIllNoticeDocTrans();
+                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡病例讨论记录")) {
+                    NingHaiFuYaoDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new NingHaiFuYaoDeathCaseDiscussDocTrans();
+                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡记录")) {
+                    NingHaiFuYaoDeathRecordDocTrans deathRecordDocTrans = new NingHaiFuYaoDeathRecordDocTrans();
+                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("疑难病例讨论记录")) {
+                    NingHaiFuYaoDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new NingHaiFuYaoDifficultCaseDiscussDocTrans();
+                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("医嘱信息")) {
+                    NingHaiFuYaoDoctorAdviceDocTrans doctorAdviceDocTrans = new NingHaiFuYaoDoctorAdviceDocTrans();
+                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("值班交接制度")) {
+                    NingHaiFuYaoDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new NingHaiFuYaoDutyShiftSystemDocTrans();
+                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("首次病程录")) {
+                    NingHaiFuYaoFirstCourseRecordDocTrans firstCourseRecordDocTrans = new NingHaiFuYaoFirstCourseRecordDocTrans();
+                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("病案首页")) {
+                    NingHaiFuYaoFirstPageRecordDocTrans firstPageRecordDocTrans = new NingHaiFuYaoFirstPageRecordDocTrans();
+                    inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("出院小结")) {
+                    NingHaiFuYaoLeaveHospitalDocTrans leaveHospitalDocTrans = new NingHaiFuYaoLeaveHospitalDocTrans();
+                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("抢救记录")) {
+                    NingHaiFuYaoRescueDocTrans rescueDocTrans = new NingHaiFuYaoRescueDocTrans();
+                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("阶段小结")) {
+                    NingHaiFuYaoStagesSummaryDocTrans stagesSummaryDocTrans = new NingHaiFuYaoStagesSummaryDocTrans();
+                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("查房记录")) {
+                    NingHaiFuYaoThreeLevelWardDocTrans threeLevelWardDocTrans = new NingHaiFuYaoThreeLevelWardDocTrans();
+                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("住院病历信息")) {
+                    NingHaiFuYaoMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new NingHaiFuYaoMedicalRecordInfoDocTrans();
+                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("化验")) {
+                    NingHaiFuYaoLisDocTrans lisDocTrans = new NingHaiFuYaoLisDocTrans();
+                    inputInfo.setLisDocs(lisDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("门诊")) {
+                    NingHaiFuYaoOutDepDocTrans outDepDocTrans = new NingHaiFuYaoOutDepDocTrans();
+                    inputInfo.setBeHospitalizedDoc(outDepDocTrans.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 (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>> 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())
+                );
+            }
+        }
+    }
+}

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

@@ -0,0 +1,262 @@
+package com.lantone.qc.trans.ninghaifuyao.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 org.jsoup.nodes.Element;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/15 16:28
+ */
+@Slf4j
+public class NingHaiFuYaoBeHospitalizedHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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);
+                analysisBeHospitalized(doc, map);
+            }
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    //宁海第一人民医院
+    private void analysisBeHospitalized(Document doc, Map<String, String> map) {
+        List<String> titles = Lists.newArrayList("姓 名","姓名","现 住 址","身份证号码","性别", "性 别","生于","父母姓名","联系电话","住址", "住 址","年 龄","年龄","电话号码",
+                "出生地", "出 生 地", "职 业", "职业", "入院时间","户籍所在地","户口地址", "入院日期","记录时间","记录日期","民 族", "民族", "病史陈述者","职 业", "联系人及关系",
+                "婚 姻", "婚姻", "联系人电话","联 系 人", "主诉", "主 诉", "现 病 史","现病史", "既 往 史", "既往史", "出生史","个 人 史", "个人史", "婚 育 史",
+                "月 经 史", "月经婚育史", "家 族 史","一般测量","实验室检查", "特殊检查","临床诊断","记录医生", "初步诊断", "补充诊断","医师签名","日 期");
+        String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
+        if (StringUtil.isNotBlank(htmlContent)) {
+            htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第 ( ) 页", "");
+            CommonAnalysisUtil.html2StructureMap(titles, htmlContent, map);
+            disDiagnose(map, Lists.newArrayList("初步诊断"), "医师签名:");
+            disDiagnose(map, Lists.newArrayList("初步诊断医师签名:"), "时 间:");
+            //入院记录 体格检查、补充及专科情况里获取辅助检查提取
+            getAuxiliary(map,Lists.newArrayList("体格检查","补充及专科情况","补充及专科情况"),htmlContent);
+            //婚育史特殊符号处理
+//            removeSymbol(map,"□","婚育史");
+        }
+    }
+
+    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList,String htmlContent) {
+        CommonAnalysisUtil.html2StructureMapNoColon(newArrayList, htmlContent, map);
+        //家族史其他内容清理
+        if(map.keySet().contains("家族史"))
+        {
+            String fimaly = map.get("家族史");
+            if(map.keySet().contains("体格检查"))
+            {
+                removeMapVal(map,fimaly,"体格检查","家族史");
+                if(map.keySet().contains("补充及专科情况")&&StringUtil.isBlank(map.get("辅助检查")))
+                {
+                    String auxiliary = map.get("补充及专科情况");
+                    CommonAnalysisUtil.html2StructureMapNoColon(
+                            Lists.newArrayList("辅助检查"),auxiliary, map);
+                    if(map.get("辅助检查").contains("初步诊断")&&StringUtil.isNotBlank(map.get("初步诊断"))
+                            &&map.get("辅助检查").contains(map.get("初步诊断")))
+                    {
+                        String val = map.get("辅助检查");
+                        if(val.contains(map.get("初步诊断")))
+                        {
+                            val = val.split("初步诊断")[0].replaceAll("初步诊断","")
+                                    .replaceAll(":","").trim();
+                            map.put("辅助检查",val);
+
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+
+    private void removeMapVal(Map<String, String> map, String val,String mapkey,String changeKey) {
+        if(val.contains(map.get(mapkey)))
+        {
+            val = val.split(map.get(mapkey))[0].replaceAll(mapkey,"").trim();
+            map.put(changeKey,val);
+        }
+    }
+
+    /**
+     * @Author songxl
+     * @Description map中特殊符号处理
+     * @Date  2021/4/8
+     * @Param [map,symbol,key]
+     * @Return void
+     * @MethodName removeSymbol
+     */
+    private void removeSymbol(Map<String, String> map,String symbol,String key) {
+        if(map.keySet().contains(key))
+        {
+            map.put(key,map.get(key).replaceAll(symbol,"").trim());
+        }
+    }
+
+    /**
+     * 处理诊断
+     */
+    private void disDiagnose(Map<String, String> map, List<String> lists, String str) {
+        for (String key : lists) {
+            String value = map.get(key);
+            if (StringUtil.isNotBlank(value) && value.contains(str)) {
+                map.put(key, value.substring(0, value.indexOf(str)));
+                map.put(key + str, value.substring(value.indexOf(str) + str.length()));
+            }
+        }
+    }
+
+    //一般模板
+    private void analysisGeneral(Document doc, String recTitle, Map<String, String> map) {
+        //个人基础信息table解析
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("table1"), map);
+        //主诉、现病史等table解析
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle2InsertMap(doc.getElementById("table6"), map);
+        if (StringUtil.isNotBlank(map.get("婚育史月经史")) && map.get("婚育史月经史").contains("经期")) {
+            map.put("婚育史", map.get("婚育史月经史").substring(0, map.get("婚育史月经史").indexOf("经期")));
+        }
+        //体 格 检 查 表(一) table解析
+        Element tgjcTableElement = doc.getElementById("table3");
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle2InsertMap(tgjcTableElement, map);
+
+        //诊断 table解析
+        String disTableElementId = null;
+        Element disTableElement = null;
+        String[] disTableElementIds = {"table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1_37", "table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1", "table7_2_0_0_1_1_2_0_1_4_5_6_7", "table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1_5_2_3_1_2", "table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1_5_2_3", "table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1_5_2_3_1_2_27", "table7_2_0_0_1_1_2_0_1_4_5_6_7_0_1_5_2_3_1"};
+        for (String eid : disTableElementIds) {
+            disTableElement = doc.getElementById(eid);
+            if (disTableElement != null) {
+                disTableElementId = eid;
+                break;
+            }
+        }
+
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(disTableElement, map);
+        disHandleExt(map);
+
+        //医生签名、医生签名时间
+        Element docSignElement = null, docSignTimeElement = null;
+        if (disTableElement != null) {
+            for (Element disTableElementNt : disTableElement.nextElementSiblings()) {
+                docSignElement = disTableElementNt.selectFirst("image,img");
+                if (docSignElement != null) {
+                    docSignTimeElement = disTableElementNt.nextElementSibling();
+                    break;
+                }
+            }
+        }
+        if (docSignElement != null) {
+//            map.put("医生签名", docSignElement.outerHtml());
+            map.put("医生签名", "暂无");
+        }
+        if (docSignTimeElement != null) {
+            map.put("医生签名时间", NingHaiFuYaoHtmlAnalysisUtil.elementLayer1ToStr(docSignTimeElement, false).trim());
+        }
+
+        //专科检查、辅助检查
+        Element yuElement = new Element("div");
+        if (tgjcTableElement != null) {
+            for (Element tgjcTableElementNt : tgjcTableElement.nextElementSiblings()) {
+                if (StringUtil.isNotBlank(disTableElementId) && tgjcTableElementNt.id().contains(disTableElementId)) {
+                    break;
+                }
+                if (tgjcTableElementNt.tagName().equals("table")) {
+                    continue;
+                }
+                tgjcTableElementNt.appendTo(yuElement);
+            }
+        }
+        String yuText = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(yuElement, true)
+                .replace("体  格  检  查  表 (二)", "")
+                .replace("(补充及专科情况)", "")
+                .replace("辅  助  检  查", "辅助检查:")
+                .replace("诊断:", "")
+                .replace("补充专科情况", "补充专科情况:")
+                .trim();
+        CommonAnalysisUtil.cutByTitles(yuText, Lists.newArrayList("专科检查", "辅助检查"), 0, map);
+
+    }
+
+    //24小时出入院记录、24小时出入院记录(全院)、24小时入出院记录(全院通用)、24小时内入院死亡记录(全院通用)
+    private void analysis24h(Document doc, Map<String, String> map) {
+        String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), false);
+        text = text.substring(text.lastIndexOf("24小时入出院记录姓    名")).replaceFirst("第1页", "");
+        List<String> titles = Lists.newArrayList("姓    名", "家庭住址", "性    别", "工作单位", "年    龄", "身份证号码", "民    族",
+                "联系人(关系)", "职    业", "入院时间", "婚    姻", "死亡时间", "记录时间", "出 生 地", "病史陈述者", "主    诉", "入院情况", "心理评估",
+                "疼痛评估", "营养评估", "功能评估", "入院诊断", "诊疗经过", "死亡原因", "死亡诊断", "出院情况", "出院诊断", "出院计划", "出院医嘱",
+                "出院去向", "医师签名", "书写时间");
+
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
+        CommonAnalysisUtil.processType(map, "出院去向");
+    }
+
+    //原-日间病历入出院记录、日间病历-性早熟
+    private void analysisDay(Document doc, Map<String, String> map) {
+        //个人基础信息table解析
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("table1"), map);
+        //主诉、入院情况等table解析
+        NingHaiFuYaoHtmlAnalysisUtil.tableStyle2InsertMap(doc.getElementById("table6"), map);
+        //医生签名、医生签名时间
+        Element docSignElement = null, docSignTimeElement = null;
+        for (Element table6ElementNt : doc.getElementById("table6").parent().nextElementSiblings()) {
+            docSignElement = table6ElementNt.selectFirst("image,img");
+            if (docSignElement != null) {
+                docSignTimeElement = table6ElementNt.nextElementSibling();
+                break;
+            }
+        }
+        if (docSignElement != null) {
+//            map.put("医生签名", docSignElement.outerHtml());
+            map.put("医生签名", "暂无");
+        }
+        if (docSignTimeElement != null) {
+            map.put("医生签名时间", NingHaiFuYaoHtmlAnalysisUtil.elementLayer1ToStr(docSignTimeElement, false).trim());
+        }
+    }
+
+    private void disHandleExt(Map<String, String> map) {
+        String[] keys = {"补充诊断", "修正诊断"};
+        String value = null;
+        int index = 0;
+        for (String key : keys) {
+            value = map.get(key);
+            if (StringUtil.isNotBlank(value)) {
+                for (String key_ : keys) {
+                    index = value.indexOf(key_);
+                    if (index > 0) {
+                        map.put(key_, value.substring(index + 5));
+                        map.put(key, value.substring(0, index));
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,71 @@
+package com.lantone.qc.trans.ninghaifuyao.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 NingHaiFuYaoClinicBloodEffectHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+    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).getElementById("main");
+            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));
+                    }
+                }
+        );
+
+         */
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle,text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录","医生签名","医师签名"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.ninghaifuyao.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 17:56
+ */
+@Slf4j
+public class NingHaiFuYaoClinicalBloodHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+
+    private String modeId = "10";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        List<String> titles = Lists.newArrayList("输血前症状", "输血前实验室指标", "输血目的", "输注成分", "输血时间",
+                "开始时间", "结束时间", "输血过程");
+        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).getElementById("main");
+            analysisGeneral(recTitle,bigDivElement, map);
+            if (map.containsKey("病情记录")) {
+                String content = map.get("病情记录");
+                CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
+            }
+            if (titles.size() > 6) {
+                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));
+                        }
+                    }
+            );
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle,text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录","医生签名","医师签名"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,120 @@
+package com.lantone.qc.trans.ninghaifuyao.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 NingHaiFuYaoConsultationHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), 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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), 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, "会诊类型");
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

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

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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:12
+ */
+@Slf4j
+public class NingHaiFuYaoConsultationRecordHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
+            analysisGeneral(recTitle,bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(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/ninghaifuyao/util/NingHaiFuYaoCrisisValueReportHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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:48
+ */
+@Slf4j
+public class NingHaiFuYaoCrisisValueReportHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
+            analysisGeneral(recTitle, bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,54 @@
+package com.lantone.qc.trans.ninghaifuyao.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;
+
+/**
+ * @Description: 病危(重)通知单html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:28
+ */
+@Slf4j
+public class NingHaiFuYaoCriticallyIllNoticeHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "25";
+
+    @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];
+            Document doc = Jsoup.parse(html);
+            NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(doc.selectFirst("body").child(0).getElementById("header"), structureMap);
+            structureMap.forEach((key, value) -> structureMap.put(key, value.replace("\n", "")));
+            String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                if (htmlContent.contains("宁海县第一医院重、危病员通知单(交患方)")) {
+                    htmlContent = htmlContent.substring(0, htmlContent.indexOf("宁海县第一医院重、危病员通知单(交患方)"));
+                }
+                htmlContent = htmlContent.replaceAll("[   ]", " ").replace("--", "");
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "告知时间");
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

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

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.ninghaifuyao.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.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 NingHaiFuYaoDeathCaseDiscussHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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);
+            Element bigDivElement = doc.selectFirst("body").child(0).getElementById("main");
+
+            bigDivElement.child(0).lastElementSibling().remove();
+            map.put("医生签名时间", NingHaiFuYaoHtmlAnalysisUtil.elementLayer1ToStr(bigDivElement.child(0).lastElementSibling(), false));
+            bigDivElement.child(0).lastElementSibling().remove();
+
+            String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, false);
+            List<String> titles = Lists.newArrayList("姓名", "性别", "出生日期", "科别", "病区", "床号", "住院号",
+                    "入院诊断", "死亡诊断", "尸检结果", "讨论时间", "讨论地点",
+                    "主 持 人", "参加人员", "具体讨论意见", "主持人小结意见", "主持人(签名)", "记录者签名");
+            CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+            NingHaiFuYaoHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+}

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

@@ -0,0 +1,48 @@
+package com.lantone.qc.trans.ninghaifuyao.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;
+
+/**
+ * @Description: 死亡记录html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:41
+ */
+@Slf4j
+public class NingHaiFuYaoDeathRecordHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "24";
+
+    @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];
+            Document doc = Jsoup.parse(html);
+            NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(doc.selectFirst("body").child(0).getElementById("header"), structureMap);
+            structureMap.forEach((key, value) -> structureMap.put(key, value.replace("\n", "")));
+            String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), false);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replaceAll("[   ]", " ");
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "记录时间");
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+}

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

@@ -0,0 +1,89 @@
+package com.lantone.qc.trans.ninghaifuyao.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;
+
+/**
+ * @Description: 疑难、危重病例讨论记录html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:41
+ */
+@Slf4j
+public class NingHaiFuYaoDifficultCaseDiscussHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "19";
+
+    @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];
+            Document doc = Jsoup.parse(html);
+            NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("header"), structureMap);
+            structureMap.forEach((key, value) -> structureMap.put(key, value.replace("\n", "")));
+            String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第一页", "");
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                if (structureMap.size() == 0) {
+                    CommonAnalysisUtil.NHExtractWardInfo(recTitle, htmlContent, structureMap);
+                    String bqjlText = "病情记录" + structureMap.get("病情记录");
+                    List<String> keys = Lists.newArrayList(
+                            "病情记录", "医师签名", "医师签字"
+                    );
+                    keys = CommonAnalysisUtil.sortTitlesNoColon(keys, bqjlText);
+                    CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, keys, 0, structureMap);
+                }
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "告知时间");
+            removeLast(structureMap);
+
+            if (structureMap.containsKey("住院号")) {
+                String date = CommonAnalysisUtil.extractDate(structureMap.get("住院号"));
+                if (StringUtil.isNotBlank(date)) {
+                    structureMap.put("时间", date);
+                    structureMap.put("住院号", structureMap.get("住院号").replace(date, "").replace("\n", ""));
+
+                }
+            }
+            NingHaiFuYaoHtmlAnalysisUtil.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/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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 NingHaiFuYaoDutyShiftSystemHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    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).getElementById("main");
+            analysisGeneral(recTitle,bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.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/ninghaifuyao/util/NingHaiFuYaoFirstCourseRecordHtmlAnalysis.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.ninghaifuyao.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;
+
+/**
+ * @Description:
+ * @author: HUJING
+ * @time: 2020/9/9 11:24
+ */
+@Slf4j
+public class NingHaiFuYaoFirstCourseRecordHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "2";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            List<String> titles = Lists.newArrayList("一. 病例特点", "二. 拟诊讨论",
+                    "诊断依据","初步诊断","鉴别诊断","诊疗计划","医师签名",
+                    "三. 诊疗计划","三、诊疗计划", "医师签名");
+            Document doc = Jsoup.parse(args[0]);
+            String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            if (structureMap.containsKey("二.拟诊讨论")) {
+                List<String> listTitle = CommonAnalysisUtil.sortTitles(
+                        Lists.newArrayList("1.初步诊断", "2.诊断依据", "3.鉴别诊断"
+                                ,"诊断依据","鉴别诊断","初步诊断"), structureMap.get("二.拟诊讨论")
+                );
+                CommonAnalysisUtil.cutByTitles(structureMap.get("二.拟诊讨论"), listTitle, 0, structureMap);
+            }
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, args[2], structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

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

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

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

@@ -0,0 +1,238 @@
+package com.lantone.qc.trans.ninghaifuyao.util;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/15 16:31
+ */
+public class NingHaiFuYaoHtmlAnalysisUtil {
+
+    /**
+     * table样式:key和value在同一个td中,以冒号分开;保留换行
+     *
+     * @param tableElement
+     * @param map
+     */
+    public static void tableStyle1InsertMap(Element tableElement, Map<String, String> map) {
+        if (tableElement == null || map == null) {
+            return;
+        }
+        List<Element> tdElements = Lists.newArrayList();
+        tableElement.selectFirst("tbody").children().forEach(trElement -> {
+            trElement.children().forEach(tdElement -> {
+                tdElements.add(tdElement);
+            });
+        });
+        String tdText = null;
+        int tdMhIndex = 0;
+        for (Element tdElement : tdElements) {
+            if (tdElement.childNodeSize() == 0) {
+                continue;
+            }
+            tdText = blockDivToStr(tdElement.child(0), true);
+            if (tdText.endsWith("\n")) {
+                tdText = tdText.substring(0, tdText.length() - 1);
+            }
+            if (StringUtil.isBlank(tdText)) {
+                continue;
+            }
+            tdMhIndex = tdText.indexOf(":");
+            if (tdMhIndex == -1) {
+                tdMhIndex = tdText.indexOf(":");
+            }
+            if (tdMhIndex < 1) {
+                continue;
+            }
+            if (tdText.contains("姓    名") && tdText.contains("年    龄")) {
+                multiColonResolve(tdMhIndex, tdText, "年    龄", map);
+            } else if (tdText.contains("姓    名") && tdText.contains("年   龄")) {
+                multiColonResolve(tdMhIndex, tdText, "年   龄", map);
+            } else if (tdText.contains("姓    名") && tdText.contains("年  龄")) {
+                multiColonResolve(tdMhIndex, tdText, "年  龄", map);
+            } else if (tdText.contains("姓    名") && tdText.contains("年 龄")) {
+                multiColonResolve(tdMhIndex, tdText, "年 龄", map);
+            } else if (tdText.contains("产前检查") && tdText.contains("孕/产次")) {
+                multiColonResolve(tdMhIndex, tdText, "孕/产次", map);
+            } else if (tdText.contains("末次月经") && tdText.contains("预产期")) {
+                multiColonResolve(tdMhIndex, tdText, "预产期", map);
+            } else {
+                map.put(
+                        StringUtil.removeBlank(tdText.substring(0, tdMhIndex)),
+                        tdText.length() - 1 <= tdMhIndex ? "" : tdText.substring(tdMhIndex + 1)
+                );
+            }
+        }
+    }
+
+    /**
+     * 取得多个字段时,分别存储
+     *
+     * @param tdText
+     * @param text
+     */
+    public static void multiColonResolve(int tdMhIndex, String tdText, String text, Map<String, String> map) {
+        String firstText = tdText.split(text)[0];
+        map.put(
+                StringUtil.removeBlank(firstText.substring(0, tdMhIndex)),
+                firstText.length() - 1 <= tdMhIndex ? "" : firstText.substring(tdMhIndex + 1)
+        );
+        String secondText = tdText.split(text)[1];
+        secondText = secondText.replace(":", "");
+        secondText = secondText.replace(":", "");
+        map.put(StringUtil.removeBlank(text), secondText);
+    }
+
+    /**
+     * table样式:td两两配对,一个key,一个value;不保留换行
+     *
+     * @param tableElement
+     * @param map
+     */
+    public static void tableStyle2InsertMap(Element tableElement, Map<String, String> map) {
+        if (tableElement == null || map == null) {
+            return;
+        }
+        List<Element> tdElements = Lists.newArrayList();
+        tableElement.selectFirst("tbody").children().forEach(trElement -> {
+            if (trElement.childNodeSize() != 2) {
+                return;
+            }
+            trElement.children().forEach(tdElement -> {
+                tdElements.add(tdElement);
+            });
+        });
+        int index = 0;
+        String key = null, value = null, text = null;
+        for (Element tdElement : tdElements) {
+            if (tdElement.childNodeSize() == 0) {
+                text = "";
+            } else {
+                text = blockDivToStr(tdElement.child(0), false);
+            }
+            if (index % 2 == 0) {
+                key = text.replaceAll("[:: ]", "");
+            }
+            if (index % 2 == 1) {
+                value = text;
+                if (StringUtil.isNotBlank(key)) {
+                    map.put(key, value);
+                }
+            }
+            index++;
+        }
+    }
+
+    /**
+     * 一个大的块状div下包含很多行行状div
+     *
+     * @param divElement
+     * @param isLineBreak 是否保留换行
+     * @return
+     */
+    public static String blockDivToStr(Element divElement, boolean isLineBreak) {
+        if (divElement == null) {
+            return "";
+        }
+        StringBuffer sbf = new StringBuffer();
+        for (Element childElement : divElement.children()) {
+            if (isLineBreak) {
+                sbf.append(elementLayer1ToStr(childElement, false)).append("\n");
+            } else {
+                sbf.append(elementLayer1ToStr(childElement, false).trim());
+            }
+        }
+        return sbf.toString();
+    }
+
+    /**
+     * 标签仅遍历第一子层级后转字符串
+     *
+     * @param element
+     * @param isLineBreak 是否保留换行
+     * @return
+     */
+    public static String elementLayer1ToStr(Element element, boolean isLineBreak) {
+        if (element == null) {
+            return "";
+        }
+        StringBuffer sbf = new StringBuffer();
+        List<Element> elements = Lists.newArrayList();
+        Elements childElements = element.children();
+        if (childElements.size() == 0) {
+            elements.add(element);
+        }
+        for (Element childElement : childElements) {
+            elements.add(childElement);
+        }
+        for (Element childElement : elements) {
+            if (childElement.tagName().equals("img") || childElement.tagName().equals("image")) {
+                //                sbf.append(childElement.outerHtml());
+                sbf.append("—");
+            } else {
+                sbf.append(childElement.text());
+            }
+            if (isLineBreak) {
+                sbf.append("\n");
+            }
+        }
+        String sbfString = removeSex(sbf.toString().replaceAll(" ", " "));
+        return sbfString;
+    }
+
+    /**
+     * 查询并插入页面模板id
+     *
+     * @param modeId
+     * @param recTitle
+     * @param map
+     */
+    public static void insertModuleId(String modeId, String recTitle, Map<String, String> map) {
+        if ((StringUtil.isBlank(modeId) && StringUtil.isBlank(recTitle)) || map == null) {
+            return;
+        }
+        String moduleId = ModuleMappingUtil.getHtmlDataTypeModuleId(recTitle);
+        if (StringUtil.isBlank(moduleId)) {
+            moduleId = ModuleMappingUtil.getStandardModuleId(modeId);
+        }
+        map.put("mode_id", moduleId);
+    }
+
+    /**
+     * map中有的value以冒号开头,用此方法来去掉冒号
+     *
+     * @param map
+     */
+    public static void mapValueRemoveStartColon(Map<String, String> map) {
+        if (map == null) {
+            return;
+        }
+        map.keySet().forEach(key -> {
+            if (map.get(key).startsWith(":") || map.get(key).startsWith(":")) {
+                map.put(key, map.get(key).replaceFirst("[::]", ""));
+            }
+        });
+    }
+
+    /**
+     * 北仑:入院记录中性别取得去除"性"
+     * e.g.(性    别:男性 ->性    别:男)
+     *
+     * @param sbfString
+     */
+    public static String removeSex(String sbfString) {
+        if (sbfString.contains("性    别:")) {
+            sbfString = sbfString.substring(0, sbfString.length() - 1);
+        }
+        return sbfString;
+    }
+
+}

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

@@ -0,0 +1,84 @@
+package com.lantone.qc.trans.ninghaifuyao.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;
+
+/**
+ * @Description:
+ * @author: HUJING
+ * @time: 2020/9/9 11:24
+ */
+@Slf4j
+public class NingHaiFuYaoLeaveHospitalHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "5";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            List<String> titles = Lists.newArrayList("性别", "婚姻", "入院日期", "出院日期", "住院天数","入院诊断", "出院诊断","分娩日期",
+                    "分娩方式", "诊治经过(入院情况、治疗经过及重要辅助检查)","手术指征", "入院情况", "辅助检查","诊治经过", "住院经过", "入院后检查化验结果",
+                    "入院后化验检查结果", "诊疗经过", "治疗结果", "转归情况", "出院计划","出院情况","出院时情况", "治疗效果","治疗结果", "出院医嘱",
+                    "特殊资料检查号码","X光拍片","MRI","CT","病理切片","医师签字", "日期","主治医师","住院医师");
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replaceAll("[   ]", " ")
+                        .replace("第1页", "")
+                        .replace("出院后请注意接听本院的随访电话:825592278255916565578435","");
+                htmlContent = htmlContent.replace("\n", "");
+                List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, htmlContent.replace("复诊时间", ""));
+                sortTitles.add("时间");
+                CommonAnalysisUtil.cutByTitles(htmlContent, sortTitles, 0, structureMap);
+            }
+            if (structureMap.containsKey("出院诊断") && structureMap.get("出院诊断").contains("入院情况")) {
+                String discharge = structureMap.get("出院诊断");
+                int index = discharge.indexOf("入院情况");
+                structureMap.put("出院诊断", discharge.substring(0, index));
+                structureMap.put("入院情况", discharge.substring(index + 4));
+            }
+            //产科出院记录 出院时情况、诊治经过(入院情况、治疗经过及重要辅助检查) title没有 :故在此特殊处理
+            try
+            {
+                String headerContent = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("header"), true);
+                if("产科".equals(StringUtil.trim(headerContent.substring(headerContent.indexOf("科室:")+"科室:".length()
+                        ,headerContent.indexOf("床号")))))
+                {
+                    if(htmlContent.contains("诊治经过(入院情况、治疗经过及重要辅助检查)")&&htmlContent.contains("辅助检查:"))
+                    {
+                        structureMap.put("诊疗经过",htmlContent.substring(htmlContent.indexOf("诊治经过(入院情况、治疗经过及重要辅助检查)")
+                                +"诊治经过(入院情况、治疗经过及重要辅助检查)".length(),htmlContent.indexOf("辅助检查:")));
+                    }
+                    if(htmlContent.contains("出院时情况")&&htmlContent.contains("出院医嘱:"))
+                    {
+                        structureMap.put("出院情况",htmlContent.substring(htmlContent.indexOf("出院时情况")
+                                +"出院时情况".length(),htmlContent.indexOf("出院医嘱:")));
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                log.error(e.getMessage(), e);
+            }
+
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "时间");
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

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

@@ -0,0 +1,61 @@
+package com.lantone.qc.trans.ninghaifuyao.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 14:56
+ */
+@Slf4j
+public class NingHaiFuYaoOperationHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "18";
+
+    @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).getElementById("main");
+            analysisGeneral(recTitle, bigDivElement, map);
+            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录" + map.get("病情记录")
+                .replace("提醒:有创诊疗操作记录内容包括操作名称、时间、步骤、结果及患者的一般情况,记录操作过","")
+                .replace("程是否顺利,有无不良反应,术后注意事项,操作医师签名、记录时间等。","")
+                .replace("手术室完成的、治疗性质的及全麻下完成的有创诊疗操作参照手术管理。(包括介入治疗、胃肠镜","")
+                .replace("下肿瘤切除/粘膜下肿瘤剥除等)","");
+        List<String> titles = Lists.newArrayList(
+                "病情记录", "患者手术后情况", "手术简要经过(包括手术方式、术中所见、过程是否顺利、有无并发症等)", "术后去向", "术后去向", "术后诊断", "术后处理措施", "术后应当特别注意观察的事项:", "术后治疗计划(包括术后应当特别注意观察的事项)", "医生签名", "医师签名"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,214 @@
+package com.lantone.qc.trans.ninghaifuyao.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.Content;
+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.Element;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/28 16:36
+ */
+@Slf4j
+public class NingHaiFuYaoOperationRecordHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "17";
+
+    @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 headerElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("header");
+            //宁海妇幼的手术记录header不是table
+            if(headerElement.selectFirst("tbody")==null)
+            {
+                analysisHeader(headerElement, map);
+            }
+            else
+            {
+                NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(Jsoup.parse(html).selectFirst("body").child(0).getElementById("header"), map);
+            }
+            map.forEach((key, value) -> map.put(key, value.replace("\n", "")));
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
+            analysisGeneral(bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            String operatingCrew = null;
+            if (map.containsKey("手术人员")) {
+                operatingCrew = map.get("手术人员");
+            } else if (map.containsKey("手术者及助手名称")) {
+                operatingCrew = map.get("手术者及助手名称");
+            }
+            if (StringUtil.isNotBlank(operatingCrew)) {
+                CommonAnalysisUtil.cutByTitles(operatingCrew, Lists.newArrayList("主刀", "一助", "二助", "助手", "洗手护士"), 0, map);
+            }
+            if (map.containsKey("主刀")) {
+                map.put("主刀", map.get("主刀").replaceAll("[^\u4E00-\u9FA5]", ""));
+            }
+            if (map.containsKey("麻醉者")) {
+                String anesthetist = map.get("麻醉者").replace("麻醉医生:", "");
+                map.put("麻醉医师", anesthetist);
+                if (anesthetist.contains("1.")) {
+                    int index = anesthetist.indexOf("1.");
+                    map.put("麻醉医师", anesthetist.substring(0, index));
+                    map.put("手术经过", anesthetist.substring(index));
+                }
+            }
+            if (map.containsKey("手术日期")) {
+                String operatorDateStr = map.get("手术日期");
+                if (operatorDateStr.contains("--")) {
+                    String[] operatorDate = operatorDateStr.split("--");
+                    map.put("手术开始时间", operatorDate[0]);
+                    map.put("手术结束时间", operatorDate[1]);
+                }
+            }
+            //宁海产科手术记录处理
+            if(map.containsKey("开始")&&map.containsKey("结束")
+                    &&!map.containsKey("手术开始时间")&&!map.containsKey("手术结束时间")
+                    &&!map.containsKey("手术日期"))
+            {
+                map.put("手术开始时间", map.get("开始"));
+                String endTime = map.get("结束");
+                if(endTime.contains("手术名称"))
+                {
+                    CommonAnalysisUtil.html2StructureMapNoColon
+                            (Lists.newArrayList("手术名称","术前诊断","手术指征","术后诊断"),endTime,map);
+                    endTime = endTime.split("手术名称")[0].trim();
+                }
+                map.put("手术结束时间", endTime);
+                map.put("手术日期",map.get("手术开始时间"));
+
+            }
+
+            if(map.containsKey("手术开始时间") && map.containsKey("手术结束时间")){
+                map.put("手术日期",map.get("手术开始时间"));
+            }
+
+            //这些科室的手术时间写了好几种格式分别处理
+//           List<String> departmentList =  Lists.newArrayList("妇科","十六病区VIP");
+           getOperaTime(map,null);
+            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void getOperaTime(Map<String, String> map,List<String> departmentList) {
+//        if(map.containsKey("病区")&&departmentList.contains(map.get("病区")))
+        if(map.containsKey("病区"))
+        {
+            //手术日期: 2021-01-06 手术时间: 上午
+            if(map.containsKey("手术日期")&&map.containsKey("手术时间"))
+            {
+                if(map.get("手术时间").contains(":")|map.get("手术时间").contains(": ")
+                                            |map.get("手术时间").contains(": "))
+                {
+                    map.put("手术时间",map.get("手术时间").replaceAll(":",":")
+                                                        .replaceAll(": ",":")
+                                                        .replaceAll(": ",":"));
+                }
+                Pattern p = Pattern.compile("[0-9]+:[0-9][0-9]|[0-9][0-9]+:[0-9][0-9]");
+                Matcher m = p.matcher(map.get("手术时间"));
+
+                String pattern = "(上午|下午|晚上|凌晨|中午|晚)";
+                if(StringUtil.isNotBlank(map.get("手术时间"))&& Pattern.matches(pattern, map.get("手术时间"))){
+                    map.put("手术时间",map.get("手术日期"));
+                }
+                //如果手术时间为时刻没有具体某天例:(手术日期: 2021年01月05日 手术时间: 12:10)
+                else if(m.find())
+                {
+                    map.put("手术时间",map.get("手术日期")+m.group(0));
+                }
+            }
+            //手术时间:2021-01-05 10:12-10:40 或 开始时间-结束时间 排除没有日期的手术时间10:12-10:40
+            String operationStartDateStr = map.get("手术时间");
+            if(StringUtil.isNotBlank(operationStartDateStr)&&operationStartDateStr.contains("-")&&
+                    operationStartDateStr.length()>11)
+            {
+                //手术时间 -> 2021.01.1210:55--12:15
+                if(operationStartDateStr.contains("--"))
+                {
+                    operationStartDateStr = operationStartDateStr.substring(0,operationStartDateStr.lastIndexOf("--")).trim();
+                }
+                else
+                {
+                    operationStartDateStr = operationStartDateStr.substring(0,operationStartDateStr.lastIndexOf("-")).trim();
+                }
+                if(StringUtil.parseDateTime(operationStartDateStr, Content.dateFormats)!=null)
+                {
+                    map.put("手术时间",operationStartDateStr);
+                }
+            }
+            //手术日期 -> 2021年01月15日15时25分- 2021年01月15日16时05分 无手术时间
+            if(map.containsKey("手术日期"))
+            {
+                Pattern p = Pattern.compile("[0-9]{4}年[0-9]+月[0-9]+日[0-9]+时[0-9]+分");
+                Matcher m = p.matcher(map.get("手术日期"));
+                if (m.find()) {
+                    map.put("手术日期",m.group(0));
+                }
+            }
+            //手术时间:2021-01-06 上午
+            if(map.containsKey("手术时间"))
+            {
+                map.put("手术时间",map.get("手术时间")
+                        .replaceAll("上午","")
+                        .replaceAll("下午","")
+                        .replaceAll("中午","")
+                        .replaceAll("晚上","")
+                        .replaceAll("晚","")
+                        .replaceAll("凌晨","").trim());
+            }
+        }
+    }
+
+    private void analysisGeneral(Element bigDivElement, Map<String, String> map) {
+        /*if (bigDivElement.selectFirst("hr") != null) {
+            bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+        }*/
+        String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        text = text.replaceAll("第1页", "");
+        List<String> titles = Lists.newArrayList(
+                "姓名", "性别", "出生日期", "出生年月", "科别", "科室", "病区", "床号", "床位", "住院号","手术开始时间","手术结束时间",
+                "手术时间", "手术日期", "手术前诊断",  "手术中诊断", "手术后诊断","手术指征", "手术人员", "外邀指导专家","麻醉方式", "麻醉人员", "麻 醉 者", "洗手护士", "本次手术是否属于非计划再次手术", "接生者",
+                "术前胎心", "手术名称", "术后诊断", "手术者及助手名称", "术中取病理标本", "麻醉方法", "手术经过(包括病人体位、切口处理、病灶所见及手术步骤等)",
+                "诊断手术/操作简要经过(包括术中有无并发症及具体描述和处理)", "手术经过","医师签名","麻 醉","术前诊断",
+                "医生签名", "记录时间", "时间", "手术/操作医生", "记录者", "术中输血", "术前宫颈准备日期", "药物名称及用法", "导管或其他", "插入深度",
+                "阴道填塞纱布条", "准备者", "取出日期", "手术方法", "术中特殊情况", "病理检查", "其他", "记录者", "手术者",
+                "检查子宫位置","开始","结束","LMP"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, text);
+        CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+
+    }
+
+
+    private void analysisHeader(Element bigDivElement, Map<String, String> map) {
+        /*if (bigDivElement.selectFirst("hr") != null) {
+            bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+        }*/
+        String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        text = text.replaceAll("第1页", "")
+                .replaceAll("_____________________________________________________________________________________","");
+        List<String> titles = Lists.newArrayList(
+                "姓名", "病区", "床号", "住院号","年龄"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, text);
+        CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+
+    }
+}

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

@@ -0,0 +1,93 @@
+package com.lantone.qc.trans.ninghaifuyao.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.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/17 19:19
+ */
+@Slf4j
+public class NingHaiFuYaoPreoperativeHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "11";
+
+    @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).getElementById("main");
+            analysisGeneral(bigDivElement, map);
+
+            NingHaiFuYaoHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(Element bigDivElement, Map<String, String> map) {
+        /*if (bigDivElement.selectFirst("hr") != null) {
+            bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+        }*/
+        String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+
+        int index1 = text.lastIndexOf("经治医师签名");
+        int index2 = text.lastIndexOf("主刀医师签名");
+        if (index1 != -1 && index2 != -1) {
+            text = text.substring(0, index1).replace("(如高血压病、冠心病、糖尿病、脑梗、心梗、心肺肝肾功能不全,口服抗凝药", "").replace("等)", "")
+                    .replace("(如腹腔镜可能改开腹等)", "").replace("(如腹腔镜可能改开腹", "").replace("皮瓣转移术可能的变更方案","")
+                    .replace("四级手术、疑难手术等必须填写以下“具体讨论意见”,作为科室三大讨论本留存资料", "")
+                    .replace("术后术后", "术后")
+                    + text.substring(index1, index2).replace("签字时间", "经治医师签字时间:").replace("年月日时分", "")
+                    + text.substring(index2).replace("签字时间", "主刀医师签字时间:").replace("年月日时分", "");
+        }
+        text = text.replace("术前讨论及术前小结", "").replace("讨论结论:", "").replace("年月日时\n" +
+                "分", "").replace("二、","");
+        List<String> titles = Lists.newArrayList("姓名", "性别", "出生日期", "出生年月", "科别", "科室", "病区", "床号", "床位", "住院号",
+                "讨论时间", "讨论方式", "参加人员", "一、简要病情", "具体讨论意见","1.术前诊断","2.手术指征与禁忌征","3.可替代方案",
+                "1.术前诊断", "2.手术指征与禁忌征", "3.可替代方案", "4.拟施手术方式(名称)及可能的变更方案","4.拟施手术方式、名称及可能的变更","5.计划性多次手术",
+                "5.本次手术是否属于计划性多次手术", "5.拟施麻醉方式", "6.术前特殊准备", "7.主要术中、术后风险及防范措施", "8.术中、术后注意事项(含护理事项)",
+                "5.计划性多次手术","6.拟施麻醉方式","7.术前特殊准备","8.主要术中、术后风险及防范措施","9.术中、术后注意事项(含护理事项)",
+                "6.拟施麻醉方式", "7.术前特殊准备", "8.主要术中、术后风险及防范措施", "9.术中、术后注意事项(含护理事项)",
+                "术前诊断", "手术指征", "拟施手术名称及方式", "拟施麻醉方式", "其他术前相关情况", "注意事项",
+                "经治医师签名", "经治医师签字时间", "主刀医师签名", "医生签名", "主刀医师签字时间", "签字时间");
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
+        CommonAnalysisUtil.processType(map, "5.计划性多次手术");
+        CommonAnalysisUtil.processType(map, "5.本次手术是否属于计划性多次手术");
+        CommonAnalysisUtil.processType(map, "讨论方式");
+        CommonAnalysisUtil.makeEmpty(map, "主刀医生签名");
+        // 解决医生签名显示 年 月 日 时 分
+        signatureTime(map);
+    }
+
+    /**
+     * 解决医生签名时间显示 年 月 日 时 分
+     *
+     * @param map
+     */
+    private void signatureTime(Map<String, String> map) {
+        String goCureDoctor = map.get("经治医师签字时间");
+        String operateDoctor = map.get("主刀医师签字时间");
+        if (StringUtil.isNotBlank(goCureDoctor) && goCureDoctor.contains("年 月 日 时 分")) {
+            map.put("经治医师签字时间", goCureDoctor.replace("年 月 日 时 分", ""));
+        }
+        if (StringUtil.isNotBlank(operateDoctor) && operateDoctor.contains("年 月 日 时 分")) {
+            map.put("主刀医师签字时间", operateDoctor.replace("年 月 日 时 分", ""));
+        }
+    }
+
+}

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

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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:12
+ */
+@Slf4j
+public class NingHaiFuYaoRescueHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "22";
+
+    @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).getElementById("main");
+            analysisGeneral(recTitle,bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.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/ninghaifuyao/util/NingHaiFuYaoStagesSummaryHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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:16
+ */
+@Slf4j
+public class NingHaiFuYaoStagesSummaryHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "28";
+
+    @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).getElementById("main");
+            analysisGeneral(recTitle, bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录","医生签名","医师签名"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,97 @@
+package com.lantone.qc.trans.ninghaifuyao.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.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.nodes.Node;
+import org.jsoup.select.Elements;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 自定义病程记录html解析
+ * @author: HUJING
+ * @time: 2020/9/15 10:28
+ */
+@Slf4j
+public class NingHaiFuYaoThreeLevelWardHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "4";
+
+    @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);
+            Element bigDivElement = doc.selectFirst("body").child(0).getElementById("main");
+            if (bigDivElement.childNodeSize() == 1) {
+                bigDivElement = bigDivElement.child(0);
+            }
+            if (bigDivElement.selectFirst("hr") != null) {
+                bigDivElement.selectFirst("hr").previousElementSiblings().remove();
+            }
+            String htmlText = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+            htmlText = htmlText.replace("注意:上级医师查房主要记 录:患者病情、诊断、鉴别诊断、当前治疗措施和疗效的分析及下一步诊疗意见等,能反应上级医 师的水平。", "")
+                    .replace("提醒:有创诊疗操作记录内容包括操作名称、时间、步骤、结果及患者的一般情况,记录操作过 程是否顺利,有无不良反应,术后注意事项,操作医师签名、记录时间等。 手术室完成的、治疗性质的及全麻下完成的有创诊疗操作参照手术管理。(包括介入治疗、胃肠镜 下肿瘤切除/粘膜下肿瘤剥除等)", "");
+            CommonAnalysisUtil.NHExtractWardInfo(recTitle, htmlText, structureMap);
+            String bqjlText = "病情记录" + structureMap.get("病情记录");
+            List<String> titles = Lists.newArrayList(
+                    "病情记录","医生签名","医师签名"
+            );
+            titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+            CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, structureMap);
+            NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+    /**
+     * 将html内容以行为单位存进list,从<hr>之后开始处理
+     *
+     * @param html 原始html内容
+     * @return
+     */
+    public static List<String> html2List(String html, boolean existHr) {
+        List<String> htmlText = Lists.newArrayList();
+        Document document = Jsoup.parse(html);
+        Element body = document.select("body").first();
+        List<Node> nodes = body.childNodes();
+        List<Node> subNodes = nodes.get(0).childNodes();
+        boolean findNode = false;
+        for (Node node : subNodes) {
+            if ("hr".equals(node.nodeName())) {
+                findNode = true;
+                continue;
+            }
+            if (findNode || !existHr) {
+                String title = node.attr("title");
+                if ("main".equals(title)) {
+                    Element element = (Element) node;
+                    Elements elements = element.select("div");
+                    for (Element e : elements) {
+                        String text = e.text();
+                        if (text.length() > 150) {
+                            continue;
+                        }
+                        htmlText.add(text);
+                    }
+                }
+            }
+        }
+        if (htmlText.get(0).length() > 200) {
+            htmlText.remove(0);
+        }
+        return htmlText;
+    }
+
+}

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

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.ninghaifuyao.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:20
+ */
+@Slf4j
+public class NingHaiFuYaoTransferIntoHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "26";
+
+    @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).getElementById("main");
+            analysisGeneral(recTitle, bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录" + map.get("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录", "医师签名", "医师签字"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+    }
+
+}

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

@@ -0,0 +1,65 @@
+package com.lantone.qc.trans.ninghaifuyao.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:22
+ */
+@Slf4j
+public class NingHaiFuYaoTransferOutHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis {
+
+    private String modeId = "27";
+
+    @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).getElementById("main");
+            analysisGeneral(recTitle, bigDivElement, map);
+            NingHaiFuYaoHtmlAnalysisUtil.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 = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录" + map.get("病情记录").replace("年   月   日   时   分 ","");
+        List<String> titles = Lists.newArrayList(
+                "病情记录",
+                "医师签名",
+                "签名时间",
+                "患者签名",
+                "签名时间"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
+        List<String> tits = Lists.newArrayList(
+                "签名时间",
+                "患者签名"
+        );
+        tits = CommonAnalysisUtil.sortTitlesNoColon(tits, text);
+        CommonAnalysisUtil.cutByTitlesNoColon(text, tits, 0, map);
+    }
+}

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

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

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

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

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

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

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

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

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

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

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

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

+ 11 - 4
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouBeHospitalizedDocTrans.java

@@ -1,10 +1,19 @@
 package com.lantone.qc.trans.taizhou;
 
-import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
 import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
-import com.lantone.qc.pub.model.label.*;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.FamilyLabel;
+import com.lantone.qc.pub.model.label.MaritalLabel;
+import com.lantone.qc.pub.model.label.MenstrualLabel;
+import com.lantone.qc.pub.model.label.PacsLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PersonalLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.model.label.VitalLabel;
+import com.lantone.qc.pub.model.label.VitalLabelSpecial;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.pub.util.StringUtil;
@@ -71,7 +80,6 @@ public class TaiZhouBeHospitalizedDocTrans extends ModelDocTrans {
             "出生时间=出生日期",
             "病人出生日期=出生日期",
             "新生儿出生日期=出生日期",
-//            "出生地址=户口地址",
             "本人电话=电话",
             "联系电话=联系人电话",
             "入院日期=入院日期",
@@ -88,7 +96,6 @@ public class TaiZhouBeHospitalizedDocTrans extends ModelDocTrans {
             "修正诊断=修正诊断",
             "医生=医师签名",
             "补充诊断=补充诊断",
-//            "户口地址=联系地址",
             "家属提供的信息可信吗=病史可靠性",
             "入院诊断(中医疾病)=中医诊断",
             "长期用药情况(包括可能成瘾的药物)=长期用药",

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

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