浏览代码

修改html解析代码

lipc 3 年之前
父节点
当前提交
5676436ef5
共有 64 个文件被更改,包括 3817 次插入1658 次删除
  1. 52 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ADLGradeDocTrans.java
  2. 38 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/AnesthesiaRecordDocTrans.java
  3. 50 359
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java
  4. 38 23
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java
  5. 41 39
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicalBloodDocTrans.java
  6. 133 100
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java
  7. 36 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/CrisisInfoDocTrans.java
  8. 36 18
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/CrisisValueReportDocTrans.java
  9. 40 23
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/CriticallyIllNoticeDocTrans.java
  10. 35 32
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathCaseDiscussDocTrans.java
  11. 36 30
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathRecordDocTrans.java
  12. 37 44
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java
  13. 5 1
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DoctorAdviceDocTrans.java
  14. 72 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DutyShiftSystemDocTrans.java
  15. 48 44
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java
  16. 20 220
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstPageRecordDocTrans.java
  17. 0 16
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/InformedConsentDocTrans.java
  18. 54 18
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/LeaveHospitalDocTrans.java
  19. 36 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/LisDocTrans.java
  20. 5 1
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/MedicalRecordInfoDocTrans.java
  21. 0 21
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/NoticeOfConversationDocTrans.java
  22. 189 199
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/OperationDocTrans.java
  23. 5 1
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/OutDepDocTrans.java
  24. 36 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/PacsDocTrans.java
  25. 0 52
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/PathologyShipDocTrans.java
  26. 34 45
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/RescueDocTrans.java
  27. 0 51
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/SeriouslyIllNoticeDocTrans.java
  28. 36 36
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/StagesSummaryDocTrans.java
  29. 179 176
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ThreeLevelWardDocTrans.java
  30. 139 84
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/TransferRecordDocTrans.java
  31. 52 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/VTEGradeDocTrans.java
  32. 32 18
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/WenfuyiDocTrans.java
  33. 41 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ADLGradeHtmlAnalysis.java
  34. 138 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/BeHospitalizedHtmlAnalysis.java
  35. 71 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicBloodEffectHtmlAnalysis.java
  36. 51 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicalBloodHtmlAnalysis.java
  37. 120 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationHtmlAnalysis.java
  38. 55 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationRecordHtmlAnalysis.java
  39. 56 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/CrisisValueReportHtmlAnalysis.java
  40. 49 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/CriticallyIllNoticeHtmlAnalysis.java
  41. 47 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DeathCaseDiscussHtmlAnalysis.java
  42. 45 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DeathRecordHtmlAnalysis.java
  43. 68 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DifficultCaseDiscussHtmlAnalysis.java
  44. 56 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DutyShiftSystemHtmlAnalysis.java
  45. 50 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/FirstCourseRecordHtmlAnalysis.java
  46. 52 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/LeaveHospitalHtmlAnalysis.java
  47. 65 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationHtmlAnalysis.java
  48. 51 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationRecordHtmlAnalysis.java
  49. 83 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/PreoperativeHtmlAnalysis.java
  50. 49 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/RescueHtmlAnalysis.java
  51. 51 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/StagesSummaryHtmlAnalysis.java
  52. 92 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ThreeLevelWardHtmlAnalysis.java
  53. 56 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/TransferIntoHtmlAnalysis.java
  54. 65 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/TransferOutHtmlAnalysis.java
  55. 41 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/VTEGradeHtmlAnalysis.java
  56. 14 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/WenFuYiHtmlAnalysis.java
  57. 243 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/WenFuYiHtmlAnalysisUtil.java
  58. 0 7
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/XmlAnalysis.java
  59. 12 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzAnalysis.java
  60. 41 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzClinicalBloodAnalysis.java
  61. 21 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzDeathCaseDiscussAnalysis.java
  62. 40 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzOperationRecordAnalysis.java
  63. 337 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzXmlAnalysis.java
  64. 143 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/util/EzXmlUtil.java

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ADLGradeDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.wenfuyi.util.ADLGradeHtmlAnalysis;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: ADLGradeDocTrans
+ * @Description: ADL评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class ADLGradeDocTrans 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("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();
+                ADLGradeHtmlAnalysis adlGradeHtmlAnalysis = new ADLGradeHtmlAnalysis();
+                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;
+    }
+}

+ 38 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/AnesthesiaRecordDocTrans.java

@@ -0,0 +1,38 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * @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;
+    }
+}

+ 50 - 359
trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java

@@ -1,385 +1,76 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
-import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
 import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
-import com.lantone.qc.pub.model.label.*;
-import com.lantone.qc.pub.model.vo.BehospitalInfoVO;
 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.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.BeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.collections.MapUtils;
 
 import java.util.List;
 import java.util.Map;
 
 /**
- * @Description:入院记录文档生成
- * @Author:liuqq
- * @time: ${DATE} ${TIME}
- **/
+ * @Description: 入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/5 15:47
+ */
 @Slf4j
 public class BeHospitalizedDocTrans extends ModelDocTrans {
 
-    private String modeId = "1";
-
     @Override
     public BeHospitalizedDoc extract(MedrecVo medrecVo) {
-        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
-        String content = contentMap.get("xmlText").toString();
-        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
-        BehospitalInfoVO behospitalInfoVO = specialStorageUtil.getBehospitalInfoThreadLocal().get();
-        Map<String, String> structureMap = null;
-        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
-            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
-        } else {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.behospitalInfoXmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            String text = sourceMap.get("原始文本").replace(":", ":").replaceAll("■", "");
-            List<String> titles = Lists.newArrayList(
-                    "其    它","一般情况","关系","可靠程度","可 靠 度",
-                    "住    址","电    话","出 生 地","生    于","入 院 于",
-                    "既往史","主    诉","陈 述 者","籍    贯","记录日期",
-                    "民    族","入院时间","年    龄","联系电话");//"供 史 者",
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-            OrdinaryAssistant.removeBlank(structureMap);
-        }
-        BeHospitalizedDoc beHospitalizedDoc = beHospitalizedDocGen(structureMap); // 不走共用
-        beHospitalizedDoc.setPageData((Map) structureMap);
-        return beHospitalizedDoc;
-    }
-
-    private void mapJoin(Map<String, String> sourceMap, Map<String, String> dailyTrans) {
-        dailyTrans.forEach((k, v) -> {
-            if (!sourceMap.containsKey(k)) {
-                sourceMap.put(k, v);
+        BeHospitalizedDoc beHospitalizedDoc = null;
+        try {
+            /*Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("htmlText").toString();*/
+            List<Map> map = (List<Map>) medrecVo.getContent().get("content");
+            StringBuffer sb = new StringBuffer();
+            Map<String, Object> contentMap = null;
+            if (map.size() > 1) {
+                for (Map<String, Object> a : map) {
+                    sb.append(a.get("htmlText"));
+                    if (a.get("recTitle").toString().contains("(一)") || a.get("recTitle").toString().contains("(一)")) {
+                        contentMap = a;
+                    }
+                }
+            } else {
+                contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
             }
-        });
-    }
-
-    private List<String> keyContrasts = Lists.newArrayList(
-            "患者姓名=姓名","病人姓名=姓名","生于=出生日期","电话=联系电话",
-            "国籍=籍贯",
-            "性别=性别",
-            "病人性别=性别",
-            "患者现住址=住址",
-            "患者年龄=年龄","病人年龄=年龄",
-            "工作单位名称=工作单位",
-            "婚姻状况=婚姻","婚姻=婚姻",
-            "供史者=病史陈述者","陈述者=病史陈述者",
-            "入院诊断=初步诊断","初步诊断西医诊断名称=初步诊断",
-            "医师签名=记录医生",
-            "记录医师签名=记录医生",
-            "签名时间=记录时间",
-            "记录医师签名日期=记录时间"
-    );
-    /*
-     "初步诊断医师=初步诊断医师签名",
-            "修正诊断医师=修正诊断医师签名",
-            "补充诊断医师=补充诊断医师签名",
-            "初步诊断时间=初步诊断日期",
-            "补充诊断时间=补充诊断日期",
-            "补充诊断时间=补充诊断日期",
-            "本人姓名=姓名",
-            "病人姓名=姓名",
-            "性别=性别",
-            "病人性别=性别",
-            "年龄=年龄",
-            "民族=民族",
-            "职业=职业",
-            "出生地址=出生地",
-            "出生、生长史=出生生长史",
-            "地址=联系地址",
-            "患者现住址=住址",
-            "工作场所=工作单位",
-            "患者工作单位名称=工作单位",
-            "信息来源=病史陈述者",
-            "病史陈述者=病史陈述者",
-            "陈述者=病史陈述者",
-            "生日=出生日期",
-            "出生时间=出生日期",
-            "病人出生日期=出生日期",
-            "新生儿出生日期=出生日期",
-            //            "出生地址=户口地址",
-            "本人电话=联系电话电话",
-            "入病房时间=入院日期",
-            "入院日期时间=入院日期",
-            "病历日期=记录日期",
-            "主诉=主诉",
-            "现病史=现病史",
-            "内科疾病史(其它)=内科疾病史其它",
-            "一般健康状况=既往健康状况",
-            "婚姻家庭关系和睦=夫妻关系",
-            "体格检查=体格检查",
-            "初步诊断=初步诊断",
-            "修正诊断=修正诊断",
-            "医生=医师签名",
-            "补充诊断=补充诊断",
-            //            "户口地址=联系地址",
-            "家属提供的信息可信吗=病史可靠性",
-            "入院诊断(中医疾病)=中医诊断",
-            "长期用药情况(包括可能成瘾的药物)=长期用药",
-            "体温(口)=体温",
-            "性别代码=性别",
-            "家庭住址=户口地址",
-            "联系人电话号码=联系电话",
-            "家长姓名=联系人",
-            "联系人姓名=联系人",
-            "患者出生地址=出生地",
-
-            "现住址=户口地址",
-            //            "_{K4}=性别",
-            "联系住址=户口地址",
-            "联系地址=户口地址",
-            "患者工作单位名称=户口地址",
-            "出生日期时间=出生日期",
-            //            "医生签名=初步诊断医师签名",
-            "签字日期=初步诊断日期",
-            "供史者=病史陈述者",
-            "无痛人流主诉=主诉",
-            "联系人电话=联系电话",
-            "医师签字时间=初步诊断日期",
-            "医师签名时间=初步诊断日期",
-            "入院诊断编码=初步诊断",
-            "婚姻=婚姻状况",
-            "病史提供者=病史陈述者",
-            "家庭地址=户口地址",
-            "患者手机号码=联系电话",
-            "孕 产次=孕产次",
-            "有/无=产前检查",
-            "末次月经日期=末次月经",
-            "入院诊断1=入院诊断",
-            //            "记录医师=初步诊断医师签名",
-            "修正诊断签名日期=修正诊断日期",
-            "修正诊断一医师签名=修正诊断医师签名",
-            "患者姓名=姓名",
-            "年月日=初步诊断日期",
-            "年月日时分=初步诊断日期",
-            "诊疗经过=诊疗情况",
-            "随访安排=随访计划",
-            "活动能力与生活自理情况=出院医嘱",
-            "患者籍贯新=籍贯",
-            "现住址邮编=邮政编码",
-            "患者签名时间=初步诊断日期",
-            "日期=初步诊断日期",
-            "骨盆外测量=专科检查",
-            "婚姻=婚姻状况",
-            "住址=户口地址",
-            "患者籍贯=出生地",
-            "他=其他",
-            "入院诊断1=初步诊断",
-            "出院诊断1=出院诊断",
-            "主刀医师签名=记录医师",
-            "签名医师=记录医师",
-            "时间=记录时间",
-            "记录时间=记录时间",
-            "诊断和诊断修正=修正诊断"
-     */
-
-
-    /**
-     * 入院记录
-     *
-     * @param structureMap
-     * @return
-     */
-    public static BeHospitalizedDoc beHospitalizedDocGen(Map<String, String> structureMap) {
-        BeHospitalizedDoc beHospitalizedDoc = new BeHospitalizedDoc();
-
-        // 走模型
-        ChiefLabel chiefLabel = new ChiefLabel();
-        chiefLabel.setText(structureMap.get("主诉"));
-        beHospitalizedDoc.setChiefLabel(chiefLabel);
-        if (StringUtil.isBlank(structureMap.get("主诉"))) {
-            beHospitalizedDoc.setChiefLabel(null);
-        }
-
-        // 走模型
-        PresentLabel presentLabel = new PresentLabel();
-        if (StringUtil.isNotBlank(structureMap.get("现病史"))) {
-            presentLabel.setText(structureMap.get("现病史"));
-        } else if (StringUtil.isNotBlank(structureMap.get("入院情况"))) {
-            presentLabel.setText(structureMap.get("入院情况"));
-        }
-        beHospitalizedDoc.setPresentLabel(presentLabel);
-
-        PastLabel pastLabel = new PastLabel();
-        pastLabel.setCrfLabel(false);
-        if (StringUtil.isNotBlank(structureMap.get("既往史"))) {
-            pastLabel.setText(structureMap.get("既往史"));
-        } else if (StringUtil.isNotBlank(structureMap.get("入院情况"))) {
-            pastLabel.setText(structureMap.get("入院情况"));
-        }
-        beHospitalizedDoc.setPastLabel(pastLabel);
-
-        PersonalLabel personalLabel = new PersonalLabel();
-        //        personalLabel.setCrfLabel(false);
-        personalLabel.setText(structureMap.get("个人史"));
-        beHospitalizedDoc.setPersonalLabel(personalLabel);
-        if (StringUtil.isBlank(structureMap.get("个人史"))) {
-            beHospitalizedDoc.setPersonalLabel(null);
-        }
-
-        MaritalLabel maritalLabel = new MaritalLabel();
-        //        maritalLabel.setCrfLabel(false);
-        maritalLabel.setText("婚育史: " + structureMap.get("婚育史"));
-        beHospitalizedDoc.setMaritalLabel(maritalLabel);
-        if (StringUtil.isBlank(structureMap.get("婚育史"))) {
-            beHospitalizedDoc.setMaritalLabel(null);
-        }
-
-        MenstrualLabel menstrualLabel = new MenstrualLabel();
-        //        menstrualLabel.setCrfLabel(false);
-        menstrualLabel.setText("月经史:" + structureMap.get("月经史"));
-        beHospitalizedDoc.setMenstrualLabel(menstrualLabel);
-        if (StringUtil.isBlank(structureMap.get("月经史"))) {
-            beHospitalizedDoc.setMenstrualLabel(null);
-        }
-
-        FamilyLabel familyLabel = new FamilyLabel();
-        //        familyLabel.setCrfLabel(false);
-        familyLabel.setText(structureMap.get("家族史"));
-        beHospitalizedDoc.setFamilyLabel(familyLabel);
-        if (StringUtil.isBlank(structureMap.get("家族史"))) {
-            beHospitalizedDoc.setFamilyLabel(null);
-        }
-
-        VitalLabel vitalLabel = new VitalLabel();
-        //        vitalLabel.setCrfLabel(false);
-        vitalLabel.setText(structureMap.get("体格检查"));
-        beHospitalizedDoc.setVitalLabel(vitalLabel);
-        if (StringUtil.isBlank(structureMap.get("体格检查"))) {
-            beHospitalizedDoc.setVitalLabel(null);
-        }
-
-        VitalLabelSpecial vitalLabelSpecial = new VitalLabelSpecial();
-        //        vitalLabelSpecial.setCrfLabel(false);
-        vitalLabelSpecial.setText(structureMap.get("专科体格检查"));
-        beHospitalizedDoc.setVitalLabelSpecial(vitalLabelSpecial);
-        if (StringUtil.isBlank(structureMap.get("专科体格检查"))) {
-            beHospitalizedDoc.setVitalLabelSpecial(null);
-        }
-
-        // 走模型
-        PacsLabel pacsLabel = new PacsLabel();
-        //        pacsLabel.setCrfLabel(false);
-        pacsLabel.setText(structureMap.get("辅助检查"));
-        beHospitalizedDoc.setPacsLabel(pacsLabel);
-        if (StringUtil.isBlank(structureMap.get("辅助检查"))) {
-            beHospitalizedDoc.setPacsLabel(null);
-        }
-
-        // 走模型
-        DiagLabel initialDiagLabel = new DiagLabel();
-        initialDiagLabel.setText(structureMap.get("初步诊断"));
-        beHospitalizedDoc.setInitialDiagLabel(initialDiagLabel);
-        if (StringUtil.isBlank(structureMap.get("初步诊断"))) {
-            beHospitalizedDoc.setInitialDiagLabel(null);
-        }
-
-        // 走模型
-        DiagLabel revisedDiagLabel = new DiagLabel();
-        revisedDiagLabel.setText(structureMap.get("修正诊断"));
-        beHospitalizedDoc.setRevisedDiagLabel(revisedDiagLabel);
-        if (StringUtil.isBlank(structureMap.get("修正诊断"))) {
-            beHospitalizedDoc.setRevisedDiagLabel(null);
-        }
-
-        // 走模型
-        DiagLabel suppleDiagLabel = new DiagLabel();
-        suppleDiagLabel.setText(structureMap.get("补充诊断"));
-        beHospitalizedDoc.setSuppleDiagLabel(suppleDiagLabel);
-        if (StringUtil.isBlank(structureMap.get("补充诊断"))) {
-            beHospitalizedDoc.setSuppleDiagLabel(null);
+            String content = sb.toString();
+            Map<String, String> structureMap = null;
+            if (map.get(0).get("isParsed") != null && "1".equals(map.get(0).get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new BeHospitalizedHtmlAnalysis();
+                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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)) {
+                beHospitalizedDoc = ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                beHospitalizedDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
         }
-
-        beHospitalizedDoc.setStructureMap(structureMap);
-
         return beHospitalizedDoc;
     }
 
-    /**
-     * 给structureMap添加一个key(映射)
-     *
-     * @param structureMap
-     * @param target       需要用到的key
-     * @param source       structureMap中含有的key
-     */
-    protected void addKeyMapping(Map<String, String> structureMap, String target, String source) {
-        if (StringUtils.isEmpty(structureMap.get(target)) && StringUtils.isNotEmpty(structureMap.get(source))) {
-            structureMap.put(target, structureMap.get(source));
-        }
-    }
+    private List<String> keyContrasts = Lists.newArrayList(
+            "单位=工作单位",
+            "户口地址=籍贯"
 
-    /**
-     * 日间病历解析全用切词方式
-     *
-     * @param text
-     * @param behDeptId
-     */
-    private Map<String, String> dailyTrans(String text, String behDeptId) {
-        Map<String, String> parseMap = Maps.newHashMap();
-        List<String> titles = Lists.newArrayList();
-        switch (behDeptId) {
-            case "51923":
-                titles = Lists.newArrayList("姓名", "出生日期", "出生地", "其他", "辅助检查", "与患者关系", "性别",
-                        "年龄", "职业", "入院时间", "婚姻", "出院时间", "民族", "身份证号", "联系电话", "邮政编码",
-                        "工作单位", "联系地址", "病史提供者", "病史陈述者", "主诉", "入院情况", "月 经 史", "婚 育 史", "体格检查", "妇科检查", "入院诊断", "诊疗情况",
-                        "诊疗经过", "出院情况", "出院诊断", "出院医嘱", "医师签名", "记录医师", "主刀医师签名",
-                        "记录时间", "时间");
-                break;
-            case "52883":
-                titles = Lists.newArrayList("姓名", "出生日期", "出生地", "其他", "辅助检查", "与患者关系", "性别",
-                        "年龄", "职业", "入院时间", "婚姻", "出院时间", "民族", "身份证号", "联系电话", "邮政编码",
-                        "工作单位", "联系地址", "病史提供者", "病史陈述者", "主诉", "入院情况", "入院诊断", "诊疗情况",
-                        "诊疗经过", "出院情况", "出院诊断", "出院医嘱", "注意事项", "出院带药", "随访计划", "医师签名",
-                        "记录医师", "记录时间", "时间");
-                break;
-            case "52903":
-                titles = Lists.newArrayList("姓名", "出生日期", "出生地", "其他", "辅助检查", "与患者关系", "性别",
-                        "年龄", "职业", "入院时间", "婚姻", "出院时间", "民族", "身份证号", "联系电话", "邮政编码",
-                        "工作单位", "联系地址", "病史提供者", "病史陈述者", "主诉", "入院情况", "入院诊断", "诊疗情况",
-                        "诊疗经过", "出院情况", "出院诊断", "出院医嘱", "注意事项", "出院带药", "随访计划", "医师签名",
-                        "记录医师", "记录时间", "时间");
-                break;
-            case "52923":
-                titles = Lists.newArrayList("姓名", "出生日期", "出生地", "其他", "辅助检查", "与患者关系", "性别",
-                        "年龄", "职业", "入院时间", "婚姻", "出院时间", "民族", "身份证号", "联系电话", "邮政编码",
-                        "工作单位", "联系地址", "病史提供者", "病史陈述者", "主诉", "入院情况", "入院诊断", "诊疗情况",
-                        "诊疗经过", "出院情况", "出院诊断", "出院医嘱", "注意事项", "出院带药", "随访计划", "医师签名",
-                        "记录医师", "记录时间", "时间");
-                break;
-            case "53523":
-                titles = Lists.newArrayList("姓名", "出生日期", "出生地", "其他", "辅助检查", "与患者关系", "性别",
-                        "年龄", "职业", "入院时间", "婚姻", "出院时间", "民族", "身份证号", "联系电话", "邮政编码",
-                        "工作单位", "联系地址", "病史提供者", "病史陈述者", "主诉", "入院情况", "入院诊断", "诊疗情况",
-                        "诊疗经过", "出院情况", "出院诊断", "出院医嘱", "注意事项", "出院带药", "随访计划", "医师签名",
-                        "记录医师", "记录时间", "时间");
-                break;
-        }
-        titles = CommonAnalysisUtil.sortTitles(titles, text);
-        CommonAnalysisUtil.cutByTitles(text, titles, 0, parseMap);
-        return parseMap;
-    }
+    );
 
-    private String modifyDiagKey(String text, String key) {
-        if (text.contains(key + ":")) {
-            text = text.replaceFirst("医师签名", key + "医师");
-            text = text.replaceFirst("日期", key + "时间");
-        }
-        return text;
-    }
-}
+}

+ 38 - 23
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java

@@ -1,58 +1,73 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.wenfuyi.util.ClinicBloodEffectHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 ClinicBloodEffectDocTrans extends ModelDocTrans {
-    private String modeId = "32";
 
     @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 -> {
-            retList.add(getClinicBloodEffectDoc(contentMap));
+            try {
+                ClinicBloodEffectDoc clinicBloodEffectDoc = getClinicalBloodDoc(contentMap);
+                if (clinicBloodEffectDoc != null) {
+                    retList.add(clinicBloodEffectDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
-    private ClinicBloodEffectDoc getClinicBloodEffectDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+    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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis beiLunHtmlAnalysis = new ClinicBloodEffectHtmlAnalysis();
+            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;
         }
-
-        ClinicBloodEffectDoc clinicBloodEffectDoc = new ClinicBloodEffectDoc();
-        clinicBloodEffectDoc.setStructureMap(structureMap);
-        clinicBloodEffectDoc.setPageData((Map) structureMap);
-
-        return clinicBloodEffectDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "病程时间=病历日期",
-            "病程标题=病程标题",//提示:页面暂时缺少对应的展示列
-            "病程内容=评估结论",
-            "记录医师签名=评估医师"
+            "病历标题=标题",
+            "病情记录=病历内容"
     );
-}
+
+}

+ 41 - 39
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicalBloodDocTrans.java

@@ -1,75 +1,77 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.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.wenfuyi.util.ClinicalBloodHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 ClinicalBloodDocTrans extends ModelDocTrans {
-    private String modeId = "10";
 
     @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 -> {
-            retList.add(getClinicalBloodDoc(contentMap));
+            try {
+                ClinicalBloodDoc clinicalBloodDoc = getClinicalBloodDoc(contentMap);
+                if (clinicalBloodDoc != null) {
+                    retList.add(clinicalBloodDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis beiLunHtmlAnalysis = new ClinicalBloodHtmlAnalysis();
+            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)) {
-            String CliBDateStr = structureMap.get("输血日期");
-            if (StringUtil.isNotBlank(CliBDateStr) && CliBDateStr.length() == 39) {
-                structureMap.put("输注开始", CliBDateStr.substring(0, 19));
-                structureMap.put("输注结束", CliBDateStr.substring(20));
-            }
+            ClinicalBloodDoc clinicalBloodDoc = ModelDocGenerate.clinicalBloodDocGen(structureMap);
+            clinicalBloodDoc.setText(CommonAnalysisUtil.html2String(content));
+            clinicalBloodDoc.setPageData((Map) structureMap);
+            return clinicalBloodDoc;
+        } else {
+            return null;
         }
-
-        ClinicalBloodDoc clinicalBloodDoc = new ClinicalBloodDoc();
-        clinicalBloodDoc.setStructureMap(structureMap);
-        clinicalBloodDoc.setPageData((Map) structureMap);
-        return clinicalBloodDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            /*"开始时间=输注开始",
-            "医生=记录医生",
-            "记录医师=记录医生",
-            "结束时间=输注结束",
-            "内容=输注后效果评价",
-            "输血原因(可多选)=输注原因",
-            "ABO=血型",
-            "医师签名=记录医生",
-            "记录医师签名=记录医生",
-            "病程时间=记录时间",
-            "病情内容=病历内容",
-            "病程内容=病历内容"*/
-            "病程时间=病历日期",
-            "病程标题=标题",
-            "病程内容=病历内容",
-            "记录医师签名=记录医生",
-            "病程时间=记录时间"
+            "病历标题=标题",
+            "输注成分=输注种类、血型、数量",
+            "输血过程=输注过程",
+            "病情记录=病历内容"
     );
-}
+
+}

+ 133 - 100
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java

@@ -3,8 +3,6 @@ package com.lantone.qc.trans.wenfuyi;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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;
@@ -14,8 +12,13 @@ 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.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.ConsultationHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.ConsultationRecordHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
 
 import java.util.List;
 import java.util.Map;
@@ -23,20 +26,17 @@ import java.util.Set;
 
 /**
  * @Description: 会诊文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
  */
+@Slf4j
 public class ConsultationDocTrans extends ModelDocTrans {
-    /**
-     * 会诊记录包含3个模块:会诊申请单,会诊结果单,会诊记录
-     * 配套放置,华卓需要注意顺序问题,没有字段可以关联,我们做不到check
-     *
-     * @param medrecVo
-     * @return
-     */
+
     @Override
     public List<ConsultationDoc> extract(MedrecVo medrecVo) {
         List<ConsultationDoc> retList = Lists.newArrayList();
 
-        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        Map<String, List<Object>> contentMap = (Map) medrecVo.getContent().get("content");
         if (contentMap == null) {
             return retList;
         }
@@ -72,56 +72,51 @@ public class ConsultationDocTrans extends ModelDocTrans {
         int index = 1;
         String consultationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            consultationName = index + "";
-            ConsultationRecordDoc consultationRecordDoc = getConsultationRecordDoc(contentMap);
-            consultationRecordDoc.setConsultationName(consultationName);
-            retMap.put(consultationName, consultationRecordDoc);
-            index++;
+            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 modeId = "7";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-
-            //按指定标题切词
-            List<String> titles = Lists.newArrayList("记录医师", "会诊意见的执行情况", "会诊医师",
-                    "会诊科室", "会诊时间", "会诊意见");
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationRecord_keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new ConsultationRecordHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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;
         }
-
-        ConsultationRecordDoc consultationRecordDoc = new ConsultationRecordDoc();
-        consultationRecordDoc.setStructureMap(structureMap);
-        consultationRecordDoc.setPageData((Map) structureMap);
-        return consultationRecordDoc;
     }
 
-    // 会诊记录映射字段
     private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
-            "会诊意见的执行情况=会诊情况",
-            "记录医师=记录医生",
-            "病程时间=记录时间"
-            /*"事件日期=记录时间",
-            "医生=记录医师",
-            "会诊意见的执行情况=会诊情况",
-            "记录医师签名=记录医生",
-            "记录医师=记录医生"*/
+            "执行情况=会诊情况"
     );
 
 
@@ -134,55 +129,67 @@ public class ConsultationDocTrans extends ModelDocTrans {
         int index = 1;
         String consultationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            consultationName = index + "";
-            ConsultationResultsDoc consultationResultsDoc = getConsultationResultsDoc(contentMap);
-            consultationResultsDoc.setConsultationName(consultationName);
-            retMap.put(consultationName, consultationResultsDoc);
-            index++;
+            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 modeId = "31";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            List<String> titles = Lists.newArrayList("会诊记录", "会诊科室", "会诊医师", "会诊意见",
-                    "会诊后采取措施", "记录医师", "会诊原因","会诊时间","记录时间");
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationResults_keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new ConsultationHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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;
         }
-
-        ConsultationResultsDoc consultationResultsDoc = new ConsultationResultsDoc();
-        consultationResultsDoc.setStructureMap(structureMap);
-        consultationResultsDoc.setPageData((Map) structureMap);
-        return consultationResultsDoc;
     }
 
-    // 会诊结果映射字段
-    private List<String> consultationResults_keyContrasts = Lists.newArrayList(
-         /*   "会诊诊断=当前诊断",
-            "事件日期1(会诊申请日期)=申请日期",
-            "医生=医师签名",
-            "本人姓名=姓名",
-            "病史描述=病史回顾描述",
-            "病历日期=会诊日期及时间",
-            "记录及建议=会诊意见",
-            "临床科室1=申请科室",
-            "申请医生1=申请医生"*/
-//            "会诊记录","会诊科室","会诊医师","会诊意见","会诊后采取措施","记录医师"
+    private List<String> consultationResults_pageDataTitles = Lists.newArrayList(
+            "科室=科别",
+            "专业=科别",
+            "申请会诊科别=申请科室",
+            "申请时间=申请日期",
+            "会诊日期=申请日期",
+            //"会诊诊断=当前诊断",
+            "患者病情及诊疗经过、申请会诊的理由及目的=会诊目的",
+            "病情摘要=会诊目的",
+            "出生年月=出生日期",
+            "床位=床号",
+            "外来专家意见=会诊意见",
+            "由受邀医生填写,本次会诊是否必要=由受邀医生填写本次会诊是否必要",
+            "单位=会诊医师所在医疗机构名称",
+            "记录医师"
     );
 
 
@@ -195,7 +202,7 @@ public class ConsultationDocTrans extends ModelDocTrans {
         int index = 1;
         String consultationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
             consultationName = index + "";
@@ -208,34 +215,60 @@ public class ConsultationDocTrans extends ModelDocTrans {
     }
 
     private ConsultationApplicationDoc getConsultationApplicationDoc(Map<String, Object> contentMap) {
-        String modeId = "30";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationApplication_keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new ConsultationHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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 = new ConsultationApplicationDoc();
-        consultationApplicationDoc.setStructureMap(structureMap);
+        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/wenfuyi/CrisisInfoDocTrans.java

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

+ 36 - 18
trans/src/main/java/com/lantone/qc/trans/wenfuyi/CrisisValueReportDocTrans.java

@@ -1,54 +1,72 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.wenfuyi.util.CrisisValueReportHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 CrisisValueReportDocTrans extends ModelDocTrans {
-    private String modeId = "23";
 
     @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 -> {
-            retList.add(getCrisisValueReportDoc(contentMap));
+            try {
+                CrisisValueReportDoc crisisValueReportDoc = getCrisisValueReportDoc(contentMap);
+                if (crisisValueReportDoc != null) {
+                    retList.add(crisisValueReportDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private CrisisValueReportDoc getCrisisValueReportDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new CrisisValueReportHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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;
         }
-
-        CrisisValueReportDoc crisisValueReportDoc = new CrisisValueReportDoc();
-        crisisValueReportDoc.setStructureMap(structureMap);
-        crisisValueReportDoc.setPageData((Map) structureMap);
-
-        return crisisValueReportDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "病历日期=记录时间"
+            "病情记录=病情分析及处理"
     );
-}
+
+}

+ 40 - 23
trans/src/main/java/com/lantone/qc/trans/wenfuyi/CriticallyIllNoticeDocTrans.java

@@ -1,58 +1,75 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.wenfuyi.util.CriticallyIllNoticeHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 CriticallyIllNoticeDocTrans extends ModelDocTrans {
-    private String modeId = "25";
 
     @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 -> {
-            retList.add(getCriticallyIllNoticeDoc(contentMap));
+            try {
+                CriticallyIllNoticeDoc criticallyIllNoticeDoc = getCriticallyIllNoticeDoc(contentMap);
+                if (criticallyIllNoticeDoc != null) {
+                    retList.add(criticallyIllNoticeDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            List<String> titles = Lists.newArrayList("防范措施","","目前病情");
-            String text = sourceMap.get("原始文本");
-            titles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
-
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new CriticallyIllNoticeHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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;
         }
-
-        CriticallyIllNoticeDoc criticallyIllNoticeDoc = new CriticallyIllNoticeDoc();
-        criticallyIllNoticeDoc.setStructureMap(structureMap);
-        criticallyIllNoticeDoc.setPageData((Map) structureMap);
-
-        return criticallyIllNoticeDoc;
     }
 
-    private List<String> keyContrasts = Lists.newArrayList();
-}
+    private List<String> keyContrasts = Lists.newArrayList(
+            "临床诊断=当前诊断",
+            "患方签名=患者签名"
+    );
+
+}

+ 35 - 32
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathCaseDiscussDocTrans.java

@@ -1,57 +1,60 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.pub.util.MapUtil;
 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.wenfuyi.util.DeathCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 DeathCaseDiscussDocTrans extends ModelDocTrans {
-    private String modeId = "3";
 
     @Override
     public DeathCaseDiscussDoc extract(MedrecVo medrecVo) {
-        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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        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();
+                WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new DeathCaseDiscussHtmlAnalysis();
+                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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);
         }
-
-        MapUtil.keyAssig(structureMap, "参加讨论人员", "参加人员及职称医生", "参加人员及职称");
-        DeathCaseDiscussDoc deathCaseDiscussDoc = new DeathCaseDiscussDoc();
-        deathCaseDiscussDoc.setStructureMap(structureMap);
-        deathCaseDiscussDoc.setPageData((Map) structureMap);
-
         return deathCaseDiscussDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "主持人=讨论主持人",
-            "死亡日期=死亡时间",
-            "讨论意见=讨论内容",
-            "现病史- 发病情况=入院情况",
-            "医生=记录医师",
-            "本人姓名=姓名",
-            "事件日期=讨论时间",
-            "当前诊断=死亡诊断",
-            "病历日期=记录时间",
-            "讨论小结=结论"
+            "主持人(科主任正职)签名=主持人签名"
     );
-}
+
+}

+ 36 - 30
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathRecordDocTrans.java

@@ -1,55 +1,61 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.wenfuyi.util.DeathRecordHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 DeathRecordDocTrans extends ModelDocTrans {
-    private String modeId = "24";
 
     @Override
     public DeathRecordDoc extract(MedrecVo medrecVo) {
-        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        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();
+                WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new DeathRecordHtmlAnalysis();
+                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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);
         }
-
-        DeathRecordDoc deathRecordDoc = new DeathRecordDoc();
-        deathRecordDoc.setStructureMap(structureMap);
-        deathRecordDoc.setPageData((Map) structureMap);
-
         return deathRecordDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "当前诊断=死亡诊断",
-            "死亡日期=死亡时间",
-            "初步诊断=入院诊断",
-            "诊治经过=诊疗经过",
-            "本人姓名=姓名",
-            "现病史- 发病情况=发病情况",
-            "病历日期=记录时间",
-            "医生=记录医师",
-            "死亡时间=死亡日期"
     );
-}
+
+}

+ 37 - 44
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java

@@ -1,80 +1,73 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.DifficultCaseDiscussHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 DifficultCaseDiscussDocTrans extends ModelDocTrans {
-    private String modeId = "19";
 
     @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 -> {
-            retList.add(getDifficultCaseDiscussDoc(contentMap));
+            try {
+                DifficultCaseDiscussDoc difficultCaseDiscussDoc = getDifficultCaseDiscussDoc(contentMap);
+                if (difficultCaseDiscussDoc != null) {
+                    retList.add(difficultCaseDiscussDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            List<String> titles = Lists.newArrayList("讨论日期","讨论意见", "地点","主持人","参加人员的姓名及专业技术职务","主持人小结",
-            "记录医师","记录医师签名","主持人签名","汇报病情","讨论目的");
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-        }
-
-        DifficultCaseDiscussDoc difficultCaseDiscussDoc = new DifficultCaseDiscussDoc();
-        difficultCaseDiscussDoc.setStructureMap(structureMap);
-        difficultCaseDiscussDoc.setPageData((Map) structureMap);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new DifficultCaseDiscussHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
 
-        return difficultCaseDiscussDoc;
+            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(
-            /*"医生=记录者",
-            "讨论小结=主持人小结",
-            "讨论意见=具体讨论意见",
-            "讨论日期时间=讨论日期",
-            "本人姓名=姓名",
-            "参加人员及职称(护士)=参加人员的姓名及专业技术职务",
-            "患者姓名=姓名",
-            "性别代码=性别",
-            "年龄 (岁)=年龄",
-            "当前科室=科别",
-            "主持人姓名=主持人姓名及专业技术职务",
-            "参加讨论人员名单=参加人员的姓名及专业技术职务",
-            "讨论内容=具体讨论意见",
-            "讨论时间=讨论日期"*/
-            "病程时间=记录时间",
-            "地点=讨论地点",
-            "主持人=主持人姓名及专业技术职务",
-            "主持人小结=主持人总结",
-            "汇报病情=汇报病史",
-            "讨论意见=讨论发言",
-            "记录医师签名=记录医生"
+            "主持人(科主任或科主任授权的科室副主任)签名=主持人签名"
     );
-}
+
+}

+ 5 - 1
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DoctorAdviceDocTrans.java

@@ -11,8 +11,11 @@ import java.util.Map;
 
 /**
  * @Description: 医嘱信息文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
  */
 public class DoctorAdviceDocTrans extends ModelDocTrans {
+
     @Override
     public List<DoctorAdviceDoc> extract(MedrecVo medrecVo) {
         List<DoctorAdviceDoc> retList = Lists.newArrayList();
@@ -29,4 +32,5 @@ public class DoctorAdviceDocTrans extends ModelDocTrans {
         doctorAdviceDoc.setPageData((Map) content);
         return doctorAdviceDoc;
     }
-}
+
+}

+ 72 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DutyShiftSystemDocTrans.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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.wenfuyi.util.DutyShiftSystemHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+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 DutyShiftSystemDocTrans 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();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new DutyShiftSystemHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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(
+
+    );
+
+}

+ 48 - 44
trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java

@@ -2,20 +2,19 @@ package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.MapUtil;
+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 org.apache.commons.lang3.StringUtils;
+import com.lantone.qc.trans.wenfuyi.util.FirstCourseRecordHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
 
-import java.util.Arrays;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -23,51 +22,56 @@ import static com.lantone.qc.trans.comsis.ModelDocGenerate.structureMapJoin;
 
 /**
  * @Description: 首次病程录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
  */
+@Slf4j
 public class FirstCourseRecordDocTrans extends ModelDocTrans {
-    private String modeId = "2";
+
     @Override
     public FirstCourseRecordDoc extract(MedrecVo medrecVo) {
-        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap;
-        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
-            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
-        } else {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        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();
+                WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new FirstCourseRecordHtmlAnalysis();
+                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    sourceMap = removeSerialNumber(sourceMap);
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                    structureMap.put("标题", recTitle);
+                }
+            }
+            if (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);
         }
-
-        structureMap.put("诊疗计划-crf", MapUtil.getSelectString(structureMap, Arrays.asList(
-                "检查计划",
-                "治疗计划和措施"
-                ))
-        );
-
-        // 诊疗计划
-        FirstCourseRecordDoc firstCourseRecordDoc = ModelDocGenerate.firstCourseRecordDocGen(structureMap);
-        firstCourseRecordDoc.setPageData((Map) structureMap);
-        List<String> keys = Lists.newArrayList("检查计划", "治疗计划", "诊疗计划");
-        String treatPlanJoin = structureMapJoin(structureMap, keys);
-        firstCourseRecordDoc.getTreatPlanLabel().setAiText(treatPlanJoin);
         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(
-            "本人姓名=姓名",
-            "现病史- 发病情况=现病史",
-            "现病史- 发病情况=现病史",
-            "医生=记录医生",
-            "治疗计划和措施=治疗计划",
-            "体温(耳)=体温耳",
-            "体温(口)=体温口",
-            "病程时间=病历日期",
-            "记录医师=记录医生",
-            "病例日期=病历日期",
-            "一般情况=病历内容",
-            "3.鉴别诊断=鉴别诊断",
-            "1.初步诊断=初步诊断",
-            "2.诊断依据=诊断依据","患者基本情况=病历内容"
+            "拟诊讨论诊断依据及鉴别诊断=诊断依据及鉴别诊断"
     );
-}
+
+}

+ 20 - 220
trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstPageRecordDocTrans.java

@@ -1,254 +1,54 @@
 package com.lantone.qc.trans.wenfuyi;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
-import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.ModelDocTrans;
-import com.lantone.qc.trans.comsis.OrdinaryAssistant;
-import org.apache.commons.lang3.StringUtils;
 
-import java.util.List;
 import java.util.Map;
 
 /**
  * @Description: 病案首页文档生成
+ * @author: 胡敬
+ * @time: 2020/3/16 17:47
  */
 public class FirstPageRecordDocTrans extends ModelDocTrans {
-    private String modeId = "6";
 
     @Override
     public FirstPageRecordDoc extract(MedrecVo medrecVo) {
-        // 与长兴一直,直接传json
         Map<String, String> content = (Map) medrecVo.getContent();
         FirstPageRecordDoc firstPageRecordDoc = new FirstPageRecordDoc();
-        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(content, keyContrasts);
-        firstPageRecordDoc.setStructureMap(structureMap);
-        //如果有入院时间,优先使用
-        if (StringUtils.isEmpty(structureMap.get("入院时间")) && StringUtils.isNotEmpty(structureMap.get("病人入院日期"))) {
-            structureMap.put("入院时间", structureMap.get("病人入院日期"));
-        }
+        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.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));
-        //义乌组织机构id存id编号
-        structureExtMap.put("ID编号", FastJsonUtils.getJsonToBean(content.get(Content.hospital_code), Object.class));
-
-        List<Map<String, String>> dischargeDiag = (List) structureExtMap.get(Content.dischargeDiag);
-        if (dischargeDiag != null && dischargeDiag.size() > 0) {
-            for (Map<String, String> diag : dischargeDiag) {
-                String diagCategory = diag.get("诊断类别");
-                if (StringUtil.isNotBlank(diagCategory) && "1".equals(diagCategory)) {
-                    diag.put("诊断类别", "主要诊断");
-                    break;
-                }
-            }
-        }
         //        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;
     }
 
-    private List<String> keyContrasts = Lists.newArrayList(
-            "住院期间身体约束=",
-            "出院日期=",
-            "诊断符合情况=",
-            "手术费=",
-            "入院途径=",
-            "颅脑损伤患者昏迷时间(入院前)=",
-            "住院费用=",
-            "红细胞=",
-            "输血情况=",
-            "入院科室=",
-            "临床诊断项目费=",
-            "血浆=",
-            "主治医生=",
-            "Rh血型=",
-            "护理费=",
-            "住院自付金额=",
-            "手术治疗费=",
-            "细胞因子类制品费=",
-            "综合医疗其他服务费=",
-            "出院科室=",
-            "户口地址邮政编码=",
-            "凝血因子类制品费=",
-            "家庭电话=",
-            "其他费=",
-            "HCV-Ab=",
-            "病案质量=",
-            "治疗用一次性医用材料费=",
-            "质控护士=",
-            "其他=",
-            "离院方式=",
-            "球蛋白类制品费=",
-            "ICD9=",
-            "ICD10=",
-            "确诊日期=",
-            "联系人姓名=",
-            "中医治疗费=",
-            "本人姓名=",
-            "新生儿年龄=",
-            "住院期间是否发生跌倒或坠床=",
-            "出生地址=",
-            "质控日期=",
-            "病历日期=",
-            "实验室诊断费=",
-            "住院医生=",
-            "现住址=",
-            "院内感染诊断=",
-            "非手术治疗项目费=",
-            "手术时数=",
-            "住院期间有无告病危=",
-            "职业=",
-            "病人病案身份=职业",
-            "病人病案性别=性别",
-            "病人病案血型=血型",
-            "感染部位=",
-            "手术日期2=",
-            "质控医师=",
-            "手术医师=",
-            "医院感染=",
-            "医生=",
-            "出院31天内再入院计划=",
-            "新生儿入院体重=",
-            "治疗结果=",
-            "影像学诊断费=",
-            "目的=",
-            "其它疾病治疗结果=",
-            "血型=",
-            "并发症=",
-            "临床路径管理=",
-            //            "临床路径管理 1.完成 2.变异 3.退出 4.未入=临床路径管理",
-            //            "有无药物过敏=药物过敏",
-            //            "单病种管理 1.是 2.否=单病种管理",
-            "现住址电话=现住址电话",
-            "拟接收医疗机构名称=",
-            "科主任=",
-            "中成药费=",
-            "助手II=",
-            "门(急)诊诊断=",
-            "非计划再次手术=",
-            "是否住院期间发生压疮=",
-            "入住ICU情况=",
-            "进修医生=",
-            "损伤中毒的外部因素=",
-            "居住地邮政编码=",
-            "麻醉方式=",
-            "病历号=",
-            "病房(出)=",
-            "入院日期=",
-            "户口地址=",
-            "年龄单位=",
-            "病房(入)=",
-            "病案完成=",
-            "西药费=",
-            "工作场所=",
-            "尸检=",
-            "其它过敏=",
-            "审核人=",
-            "病理诊断=",
-            //            "放射与病理符合=放射与病理",
-            "医院=",
-            "就诊类别=",
-            "籍贯=",
-            //            "门诊与出院符合=门诊与出院",
-            "麻醉医师=",
-            "实习医生=",
-            "HIV-Ab=",
-            "转科科室=",
-            "联系电话=",
-            "病理诊断费=",
-            "事件基本信息=",
-            "血小板=",
-            "年龄=",
-            "并发症情况=",
-            "一般医疗服务费=",
-            "联系人地址=",
-            "过敏史=",
-            "责任护士=",
-            "主任医生=",
-            "床号=",
-            "抗菌药物费用=",
-            "病人基本信息=",
-            "生日=",
-            "切口等级=",
-            "HBsAg=",
-            "手术记录=",
-            "单病种管理=",
-            //            "临床与病理符合=临床与病理",
-            "麻醉费=",
-            "康复费=",
-            "研究生=",
-            "临床科室=",
-            "出生体重1=",
-            "审核=",
-            "检查用一次性医用材料费=",
-            "医疗付费方式=",
-            "其它诊断=",
-            "是否进入临床路径=",
-            //            "入院与出院符合=入院与出院",
-            "诊断治疗信息=",
-            "抢救次数=",
-            "入院诊断=",
-            "户籍住址=",
-            "病理诊断的icd10=",
-            "助手=",
-            "手术操作代码=",
-            "本人电话=",
-            "医疗组=",
-            "手术用一次性医用材料费=",
-            "白蛋白类制品费=",
-            "健康卡号=",
-            "全血=",
-            "民族=",
-            "一般治疗操作费=",
-            "术前诊断与术后诊断=",
-            "其它诊断ICD10=",
-            "病人类别=",
-            "门急诊ICD10=",
-            "中草药费=",
-            "颅脑损伤患者昏迷时间(入院后)=",
-            "关系=",
-            "切口愈合等级=",
-            "居民身份证=",
-            "是否发生压疮=",
-            "编码员=",
-            "血费=",
-            "手术级别=",
-            "成功次数=",
-            "就诊次数=",
-            "婚姻=",
-            "审核日期=",
-            "条码病历号=",
-            "主要诊断=",
-            "住院次数=",
-            "性别=",
-            "损伤诊断icd10=",
-            "入院病情2=",
-            "临床物理治疗费=",
-            "是否完成临床路径=",
-            "手术名称=",
-            "国籍=",
-            "病历状态=",
-            "实际住院天数=",
-            "本人工作单位电话=",
-            "工作单位邮政编码=",
-            "病理号="
-            //            "病人出生日期=出生日期"
-            //            "门诊与出院符合 0.未做 1.符合 2.不符合 3.不确定=门诊与出院",
-            //            "入院与出院符合 0.未做 1.符合 2.不符合 3.不确定=入院与出院",
-            //            "术前与术后符合 0.未做 1.符合 2.不符合 3.不确定=术前与术后",
-            //            "临床与病理符合 0.未做 1.符合 2.不符合 3.不确定=临床与病理",
-            //            "放射与病理符合0.未做 1.符合 2.不符合 3.不确定=放射与病理"
-    );
-}
+}

+ 0 - 16
trans/src/main/java/com/lantone/qc/trans/wenfuyi/InformedConsentDocTrans.java

@@ -1,16 +0,0 @@
-package com.lantone.qc.trans.wenfuyi;
-
-import com.lantone.qc.pub.model.doc.InformedConsentDoc;
-import com.lantone.qc.pub.model.vo.MedrecVo;
-import com.lantone.qc.trans.ModelDocTrans;
-
-/**
- * @Description: 知情同意书
- */
-public class InformedConsentDocTrans extends ModelDocTrans {
-    @Override
-    public InformedConsentDoc extract(MedrecVo medrecVo) {
-        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
-        return informedConsentDoc;
-    }
-}

+ 54 - 18
trans/src/main/java/com/lantone/qc/trans/wenfuyi/LeaveHospitalDocTrans.java

@@ -1,41 +1,77 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.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.wenfuyi.util.WenFuYiHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.LeaveHospitalHtmlAnalysis;
+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 LeaveHospitalDocTrans extends ModelDocTrans {
-    private String modeId = "5";
 
     @Override
     public LeaveHospitalDoc extract(MedrecVo medrecVo) {
-        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        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();
+                WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new LeaveHospitalHtmlAnalysis();
+                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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);
         }
-        LeaveHospitalDoc leaveHospitalDoc = new LeaveHospitalDoc();
-        leaveHospitalDoc.setStructureMap(structureMap);
-        leaveHospitalDoc.setPageData((Map) structureMap);
         return leaveHospitalDoc;
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "时    间=时间"
-
+            "入院诊断(Admittingdiagnosis)=入院诊断",
+            "出院诊断(Dischargediagnosis)=出院诊断",
+            "入院情况(Admissionstatus)=入院情况",
+            "诊疗经过(Hospitalcourse)=诊疗经过",
+            "出院情况(Dischargestatus)=出院情况",
+            "疗效评定(Curativeeffect)=疗效评定",
+            "出院医嘱(Dischargeinstructions)=出院医嘱",
+            "患者/法定监护人/委托代理人签名=患方签名"
     );
-}
+
+}

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/LisDocTrans.java

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

+ 5 - 1
trans/src/main/java/com/lantone/qc/trans/wenfuyi/MedicalRecordInfoDocTrans.java

@@ -9,8 +9,11 @@ import java.util.Map;
 
 /**
  * @Description: 住院病历信息
+ * @author: 胡敬
+ * @time: 2020/6/3 15:45
  */
 public class MedicalRecordInfoDocTrans extends ModelDocTrans {
+
     @Override
     public MedicalRecordInfoDoc extract(MedrecVo medrecVo) {
         Map<String, String> content = (Map) ((List) medrecVo.getContent().get("content")).get(0);
@@ -19,4 +22,5 @@ public class MedicalRecordInfoDocTrans extends ModelDocTrans {
         medicalRecordInfoDoc.setPageData(medrecVo.getContent());
         return medicalRecordInfoDoc;
     }
-}
+
+}

+ 0 - 21
trans/src/main/java/com/lantone/qc/trans/wenfuyi/NoticeOfConversationDocTrans.java

@@ -1,21 +0,0 @@
-package com.lantone.qc.trans.wenfuyi;
-
-import com.lantone.qc.pub.model.doc.NoticeOfConversationDoc;
-import com.lantone.qc.pub.model.vo.MedrecVo;
-import com.lantone.qc.trans.ModelDocTrans;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @Description: 谈话告知书
- */
-public class NoticeOfConversationDocTrans extends ModelDocTrans {
-    @Override
-    public NoticeOfConversationDoc extract(MedrecVo medrecVo) {
-        NoticeOfConversationDoc noticeOfConversationDoc = new NoticeOfConversationDoc();
-        Map<String, List<String>> map = (Map)medrecVo.getContent().get("content");
-        noticeOfConversationDoc.getStructureMap().put("","");
-        return noticeOfConversationDoc;
-    }
-}

+ 189 - 199
trans/src/main/java/com/lantone/qc/trans/wenfuyi/OperationDocTrans.java

@@ -3,17 +3,18 @@ package com.lantone.qc.trans.wenfuyi;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
-import org.apache.commons.lang3.StringUtils;
+import com.lantone.qc.trans.wenfuyi.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.jsoup.Jsoup;
 
 import java.util.List;
 import java.util.Map;
@@ -21,14 +22,12 @@ import java.util.Set;
 
 /**
  * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
  */
+@Slf4j
 public class OperationDocTrans extends ModelDocTrans {
-    /**
-     * 手术文档包含:术后首次病程及谈话记录;手术记录;术前讨论、术前小结;手术知情同意书;手术安全核查表
-     *
-     * @param medrecVo
-     * @return
-     */
+
     @Override
     public List<OperationDoc> extract(MedrecVo medrecVo) {
         List<OperationDoc> retList = Lists.newArrayList();
@@ -42,14 +41,12 @@ public class OperationDocTrans extends ModelDocTrans {
         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("手术安全核查表"));
+        Map<String, OperationSafetyChecklistDoc> operationSafetyChecklistDocMap = getOperationSafetyChecklistDocMap((List) contentMap.get("手术安全核查表"));
 
         Set<String> operationNameSet = Sets.newHashSet();
         operationNameSet.addAll(operationDiscussionDocMap.keySet());
         operationNameSet.addAll(operationRecordDocMap.keySet());
         operationNameSet.addAll(preoperativeDiscussionDocMap.keySet());
-        operationNameSet.addAll(operationInformedConsentDocMap.keySet());
-        //operationNameSet.addAll(operationSafetyChecklistDocMap.keySet());
 
         operationNameSet.forEach(operationName -> {
             OperationDoc operationDoc = new OperationDoc();
@@ -58,9 +55,10 @@ public class OperationDocTrans extends ModelDocTrans {
             operationDoc.setOperationRecordDoc(operationRecordDocMap.get(operationName));
             operationDoc.setPreoperativeDiscussionDoc(preoperativeDiscussionDocMap.get(operationName));
             operationDoc.setOperationInformedConsentDoc(operationInformedConsentDocMap.get(operationName));
-            //operationDoc.setOperationSafetyChecklistDoc(operationSafetyChecklistDocMap.get(operationName));
+            operationDoc.setOperationSafetyChecklistDoc(operationSafetyChecklistDocMap.get(operationName));
             retList.add(operationDoc);
         });
+
         return retList;
     }
 
@@ -74,71 +72,63 @@ public class OperationDocTrans extends ModelDocTrans {
         int index = 1;
         String operationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            operationName = index + "";
-            OperationDiscussionDoc operationDiscussionDoc = getOperationDiscussionDoc(contentMap);
-            operationDiscussionDoc.setOperationName(operationName);
-            retMap.put(operationName, operationDiscussionDoc);
-            index++;
+            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 modeId = "18";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            List<String> titles = Lists.newArrayList(
-                    "术后处理措施","医师签名","患方签名",
-                    "记录医师","术后注意事项","术后处理措施","术后诊断",
-                    "手术方式","麻醉方式","术中诊断","手术结束时间","手术开始时间","手术简要经过",
-                    "手术名称","手术时间","术前诊断","手术医生","助手","手术经过","术后生命体征",
-                    "患者家属签名");
-
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts, modeId);
-
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new OperationHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            if (MapUtils.isNotEmpty(sourceMap)) {
+                structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts);
+                structureMap.put("记录编号", contentMap.get("recId").toString());
+                structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                operationDiscussionDoc = ModelDocGenerate.operationDiscussionDocGen(structureMap);
+                String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(Jsoup.parse(content).selectFirst("body").child(0), true);
+                operationDiscussionDoc.setText(text);
+                operationDiscussionDoc.setPageData((Map) structureMap);
+                return operationDiscussionDoc;
+            } else {
+                return null;
+            }
         }
-
-        OperationDiscussionDoc operationDiscussionDoc = new OperationDiscussionDoc();
-        operationDiscussionDoc.setStructureMap(structureMap);
-        operationDiscussionDoc.setPageData((Map) structureMap);
-
-        return operationDiscussionDoc;
     }
 
     private List<String> operationDiscussion_keyContrasts = Lists.newArrayList(
-            "病程时间=病历日期","病程标题=标题",
-            "本人姓名=姓名",
-            "书写日期=记录时间",
-            "注意事项=术后注意事项",
-            "治疗计划和措施=术后处理措施",
-            "术后注意观察事项=术后注意事项",
-            "手术名称=手术名称方式",
-            "术中诊断=术中后诊断",
-            "术后诊断=术中后诊断",
-            "术后诊疗计划(处理措施)=术后处理措施",
-            "术后谈话=术后注意事项",
-            "记录医师签名=记录医生",
-            "医师签名=记录医生",
-            "签名时间=记录时间",
-            "会诊日期=手术日期",
-            "记录医师=记录医生",
-            "医师签名日期=记录时间",
-            "手术经过=手术简要经过",
-            "术后生命体征=术后注意事项"
+            "主刀/I助签名=主刀医师签名",
+            "患者/法定监护人/委托代理人签名=患方签名"
     );
 
 
@@ -151,76 +141,56 @@ public class OperationDocTrans extends ModelDocTrans {
         int index = 1;
         String operationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            operationName = index + "";
-            OperationRecordDoc operationRecordDoc = getOperationRecordDoc(contentMap);
-            operationRecordDoc.setOperationName(operationName);
-            retMap.put(operationName, operationRecordDoc);
-            index++;
+            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 modeId = "17";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            List<String> titles = Lists.newArrayList("手术开始时间", "手术结束时间","术中诊断","手术简要经过","主    刀",
-                    "第一助手", "第二助手","第三助手","洗手护士", "巡回护士","麻醉方式","手术方式","麻醉医师","手术标本","冰冻切片结果",
-                    "术中并发症","术中失血量","手术经过及处理","手术简要经过","医师签名","主刀医师签名","时间",
-                    "患方签名","记录时间");
-
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationRecord_keyContrasts, modeId);
-            //出血量、输血量有些有ml有些没有,统一一下
-            if(structureMap.containsKey("输血量")){
-                structureMap.put("输血量",structureMap.get("输血量").replaceAll("ml",""));
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new OperationRecordHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
+            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());
             }
-            OrdinaryAssistant.removeBlank(structureMap);
+
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            OperationRecordDoc operationRecordDoc = ModelDocGenerate.operationRecordDocGen(structureMap);
+            operationRecordDoc.setPageData((Map) structureMap);
+            return operationRecordDoc;
+        } else {
+            return null;
         }
-        OperationRecordDoc operationRecordDoc = new OperationRecordDoc();
-        operationRecordDoc.setStructureMap(structureMap);
-        operationRecordDoc.setPageData((Map) structureMap);
-        return operationRecordDoc;
     }
 
-    // 手术记录
     private List<String> operationRecord_keyContrasts = Lists.newArrayList(
-            "病程时间=病历日期","病程标题=标题","麻醉医师=麻醉人员","巡回护士姓名=巡回护士",
-            "待产日期=手术日期",
-            "医生=主刀医师签名",
-            "助手=一助",
-            "本人姓名=姓名",
-            "手术记录手术开始日期=开始时间",
             "手术开始时间=开始时间",
-            "手术记录手术结束日期=结束时间",
-            "手术结束日期时间=结束时间",
             "手术结束时间=结束时间",
-            "术后诊断=术中后诊断",
-            "术中后诊断=术中后诊断",
-            "术中诊断=术中后诊断",
-            "手术记录手术过程=手术经过",
-            "手术简要经过=手术经过",
-            "主刀医师=主刀医师",
-            "Ⅰ助姓名=一助",
-            "Ⅱ助姓名=二助",
-            "手术记录麻醉方式=麻醉方式",
-            "麻醉医师签名=麻醉医师",
-            "主刀医师签名=医师签名",
-            "医师签名=医师签名",
-            "记录时间=医师签名时间",
-            "时间=医师签名时间"
+            "探查(术中所见)=探查术中所见",
+            "手术经过(手术小结)=手术经过",
+            "记录日期=记录时间"
     );
 
 
@@ -233,59 +203,67 @@ public class OperationDocTrans extends ModelDocTrans {
         int index = 1;
         String operationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            operationName = index + "";
-            PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
-            preoperativeDiscussionDoc.setOperationName(operationName);
-            retMap.put(operationName, preoperativeDiscussionDoc);
-            index++;
+            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 modeId = "11";
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            List<String> titles = Lists.newArrayList("简要病情","术前诊断","手术指征","手术禁忌症",
-                    "拟施手术名称和方式","拟施麻醉方式","其他术前相关情况","术中或术后可能发生的并发症","手术风险及防治对策",
-                    "术前与患方谈话及签定手术知情同意书情况","注意事项","术前准备","记录医师","手术名称"
-            );
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new PreoperativeHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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("讨论时间", "手术指征", "注意事项", "术前诊断", "医生签名", "风险及防范措施", "可替代方案", "术前准备", "参加人员");
+
+        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);
         }
-        PreoperativeDiscussionDoc preoperativeDiscussionDoc = new PreoperativeDiscussionDoc();
-        preoperativeDiscussionDoc.setStructureMap(structureMap);
-        preoperativeDiscussionDoc.setPageData((Map) structureMap);
-        return preoperativeDiscussionDoc;
     }
 
     private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
-            "拟施手术名称和方式=拟施手术名称及方式",
-            "拟行术式=拟施手术名称及方式",
-            "病程标题=文书标题",
-            "临床诊断=术前诊断",
-            "术前准备内容=术前准备",
-            "中术后可能出现的风险及应对措施=风险及防范措施",
-            "术中、术后应当充分注意的事项=术中术后注意事项",
-            "术中术后注意事项含护理事项=术中术后注意事项","注意事项=术中术后注意事项",
-            "手术风险及防治对策=风险及防范措施",
-            "主要术中、术后风险及防范措施=风险及防范措施",
-            "意外及防范措施=风险及防范措施",
-            "术前术后注意事项=注意事项",
-            "麻醉方式=拟施麻醉方式",
-            "记录医师签名=记录医生"
+            "1.拟施麻醉方式=拟施麻醉方式",
+            "2.术前特殊准备=术前特殊准备",
+            "3.主要术中、术后风险及防范措施=风险及防范措施",
+            "4.术中、术后注意事项(含护理事项)=术中术后注意事项"
+
     );
 
     /**********************************************手术知情同意书****************************************************/
@@ -297,7 +275,7 @@ public class OperationDocTrans extends ModelDocTrans {
         int index = 1;
         String operationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
             operationName = index + "";
@@ -311,23 +289,41 @@ public class OperationDocTrans extends ModelDocTrans {
 
     private OperationInformedConsentDoc getOperationInformedConsentDoc(Map<String, Object> contentMap) {
         String modeId = "16";
-        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationInformedConsent_keyContrasts, modeId);
-        }
+//        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.setStructureMap(structureMap);
-        operationInformedConsentDoc.setPageData((Map) structureMap);
+//        operationInformedConsentDoc.setText(text);
+//        operationInformedConsentDoc.setPageData((Map) cutWordMap);
+
         return operationInformedConsentDoc;
     }
 
+    private List<String> operationInformedConsent_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "手术医生",
+            "目前诊断",
+            "手术名称",
+            "手术指征",
+            "风险及并发症",
+            "保守治疗",
+            "其他手术",
+            "签名",
+            "签名时间"
+    );
+
     private List<String> operationInformedConsent_keyContrasts = Lists.newArrayList(
             "姓名++++患者姓名=姓名",
             "性别=",
@@ -337,16 +333,14 @@ public class OperationDocTrans extends ModelDocTrans {
             "手术医生=",
             "目前诊断=",
             "手术名称=",
-            "手术指征=手术指征与禁忌",
+            "手术指征=",
             "风险及并发症=",
             "++++保守治疗=保守治疗",
             "++++其他手术=其他手术",
             "签名++++=签名",
-            "签名时间=签名时间",
-            "术前准备内容=术前准备"
+            "签名时间=签名时间"
     );
 
-
     /**********************************************手术安全核查表****************************************************/
     private Map<String, OperationSafetyChecklistDoc> getOperationSafetyChecklistDocMap(List<Map<String, Object>> contentMaps) {
         Map<String, OperationSafetyChecklistDoc> retMap = Maps.newHashMap();
@@ -356,7 +350,7 @@ public class OperationDocTrans extends ModelDocTrans {
         int index = 1;
         String operationName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
             operationName = index + "";
@@ -370,24 +364,33 @@ public class OperationDocTrans extends ModelDocTrans {
 
     private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(Map<String, Object> contentMap) {
         String modeId = "21";
-        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationSafetyChecklist_keyContrasts, modeId);
-        }
+//        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.setStructureMap(structureMap);
-        operationSafetyChecklistDoc.setPageData((Map) structureMap);
+//        operationSafetyChecklistDoc.setText(text);
+//        operationSafetyChecklistDoc.setPageData((Map) cutWordMap);
 
         return operationSafetyChecklistDoc;
     }
 
+    private List<String> operationSafetyChecklist_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "签名"
+    );
+
     private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
             "姓名++++患者姓名=姓名",
             "性别",
@@ -396,17 +399,4 @@ public class OperationDocTrans extends ModelDocTrans {
             "病案号++++住院号=病案号",
             "签名++++=签名"
     );
-
-    /**
-     * 给structureMap添加一个key(映射)
-     *
-     * @param structureMap
-     * @param target       需要用到的key
-     * @param source       structureMap中含有的key
-     */
-    protected void addKeyMapping(Map<String, String> structureMap, String target, String source) {
-        if (StringUtils.isEmpty(structureMap.get(target)) && StringUtils.isNotEmpty(structureMap.get(source))) {
-            structureMap.put(target, structureMap.get(source));
-        }
-    }
 }

+ 5 - 1
trans/src/main/java/com/lantone/qc/trans/wenfuyi/OutDepDocTrans.java

@@ -12,8 +12,11 @@ import java.util.Map;
 
 /**
  * @Description: 门诊入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
  */
 public class OutDepDocTrans extends ModelDocTrans {
+
     @Override
     public BeHospitalizedDoc extract(MedrecVo medrecVo) {
         BeHospitalizedDoc beHospitalizedDoc = new BeHospitalizedDoc();
@@ -33,4 +36,5 @@ public class OutDepDocTrans extends ModelDocTrans {
 
         return beHospitalizedDoc;
     }
-}
+
+}

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/PacsDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+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 PacsDocTrans 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;
+    }
+
+}

+ 0 - 52
trans/src/main/java/com/lantone/qc/trans/wenfuyi/PathologyShipDocTrans.java

@@ -1,52 +0,0 @@
-package com.lantone.qc.trans.wenfuyi;
-
-import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
-import com.lantone.qc.pub.model.doc.PathologyShipDoc;
-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.OrdinaryAssistant;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : PathologyShipDocTrans
- */
-public class PathologyShipDocTrans extends ModelDocTrans {
-    private String modeId = "35";
-
-    @Override
-    public List<PathologyShipDoc> extract(MedrecVo medrecVo) {
-        List<PathologyShipDoc> retList = Lists.newArrayList();
-        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
-        contentMaps.forEach(contentMap -> {
-            retList.add(getPathologyShipDoc(contentMap));
-        });
-        return retList;
-    }
-
-    private PathologyShipDoc getPathologyShipDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap = null;
-        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
-            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
-        } else {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-        }
-        PathologyShipDoc pathologyShipDoc = new PathologyShipDoc();
-        pathologyShipDoc.setStructureMap(structureMap);
-        pathologyShipDoc.setPageData((Map) structureMap);
-        return pathologyShipDoc;
-    }
-
-    private List<String> keyContrasts = Lists.newArrayList("检验标本=送检标本名称",
-            "本人姓名=姓名",
-            "术中发现=手术所见");
-}

+ 34 - 45
trans/src/main/java/com/lantone/qc/trans/wenfuyi/RescueDocTrans.java

@@ -1,82 +1,71 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 import com.lantone.qc.pub.model.doc.RescueDoc;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.trans.ModelDocTrans;
-import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.RescueHtmlAnalysis;
+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 RescueDocTrans extends ModelDocTrans {
-    private String modeId = "22";
 
     @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 -> {
-            retList.add(getRescueDoc(contentMap));
+            try {
+                RescueDoc rescueDoc = getRescueDoc(contentMap);
+                if (rescueDoc != null) {
+                    retList.add(rescueDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private RescueDoc getRescueDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            if (sourceMap.containsKey("原始文本")) {
-                String originalText = sourceMap.get("原始文本");
-                List<String> titles = Lists.newArrayList("记录医师",
-                        "参加抢救者姓名及专业技术职务","抢救结果","后续注意事项",
-                        "病情变化情况及抢救经过","结束时间", "开始时间");
-                List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, originalText);
-                CommonAnalysisUtil.cutByTitles(originalText, sortTitles, 0, sourceMap);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new RescueHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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());
             }
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-            /*
-            if (structureMap.containsKey("抢救措施") && structureMap.containsKey("抢救实施的时间及措施")) {
-                structureMap.put("抢救措施", structureMap.get("抢救措施").replace(structureMap.get("抢救实施的时间及措施"), ""));
-            }*/
         }
-
-        RescueDoc rescueDoc = new RescueDoc();
-        rescueDoc.setStructureMap(structureMap);
-        rescueDoc.setPageData((Map) structureMap);
-
-        return rescueDoc;
+        if (MapUtils.isNotEmpty(structureMap)) {
+            RescueDoc rescueDoc = ModelDocGenerate.rescueDocGen(structureMap);
+            rescueDoc.setPageData((Map) structureMap);
+            return rescueDoc;
+        } else {
+            return null;
+        }
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            /*"事件日期=开始时间",
-            "抢救病情=病情变化",
-            "本人姓名=姓名",
-            "抢救结束日期=结束时间",
-            "抢救开始日期=开始时间",
-            "抢救经过与措施=抢救措施",
-            "病情变化情况=简要病情",
-            "是否成功=抢救是否成功",
-            "参与抢救人员名单=参加抢救的医务人员姓名及专业技术职称",
-            "参加抢救人员名单=参加抢救的医务人员姓名及专业技术职称",
-            "记录医师=记录医生",
-            "患者签名时间=记录时间",
-            "抢救记录=简要病情",
-            "医师签名=记录医生",
-            "抢救实施的时间及措施=抢救措施",
-            "病程内容=抢救措施"*/
     );
-}
+
+}

+ 0 - 51
trans/src/main/java/com/lantone/qc/trans/wenfuyi/SeriouslyIllNoticeDocTrans.java

@@ -1,51 +0,0 @@
-package com.lantone.qc.trans.wenfuyi;
-
-import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
-import com.lantone.qc.pub.model.doc.SeriouslyIllNoticeDoc;
-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.OrdinaryAssistant;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @Description: 病重通知书文档生成
- */
-public class SeriouslyIllNoticeDocTrans extends ModelDocTrans {
-    private String modeId = "29";
-
-    @Override
-    public List<SeriouslyIllNoticeDoc> extract(MedrecVo medrecVo) {
-        List<SeriouslyIllNoticeDoc> retList = Lists.newArrayList();
-        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
-        contentMaps.forEach(contentMap -> {
-            retList.add(getSeriouslyIllNoticeDoc(contentMap));
-        });
-        return retList;
-    }
-
-    private SeriouslyIllNoticeDoc getSeriouslyIllNoticeDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap = null;
-        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
-            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
-        } else {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-        }
-        SeriouslyIllNoticeDoc seriouslyIllNoticeDoc = new SeriouslyIllNoticeDoc();
-        seriouslyIllNoticeDoc.setStructureMap(structureMap);
-        seriouslyIllNoticeDoc.setPageData((Map) structureMap);
-
-        return seriouslyIllNoticeDoc;
-    }
-
-    private List<String> keyContrasts = Lists.newArrayList();
-}

+ 36 - 36
trans/src/main/java/com/lantone/qc/trans/wenfuyi/StagesSummaryDocTrans.java

@@ -1,72 +1,72 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.StagesSummaryHtmlAnalysis;
+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 StagesSummaryDocTrans extends ModelDocTrans {
-    private String modeId = "28";
 
     @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 -> {
-            retList.add(getStagesSummaryDoc(contentMap));
+            try {
+                StagesSummaryDoc stagesSummaryDoc = getStagesSummaryDoc(contentMap);
+                if (stagesSummaryDoc != null) {
+                    retList.add(stagesSummaryDoc);
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
         return retList;
     }
 
     private StagesSummaryDoc getStagesSummaryDoc(Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+        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 {
-            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            List<String> titles = Lists.newArrayList("入院情况", "入院诊断", "辅助检查",
-                    "诊疗经过", "目前情况", "目前诊断", "进一步诊疗方案",
-                    "记录医师","诊疗计划");
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
-            if(structureMap.containsKey("主诉")){
-                structureMap.put("主诉",structureMap.get("主诉").split("入院情况")[0]);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new StagesSummaryHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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());
             }
         }
-
-        StagesSummaryDoc stagesSummaryDoc = new StagesSummaryDoc();
-        stagesSummaryDoc.setStructureMap(structureMap);
-        stagesSummaryDoc.setPageData((Map) structureMap);
-
-        return stagesSummaryDoc;
+        if (MapUtils.isNotEmpty(structureMap)) {
+            StagesSummaryDoc stagesSummaryDoc = ModelDocGenerate.stagesSummaryDocGen(structureMap);
+            stagesSummaryDoc.setPageData((Map) structureMap);
+            return stagesSummaryDoc;
+        } else {
+            return null;
+        }
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "本人姓名=姓名",
-            "现病史- 发病情况=发病情况",
-            "体温(耳)=体温耳",
-            "医师签名=记录医生",
-            "进一步诊疗方案=诊疗计划",
-            "记录医师=记录医生",
-            "病程时间=病历日期",
-            "病程内容=主诉",
-            "诊疗经过=诊治经过"
-            );
-}
+            "病情记录=病历内容"
+    );
+
+}

+ 179 - 176
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ThreeLevelWardDocTrans.java

@@ -1,15 +1,11 @@
 package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
-import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
-import com.lantone.qc.dbanaly.lt.facade.ModelHospitalFacade;
 import com.lantone.qc.dbanaly.util.KernelConstants;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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.operation.PreoperativeDiscussionDoc;
 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;
@@ -18,119 +14,98 @@ 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.CommonAnalysisUtil;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.ThreeLevelWardHtmlAnalysis;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.*;
-import java.util.stream.Collectors;
+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 ThreeLevelWardDocTrans extends ModelDocTrans {
-    private String modeId = "4";
-    private List<String> recTitles;
+
     private List<OperationDoc> operationDocs;
-    private List<String> keyContrasts = Lists.newArrayList(
-            "病程时间=查房日期",
-            "病程标题=查房标题",
-            "病程内容=病情记录",
-            "记录医师=记录医生"
-    );
 
     @Override
     public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
-        ModelHospitalFacade modelHospitalFacade = SpringContextUtil.getBean(ModelHospitalFacade.class);
-        recTitles = modelHospitalFacade.getRecTitles(5l, 4l);
-
         List<ThreeLevelWardDoc> retList = Lists.newArrayList();
+        ThreeLevelWardDoc threeLevelWardDoc = new ThreeLevelWardDoc();
         List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
-
-        ThreeLevelWardDoc result = new ThreeLevelWardDoc();
         contentMaps.forEach(contentMap -> {
-            classifyThreeLevelWardDoc(result, contentMap);
+            try {
+                classifyThreeLevelWardDoc(threeLevelWardDoc, contentMap);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
         });
-        retList.add(result);
+        retList.add(threeLevelWardDoc);
         return retList;
     }
 
-    private void classifyThreeLevelWardDoc(ThreeLevelWardDoc result, Map<String, Object> contentMap) {
-        String content = contentMap.get("xmlText").toString();
+    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 {
-            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
-            List<String> titles = Lists.newArrayList(
-                    "记录医师");
-
-            String text = sourceMap.get("原始文本");
-            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
-            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
             String recTitle = contentMap.get("recTitle").toString();
-            if (recTitles.contains(recTitle)) {
-                sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new ThreeLevelWardHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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());
             }
-            //病程内容未解析出来 则在原始文本中获取病程内容
-            addContent(sourceMap);
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+        if (MapUtils.isEmpty(structureMap)) {
+            return;
+        }
 
-            if (StringUtils.isEmpty(structureMap.get("查房日期"))) {
-                return;
-            }
-            //不能简单的标准转化,如果有查房标题,优先使用
-            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房备注"))) {
-                structureMap.put("查房标题", structureMap.get("查房备注"));
-            }
-            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房类别"))) {
-                structureMap.put("查房标题", structureMap.get("查房类别"));
-            }
-            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("上级查房医生职称"))) {
-                structureMap.put("查房标题", structureMap.get("上级查房医生职称"));
-            }
+        if (structureMap.containsKey("病程录内容")) {
+            structureMap.put("病情记录", structureMap.get("病程录内容").replace("/", ""));
+        }
+
+        if (structureMap.containsKey("文书标题")) {
+            structureMap.put("查房标题", structureMap.get("文书标题"));
         }
+
         //总的查房记录 汇总
         ThreeLevelWardDoc allDoctorWradDoc = new ThreeLevelWardDoc();
         allDoctorWradDoc.setStructureMap(structureMap);
         allDoctorWradDoc.setPageData((Map) structureMap);
-        result.addAllDoctorWradDoc(allDoctorWradDoc);
+        threeLevelWardDoc.addAllDoctorWradDoc(allDoctorWradDoc);
 
         //主任医师查房
         DirectorDoctorWardDoc directorDoctorWardDoc = findDirectorDoctorWardDoc(structureMap);
         if (directorDoctorWardDoc != null) {
-            result.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
+            threeLevelWardDoc.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
         }
         //主治医师查房
         AttendingDoctorWardDoc attendingDoctorWardDoc = findAttendingDoctorWardDoc(structureMap);
         if (attendingDoctorWardDoc != null) {
-            result.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
+            threeLevelWardDoc.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
         }
         //普通医师查房
         if (directorDoctorWardDoc == null && attendingDoctorWardDoc == null) {
             GeneralDoctorWardDoc generalDoctorWardDoc = new GeneralDoctorWardDoc();
             generalDoctorWardDoc.setStructureMap(structureMap);
             generalDoctorWardDoc.setPageData((Map) structureMap);
-            result.addGeneralDoctorWardDoc(generalDoctorWardDoc);
+            threeLevelWardDoc.addGeneralDoctorWardDoc(generalDoctorWardDoc);
         }
-    }
 
-    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();
-        }
     }
 
     /**
@@ -140,19 +115,38 @@ public class ThreeLevelWardDocTrans extends ModelDocTrans {
      */
     private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
         String title = structureMap.get("查房标题");
+        String content = structureMap.get("病情记录");
+        String writTitle = structureMap.get("文书标题");
         String recordDateStr = structureMap.get("查房日期");
-        String chiefSurgeon = structureMap.get("主刀医师");
         Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        //标题有代字
         DirectorDoctorWardDoc directorDoctorWardDoc = null;
-        if (StringUtils.isNotEmpty(title)) {
-            if (title.contains("主刀")) {
-                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
-                title = title.replace("主刀", doctorTitle);
+        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(chiefSurgeon, operationDocs, recordDate, "一助");
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
                 title = title.replace("一助", doctorTitle);
             }
-            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) {    //标题有代字)
+            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);
@@ -168,137 +162,145 @@ public class ThreeLevelWardDocTrans extends ModelDocTrans {
      */
     private AttendingDoctorWardDoc findAttendingDoctorWardDoc(Map<String, String> structureMap) {
         String title = structureMap.get("查房标题");
+        String writTitle = structureMap.get("文书标题");
+        String content = structureMap.get("病情记录");
         String recordDateStr = structureMap.get("查房日期");
-        String chiefSurgeon = structureMap.get("主刀医师");
         Date recordDate = StringUtil.parseDateTime(recordDateStr);
         AttendingDoctorWardDoc attendingDoctorWardDoc = null;
-        if (StringUtils.isNotEmpty(title)) {
-            if (title.contains("主刀")) {
-                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
-                title = title.replace("主刀", doctorTitle);
+        //标题有代字
+        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(chiefSurgeon, operationDocs, recordDate, "一助");
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
                 title = title.replace("一助", doctorTitle);
             }
-            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) {    //标题有代字)
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治"))
+                    || findAttend(content) || title.contains("三级") || endocrinologyTitle(title)) {
                 attendingDoctorWardDoc = new AttendingDoctorWardDoc();
                 attendingDoctorWardDoc.setStructureMap(structureMap);
                 attendingDoctorWardDoc.setPageData((Map) structureMap);
             }
         }
-        return attendingDoctorWardDoc;
-    }
 
-    public static String subTitle(String srcText) {
-        String title = "";
-        if (StringUtil.isNotBlank(srcText)) {
-            //标题不包含代字,直接返回原标题
-            if (!srcText.contains("代")) {
-                return srcText;
+        //文书标题和模板标题不一致
+        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 (srcText.contains("携")) {
-                title += srcText.substring(0, srcText.indexOf("携"));
-            } else if (srcText.contains("兼")) {
-                title += srcText.substring(0, srcText.indexOf("兼"));
-            }
-            //有代字时,取代字之后部分
-            if (srcText.contains("代") && srcText.indexOf("代") != srcText.length() - 1) {
-                title += srcText.substring(srcText.lastIndexOf("代") + 1);
-            } else {
-                return srcText;
+            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 title;
+        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(String chiefSurgeonFromWard, List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+    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;
         }
-        //如果查房记录中有主刀医师姓名,直接用这个姓名获取对应职称
-        if (StringUtil.isNotBlank(chiefSurgeonFromWard)) {
-            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeonFromWard);
-            if (doctor != null) {
-                title = doctor.get("professor");
-                if (StringUtil.isNotBlank(title)) {
-                    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 (operationDocs != null) {
-            long operationCount = operationDocs.stream().map(OperationDoc::getOperationRecordDoc).filter(Objects::nonNull).count();
-            long preoperativeCount = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).count();
-            if (operationCount == 0 && preoperativeCount > 0) {
-                long timeDiff = 0L;
-                List<PreoperativeDiscussionDoc> preoperativeDoc = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).collect(Collectors.toList());
-                for (PreoperativeDiscussionDoc doc : preoperativeDoc) {
-                    Map<String, String> structureMap = doc.getStructureMap();
-                    String chiefSurgeon = structureMap.get(findTitle + "签名");
-                    String operatorEndDateStr = structureMap.get("主刀医师签字时间");
-                    if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+            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;
                     }
-                    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;
-                            }
-                        }
-                    }
-                }
-                if (StringUtil.isNotBlank(title)) {
-                    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) || 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;
-                        }
+                    if (timeDiff == 0 || timeDiff > timeDifference) {
+                        /* 取距离此次主刀医师查房最近的一次手术时间 */
+                        timeDiff = timeDifference;
+                        title = professor;
                     }
                 }
             }
@@ -335,4 +337,5 @@ public class ThreeLevelWardDocTrans extends ModelDocTrans {
         }
         return timeDifference;
     }
-}
+
+}

+ 139 - 84
trans/src/main/java/com/lantone/qc/trans/wenfuyi/TransferRecordDocTrans.java

@@ -2,8 +2,6 @@ package com.lantone.qc.trans.wenfuyi;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
-import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
 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;
@@ -13,13 +11,23 @@ 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.wenfuyi.util.WenFuYiHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.TransferIntoHtmlAnalysis;
+import com.lantone.qc.trans.wenfuyi.util.TransferOutHtmlAnalysis;
+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 TransferRecordDocTrans extends ModelDocTrans {
+
+    @Override
     public TransferRecordDoc extract(MedrecVo medrecVo) {
         TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
 
@@ -30,14 +38,17 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         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, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(into);
-        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(out);
         Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
 
         //转入
@@ -50,9 +61,9 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         });
         for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
             Map<String, String> structureMap = transferIntoDoc.getStructureMap();
-            String inDateStr = structureMap.get("转日期");
+            String inDateStr = structureMap.get("转日期");
             if (StringUtil.isBlank(inDateStr)) {
-                continue;
+                inDateStr = structureMap.get("病历日期");
             }
             Date inDate = StringUtil.parseDateTime(inDateStr);
             if (inDate == null) {
@@ -71,9 +82,9 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         });
         for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
             Map<String, String> structureMap = transferOutDoc.getStructureMap();
-            String outDateStr = structureMap.get("转日期");
+            String outDateStr = structureMap.get("转日期");
             if (StringUtil.isBlank(outDateStr)) {
-                continue;
+                outDateStr = structureMap.get("病历日期");
             }
             Date outDate = StringUtil.parseDateTime(outDateStr);
             if (outDate == null) {
@@ -93,9 +104,9 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         });
         for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
             Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
-            String transferDateStr = structureMap.get("转日期");
+            String transferDateStr = structureMap.get("转日期");
             if (StringUtil.isBlank(transferDateStr)) {
-                continue;
+                transferDateStr = structureMap.get("病历日期");
             }
             Date transferDate = StringUtil.parseDateTime(transferDateStr);
             if (transferDate == null) {
@@ -118,47 +129,52 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         int index = 1;
         String transferRecordName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            transferRecordName = index + "";
-            TransferIntoDoc transferIntoDoc = getTransferIntoDoc(contentMap);
-            transferIntoDoc.setTransferRecordName(transferRecordName);
-            retMap.put(transferRecordName, transferIntoDoc);
-            index++;
+            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 modeId = "26";
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap = null;
-        Map<String, String> sourceMap = null;
+        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 {
-            sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts, modeId);
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new TransferIntoHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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;
         }
-
-        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
-        transferIntoDoc.setText(content);
-        transferIntoDoc.setStructureMap(structureMap);
-        transferIntoDoc.setPageData((Map) sourceMap);
-
-        return transferIntoDoc;
     }
 
-    private List<String> transferInto_keyContrasts = Lists.newArrayList(
-            "书写日期=记录日期",
-            "转入时间=转入日期",
-            "本人姓名=姓名"
-    );
-
     /**************************************************全部*******************************************************/
     private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
         Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
@@ -168,37 +184,55 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         int index = 1;
         String transferRecordName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            transferRecordName = index + "";
-            TransferRecordDoc transferRecordDoc = getTransferAllDoc(contentMap);
-            transferRecordDoc.setTransferRecordName(transferRecordName);
-            retMap.put(transferRecordName, transferRecordDoc);
-            index++;
+            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 modeId = "34";
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap = null;
-        Map<String, String> sourceMap = null;
+        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 {
-            sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts);
-        }
-        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
-        transferAllDoc.setText(content);
-        transferAllDoc.setStructureMap(structureMap);
-        transferAllDoc.setPageData((Map) sourceMap);
-        return transferAllDoc;
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new TransferOutHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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();
@@ -208,43 +242,64 @@ public class TransferRecordDocTrans extends ModelDocTrans {
         int index = 1;
         String transferRecordName = null;
         for (Map<String, Object> contentMap : contentMaps) {
-            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+            if (contentMap.get("htmlText") == null || StringUtil.isBlank(contentMap.get("htmlText").toString())) {
                 continue;
             }
-            transferRecordName = index + "";
-            TransferOutDoc transferOutDoc = getTransferOutDoc(contentMap);
-            transferOutDoc.setTransferRecordName(transferRecordName);
-            retMap.put(transferRecordName, transferOutDoc);
-            index++;
+            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 modeId = "27";
-        String content = contentMap.get("xmlText").toString();
-        Map<String, String> structureMap = null;
-        Map<String, String> sourceMap = null;
+        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 {
-            sourceMap = YiWuXmlUtil.xmlToMap(content);
-            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
-            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
-            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
-            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferOut_keyContrasts, modeId);
-        }
-        TransferOutDoc transferOutDoc = new TransferOutDoc();
-        transferOutDoc.setText(content);
-        transferOutDoc.setStructureMap(structureMap);
-        transferOutDoc.setPageData((Map) sourceMap);
-
-        return transferOutDoc;
+            String recTitle = contentMap.get("recTitle").toString();
+            String recTypeId = contentMap.get("recTypeId").toString();
+            WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new TransferOutHtmlAnalysis();
+            Map<String, String> sourceMap = wenFuYiHtmlAnalysis.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 List<String> transferOut_keyContrasts = Lists.newArrayList(
-            "书写日期=记录日期",
-            "转出时间=转入日期",
-            "本人姓名=姓名"
+    //存入转入转出时间
+    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(
+            "医师签名=记录医生",
+            "病历标题=标题",
+            "病情记录=病历内容",
+            "签名时间=记录时间"
     );
-}
+
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/VTEGradeDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.wenfuyi.util.VTEGradeHtmlAnalysis;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: VTEGradeDocTrans
+ * @Description: VTE评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class VTEGradeDocTrans 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("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();
+                VTEGradeHtmlAnalysis vteGradeHtmlAnalysis = new VTEGradeHtmlAnalysis();
+                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;
+    }
+}

+ 32 - 18
trans/src/main/java/com/lantone/qc/trans/wenfuyi/WenfuyiDocTrans.java

@@ -1,11 +1,5 @@
 package com.lantone.qc.trans.wenfuyi;
 
-/**
- * @Description:嵊州人民医院解析
- * @Author:liuqq
- * @time: ${DATE} ${TIME}
- **/
-
 import com.google.common.collect.Lists;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.vo.MedrecVo;
@@ -19,10 +13,15 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-//import com.lantone.qc.trans..*;
-
+/**
+ * @ClassName : WenfuyiDocTrans
+ * @Description :
+ * @Author : 楼辉荣
+ * @Date: 2020-03-03 19:47
+ */
 @Slf4j
 public class WenfuyiDocTrans extends DocTrans {
+
     @Override
     protected InputInfo extract(QueryVo queryVo) {
         InputInfo inputInfo = new InputInfo();
@@ -57,8 +56,8 @@ public class WenfuyiDocTrans extends DocTrans {
                     inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("危急值")) {
-                    /*CrisisInfoDocTrans crisisInfoDocTrans = new CrisisInfoDocTrans();
-                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));*/
+                    CrisisInfoDocTrans crisisInfoDocTrans = new CrisisInfoDocTrans();
+                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("病危通知书")) {
                     CriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new CriticallyIllNoticeDocTrans();
@@ -81,8 +80,8 @@ public class WenfuyiDocTrans extends DocTrans {
                     inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("值班交接制度")) {
-                    /*DutyShiftSystemDocTrans dutyShiftSystemDocTrans = new DutyShiftSystemDocTrans();
-                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));*/
+                    DutyShiftSystemDocTrans dutyShiftSystemDocTrans = new DutyShiftSystemDocTrans();
+                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("首次病程录")) {
                     FirstCourseRecordDocTrans firstCourseRecordDocTrans = new FirstCourseRecordDocTrans();
@@ -106,7 +105,7 @@ public class WenfuyiDocTrans extends DocTrans {
                 }
                 if (i.getTitle().equals("查房记录")) {
                     ThreeLevelWardDocTrans threeLevelWardDocTrans = new ThreeLevelWardDocTrans();
-//                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
                     inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("住院病历信息")) {
@@ -114,17 +113,32 @@ public class WenfuyiDocTrans extends DocTrans {
                     inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("化验")) {
-                 /*   LisDocTrans lisDocTrans = new LisDocTrans();
-                    inputInfo.setLisDocs(lisDocTrans.extract(i));*/
+                    LisDocTrans lisDocTrans = new LisDocTrans();
+                    inputInfo.setLisDocs(lisDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("辅检")) {
-                  /*  PacsDocTrans pacsDocTrans = new PacsDocTrans();
-                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));*/
+                    PacsDocTrans pacsDocTrans = new PacsDocTrans();
+                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));
                 }
                 if (i.getTitle().equals("门诊")) {
                     OutDepDocTrans outDepDocTrans = new OutDepDocTrans();
                     inputInfo.setBeHospitalizedDoc(outDepDocTrans.extract(i));
                 }
+                /*******************************VTE评分 trans解析*****************************************/
+                if (i.getTitle().equals("VTE评分")) {
+                    VTEGradeDocTrans vteGradeDocTrans = new VTEGradeDocTrans();
+                    inputInfo.setVteGradeDoc(vteGradeDocTrans.extract(i));
+                }
+                /*******************************ADL评分 trans解析*****************************************/
+                if (i.getTitle().equals("ADL评分")) {
+                    ADLGradeDocTrans adlGradeDocTrans = new ADLGradeDocTrans();
+                    inputInfo.setAdlGradeDoc(adlGradeDocTrans.extract(i));
+                }
+                /*******************************手麻记录 trans解析*****************************************/
+                if (i.getTitle().equals("手麻记录")) {
+                    AnesthesiaRecordDocTrans anesthesiaRecordDocTrans= new AnesthesiaRecordDocTrans();
+                    inputInfo.setAnesthesiaRecordDocs(anesthesiaRecordDocTrans.extract(i));
+                }
             }
         }
         pageDataHandle(inputInfo);
@@ -265,4 +279,4 @@ public class WenfuyiDocTrans extends DocTrans {
             }
         }
     }
-}
+}

+ 41 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ADLGradeHtmlAnalysis.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.wenfuyi.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.select.Elements;
+
+import java.util.Map;
+
+/**
+ * @ClassName:
+ * @Description: ADL评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class ADLGradeHtmlAnalysis implements WenFuYiHtmlAnalysis {
+    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;
+    }
+}

+ 138 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/BeHospitalizedHtmlAnalysis.java

@@ -0,0 +1,138 @@
+package com.lantone.qc.trans.wenfuyi.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.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/15 16:28
+ */
+@Slf4j
+public class BeHospitalizedHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            }
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    //一般模板
+    private void analysisGeneral(Document doc, String recTitle, Map<String, String> map) {
+
+        String htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body"), true)
+                .replace("注意:询问有无境外和国内中高风险疫区居留史和接触史。", "")
+                .replace("(拟诊或确诊肿瘤病人应记录转移区域的淋巴结情况、已有区域及淋巴结性质。)", "")
+                .replace("(外院检查注明该医院名称、日期、报告编号!)", "")
+                .replace("(外院检查注明该医院名称、日期!)", "");
+
+        List<String> titles = Lists.newArrayList("姓 名", "邮 编", "性 别", "单位", "年 龄", "身份证号码", "婚 姻", "户口地址", "民 族", "联系电话", "出生地",
+                "入院日期", "职 业", "病史陈述者", "主诉", "现病史", "既往史", "系统回顾", "个人史", "婚育史", "家族史", "一般情况", "特殊检查", "实验室检查", "初步诊断", "修正诊断");
+
+        titles = CommonAnalysisUtil.sortTitles(titles, htmlContent);
+        CommonAnalysisUtil.cutByTitles(htmlContent, titles, 0, map);
+        if (map.get("初步诊断").contains("医师签名")) {
+            map.put("初步诊断医师签名", map.get("初步诊断").substring(map.get("初步诊断").indexOf("医师签名") + 5));
+            map.put("初步诊断", map.get("初步诊断").substring(0, map.get("初步诊断").indexOf("医师签名")));
+            if (map.get("初步诊断医师签名").contains("日期")) {
+                map.put("初步诊断日期", map.get("初步诊断医师签名").substring(map.get("初步诊断医师签名").indexOf("日期") + 3));
+                map.put("初步诊断医师签名", map.get("初步诊断医师签名").substring(0, map.get("初步诊断医师签名").indexOf("日期")).replace("医师签名: ", ""));
+            }
+        }
+        if (map.get("修正诊断").contains("医师签名")) {
+            map.put("修正诊断医师签名", map.get("修正诊断").substring(map.get("修正诊断").indexOf("医师签名") + 5));
+            map.put("修正诊断", map.get("修正诊断").substring(0, map.get("修正诊断").indexOf("医师签名")));
+            if (map.get("修正诊断医师签名").contains("日期")) {
+                map.put("修正诊断日期", map.get("修正诊断医师签名").substring(map.get("修正诊断医师签名").indexOf("日期") + 3));
+                map.put("修正诊断医师签名", map.get("修正诊断医师签名").substring(0, map.get("修正诊断医师签名").indexOf("日期")));
+            }
+        }
+
+        map.put("辅助检查", "特殊检查:" + map.get("特殊检查") + ";实验室检查:" + map.get("实验室检查"));
+
+    }
+
+    //24小时出入院记录、24小时出入院记录(全院)、24小时入出院记录(全院通用)、24小时内入院死亡记录(全院通用)
+    private void analysis24h(Document doc, Map<String, String> map) {
+        String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), 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解析
+        WenFuYiHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("table1"), map);
+        //主诉、入院情况等table解析
+        WenFuYiHtmlAnalysisUtil.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("医生签名时间", WenFuYiHtmlAnalysisUtil.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/wenfuyi/util/ClinicBloodEffectHtmlAnalysis.java

@@ -0,0 +1,71 @@
+package com.lantone.qc.trans.wenfuyi.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 ClinicBloodEffectHtmlAnalysis implements WenFuYiHtmlAnalysis {
+    List<String> titles = Lists.newArrayList("输血前症状", "输血前实验室指标", "输血目的", "输注成分", "输血时间",
+            "开始时间", "结束时间", "输血过程");
+
+    private String modeId = "32";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
+            analysisGeneral(recTitle,bigDivElement, map);
+            if (map.containsKey("病情记录")) {
+                String content = map.get("病情记录");
+                CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
+            }
+        /*titles.remove(5);
+        titles.forEach(i -> {
+                    if (map.get(i).length() > 2) {
+                        map.put(i, map.get(i).substring(0, map.get(i).length() - 2));
+                    }
+                }
+        );
+
+         */
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.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);
+    }
+
+}

+ 51 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicalBloodHtmlAnalysis.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.trans.wenfuyi.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 ClinicalBloodHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+
+    private String modeId = "10";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            String content = Jsoup.parse(html).selectFirst("body").children().text();
+            analysisGeneral(recTitle, content, map);
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(String recTitle, String content, Map<String, String> map) {
+        CommonAnalysisUtil.extractWardInfo(recTitle, content, map);
+        String bqjlText = "病情记录:" + map.get("病情记录");
+        map.remove("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录", "输血制品原因", "输血制品日期", "输血制品种类及量", "输血制品反应", "输血制品效果评价"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitles(bqjlText, titles, 0, map);
+    }
+
+}

+ 120 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationHtmlAnalysis.java

@@ -0,0 +1,120 @@
+package com.lantone.qc.trans.wenfuyi.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 ConsultationHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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 = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "");
+                    CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                }
+                if (StringUtil.isNotBlank(structureMap.get("会诊时间"))) {
+                    String[] strArr = structureMap.get("会诊时间").split(" ");
+                    structureMap.put("会诊意见", strArr[strArr.length - 1]);
+                    structureMap.put("会诊时间", strArr[0]);
+                }
+                CommonAnalysisUtil.extractDateByTitle(structureMap, "申请时间");
+            } else if ("MDT会诊申请表".equals(recTitle) || "新-MDT会诊三合一".equals(recTitle)) {
+                titles = Lists.newArrayList("姓名", "性别", "出生日期", "联系电话",
+                        "申请科室", "入院/首诊时间", "住院号", "病情概述(含主诉、病史、诊断、诊治过程等)", "拟申请MDT时间、地点",
+                        "拟请MDT参加科室", "MDT目的", "申请人签名", "申请递交时间", "科主任签字", "专家诊治建议", "专家科室", "签名",
+                        "填写时间", "主持科室小结(MDT的最终诊治决议)", "科主任(主持人)签名", "记录人(主管医师)签字", "日期");
+                htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("住院/门诊号", "").replace("第1页", "");
+                    StringBuffer sbf = new StringBuffer();
+                    List<String> distinctText = Lists.newArrayList(htmlContent.split(" ")).stream().distinct().collect(Collectors.toList());
+                    for (String text : distinctText) {
+                        sbf.append(text).append(" ");
+                    }
+                    CommonAnalysisUtil.html2StructureMapNoColon(titles, sbf.toString(), structureMap);
+                }
+                if (StringUtil.isNotBlank(structureMap.get("主持科室小结(MDT的最终诊治决议)"))) {
+                    String[] valueArray = structureMap.get("主持科室小结(MDT的最终诊治决议)").split(" ");
+                    structureMap.put("主持科室小结(MDT的最终诊治决议)", valueArray[1]);
+                    String v = valueArray[2];
+                    String[] vArr = v.split(":");
+                    if (vArr.length > 1) {
+                        structureMap.put(vArr[0], vArr[1]);
+                    }
+                }
+            } else if ("(外地专家)会诊邀请函".equals(recTitle)) {
+                titles = Lists.newArrayList("姓名", "出生年月", "病区", "床位", "住院号", "病情摘要", "会诊日期", "被邀医师", "专业",
+                        "职称", "单位", "会诊费用", "会诊科室", "医师签名", "医生签名", "科主任 签名", "患方意见", "签字", "外来专家 意见", "签字",
+                        "邀请医院(钉钉审批后盖章)");
+                htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "").replace("年   月   日   时   分", "");
+                    CommonAnalysisUtil.html2StructureMapNoColon(titles, htmlContent, structureMap);
+                }
+                if (structureMap.containsKey("外来专家意见")) {
+                    structureMap.put("外来专家意见", structureMap.get("外来专家意见").replaceAll("签字:", ""));
+                }
+                if (structureMap.containsKey("被邀医师")) {
+                    structureMap.put("会诊医师", structureMap.get("被邀医师"));
+                }
+
+            } else {
+                htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+                //htmlContent = CommonAnalysisUtil.html2String(html);
+                if (StringUtil.isNotBlank(htmlContent)) {
+                    htmlContent = htmlContent.replaceAll("[   ]", " ").replace("第1页", "");
+                    CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+                }
+            }
+            if (structureMap.containsKey("会诊到达时间")) {
+                String arriveDateStr = CommonAnalysisUtil.extractDate(structureMap.get("会诊到达时间"));
+                if (StringUtil.isNotBlank(arriveDateStr)) {
+                    structureMap.put("会诊意见", structureMap.get("会诊到达时间").replace(arriveDateStr, "").trim());
+                    structureMap.put("会诊到达时间", arriveDateStr);
+                }
+            }
+            CommonAnalysisUtil.processType(structureMap, "会诊类型");
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationRecordHtmlAnalysis.java

@@ -0,0 +1,55 @@
+package com.lantone.qc.trans.wenfuyi.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 ConsultationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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");
+            analysisGeneral(recTitle, bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true).replace("(记录会诊意见执行情况)", "");
+        CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
+        List<String> titles = Lists.newArrayList(
+                "会诊记录"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, text);
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
+    }
+
+}

+ 56 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/CrisisValueReportHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.wenfuyi.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 CrisisValueReportHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            analysisGeneral(recTitle,bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.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);
+    }
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/CriticallyIllNoticeHtmlAnalysis.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.wenfuyi.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 CriticallyIllNoticeHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            String htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replaceAll("[   ]", " ");
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "告知时间");
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

+ 47 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DeathCaseDiscussHtmlAnalysis.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.trans.wenfuyi.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 DeathCaseDiscussHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    private String modeId = "3";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String text = doc.selectFirst("body").children().text();
+            List<String> titles = Lists.newArrayList("讨论时间", "讨论地点", "主持人", "病例报告人", "参加人员", "职 业", "单位或现住址",
+                    "入院日期", "死亡时间", "死亡诊断", "死亡原因", "具体讨论意见", "主持人小结意见", "主持人(科主任正职)签名",
+                    "记录医师", "记录日期");
+            CommonAnalysisUtil.extractWardInfo(recTitle,text,map);
+            titles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
+            WenFuYiHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+}

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DeathRecordHtmlAnalysis.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.wenfuyi.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 DeathRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            String htmlContent = doc.selectFirst("body").children().text();
+            if (StringUtil.isNotBlank(htmlContent)) {
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "记录日期");
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+}

+ 68 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DifficultCaseDiscussHtmlAnalysis.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.trans.wenfuyi.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 DifficultCaseDiscussHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            String htmlContent = doc.selectFirst("body").children().text();
+            if (StringUtil.isNotBlank(htmlContent)) {
+                CommonAnalysisUtil.extractWardInfo(recTitle,htmlContent, structureMap);
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "告知时间");
+            WenFuYiHtmlAnalysisUtil.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/wenfuyi/util/DutyShiftSystemHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.wenfuyi.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 DutyShiftSystemHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    private String modeId = "9";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
+            analysisGeneral(recTitle,bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.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/wenfuyi/util/FirstCourseRecordHtmlAnalysis.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.wenfuyi.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 FirstCourseRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    private String modeId = "2";
+
+    @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];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body"), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                String[] lines = htmlContent.split("\n\n");
+                titles = CommonAnalysisUtil.sortTitlesNoColon(titles, htmlContent);
+                CommonAnalysisUtil.cutByTitlesNoColon(htmlContent, titles, 0, structureMap);
+            }
+
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTitle, structureMap);
+            //        CommonAnalysisUtil.extractDateByTitle(structureMap, "时间");
+            //        structureMap.forEach((k,v)-> System.out.println(k + "------" + v));
+            //        structureMap.put("rec_title=", "107");
+
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/LeaveHospitalHtmlAnalysis.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.wenfuyi.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 LeaveHospitalHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    private String modeId = "5";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            List<String> titles = Lists.newArrayList(
+                    "入院诊断(Admitting diagnosis)", "出院诊断(Discharge diagnosis)", "入院情况(Admission status)", "诊疗经过(Hospital course)", "出院情况(Discharge status)", "疗效评定(Curative effect)",
+                    "出院医嘱(Discharge instructions)", "患者/法定监护人/委托代理人签名", "签名时间");
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body"), true);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replace("医务人员已告知出院录中主要内容。", "")
+                        .replace("诊疗经过(Hospital course)", "诊疗经过(Hospital course):")
+                        .replace("出院医嘱(Discharge instructions)", "出院医嘱(Discharge instructions):");
+                List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, htmlContent);
+                CommonAnalysisUtil.cutByTitles(htmlContent, sortTitles, 0, structureMap);
+            }
+            if (structureMap.get("签名时间") != null) {
+                structureMap.put("签名时间", structureMap.get("签名时间").replace("年 月 日 时 分", ""));
+            }
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+}

+ 65 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationHtmlAnalysis.java

@@ -0,0 +1,65 @@
+package com.lantone.qc.trans.wenfuyi.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 OperationHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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];
+            String bigDivElement = Jsoup.parse(html).selectFirst("body").children().text();
+            analysisGeneral(recTitle, bigDivElement, map);
+            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(String recTitle, String bigDivElement, Map<String, String> map) {
+        String text = bigDivElement.replace("温馨提示:【术后首次病程记录】请在离开手术室之前书写完毕,返回病房后及时告知患方并签字,签字时间应迟于记录时间。", "")
+                .replace("温馨提示:【术后首次病程记录】请先在手术室录入,然后回病房打印。", "")
+                .replace("注:病灶描述。", "").replace("注:手术简要步骤、病灶切除、送病理等。", "")
+                .replace("注:病人回病房时的一般情况,如生命体征、麻醉后情况等。", "").replace("注:包括用药、引流管等。", "");
+
+        int index1 = text.indexOf("主刀/I助签名");
+        int index2 = text.indexOf("患者/法定监护人/委托代理人签名");
+        if (!text.contains("记录时间")) {
+            if (index1 != -1 && index2 != -1) {
+                text = text.substring(0, index1)
+                        + text.substring(index1, index2).replace("签名时间", "主刀签字时间").replace("年月日时分秒", "")
+                        + text.substring(index2).replace("签名时间", "患方签字时间").replace("年月日时分秒", "");
+            }
+        }
+
+        CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
+        List<String> titles = Lists.newArrayList(
+                "手术开始时间", "手术结束时间", "手术时间", "麻醉方式", "手术方式", "术中诊断", "术中所见", "手术简要经过", "患者术后情况", "术后处理措施", "术后应当特别注意观察的事项",
+                        "主刀/I助签名", "患者/法定监护人/委托代理人签名", "主刀签字时间", "患方签字时间", "记录时间"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, text);
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
+    }
+
+}

+ 51 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationRecordHtmlAnalysis.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.trans.wenfuyi.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 16:36
+ */
+@Slf4j
+public class OperationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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];
+            String content = Jsoup.parse(html).selectFirst("body").children().text();
+            analysisGeneral(content, map);
+            WenFuYiHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(String content, Map<String, String> map) {
+        content = content.replaceAll("注:如果手术记录中的手术日期有变更,必须重新点击“编辑手术名称”按钮保存。", "");
+        List<String> titles = Lists.newArrayList(
+                "手术开始时间", "手术结束时间", "手术日期", "术前诊断", "术中诊断", "手术名称", "主刀医师", "一助", "二助", "麻醉方式", "麻醉者", "体位及手术径路", "探查(术中所见)",
+                "操作步骤", "手术经过(手术小结)", "主刀签名", "记录者", "记录时间", "记录日期"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, content);
+        CommonAnalysisUtil.cutByTitlesNoColon(content, titles, 0, map);
+    }
+
+}

+ 83 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/PreoperativeHtmlAnalysis.java

@@ -0,0 +1,83 @@
+package com.lantone.qc.trans.wenfuyi.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 PreoperativeHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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");
+            analysisGeneral(bigDivElement, map);
+
+            WenFuYiHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+            WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+
+    private void analysisGeneral(Element bigDivElement, Map<String, String> map) {
+        map.put("文书标题", bigDivElement.select("center").text());
+        String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement.select("table").first(), true);
+
+        int index1 = text.indexOf("医师签名");
+        int index2 = text.lastIndexOf("主刀医师签名");
+        if (index1 != -1 && index2 != -1) {
+            text = text.substring(0, index1)
+                    + text.substring(index1, index2).replace("签名时间", "经治医师签字时间").replace("年月日时分秒", "")
+                    + text.substring(index2).replace("签名时间", "主刀医师签字时间").replace("年月日时分秒", "");
+        }
+        text = text.replace("(如高血压病、冠心病、糖尿病、脑梗、心梗、心肺肝肾功能不全、口服抗凝药等)", "")
+                .replace("二、讨论结论:", "")
+                .replace("一、简要病情", "简要病情");
+        List<String> titles = Lists.newArrayList(
+                "讨论时间", "讨论方式", "参加人员", "简要病情",
+                "术前诊断", "手术指征与禁忌征", "可替代方案", "拟施手术方式、名称及可能的变更", "计划性多次手术",
+                "1.拟施麻醉方式",
+                "2.术前特殊准备", "3.主要术中、术后风险及防范措施", "4.术中、术后注意事项(含护理事项)",
+                "医师签名", "经治医师签字时间", "主刀医师签名", "主刀医师签字时间");
+        titles = CommonAnalysisUtil.sortTitles(titles, text);
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, 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("年 月 日 时 分", ""));
+        }
+    }
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/RescueHtmlAnalysis.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.wenfuyi.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 RescueHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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");
+            analysisGeneral(recTitle, bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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) {
+        String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true).replace("备注:如抢救失败,应动员近亲属做尸检,签署尸检同意书。如近亲属拒绝尸检及拒签同意书应记录在病历上", "");
+        CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
+        List<String> titles = Lists.newArrayList(
+                "抢救时间", "参加抢救人员姓名和职称", "病情变化情况", "抢救措施及详细经过"
+        );
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, text);
+        CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+    }
+
+}

+ 51 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/StagesSummaryHtmlAnalysis.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.trans.wenfuyi.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 StagesSummaryHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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");
+            analysisGeneral(recTitle, bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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) {
+        String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
+        String bqjlText = "病情记录:" + map.get("病情记录");
+        map.remove("病情记录");
+        List<String> titles = Lists.newArrayList(
+                "病情记录", "入院情况", "入院诊断", "诊疗经过", "目前情况", "目前诊断", "诊疗计划", "治疗组组长"
+        );
+        titles = CommonAnalysisUtil.sortTitles(titles, bqjlText);
+        CommonAnalysisUtil.cutByTitles(bqjlText, titles, 0, map);
+    }
+
+}

+ 92 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ThreeLevelWardHtmlAnalysis.java

@@ -0,0 +1,92 @@
+package com.lantone.qc.trans.wenfuyi.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 org.jsoup.nodes.Node;
+import org.jsoup.select.Elements;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.lantone.qc.trans.comsis.CommonAnalysisUtil.extractDate;
+
+/**
+ * @Description: 自定义病程记录html解析
+ * @author: HUJING
+ * @time: 2020/9/15 10:28
+ */
+@Slf4j
+public class ThreeLevelWardHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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");
+            if (bigDivElement.childNodeSize() == 1) {
+                bigDivElement = bigDivElement.child(0);
+            }
+            String htmlText = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+            CommonAnalysisUtil.extractWardInfo(recTitle, htmlText, structureMap);
+            List<String> titles = Lists.newArrayList("摘要", "病程录内容");
+            titles = CommonAnalysisUtil.sortTitles(titles, htmlText);
+            CommonAnalysisUtil.cutByTitles(htmlText, titles, 0, structureMap);
+            WenFuYiHtmlAnalysisUtil.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/wenfuyi/util/TransferIntoHtmlAnalysis.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.wenfuyi.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 TransferIntoHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            analysisGeneral(recTitle, bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.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);
+    }
+
+}

+ 65 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/TransferOutHtmlAnalysis.java

@@ -0,0 +1,65 @@
+package com.lantone.qc.trans.wenfuyi.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 TransferOutHtmlAnalysis implements WenFuYiHtmlAnalysis {
+
+    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);
+            analysisGeneral(recTitle, bigDivElement, map);
+            WenFuYiHtmlAnalysisUtil.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 = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+        CommonAnalysisUtil.extractWardInfo(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);
+    }
+}

+ 41 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/VTEGradeHtmlAnalysis.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.wenfuyi.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: VTEGradeHtmlAnalysis
+ * @Description: VTE评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class VTEGradeHtmlAnalysis implements WenFuYiHtmlAnalysis {
+    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;
+    }
+}

+ 14 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/WenFuYiHtmlAnalysis.java

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

+ 243 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/WenFuYiHtmlAnalysisUtil.java

@@ -0,0 +1,243 @@
+package com.lantone.qc.trans.wenfuyi.util;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+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 WenFuYiHtmlAnalysisUtil {
+
+    /**
+     * 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 if (tdText.contains("中医诊断:") && tdText.contains("西医诊断:")) {
+                List<String> titles = Lists.newArrayList("中医诊断", "西医诊断");
+                CommonAnalysisUtil.cutByTitles(tdText, titles, 0, map);
+                map.put("初步诊断", "中医诊断:" + map.get("中医诊断") + " 西医诊断:" + map.get("西医诊断"));
+            } 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;
+    }
+
+}

+ 0 - 7
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/XmlAnalysis.java

@@ -1,7 +0,0 @@
-package com.lantone.qc.trans.wenfuyi.util;
-
-import java.util.Map;
-
-public interface XmlAnalysis {
-    Map<String, String> analysis(String... args);
-}

+ 12 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzAnalysis.java

@@ -0,0 +1,12 @@
+package com.lantone.qc.trans.wenfuyi.util.ez;
+
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2021/1/6 14:24
+ */
+public interface EzAnalysis {
+    Map<String, String> analysis(String xml) throws Exception;
+}

+ 41 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzClinicalBloodAnalysis.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.wenfuyi.util.ez;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.trans.wenfuyi.util.ez.util.EzXmlUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 输血记录解析
+ * @author: HUJING
+ * @time: 2021/1/7 11:20
+ */
+@Slf4j
+public class EzClinicalBloodAnalysis implements EzAnalysis {
+
+    @Override
+    public Map<String, String> analysis(String xml) throws Exception {
+        Map<String, String> map = EzXmlUtil.analysis(xml);
+        Map<String, String> structureMap = EzXmlUtil.mapKeyContrast(map, keyContrasts);
+        return map;
+    }
+
+    /**
+     * 目前能解析字段:
+     * 全文本
+     * 诊断
+     * 检验结果
+     * 血型
+     * 输注量
+     * 输血开始时间
+     * 输血日期end
+     * 输血结束时间
+     * 输血指征
+     */
+    private static List<String> keyContrasts = Lists.newArrayList(
+            "输注量=输血量(mL)",
+            "血型=ABO血型代码"
+    );
+}

+ 21 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzDeathCaseDiscussAnalysis.java

@@ -0,0 +1,21 @@
+package com.lantone.qc.trans.wenfuyi.util.ez;
+
+import com.lantone.qc.trans.wenfuyi.util.ez.util.EzXmlUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+/**
+ * @Description: 死亡病例讨论记录文档生成
+ * @author: HUJING
+ * @time: 2021/1/4 17:25
+ */
+@Slf4j
+public class EzDeathCaseDiscussAnalysis implements EzAnalysis {
+
+    @Override
+    public Map<String, String> analysis(String xml) throws Exception {
+        Map<String, String> map = EzXmlUtil.analysis(xml);
+        return map;
+    }
+}

+ 40 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzOperationRecordAnalysis.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.trans.wenfuyi.util.ez;
+
+import com.lantone.qc.trans.wenfuyi.util.ez.util.EzXmlUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+/**
+ * @Description: 手术记录解析
+ * @author: HUJING
+ * @time: 2021/1/7 11:20
+ */
+@Slf4j
+public class EzOperationRecordAnalysis implements EzAnalysis {
+
+    @Override
+    public Map<String, String> analysis(String xml) throws Exception {
+        Map<String, String> map = EzXmlUtil.analysis(xml);
+        if (map.containsKey("手术结束时间")) {
+            map.put("手术结束时间", map.get("手术结束时间").split(" ")[0]);
+        }
+        return map;
+    }
+    /**
+     * 目前能解析字段:
+     *  手术开始时间
+     *  手术结束时间
+     *  术前诊断
+     *  手术名称
+     *  术中诊断
+     *  手 术 者
+     *  麻醉方法
+     *  麻 醉 者
+     *  术中并发症
+     *  存在问题
+     *  术中失血量
+     *  手术经过
+     *  日期
+     */
+}

+ 337 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/EzXmlAnalysis.java

@@ -0,0 +1,337 @@
+package com.lantone.qc.trans.wenfuyi.util.ez;
+
+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 org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.dom4j.Node;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/24 11:28
+ */
+public class EzXmlAnalysis {
+
+    public static Map<String, String> analysis(String deptName, String xml) throws Exception {
+        if (deptName.equals("小儿外科")) {
+            return analysisEk(deptName, xml);
+        }
+        return null;
+    }
+
+    public static Map<String, String> analysisEk(String deptName, String xml) throws Exception {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        Document doc = DocumentHelper.parseText(xml);
+        Element rootElement = doc.getRootElement();
+        jbxxInsertMap(rootElement, map);
+        tgjcInsertMap(rootElement, map);
+        fzjcInsertMap(rootElement, map);
+        zkjcInsertMap(rootElement, map);
+        disInsertMap(rootElement, map);
+        otherInsertMap(rootElement, map);
+        return map;
+    }
+
+    //其他信息
+    public static void otherInsertMap(Element rootElement, Map<String, String> map) {
+        List<String> titles = Lists.newArrayList(
+                "主诉", "现病史", "既往史", "手术史", "输血史", "过敏史", "个人史", "预防接种史", "家族史", "婚育史", "月经史"
+        );
+        String rootText = elementTxt(rootElement);
+        String signTimeStr = findTimeStr(rootText.substring(rootText.length() - 18));
+        if (StringUtil.isNotBlank(signTimeStr)) {
+            rootText = rootText.substring(0, rootText.lastIndexOf(signTimeStr));
+        }
+        titles = CommonAnalysisUtil.sortTitlesNoColon(titles, rootText);
+        CommonAnalysisUtil.cutByTitlesNoColon(rootText, titles, 0, map);
+    }
+
+    public static void disInsertMap(Element rootElement, Map<String, String> map) {
+        Node cbzdNode = rootElement.selectSingleNode("section[@name='初步诊断']");
+        if (cbzdNode != null) {
+            rootElement.remove(cbzdNode);
+        }
+        Node disNode = rootElement.selectSingleNode("section[@name='诊断']");
+        if (disNode != null) {
+            String disText = elementTxt(disNode);
+            List<String> titles = CommonAnalysisUtil.sortTitlesNoColon(Lists.newArrayList("初步诊断", "补充诊断", "再次补充诊断", "修正诊断", "出院诊断"), disText);
+            CommonAnalysisUtil.cutByTitlesNoColon(disText, titles, 0, map);
+            titles.forEach(title -> {
+                disExt(map, title);
+            });
+            rootElement.remove(disNode);
+        }
+    }
+
+    //诊断特殊处理
+    public static void disExt(Map<String, String> map, String key) {
+        String disMessage = map.get(key);
+        String sign = null;
+        String signTime = null;
+        int signIndex = 0;
+        if (StringUtil.isNotBlank(disMessage)) {
+            Pattern pattern = Pattern.compile("[0-9]+[年/-][0-9]+[月/-][0-9]+[日]{0,}");
+            Matcher matcher = pattern.matcher(disMessage);
+            if (matcher.find()) {
+                signTime = matcher.group();
+                disMessage = disMessage.substring(0, matcher.start());
+            }
+
+            signIndex = disMessage.indexOf("医师签名");
+            if (signIndex > -1) {
+                sign = disMessage.substring(signIndex).replace("医师签名", "").replaceAll("[::]", "");
+                disMessage = disMessage.substring(0, signIndex);
+            }
+            map.put(key, disMessage);
+            if (StringUtil.isNotBlank(sign)) {
+                map.put(key + "签名", sign.replaceAll("日期", ""));
+            }
+            if (StringUtil.isNotBlank(signTime)) {
+                map.put(key + "签名日期", signTime);
+            }
+        }
+    }
+
+    //辅助检查
+    public static void fzjcInsertMap(Element rootElement, Map<String, String> map) {
+        Node fzjcNode = rootElement.selectSingleNode("section[@name='辅助检查']");
+        if (fzjcNode != null) {
+            map.put("辅助检查", elementTxt(fzjcNode).replaceFirst("辅助检查", ""));
+            rootElement.remove(fzjcNode);
+        }
+    }
+
+    // 专科检查
+    public static void zkjcInsertMap(Element rootElement, Map<String, String> map) {
+        Node zkjcNode = rootElement.selectSingleNode("section[@name='专科检查']");
+        if (zkjcNode != null) {
+            map.put("专科检查", elementTxt(zkjcNode).replaceFirst("专科检查", ""));
+            rootElement.remove(zkjcNode);
+        }
+    }
+
+    //基本信息
+    public static void jbxxInsertMap(Element rootElement, Map<String, String> map) {
+        Node jbxxNode = rootElement.selectSingleNode("section[@name='基本信息']");
+        if (jbxxNode != null) {
+            ((List<Element>) jbxxNode.selectNodes("fieldelem")).forEach(i -> {
+                elementInsertMap(i, map);
+            });
+            String age = map.get("年龄");
+            String ageYear = "";
+            String ageMon = "";
+            if (StringUtil.isNotBlank(age)) {
+                ageYear = age;
+                if (age.indexOf("岁") > -1) {
+                    ageYear = age;
+                } else if (age.indexOf("月") > -1) {
+                    ageYear = "";
+                    ageMon = age;
+                }
+            }
+            map.put("年龄岁", ageYear);
+            map.put("年龄月", ageMon);
+            rootElement.remove(jbxxNode);
+        }
+    }
+
+    //身高体重
+    public static void sgtzInsertMap(Element rootElement, Map<String, String> map) {
+        Map<String, String> map2 = Maps.newHashMap();
+        Node tgjcNode = rootElement.selectSingleNode("section[@name='体格检查']");
+        if (tgjcNode != null) {
+            Node ybqkNode = tgjcNode.selectSingleNode("section[@name='一般情况']");
+            if (ybqkNode != null) {
+                if (StringUtil.isBlank(map.get("身高"))) {
+                    elementInsertMap((Element) ybqkNode.selectSingleNode("fieldelem[@name='身高']"), map);
+                }
+                if (StringUtil.isBlank(map.get("体重"))) {
+                    elementInsertMap((Element) ybqkNode.selectSingleNode("fieldelem[@name='体重']"), map);
+                }
+
+                String ybqkText = elementTxt(ybqkNode);
+                List<String> titles = Lists.newArrayList("身高", "体重");
+                titles = CommonAnalysisUtil.sortTitlesNoColon(titles, ybqkText);
+                CommonAnalysisUtil.cutByTitlesNoColon(ybqkText, titles, 0, map2);
+                sgtzxyInsertMap(map2);
+            }
+        }
+
+        smtzSgtzInsertMap(rootElement, map2);
+        if (!map.containsKey("身高")) {
+            map.put("身高", map2.get("身高"));
+
+        }
+        if (!map.containsKey("体重")) {
+            map.put("体重", map2.get("体重"));
+        }
+        if (!map.containsKey("收缩压")) {
+            map.put("收缩压", map2.get("收缩压"));
+        }
+        if (!map.containsKey("舒张压")) {
+            map.put("舒张压", map2.get("舒张压"));
+        }
+    }
+
+    //生命体征中提取身高体重
+    public static void smtzSgtzInsertMap(Element rootElement, Map<String, String> map) {
+        Node tgjcNode = rootElement.selectSingleNode("section[@name='体格检查']");
+        if (tgjcNode != null) {
+            Node smtzNode = tgjcNode.selectSingleNode("section[@name='生命体征']");
+            if (smtzNode != null) {
+                Map<String, String> map2 = Maps.newHashMap();
+                String smtzText = elementTxt(smtzNode);
+                List<String> titles = Lists.newArrayList("身高", "体重", "血压", "BP");
+                titles = CommonAnalysisUtil.sortTitlesNoColon(titles, smtzText);
+                CommonAnalysisUtil.cutByTitlesNoColon(smtzText, titles, 0, map2);
+                sgtzxyInsertMap(map2);
+
+                map.put("收缩压", map2.get("收缩压"));
+                map.put("舒张压", map2.get("舒张压"));
+                if (StringUtil.isBlank(map.get("身高"))) {
+                    map.put("身高", map2.get("身高"));
+                }
+                if (StringUtil.isBlank(map.get("体重"))) {
+                    map.put("体重", map2.get("体重"));
+                }
+            }
+        }
+    }
+
+    //身高、体重、血压公共处理方法
+    private static void sgtzxyInsertMap(Map<String, String> map) {
+        Pattern pattern = Pattern.compile("[0-9]+[.]{0,1}[0-9]*");
+        if (map.containsKey("身高")) {
+            String value = map.get("身高");
+            if (StringUtil.isNotBlank(value)) {
+                value = StringUtil.removeBlank(value);
+                Matcher matcher = pattern.matcher(value);
+                if (matcher.find()) {
+                    map.put("身高", matcher.group());
+                } else {
+                    map.put("身高", "");
+                }
+            }
+        }
+        if (map.containsKey("体重")) {
+            String value = map.get("体重");
+            if (StringUtil.isNotBlank(value)) {
+                value = StringUtil.removeBlank(value);
+                Matcher matcher = pattern.matcher(value);
+                if (matcher.find()) {
+                    map.put("体重", matcher.group());
+                } else {
+                    map.put("体重", "");
+                }
+            }
+        }
+        pattern = Pattern.compile("[0-9]+[.]{0,1}[0-9]*/[0-9]+[.]{0,1}[0-9]*");
+        if (map.containsKey("血压") || map.containsKey("BP")) {
+            String value = map.get("血压");
+            if (StringUtil.isBlank(value)) {
+                value = map.get("BP");
+            }
+            if (StringUtil.isNotBlank(value)) {
+                value = StringUtil.removeBlank(value);
+                Matcher matcher = pattern.matcher(value);
+                if (matcher.find()) {
+                    value = matcher.group();
+                    String[] arry = value.split("/");
+                    if (arry.length == 2) {
+                        map.put("收缩压", arry[0]);
+                        map.put("舒张压", arry[1]);
+                    }
+                }
+            }
+        }
+    }
+
+    //体格检查
+    public static void tgjcInsertMap(Element rootElement, Map<String, String> map) {
+        Node tgjcNode = rootElement.selectSingleNode("section[@name='体格检查']");
+        if (tgjcNode != null) {
+            Node smtzNode = tgjcNode.selectSingleNode("section[@name='生命体征']");
+            if (smtzNode != null) {
+                ((List<Element>) smtzNode.selectNodes("fieldelem")).forEach(i -> {
+                    elementInsertMap(i, map);
+                });
+            }
+            ((List<Element>) tgjcNode.selectNodes("section[@name!='生命体征']")).forEach(i -> {
+                elementInsertMap(i, map);
+            });
+
+            String jzsz = map.get("脊柱四肢");
+            String jz = "";
+            String sz = "";
+            if (StringUtil.isNotBlank(jzsz)) {
+                if (jzsz.indexOf("四肢") > -1) {
+                    jz = jzsz.substring(0, jzsz.indexOf("四肢"));
+                    sz = jzsz.substring(jzsz.indexOf("四肢"));
+                } else {
+                    jz = jzsz;
+                }
+            }
+            map.put("脊柱", jz);
+            map.put("四肢", sz);
+            sgtzInsertMap(rootElement, map);
+            rootElement.remove(tgjcNode);
+        }
+    }
+
+    public static String elementTxt(Node node) {
+        if (node != null) {
+            return StringUtil.removeBlank(node.getStringValue());
+        } else {
+            return "";
+        }
+    }
+
+    public static void elementInsertMap(Element element, Map<String, String> map) {
+        if (element == null || map == null) {
+            return;
+        }
+        String key = null;
+        List<Element> elements = element.elements();
+        if (elements.size() > 0 && (key = isKey(elementTxt(elements.get(0)))) != null) {
+            element.remove(elements.get(0));
+        } else {
+            key = element.attributeValue("name");
+        }
+        if (StringUtil.isNotBlank(key)) {
+            map.put(key, elementTxt(element));
+        }
+    }
+
+    public static String isKey(String key) {
+        if (StringUtil.isBlank(key)) {
+            return null;
+        }
+        key = StringUtil.removeBlank(key);
+        Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]+[::]");
+        if (pattern.matcher(key).matches()) {
+            return key.substring(0, key.length() - 1);
+        } else {
+            return null;
+        }
+    }
+
+    public static String findTimeStr(String text) {
+        String ret = "";
+        Pattern pattern = Pattern.compile("[0-9]+[年/-][0-9]+[月/-][0-9]+[日]{0,}");
+        Matcher matcher = pattern.matcher(text);
+        if (matcher.find()) {
+            ret = matcher.group();
+        }
+        return ret;
+    }
+
+}

+ 143 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ez/util/EzXmlUtil.java

@@ -0,0 +1,143 @@
+package com.lantone.qc.trans.wenfuyi.util.ez.util;
+
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.yiwu.util.MapUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.*;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description:
+ * @author: HUJING
+ * @time: 2021/1/4 14:30
+ */
+@Slf4j
+public class EzXmlUtil {
+
+    public static Map<String, String> analysis(String xml) throws Exception {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            Document doc = DocumentHelper.parseText(bom(xml));
+            Element rootElement = doc.getRootElement();
+            findAllNodes(rootElement, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            throw new Exception("xml解析错误:" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 从指定节点开始,向下寻找所有节点 ,包括其子节点<br/>
+     *
+     * @param node 所指定的节点
+     */
+    public static void findAllNodes(Element node, Map<String, String> map) {
+
+        putNode(node, map);
+
+        // 递归遍历当前节点所有的子节点
+        List<Element> listElement = node.elements();
+
+        // 遍历所有一级子节点
+        for (Element e : listElement) {
+            findAllNodes(e, map);// 递归
+        }
+    }
+
+    /**
+     * 存放节点,不包括其子节点
+     *
+     * @param node 所指定的节点
+     */
+    public static void putNode(Element node, Map<String, String> map) {
+        String labelName = node.getName();
+        List<Attribute> listAttr = node.attributes();// 所有属性
+        for (Attribute attr : listAttr) {// 遍历所有属性
+            //String name = attr.getName();// 属性名称
+            if (("fieldelem".equals(labelName)) && StringUtil.isNotBlank(attr.getValue())) {
+                String fieldelemKey = attr.getValue();// 属性的值
+                String text = node.getStringValue();
+                map.put(fieldelemKey, text);
+            }
+            if ("section".equals(labelName)) {
+                List<Element> content = node.content();
+                if (content.size() > 0) {
+                    Element firstEle = content.get(0);
+                    String key = firstEle.getStringValue();
+                    if (key.endsWith(":")) {
+                        key = key.substring(0, key.length() - 1);
+                    }
+                    String value = "";
+                    for (int i = 1; i < content.size(); i++) {
+                        String v = content.get(i).getStringValue();
+                        value += v + " ";
+                    }
+                    map.put(key, value);
+                }
+            }
+        }
+    }
+
+    public static String bom(String result) {
+        if (null != result && !"".equals(result)) {
+            if (result.contains("<") && result.lastIndexOf(">") != -1 && result.lastIndexOf(">") > result.indexOf("<")) {
+                result = result.substring(result.indexOf("<"), result.lastIndexOf(">") + 1);
+            }
+        }
+        return result;
+    }
+
+    public static String elementTxt(Node node) {
+        if (node != null) {
+            return StringUtil.removeBlank(node.getStringValue());
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * 根据给定key映射
+     *
+     * @param sourceMap
+     * @param keyContrasts
+     * @return
+     */
+    public static Map<String, String> mapKeyContrast(Map<String, String> sourceMap, List<String> keyContrasts) {
+        Map<String, String> retMap = Maps.newHashMap();
+        mapKeyContrastCommon(sourceMap, keyContrasts, retMap);
+        return retMap;
+    }
+
+    public static void mapKeyContrastCommon(Map sourceMap, List<String> keyContrasts, Map<String, String> retMap) {
+        Map<String, String> sourceMap_ = MapUtil.copyMap(sourceMap);
+        String[] arry = null;
+        String sourceKey = null, targetKey;
+        Set<String> removeKey = new HashSet<>();
+        for (String keyContrast : keyContrasts) {
+            arry = keyContrast.split("=");
+            sourceKey = arry[0];
+            if (arry.length == 1) {
+                targetKey = arry[0];
+            } else {
+                targetKey = arry[1];
+            }
+            if (StringUtil.isNotBlank(sourceMap_.get(sourceKey))
+                    && (!retMap.containsKey(targetKey) || StringUtil.isBlank(retMap.get(targetKey)))) {
+                retMap.put(targetKey, sourceMap_.get(sourceKey));
+            }
+            removeKey.add(sourceKey);
+        }
+        Set<String> keySet = retMap.keySet();
+        for (String key : sourceMap_.keySet()) {
+            if (!keySet.contains(key) && !removeKey.contains(key)) { // 如果之前已放过key就不用放了
+                retMap.put(key, sourceMap_.get(key));
+            }
+        }
+    }
+}