Browse Source

宁波北仑配置添加

rengb 4 years ago
parent
commit
444bbf9b72
34 changed files with 3237 additions and 0 deletions
  1. 6 0
      public/pom.xml
  2. 40 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunAnesthesiaRelatedDocTrans.java
  3. 134 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunBeHospitalizedDocTrans.java
  4. 63 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicBloodEffectDocTrans.java
  5. 78 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicalBloodDocTrans.java
  6. 240 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunConsultationDocTrans.java
  7. 36 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunCrisisInfoDocTrans.java
  8. 78 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunCrisisValueReportDocTrans.java
  9. 74 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunCriticallyIllNoticeDocTrans.java
  10. 56 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDailyCourseRecordDocTrans.java
  11. 70 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDeathCaseDiscussDocTrans.java
  12. 79 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDeathRecordDocTrans.java
  13. 73 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDifficultCaseDiscussDocTrans.java
  14. 324 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDocTrans.java
  15. 36 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDoctorAdviceDocTrans.java
  16. 76 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDutyShiftSystemDocTrans.java
  17. 85 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstCourseRecordDocTrans.java
  18. 65 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstPageRecordDocTrans.java
  19. 18 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunInformedConsentDocTrans.java
  20. 67 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunLeaveHospitalDocTrans.java
  21. 36 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunLisDocTrans.java
  22. 26 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunMedicalRecordInfoDocTrans.java
  23. 20 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunNoticeOfConversationDocTrans.java
  24. 69 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunNursingSystemDocTrans.java
  25. 479 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunOperationDocTrans.java
  26. 40 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunOutDepDocTrans.java
  27. 60 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunPathologyShipDocTrans.java
  28. 68 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunRescueDocTrans.java
  29. 76 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunSeriouslyIllNoticeDocTrans.java
  30. 86 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunStagesSummaryDocTrans.java
  31. 308 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunThreeLevelWardDocTrans.java
  32. 240 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunTransferRecordDocTrans.java
  33. 14 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunHtmlAnalysis.java
  34. 17 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunLeaveHospitalHtmlAnalysis.java

+ 6 - 0
public/pom.xml

@@ -34,6 +34,12 @@
             <artifactId>dom4j</artifactId>
             <version>1.6.1</version>
         </dependency>
+        <!-- jsoup HTML parser library @ https://jsoup.org/ -->
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.12.1</version>
+        </dependency>
         <dependency>
             <groupId>jaxen</groupId>
             <artifactId>jaxen</artifactId>

+ 40 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunAnesthesiaRelatedDocTrans.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.AnesthesiaRelatedDoc;
+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:
+ * @Author: HUJING
+ * @Date: 2020/5/11 16:23
+ */
+public class BeiLunAnesthesiaRelatedDocTrans extends ModelDocTrans {
+    @Override
+    public List<AnesthesiaRelatedDoc> extract(MedrecVo medrecVo) {
+        List<AnesthesiaRelatedDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getAnesthesiaRelatedDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private AnesthesiaRelatedDoc getAnesthesiaRelatedDoc(Map<String, String> content) {
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(content, keyContrasts);
+        AnesthesiaRelatedDoc anesthesiaRelatedDoc = new AnesthesiaRelatedDoc();
+        anesthesiaRelatedDoc.setStructureMap(structureMap);
+        anesthesiaRelatedDoc.setPageData((Map) content);
+        return anesthesiaRelatedDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "组织手术名称=手术名称"
+    );
+}

+ 134 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunBeHospitalizedDocTrans.java

@@ -0,0 +1,134 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.beilun.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunLeaveHospitalHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/5 15:47
+ */
+public class BeiLunBeHospitalizedDocTrans extends ModelDocTrans {
+
+    @Override
+    public BeHospitalizedDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = CxXmlUtil.firstLevelNodeValue(content);
+        String sex = "男";
+        for (String key : sourceMap.keySet()) {
+            if (key.indexOf("性别") > -1) {
+                if (sourceMap.get(key).indexOf("男") > -1 || sourceMap.get(key).indexOf("女") > -1) {
+                    sex = StringUtil.removeBlank(sourceMap.get(key));
+                }
+            }
+        }
+        sourceMap.put(sex, "");
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+        String specialCheck = structureMap.get("专科检查");
+        if (StringUtil.isNotBlank(specialCheck)) {
+            structureMap.put("专科体格检查", specialCheck);
+        } else {
+            String tgjc = concatSpecialCheck(sourceMap);
+            if (StringUtil.isNotBlank(tgjc)) {
+                structureMap.put("专科体格检查", tgjc);
+            }
+        }
+        String marital = structureMap.get("婚育史");
+        String marry = structureMap.get("婚姻");
+        if (StringUtil.isBlank(marital) && StringUtil.isNotBlank(marry)) {
+            structureMap.put("婚育史", marry);
+        }
+        BeHospitalizedDoc beHospitalizedDoc = ModelDocGenerate.beHospitalizedDocGen(structureMap);
+        beHospitalizedDoc.setText(content);
+        beHospitalizedDoc.setPageData((Map) structureMap);
+        return beHospitalizedDoc;
+    }
+
+
+    private String concatSpecialCheck(Map<String, String> sourceMap) {
+        return concatString(sourceMap.get("一般情况")) +
+                concatString(sourceMap.get("皮肤情况")) +
+                concatString(sourceMap.get("淋巴")) +
+                concatString(sourceMap.get("头部检查")) +
+                concatString(sourceMap.get("颈部")) +
+                concatString(sourceMap.get("胸部检查")) +
+                concatString(sourceMap.get("肺部检查")) +
+                concatString(sourceMap.get("心脏检查")) +
+                concatString(sourceMap.get("血管")) +
+                concatString(sourceMap.get("腹部检查")) +
+                concatString(sourceMap.get("外生殖器")) +
+                concatString(sourceMap.get("直肠肛门")) +
+                concatString(sourceMap.get("四肢脊柱检查")) +
+                concatString(sourceMap.get("神经系统检查")) +
+                concatString(sourceMap.get("其他说明"));
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "出生地++++出生地(住院)=出生地",
+            "工作单位++++工作单位地址=工作单位",
+            "婚姻状况++++婚姻=婚姻",
+            "诊疗经过++++入院诊治经过=诊疗经过",
+            "联系电话=电话",
+            "供史者++++病史叙述者=病史陈述者",
+            "++++病史叙述者=病史陈述者",
+            "供史者++++供史者新=病史陈述者",
+            "供史者=病史陈述者",
+            "病史叙述者=病史陈述者",
+            "病史提供者++++病史叙述者=病史陈述者",
+            "婚育史:=婚育史",
+            "外生殖器++++外生殖器文本框=",
+            //            "户口地址=联系地址",
+            "家庭住址++++现住址=现住址",
+            "产次++++产=产次",
+            "家长姓名++++家长=家长姓名",
+            "职业++++首页职业新=职业",
+            "签名时间++++修正签名时间=修正签名时间",
+            "修正诊断++++初步诊断=修正诊断",
+            "与患者关系=关系",
+//            "出生日期=出生时间",
+            "入院情况=入院病情",
+            "++++药物过敏史=药物过敏史",
+            "++++浮肿少尿史=浮肿少尿史",
+            "++++出血史=出血史",
+            "++++多饮多尿史=多饮多尿史",
+            "++++传染病史=传染病史",
+            "++++尿频尿痛史=尿频尿痛史",
+            "++++外伤手术史=外伤手术史",
+            "++++咳嗽气喘史=咳嗽气喘史",
+            "++++抽搐史=抽搐史",
+            "++++重大疾病史和治疗史=重大疾病史和治疗史",
+            "++++腹痛腹泻史=腹痛腹泻史",
+            "++++过敏史=过敏史",
+            "++++输血史=输血史",
+            "++++胸闷心悸史=胸闷心悸史",
+            "实验室检查++++辅助检查=辅助检查",
+            "签名++++=医师签名",
+            "兄弟姐妹健康状况++++兄弟姐妹=兄弟姐妹健康状况",
+            "++++(外)祖父母=外祖父母",
+            "出生时间=出生日期"
+    );
+
+    private String concatString(String item) {
+        if (StringUtil.isBlank(item)) {
+            return "";
+        } else {
+            return item + "。";
+        }
+    }
+
+}

+ 63 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunClinicBloodEffectDocTrans.java

@@ -0,0 +1,63 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 王宇
+ * @create 2020-04-30 12:39
+ * @desc 输血后效果评价
+ **/
+public class BeiLunClinicBloodEffectDocTrans extends ModelDocTrans {
+    @Override
+    public List<ClinicBloodEffectDoc> extract(MedrecVo medrecVo) {
+        List<ClinicBloodEffectDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicalBloodDoc(contentMap));
+        });
+        return retList;
+    }
+    private ClinicBloodEffectDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+
+        ClinicBloodEffectDoc clinicBloodEffectDoc = ModelDocGenerate.clinicBloodEffectDoc(cutWordMap);
+        clinicBloodEffectDoc.setText(text);
+        clinicBloodEffectDoc.setPageData((Map) cutWordMap);
+
+        return clinicBloodEffectDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "输注时间",
+            "输注后效果评价",
+            "记录医师",
+            "记录时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "签名++++=记录医师",
+            "签名时间=",
+            "输血效果评价=输注后效果评价",
+            "日常病程记录++++文本框=输注后效果评价"
+    );
+}

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

@@ -0,0 +1,78 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 输血/血制品病程记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:21
+ */
+public class BeiLunClinicalBloodDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ClinicalBloodDoc> extract(MedrecVo medrecVo) {
+        List<ClinicalBloodDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicalBloodDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, "");
+        cutWordMap.putAll(structureMap);
+        if (StringUtil.isNotBlank(structureMap.get("输注种类、血型、数量"))) {
+            cutWordMap.put("输血成分及数量", structureMap.get("输注种类、血型、数量"));
+        }
+
+        ClinicalBloodDoc clinicalBloodDoc = ModelDocGenerate.clinicalBloodDocGen(cutWordMap);
+        clinicalBloodDoc.setText(text);
+        clinicalBloodDoc.setPageData((Map) cutWordMap);
+
+        return clinicalBloodDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "输注原因",
+            "输注时间",
+            "输注开始",
+            "输注结束",
+            "输注种类、血型、数量",
+            "输注过程",
+            "输注后效果评价",
+            "记录医师",
+            "记录时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "输注原因=",
+            "输注开始=",
+            "输注结束=",
+            "输注种类、血型、数量=",
+            "输注过程=",
+            "++++复选框=输注方式",
+            "签名++++=记录医师",
+            "签名时间="
+    );
+
+}

+ 240 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunConsultationDocTrans.java

@@ -0,0 +1,240 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+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.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 会诊文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+public class BeiLunConsultationDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ConsultationDoc> extract(MedrecVo medrecVo) {
+        List<ConsultationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+
+        Map<String, ConsultationRecordDoc> consultationRecordDocMap = getConsultationRecordDocMap((List) contentMap.get("会诊记录"));
+        Map<String, ConsultationResultsDoc> consultationResultsDocMap = getConsultationResultsDocMap((List) contentMap.get("会诊结果单"));
+        Map<String, ConsultationApplicationDoc> consultationApplicationDocMap = getConsultationApplicationDocMap((List) contentMap.get("会诊申请单"));
+
+        Set<String> consultationNameSet = Sets.newHashSet();
+        consultationNameSet.addAll(consultationRecordDocMap.keySet());
+        consultationNameSet.addAll(consultationResultsDocMap.keySet());
+        consultationNameSet.addAll(consultationApplicationDocMap.keySet());
+
+        consultationNameSet.forEach(consultationName -> {
+            ConsultationDoc consultationDoc = new ConsultationDoc();
+            consultationDoc.setConsultationName(consultationName);
+            consultationDoc.setConsultationRecordDoc(consultationRecordDocMap.get(consultationName));
+            consultationDoc.setConsultationResultsDoc(consultationResultsDocMap.get(consultationName));
+            consultationDoc.setConsultationApplicationDoc(consultationApplicationDocMap.get(consultationName));
+            retList.add(consultationDoc);
+        });
+
+        return retList;
+    }
+
+
+    /**************************************************会诊记录*********************************************************/
+    private Map<String, ConsultationRecordDoc> getConsultationRecordDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationRecordDoc consultationRecordDoc = getConsultationRecordDoc(contentMap);
+            consultationRecordDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationRecordDoc getConsultationRecordDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, consultationRecord_keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, consultationRecord_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+        MapUtil.keyAssig(cutWordMap, "记录医师", "签名");
+
+        ConsultationRecordDoc consultationRecordDoc = ModelDocGenerate.consultationRecordDocGen(cutWordMap);
+        consultationRecordDoc.setText(text);
+        consultationRecordDoc.setPageData((Map) cutWordMap);
+
+        return consultationRecordDoc;
+    }
+
+    private List<String> consultationRecord_sourceTitles = Lists.newArrayList(
+            "医师签名"
+    );
+
+    private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
+            "执行情况=会诊情况",
+            "记录日期=会诊申请日期",
+            "签名++++=签名",
+            "医师签名=签名"
+    );
+
+
+    /**************************************************会诊结果单*******************************************************/
+    private Map<String, ConsultationResultsDoc> getConsultationResultsDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationResultsDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationResultsDoc consultationResultsDoc = getConsultationResultsDoc(contentMap);
+            consultationResultsDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationResultsDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationResultsDoc getConsultationResultsDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, consultationApplication_keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, consultationApplication_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        ConsultationResultsDoc consultationResultsDoc = ModelDocGenerate.consultationResultsDocGen(cutWordMap);
+        consultationResultsDoc.setText(content);
+        consultationResultsDoc.setPageData((Map) cutWordMap);
+        return consultationResultsDoc;
+    }
+
+    private List<String> consultationResults_pageDataTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录医师"
+    );
+    private List<String> consultationResults_sourceTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录时间",
+            "记录医师"
+    );
+
+
+    /**************************************************会诊申请单*******************************************************/
+    private Map<String, ConsultationApplicationDoc> getConsultationApplicationDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationApplicationDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationApplicationDoc consultationApplicationDoc = getConsultationApplicationDoc(contentMap);
+            consultationApplicationDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationApplicationDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationApplicationDoc getConsultationApplicationDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> 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, consultationApplication_keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, consultationApplication_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        ConsultationApplicationDoc consultationApplicationDoc = ModelDocGenerate.consultationApplicationDocGen(cutWordMap);
+        consultationApplicationDoc.setText(text);
+        consultationApplicationDoc.setPageData((Map) cutWordMap);
+
+        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/beilun/BeiLunCrisisInfoDocTrans.java

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

+ 78 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunCrisisValueReportDocTrans.java

@@ -0,0 +1,78 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 危急值记录文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunCrisisValueReportDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CrisisValueReportDoc> extract(MedrecVo medrecVo) {
+        List<CrisisValueReportDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCrisisValueReportDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CrisisValueReportDoc getCrisisValueReportDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+        structureMap.put("医生姓名", structureMap.get("医生签名"));
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        CrisisValueReportDoc crisisValueReportDoc = ModelDocGenerate.crisisValueReportDocGen(cutWordMap);
+        crisisValueReportDoc.setText(text);
+        crisisValueReportDoc.setPageData((Map) cutWordMap);
+
+        return crisisValueReportDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "记录时间",
+            "记录医师",
+            "患者临床诊断",
+            "危急值记录内容",
+            "报告部门",
+            "报告人姓名",
+            "报告时间",
+            "接收人姓名",
+            "接收时间",
+            "病情分析及处理",
+            "医生签名",
+            "医生姓名",
+            "医生签名时间",
+            "签名时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "危急值记录=危急值记录内容",
+            "接收时间=",
+            "病情分析及处理=",
+            "++++病情评估=",
+            "签名++++=医生签名",
+            "签名时间=医生签名时间"
+    );
+
+}

+ 74 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunCriticallyIllNoticeDocTrans.java

@@ -0,0 +1,74 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病危通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunCriticallyIllNoticeDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CriticallyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<CriticallyIllNoticeDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCriticallyIllNoticeDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        CriticallyIllNoticeDoc criticallyIllNoticeDoc = ModelDocGenerate.criticallyIllNoticeDocGen(cutWordMap);
+        criticallyIllNoticeDoc.setText(text);
+        criticallyIllNoticeDoc.setPageData((Map) cutWordMap);
+
+        return criticallyIllNoticeDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "记录时间",
+            "记录医师",
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "目前诊断",
+            "签名",
+            "签名时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=病区",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "目前诊断++++初步诊断=目前诊断",
+            "签名++++=签名",
+            "签名时间="
+    );
+
+}

+ 56 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDailyCourseRecordDocTrans.java

@@ -0,0 +1,56 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.DailyCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 日常病程录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 17:34
+ */
+public class BeiLunDailyCourseRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DailyCourseRecordDoc> extract(MedrecVo medrecVo) {
+        List<DailyCourseRecordDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDailyCourseRecordDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DailyCourseRecordDoc getDailyCourseRecordDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        DailyCourseRecordDoc dailyCourseRecordDoc = new DailyCourseRecordDoc();
+        dailyCourseRecordDoc.setText(text);
+        dailyCourseRecordDoc.setPageData((Map) cutWordMap);
+
+        return dailyCourseRecordDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList();
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "日常病程记录++++文本框=病程记录内容",
+            "签名++++=签名"
+    );
+
+}

+ 70 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDeathCaseDiscussDocTrans.java

@@ -0,0 +1,70 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.DeathCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+public class BeiLunDeathCaseDiscussDocTrans extends ModelDocTrans {
+
+    @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> 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, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        DeathCaseDiscussDoc deathCaseDiscussDoc = ModelDocGenerate.deathCaseDiscussDocGen(cutWordMap);
+        deathCaseDiscussDoc.setText(text);
+        deathCaseDiscussDoc.setPageData((Map) cutWordMap);
+
+        return deathCaseDiscussDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "记录时间",
+            "记录医师",
+            "入院时间",
+            "死亡时间",
+            "出院时间",
+            "入院诊断",
+            "死亡诊断",
+            "讨论时间",
+            "讨论地点",
+            "参加讨论人员",
+            "讨论主持人",
+            "讨论内容",
+            "死亡原因",
+            "结论"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "讨论时间=",
+            "主持人=讨论主持人",
+            "参加人员姓名=参加讨论人员",
+            "讨论内容=",
+            "主持人小结++++主持人小结意见=结论",
+            "签名++++=记录医师",
+            "签名时间="
+    );
+
+}

+ 79 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDeathRecordDocTrans.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+public class BeiLunDeathRecordDocTrans extends ModelDocTrans {
+
+    @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> 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, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        DeathRecordDoc deathRecordDoc = ModelDocGenerate.deathRecordDocGen(cutWordMap);
+        deathRecordDoc.setText(text);
+        deathRecordDoc.setPageData((Map) cutWordMap);
+
+        return deathRecordDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "科别",
+            "床号",
+            "病案号",
+            "年龄",
+            "入院时间",
+            "死亡时间",
+            "入院情况",
+            "发病经过",
+            "入院诊断",
+            "诊疗经过",
+            "死亡原因",
+            "死亡诊断",
+            "记录医师",
+            "记录时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "入院时间=",
+            "死亡时间=",
+            "入院情况=",
+            "入院诊断++++初步诊断=入院诊断",
+            "诊疗经过=",
+            "死亡原因=",
+            "死亡诊断++++初步诊断=死亡诊断",
+            "签名++++=记录医师",
+            "签名时间=记录时间"
+    );
+
+}

+ 73 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDifficultCaseDiscussDocTrans.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+public class BeiLunDifficultCaseDiscussDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DifficultCaseDiscussDoc> extract(MedrecVo medrecVo) {
+        List<DifficultCaseDiscussDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDifficultCaseDiscussDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        DifficultCaseDiscussDoc difficultCaseDiscussDoc = ModelDocGenerate.difficultCaseDiscussDocGen(cutWordMap);
+        difficultCaseDiscussDoc.setText(content);
+        difficultCaseDiscussDoc.setPageData((Map) cutWordMap);
+
+        return difficultCaseDiscussDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "记录时间",
+            "记录医师",
+            "入院时间",
+            "入院诊断",
+            "讨论时间",
+            "讨论地点",
+            "讨论目的",
+            "主持人",
+            "参加讨论者",
+            "讨论内容",
+            "结论"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+          "讨论日期=讨论时间",
+          "人员及专业技术职务++++专业技术职务=参加讨论者",
+          "患者病情汇报=简要病情",
+          "讨论结果++++主持人小结意见=结论",
+          "签名++++=签名",
+            "患者病情汇报=讨论内容"
+    );
+
+}

+ 324 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDocTrans.java

@@ -0,0 +1,324 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.model.vo.QueryVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.trans.DocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BeiLunDocTrans
+ * @Description :
+ * @Author : 楼辉荣
+ * @Date: 2020-03-03 19:47
+ */
+public class BeiLunDocTrans extends DocTrans {
+
+    @Override
+    protected InputInfo extract(QueryVo queryVo) {
+        InputInfo inputInfo = new InputInfo();
+        for (MedrecVo i : queryVo.getMedrec()) {
+            if (i.getTitle().equals("会诊")) {
+                BeiLunConsultationDocTrans consultationDocTrans = new BeiLunConsultationDocTrans();
+                inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("手术")) {
+                BeiLunOperationDocTrans operationDocTrans = new BeiLunOperationDocTrans();
+                inputInfo.setOperationDocs(operationDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("转科")) {
+                BeiLunTransferRecordDocTrans transferRecordDocTrans = new BeiLunTransferRecordDocTrans();
+                inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("入院记录")) {
+                BeiLunBeHospitalizedDocTrans beHospitalizedDocTrans = new BeiLunBeHospitalizedDocTrans();
+                inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("输血/血制品病程记录")) {
+                BeiLunClinicalBloodDocTrans clinicalBloodDocTrans = new BeiLunClinicalBloodDocTrans();
+                inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("输血后效果评价")) {
+                BeiLunClinicBloodEffectDocTrans changxClinicBloodEffectDocTrans = new BeiLunClinicBloodEffectDocTrans();
+                inputInfo.setClinicBloodEffectDocs(changxClinicBloodEffectDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("危急值记录")) {
+                BeiLunCrisisValueReportDocTrans crisisValueReportDocTrans = new BeiLunCrisisValueReportDocTrans();
+                inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("危急值")) {
+                BeiLunCrisisInfoDocTrans changxCrisisInfoDocTrans = new BeiLunCrisisInfoDocTrans();
+                inputInfo.setCrisisInfoDocs(changxCrisisInfoDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("病危通知书")) {
+                BeiLunCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new BeiLunCriticallyIllNoticeDocTrans();
+                inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("死亡病例讨论记录")) {
+                BeiLunDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new BeiLunDeathCaseDiscussDocTrans();
+                inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("死亡记录")) {
+                BeiLunDeathRecordDocTrans deathRecordDocTrans = new BeiLunDeathRecordDocTrans();
+                inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("疑难病例讨论记录")) {
+                BeiLunDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new BeiLunDifficultCaseDiscussDocTrans();
+                inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("医嘱信息")) {
+                BeiLunDoctorAdviceDocTrans doctorAdviceDocTrans = new BeiLunDoctorAdviceDocTrans();
+                inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("手术麻醉信息")) {
+                BeiLunAnesthesiaRelatedDocTrans changxAnesthesiaRelatedDocTrans = new BeiLunAnesthesiaRelatedDocTrans();
+                inputInfo.setAnesthesiaRelatedDocs(changxAnesthesiaRelatedDocTrans.extract(i));
+            }
+            //            if (i.getTitle().equals("值班交接制度")) {
+            //                ChangxDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new ChangxDutyShiftSystemDocTrans();
+            //                inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
+            //            }
+            if (i.getTitle().equals("首次病程录")) {
+                BeiLunFirstCourseRecordDocTrans firstCourseRecordDocTrans = new BeiLunFirstCourseRecordDocTrans();
+                inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("病案首页")) {
+                BeiLunFirstPageRecordDocTrans firstPageRecordDocTrans = new BeiLunFirstPageRecordDocTrans();
+                inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("出院小结")) {
+                BeiLunLeaveHospitalDocTrans leaveHospitalDocTrans = new BeiLunLeaveHospitalDocTrans();
+                inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+            }
+            //            if (i.getTitle().equals("分级护理制度")) {
+            //                ChangxNursingSystemDocTrans nursingSystemDocTrans = new ChangxNursingSystemDocTrans();
+            //                inputInfo.setNursingSystemDoc(nursingSystemDocTrans.extract(i));
+            //            }
+            if (i.getTitle().equals("抢救记录")) {
+                BeiLunRescueDocTrans rescueDocTrans = new BeiLunRescueDocTrans();
+                inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+            }
+            //            if (i.getTitle().equals("病重通知书")) {
+            //                ChangxSeriouslyIllNoticeDocTrans seriouslyIllNoticeDocTrans = new ChangxSeriouslyIllNoticeDocTrans();
+            //                inputInfo.setSeriouslyIllNoticeDocs(seriouslyIllNoticeDocTrans.extract(i));
+            //            }
+            if (i.getTitle().equals("阶段小结")) {
+                BeiLunStagesSummaryDocTrans stagesSummaryDocTrans = new BeiLunStagesSummaryDocTrans();
+                inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("查房记录")) {
+                BeiLunThreeLevelWardDocTrans threeLevelWardDocTrans = new BeiLunThreeLevelWardDocTrans();
+                threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("病理检验送检单")) {
+                BeiLunPathologyShipDocTrans pathologyShipDocTrans = new BeiLunPathologyShipDocTrans();
+                inputInfo.setPathologyShipDocs(pathologyShipDocTrans.extract(i));
+            }
+            //            if (i.getTitle().equals("知情同意书")) {
+            //                ChangxInformedConsentDocTrans informedConsentDocTrans = new ChangxInformedConsentDocTrans();
+            //                inputInfo.setInformedConsentDoc(informedConsentDocTrans.extract(i));
+            //            }
+            //            if (i.getTitle().equals("谈话告知书")) {
+            //                ChangxNoticeOfConversationDocTrans noticeOfConversationDocTrans = new ChangxNoticeOfConversationDocTrans();
+            //                inputInfo.setNoticeOfConversationDoc(noticeOfConversationDocTrans.extract(i));
+            //            }
+            if (i.getTitle().equals("日常病程录")) {
+                BeiLunDailyCourseRecordDocTrans dailyCourseRecordDocTrans = new BeiLunDailyCourseRecordDocTrans();
+                inputInfo.setDailyCourseRecordDocs(dailyCourseRecordDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("住院病历信息")) {
+                BeiLunMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new BeiLunMedicalRecordInfoDocTrans();
+                inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("化验")) {
+                BeiLunLisDocTrans changxLisDocTrans = new BeiLunLisDocTrans();
+                inputInfo.setLisDocs(changxLisDocTrans.extract(i));
+            }
+            if (i.getTitle().equals("门诊")) {
+                BeiLunOutDepDocTrans changxOutDepDocTrans = new BeiLunOutDepDocTrans();
+                inputInfo.setBeHospitalizedDoc(changxOutDepDocTrans.extract(i));
+            }
+        }
+        pageDataHandle(inputInfo);
+        return inputInfo;
+    }
+
+    private void pageDataHandle(InputInfo inputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() != null) {
+            inputInfo.getPageData().put("入院记录", Lists.newArrayList(inputInfo.getBeHospitalizedDoc().getPageData()));
+        }
+        if (inputInfo.getDeathCaseDiscussDoc() != null) {
+            inputInfo.getPageData().put("死亡病例讨论记录", Lists.newArrayList(inputInfo.getDeathCaseDiscussDoc().getPageData()));
+        }
+        if (inputInfo.getDeathRecordDoc() != null) {
+            inputInfo.getPageData().put("死亡记录", Lists.newArrayList(inputInfo.getDeathRecordDoc().getPageData()));
+        }
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            inputInfo.getPageData().put("首次病程录", Lists.newArrayList(inputInfo.getFirstCourseRecordDoc().getPageData()));
+        }
+        if (inputInfo.getLeaveHospitalDoc() != null) {
+            inputInfo.getPageData().put("出院小结", Lists.newArrayList(inputInfo.getLeaveHospitalDoc().getPageData()));
+        }
+        //        if (inputInfo.getNursingSystemDoc() != null) {
+        //            inputInfo.getPageData().put("分级护理制度", Lists.newArrayList(inputInfo.getNursingSystemDoc().getPageData()));
+        //        }
+        if (inputInfo.getFirstPageRecordDoc() != null) {
+            inputInfo.getPageData().put("病案首页", Lists.newArrayList(inputInfo.getFirstPageRecordDoc().getPageData()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
+            inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> i.getText().indexOf("输白蛋白") == -1).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
+            inputInfo.getPageData().put(
+                    "输血后效果评价",
+                    inputInfo.getClinicBloodEffectDocs()
+                            .stream()
+                            .map(i -> i.getPageData())
+                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy-MM-dd HH:mm"))
+                            .collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
+            inputInfo.getPageData().put("危急值记录", inputInfo.getCrisisValueReportDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCriticallyIllNoticeDocs())) {
+            inputInfo.getPageData().put("病危通知书", inputInfo.getCriticallyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDifficultCaseDiscussDocs())) {
+            inputInfo.getPageData().put("疑难病例讨论记录", inputInfo.getDifficultCaseDiscussDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getDoctorAdviceDocs())) {
+        //            inputInfo.getPageData().put("医嘱信息", inputInfo.getDoctorAdviceDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getDutyShiftSystemDocs())) {
+        //            inputInfo.getPageData().put("值班交接制度", inputInfo.getDutyShiftSystemDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        if (ListUtil.isNotEmpty(inputInfo.getRescueDocs())) {
+            inputInfo.getPageData().put("抢救记录", inputInfo.getRescueDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getSeriouslyIllNoticeDocs())) {
+        //            inputInfo.getPageData().put("病重通知书", inputInfo.getSeriouslyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        if (ListUtil.isNotEmpty(inputInfo.getStagesSummaryDocs())) {
+            inputInfo.getPageData().put("阶段小结", inputInfo.getStagesSummaryDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getThreeLevelWardDocs())) {
+            inputInfo.getPageData().put("查房记录", inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getPathologyShipDocs())) {
+            inputInfo.getPageData().put("病理检验送检单", inputInfo.getPathologyShipDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDailyCourseRecordDocs())) {
+            inputInfo.getPageData().put("日常病程录", inputInfo.getDailyCourseRecordDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
+            List<Map<String, Object>> crPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(crPd)) {
+                inputInfo.getPageData().put("会诊记录", crPd);
+            }
+
+            List<Map<String, Object>> caPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(caPd)) {
+                inputInfo.getPageData().put("会诊申请单", caPd);
+            }
+
+            List<Map<String, Object>> ctPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(ctPd)) {
+                inputInfo.getPageData().put("会诊结果单", ctPd);
+            }
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getOperationDocs())) {
+            List<Map<String, Object>> odPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationDiscussionDoc().getPageData())
+                    //                    .sorted((map1, map2) -> pageDataTimeSort(map1, map2, "手术日期", "yyyy/MM/dd"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(odPageDataList)) {
+                inputInfo.getPageData().put("术后首次病程及谈话记录", odPageDataList);
+            }
+
+            List<Map<String, Object>> orPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationRecordDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationRecordDoc().getPageData())
+                    //                    .sorted((map1, map2) -> pageDataTimeSort(map1, map2, "开始时间", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(orPageDataList)) {
+                inputInfo.getPageData().put("手术记录", orPageDataList);
+            }
+
+            List<Map<String, Object>> pdPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getPreoperativeDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getPreoperativeDiscussionDoc().getPageData())
+                    //                    .sorted((map1, map2) -> pageDataTimeSort(map1, map2, "讨论时间", "yyyy年MM月dd日 HH时mm分"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(pdPageDataList)) {
+                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
+            }
+            /*List<Map<String, Object>> oicPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationInformedConsentDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationInformedConsentDoc().getPageData())
+                    .sorted((map1, map2) -> pageDataTimeSort(map1, map2, "谈话日期", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(oicPageDataList)) {
+                inputInfo.getPageData().put("手术知情同意书", oicPageDataList);
+            }
+
+            List<Map<String, Object>> oscPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationSafetyChecklistDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationSafetyChecklistDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(oscPageDataList)) {
+                inputInfo.getPageData().put("手术安全核查表", oscPageDataList);
+            }*/
+        }
+        if (inputInfo.getTransferRecordDocs() != null) {
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferIntoDocs())) {
+                inputInfo.getPageData().put(
+                        "转入记录",
+                        inputInfo.getTransferRecordDocs().getTransferIntoDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferOutDocs())) {
+                inputInfo.getPageData().put(
+                        "转出记录",
+                        inputInfo.getTransferRecordDocs().getTransferOutDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+        }
+    }
+
+}

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

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

+ 76 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunDutyShiftSystemDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.beilun;
+
+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.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 值班交接制度文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:24
+ */
+public class BeiLunDutyShiftSystemDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DutyShiftSystemDoc> extract(MedrecVo medrecVo) {
+        List<DutyShiftSystemDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getDutyShiftSystemDoc(content));
+        });
+        return retList;
+    }
+
+    private DutyShiftSystemDoc getDutyShiftSystemDoc(String content) {
+        Map<String, String> pageData = Preproc.extract_doc_pub(true, pageDataTitles, content);
+        pageData.put("病程记录内容",
+                pageData.get("病程记录内容")
+                        .replace(pageData.get("病程记录时间"), "")
+                        .replace(pageData.get("病程记录名称"), "")
+        );
+
+        List<String> targetTitles = Lists.newArrayList();
+        sourceTitles.forEach(sourceTitle -> {
+            String targetTitle = "";
+            for (int index = 0; index < sourceTitle.length(); index++) {
+                if (index == sourceTitle.length() - 1) {
+                    targetTitle += sourceTitle.substring(index, index + 1);
+                } else {
+                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
+                }
+            }
+            targetTitles.add(targetTitle);
+        });
+
+        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
+        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+
+        DutyShiftSystemDoc dutyShiftSystemDoc = ModelDocGenerate.dutyShiftSystemDocGen(sourceMap);
+        dutyShiftSystemDoc.setText(content);
+        dutyShiftSystemDoc.setPageData((Map) pageData);
+
+        return dutyShiftSystemDoc;
+    }
+
+    private List<String> pageDataTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录医师"
+    );
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录时间",
+            "记录医师"
+    );
+
+}

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

@@ -0,0 +1,85 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.lantone.qc.trans.comsis.ModelDocGenerate.structureMapJoin;
+
+/**
+ * @Description: 首次病程录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+public class BeiLunFirstCourseRecordDocTrans extends ModelDocTrans {
+
+    @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> 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, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = getCutWordMap(text);
+        cutWordMap.putAll(structureMap);
+
+        FirstCourseRecordDoc firstCourseRecordDoc = ModelDocGenerate.firstCourseRecordDocGen(cutWordMap);
+        firstCourseRecordDoc.setText(text);
+        firstCourseRecordDoc.setPageData((Map) cutWordMap);
+        List<String> keys = Lists.newArrayList("需求评估", "预期目标", "诊疗计划", "治疗监测计划");
+        String treatPlanJoin = structureMapJoin(structureMap, keys);
+        firstCourseRecordDoc.getTreatPlanLabel().setAiText(treatPlanJoin);
+        return firstCourseRecordDoc;
+    }
+
+    private Map<String, String> getCutWordMap(String content) {
+        Map<String, String> retMap = Maps.newHashMap();
+        if (StringUtil.isBlank(content)) {
+            return retMap;
+        }
+        List<String> targetTitles = Lists.newArrayList();
+        sourceTitles.forEach(sourceTitle -> {
+            String targetTitle = "[一二三四五六七八九十]{0,1}[、.]{0,1}";
+            for (int index = 0; index < sourceTitle.length(); index++) {
+                if (index == sourceTitle.length() - 1) {
+                    targetTitle += sourceTitle.substring(index, index + 1);
+                } else {
+                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
+                }
+            }
+            targetTitles.add(targetTitle);
+        });
+        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
+        for (String key : sourceMap.keySet()) {
+            retMap.put(key.replaceAll("[一二三四五六七八九十、.]", ""), sourceMap.get(key));
+        }
+        return retMap;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "病例特点",
+            "初步诊断",
+            "诊断依据",
+            "鉴别诊断",
+            "诊疗计划"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "签名++++=记录医师"
+    );
+
+}

+ 65 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunFirstPageRecordDocTrans.java

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

+ 18 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunInformedConsentDocTrans.java

@@ -0,0 +1,18 @@
+package com.lantone.qc.trans.beilun;
+
+import com.lantone.qc.pub.model.doc.InformedConsentDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+
+/**
+ * @Description: 知情同意书
+ * @author: wangyu
+ * @time: 2020/4/20 17:48
+ */
+public class BeiLunInformedConsentDocTrans extends ModelDocTrans {
+    @Override
+    public InformedConsentDoc extract(MedrecVo medrecVo) {
+        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
+        return informedConsentDoc;
+    }
+}

+ 67 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunLeaveHospitalDocTrans.java

@@ -0,0 +1,67 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+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.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 出院小结文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+public class BeiLunLeaveHospitalDocTrans extends ModelDocTrans {
+
+    @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> sourceMap = CxXmlUtil.firstLevelNodeValue(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+        LeaveHospitalDoc 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(CxXmlUtil.getXmlText(content));
+        leaveHospitalDoc.setPageData((Map) structureMap);
+        return leaveHospitalDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=",
+            "床号=",
+            "病案号++++住院号=",
+            "年龄=",
+            "入院日期=入院时间",
+            "出院日期=出院时间",
+            "入院诊断=入院诊断",
+            "出院诊断=出院诊断",
+            "实际住院天数=住院天数",
+            "入院情况=入院情况",
+            "诊治经过++++入院诊治经过=诊治经过",
+            "出院情况=",
+            "出院医嘱=",
+            /*           "健康教育=注意事项",*/
+            "随访计划=",
+            "签名++++=医师签名",
+            "签名时间=签名时间",
+            "日期=出院时间"
+    );
+
+}

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

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

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

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

+ 20 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunNoticeOfConversationDocTrans.java

@@ -0,0 +1,20 @@
+package com.lantone.qc.trans.beilun;
+
+import com.lantone.qc.pub.model.doc.NoticeOfConversationDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+
+/**
+ * @Description: 谈话告知书
+ * @author: wangyu
+ * @time: 2020/4/20 18:06
+ */
+public class BeiLunNoticeOfConversationDocTrans extends ModelDocTrans {
+    @Override
+    public NoticeOfConversationDoc extract(MedrecVo medrecVo) {
+        NoticeOfConversationDoc noticeOfConversationDoc = new NoticeOfConversationDoc();
+//        List<String> noticeofConverstartons = (List<String>) medrecVo.getContent().get("content");
+//        noticeOfConversationDoc.setAllNoticeOfConverstartion(noticeofConverstartons);
+        return noticeOfConversationDoc;
+    }
+}

+ 69 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunNursingSystemDocTrans.java

@@ -0,0 +1,69 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.NursingSystemDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 分级护理制度文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:26
+ */
+public class BeiLunNursingSystemDocTrans extends ModelDocTrans {
+
+    @Override
+    public NursingSystemDoc extract(MedrecVo medrecVo) {
+        String content = ((List<String>) medrecVo.getContent().get("content")).get(0);
+
+        Map<String, String> pageData = Preproc.extract_doc_pub(true, pageDataTitles, content);
+        pageData.put("病程记录内容",
+                pageData.get("病程记录内容")
+                        .replace(pageData.get("病程记录时间"), "")
+                        .replace(pageData.get("病程记录名称"), "")
+        );
+
+        List<String> targetTitles = Lists.newArrayList();
+        sourceTitles.forEach(sourceTitle -> {
+            String targetTitle = "";
+            for (int index = 0; index < sourceTitle.length(); index++) {
+                if (index == sourceTitle.length() - 1) {
+                    targetTitle += sourceTitle.substring(index, index + 1);
+                } else {
+                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
+                }
+            }
+            targetTitles.add(targetTitle);
+        });
+
+        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
+        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+
+        NursingSystemDoc nursingSystemDoc = ModelDocGenerate.nursingSystemDocGen(sourceMap);
+        nursingSystemDoc.setText(content);
+        nursingSystemDoc.setPageData((Map) pageData);
+
+        return nursingSystemDoc;
+    }
+
+    private List<String> pageDataTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录医师"
+    );
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录时间",
+            "记录医师"
+    );
+
+}

+ 479 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunOperationDocTrans.java

@@ -0,0 +1,479 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationInformedConsentDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationSafetyChecklistDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
+ */
+public class BeiLunOperationDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<OperationDoc> extract(MedrecVo medrecVo) {
+        List<OperationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+
+        Map<String, OperationDiscussionDoc> operationDiscussionDocMap = getOperationDiscussionDocMap((List) contentMap.get("术后首次病程及谈话记录"));
+        Map<String, OperationRecordDoc> operationRecordDocMap = getOperationRecordDocMap((List) contentMap.get("手术记录"));
+        Map<String, PreoperativeDiscussionDoc> preoperativeDiscussionDocMap = getPreoperativeDiscussionDocMap((List) contentMap.get("术前讨论、术前小结"));
+        Map<String, OperationInformedConsentDoc> operationInformedConsentDocMap = getOperationInformedConsentDocMap((List) contentMap.get("手术知情同意书"));
+        Map<String, OperationSafetyChecklistDoc> operationSafetyChecklistDocMap = getOperationSafetyChecklistDocMap((List) contentMap.get("手术安全核查表"));
+
+        Set<String> operationNameSet = Sets.newHashSet();
+        operationNameSet.addAll(operationDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationRecordDocMap.keySet());
+        operationNameSet.addAll(preoperativeDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationInformedConsentDocMap.keySet());
+        operationNameSet.addAll(operationSafetyChecklistDocMap.keySet());
+
+        operationNameSet.forEach(operationName -> {
+            OperationDoc operationDoc = new OperationDoc();
+            operationDoc.setOperationName(operationName);
+            operationDoc.setOperationDiscussionDoc(operationDiscussionDocMap.get(operationName));
+            operationDoc.setOperationRecordDoc(operationRecordDocMap.get(operationName));
+            operationDoc.setPreoperativeDiscussionDoc(preoperativeDiscussionDocMap.get(operationName));
+            operationDoc.setOperationInformedConsentDoc(operationInformedConsentDocMap.get(operationName));
+            operationDoc.setOperationSafetyChecklistDoc(operationSafetyChecklistDocMap.get(operationName));
+            retList.add(operationDoc);
+        });
+
+        return retList;
+    }
+
+
+    /*******************************************术后首次病程及谈话记录***************************************************/
+    private Map<String, OperationDiscussionDoc> getOperationDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationDiscussionDoc operationDiscussionDoc = getOperationDiscussionDoc(contentMap);
+            operationDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, operationDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationDiscussionDoc getOperationDiscussionDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationDiscussion_keyContrasts);
+        if (StringUtil.isNotBlank(structureMap.get("手术开始时间"))) {
+            structureMap.put("手术时间", structureMap.get("手术开始时间"));
+        }
+        if (StringUtil.isNotBlank(structureMap.get("签名"))) {
+            structureMap.put("记录医师", structureMap.get("签名"));
+        }
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationDiscussion_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        OperationDiscussionDoc operationDiscussionDoc = ModelDocGenerate.operationDiscussionDocGen(cutWordMap);
+        operationDiscussionDoc.setText(text);
+        operationDiscussionDoc.setPageData((Map) cutWordMap);
+
+        return operationDiscussionDoc;
+    }
+
+    private List<String> operationDiscussion_sourceTitles = Lists.newArrayList(
+            "记录医师",
+            "记录时间",
+            "手术时间",
+            "麻醉方式",
+            "手术方式",
+            "术中诊断",
+            "手术简要经过",
+            "患者术后情况",
+            "术后处理措施",
+            "术后可能出现的并发症及预防措施",
+            "术后注意事项",
+            "谈话医师签字",
+            "患者签名",
+            "患者签名时间",
+            "被授权人/代理人签名",
+            "代理人签名时间"
+    );
+
+    private List<String> operationDiscussion_keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "手术开始时间=",
+            "手术结束时间=",
+            "麻醉方式=",
+            "麻醉医生=麻醉医师",
+            "手术方式=",
+            "手术人员=手术相关人员",
+            "手术方式++++手术名称=手术方式",
+            "术中诊断++++初步诊断=术中诊断",
+            "术中诊断++++术后诊断=术中诊断",
+            "并发症++++手术并发症=术中并发症",
+            "手术经过=手术简要经过",
+            "患者术后情况=",
+            "术后处理措施=",
+            "术后并发症及预防措施=术后可能出现的并发症及预防措施",
+            "术后注意事项=",
+            "患者签名=",
+            "签名时间=代理人签名时间",
+            "签字++++患者授权的其他代理人签字=代理人签名",
+            "签名++++=医生签名"
+    );
+
+
+    /**********************************************手术记录*************************************************************/
+    private Map<String, OperationRecordDoc> getOperationRecordDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationRecordDoc operationRecordDoc = getOperationRecordDoc(contentMap);
+            operationRecordDoc.setOperationName(operationName);
+            retMap.put(operationName, operationRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationRecordDoc getOperationRecordDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationRecord_keyContrasts);
+        if (StringUtil.isNotBlank(structureMap.get("签名"))) {
+            structureMap.put("记录医师", structureMap.get("签名"));
+        }
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationRecord_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        OperationRecordDoc operationRecordDoc = ModelDocGenerate.operationRecordDocGen(cutWordMap);
+        operationRecordDoc.setText(text);
+        operationRecordDoc.setPageData((Map) cutWordMap);
+
+        return operationRecordDoc;
+    }
+
+    private List<String> operationRecord_sourceTitles = Lists.newArrayList(
+            "记录医师",
+            "记录时间",
+            "手术名称",
+            "麻醉方式",
+            "术前诊断",
+            "术后诊断",
+            "手术经过"
+    );
+
+    private List<String> operationRecord_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=",
+            "性别=",
+            "病区++++病区名称=",
+            "床号=",
+            "病案号++++住院号=",
+            "手术开始时间=",
+            "手术结束时间=",
+            "术前诊断=",
+            "手术名称=",
+            "术后诊断=",
+            "主刀医师=",
+            "一助=",
+            "二助=",
+            "器械护士=",
+            "麻醉方式=",
+            "麻醉医生=",
+            "清洁程度=",
+            "ASA分级++++麻醉ASA分级=",
+            "手术持续时间=",
+            "风险评估分值=",
+            "++++浅层组织手术=",
+            "++++深层组织手术=",
+            "++++器官手术=",
+            "++++空隙手术=",
+            //            "++++术中送检无=术中送检",
+            //            "++++术中送检有=术中送检",
+            "冰冻切片结果=",
+            "++++并发症无=手术并发症",
+            "++++并发症有=手术并发症",
+            "手术并发症=",
+            "失血量=",
+            "手术经过=",
+            "记录时间=",
+            "记录时间=",
+            "术(中)后诊断++++术后中诊断=术后诊断"
+    );
+
+
+    /**********************************************术前讨论、术前小结****************************************************/
+    private Map<String, PreoperativeDiscussionDoc> getPreoperativeDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, PreoperativeDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
+            preoperativeDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, preoperativeDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private PreoperativeDiscussionDoc getPreoperativeDiscussionDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, preoperativeDiscussion_keyContrasts);
+        structureMap.put(
+                "术前准备内容",
+                (StringUtil.isBlank(structureMap.get("术前准备内容")) ? "" : structureMap.get("术前准备内容")) + (StringUtil.isBlank(structureMap.get("术前准备++++术前准备情况")) ? "" : structureMap.get("术前准备++++术前准备情况"))
+        );
+        structureMap.put(
+                "术前术后注意事项",
+                (StringUtil.isBlank(structureMap.get("术前术后注意事项")) ? "" : structureMap.get("术前术后注意事项")) + (StringUtil.isBlank(structureMap.get("术后注意事项")) ? "" : structureMap.get("术后注意事项"))
+        );
+        structureMap.put("讨论时间", structureMap.get("记录时间"));
+        if (StringUtil.isNotBlank(structureMap.get("签名"))) {
+            structureMap.put("记录医师", structureMap.get("签名"));
+        }
+        if (StringUtil.isNotBlank(structureMap.get("拟行治疗指征及禁忌症"))) {
+            structureMap.put("拟行术式", structureMap.get("拟行治疗指征及禁忌症"));
+        } else if (StringUtil.isNotBlank(structureMap.get("拟施手术方式"))) {
+            structureMap.put("拟行术式", structureMap.get("拟施手术方式"));
+        }
+
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, preoperativeDiscussion_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        PreoperativeDiscussionDoc preoperativeDiscussionDoc = ModelDocGenerate.preoperativeDiscussionDocGen(cutWordMap);
+        preoperativeDiscussionDoc.setText(text);
+        preoperativeDiscussionDoc.setPageData((Map) cutWordMap);
+
+        return preoperativeDiscussionDoc;
+    }
+
+    private List<String> preoperativeDiscussion_sourceTitles = Lists.newArrayList(
+            "记录医师",
+            "记录时间",
+            "讨论时间",
+            "讨论方式",
+            "参加人员",
+            "简要病情",
+            "讨论结论",
+            "经治医师签名",
+            "经治医师签字时间",
+            "主刀医师签名",
+            "主刀医师签字时间",
+            "手术指征",
+            "麻醉方式",
+            "术前准备内容",
+            "术前术后注意事项",
+            "可能意外和防范措施",
+            "拟行术式",
+            "拟施手术方式、名称及可能的变更与禁忌征"
+    );
+
+    private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
+            "讨论时间++++记录日期=记录时间",
+            "签字时间=主刀医师签字时间",
+            "参加人员姓名=参加人员",
+            "病情摘要++++简要病情=简要病情",
+            "术前诊断++++初步诊断=术前诊断",
+            "手术指征与禁忌征++++手术指征=手术指征",
+            "拟行治疗指征及禁忌症=",
+            "拟施麻醉方式=麻醉方式",
+            "术前准备情况=术前准备内容",
+            "术前准备++++术前准备情况=",
+            "手术风险及预防措施++++文本框=可能意外和防范措施",
+            "术中注意事项=术前术后注意事项",
+            "术后注意事项=",
+            "目前使用的药物=目前服用药物",
+            "诊疗计划=治疗计划和措施",
+            "注意事项=术前术后注意事项",
+            "手术名称及方式=拟施手术方式名称及可能的变更与禁忌症",
+            "拟施手术方式、名称及可能的变更与禁忌征=拟施手术方式名称及可能的变更与禁忌症"
+    );
+
+
+    /**********************************************手术知情同意书****************************************************/
+    private Map<String, OperationInformedConsentDoc> getOperationInformedConsentDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationInformedConsentDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationInformedConsentDoc operationInformedConsentDoc = getOperationInformedConsentDoc(contentMap);
+            operationInformedConsentDoc.setOperationName(operationName);
+            retMap.put(operationName, operationInformedConsentDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationInformedConsentDoc getOperationInformedConsentDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationInformedConsent_keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationInformedConsent_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        OperationInformedConsentDoc operationInformedConsentDoc = ModelDocGenerate.operationInformedConsentDocGen(cutWordMap);
+        operationInformedConsentDoc.setText(text);
+        operationInformedConsentDoc.setPageData((Map) cutWordMap);
+
+        return operationInformedConsentDoc;
+    }
+
+    private List<String> operationInformedConsent_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "手术医生",
+            "目前诊断",
+            "手术名称",
+            "手术指征",
+            "风险及并发症",
+            "保守治疗",
+            "其他手术",
+            "签名",
+            "签名时间"
+    );
+
+    private List<String> operationInformedConsent_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=病区",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "手术医生=",
+            "目前诊断=",
+            "手术名称=",
+            "手术指征=",
+            "风险及并发症=",
+            "++++保守治疗=保守治疗",
+            "++++其他手术=其他手术",
+            "签名++++=签名",
+            "签名时间=签名时间"
+    );
+
+
+    /**********************************************手术安全核查表****************************************************/
+    private Map<String, OperationSafetyChecklistDoc> getOperationSafetyChecklistDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationSafetyChecklistDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationSafetyChecklistDoc operationSafetyChecklistDoc = getOperationSafetyChecklistDoc(contentMap);
+            operationSafetyChecklistDoc.setOperationName(operationName);
+            retMap.put(operationName, operationSafetyChecklistDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationSafetyChecklist_keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, operationSafetyChecklist_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        OperationSafetyChecklistDoc operationSafetyChecklistDoc = ModelDocGenerate.operationSafetyChecklistDocGen(cutWordMap);
+        operationSafetyChecklistDoc.setText(text);
+        operationSafetyChecklistDoc.setPageData((Map) cutWordMap);
+
+        return operationSafetyChecklistDoc;
+    }
+
+    private List<String> operationSafetyChecklist_sourceTitles = Lists.newArrayList(
+            "姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号",
+            "签名"
+    );
+
+    private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号++++住院号=病案号",
+            "签名++++=签名"
+    );
+
+}

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

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

+ 60 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunPathologyShipDocTrans.java

@@ -0,0 +1,60 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.PathologyShipDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : PathologyShipDocTrans
+ * @Description : 病理检验送检单
+ * @Author : 楼辉荣
+ * @Date: 2020-04-19 17:49
+ */
+public class BeiLunPathologyShipDocTrans extends ModelDocTrans {
+    @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> sourceMap = CxXmlUtil.firstLevelNodeValue(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        PathologyShipDoc pathologyShipDoc = new PathologyShipDoc();
+        pathologyShipDoc.setStructureMap(structureMap);
+        pathologyShipDoc.setPageData((Map) structureMap);
+        return pathologyShipDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "病案号++++住院号=病案号",
+            "病区++++病区名称=病区",
+            "数量=标本件数",
+            "医师=送检医师",
+            "++++送检材料=送检标本名称",
+            "++++标本送检时间=标本离体时间",
+            "++++取材部位=送检组织取材部位",
+            "联系地址=病人详细通讯地址",
+            "检查结果=辅助检查结果",
+            "手术所见=术中发现",
+            "传染性标本=是否为传染性标本",
+            "日期=检验日期",
+            "++++月经日期=末次月经日期"
+    );
+
+}

+ 68 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunRescueDocTrans.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.RescueDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 抢救记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 17:34
+ */
+public class BeiLunRescueDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<RescueDoc> extract(MedrecVo medrecVo) {
+        List<RescueDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getRescueDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private RescueDoc getRescueDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        RescueDoc rescueDoc = ModelDocGenerate.rescueDocGen(cutWordMap);
+        rescueDoc.setText(text);
+        rescueDoc.setPageData((Map) cutWordMap);
+
+        return rescueDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "抢救时间",
+            "记录时间",
+            "记录医师",
+            "抢救过程",
+            "参与人员"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "病情变化情况=",
+            "抢救时间及措施++++抢救措施=",
+            "参加抢救者的姓名及专业技术职称++++参加现场抢救的医师及护理人员=参与人员",
+            "签名++++=记录医师",
+            "签名时间=抢救时间"
+//            "参与人员=参加人员及职称"
+    );
+
+}

+ 76 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunSeriouslyIllNoticeDocTrans.java

@@ -0,0 +1,76 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.SeriouslyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病重通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunSeriouslyIllNoticeDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<SeriouslyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<SeriouslyIllNoticeDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getSeriouslyIllNoticeDoc(content));
+        });
+        return retList;
+    }
+
+    private SeriouslyIllNoticeDoc getSeriouslyIllNoticeDoc(String content) {
+        Map<String, String> pageData = Preproc.extract_doc_pub(true, pageDataTitles, content);
+        pageData.put("病程记录内容",
+                pageData.get("病程记录内容")
+                        .replace(pageData.get("病程记录时间"), "")
+                        .replace(pageData.get("病程记录名称"), "")
+        );
+
+        List<String> targetTitles = Lists.newArrayList();
+        sourceTitles.forEach(sourceTitle -> {
+            String targetTitle = "";
+            for (int index = 0; index < sourceTitle.length(); index++) {
+                if (index == sourceTitle.length() - 1) {
+                    targetTitle += sourceTitle.substring(index, index + 1);
+                } else {
+                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
+                }
+            }
+            targetTitles.add(targetTitle);
+        });
+
+        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
+        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+
+        SeriouslyIllNoticeDoc seriouslyIllNoticeDoc = ModelDocGenerate.seriouslyIllNoticeDocGen(sourceMap);
+        seriouslyIllNoticeDoc.setText(content);
+        seriouslyIllNoticeDoc.setPageData((Map) pageData);
+
+        return seriouslyIllNoticeDoc;
+    }
+
+    private List<String> pageDataTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录医师"
+    );
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "病程记录时间",
+            "病程记录名称",
+            "病程记录内容",
+            "记录时间",
+            "记录医师"
+    );
+
+}

+ 86 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunStagesSummaryDocTrans.java

@@ -0,0 +1,86 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 阶段小结文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class BeiLunStagesSummaryDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<StagesSummaryDoc> extract(MedrecVo medrecVo) {
+        List<StagesSummaryDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getStagesSummaryDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private StagesSummaryDoc getStagesSummaryDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getXmlText(content);
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+        StagesSummaryDoc stagesSummaryDoc = ModelDocGenerate.stagesSummaryDocGen(cutWordMap);
+        stagesSummaryDoc.setText(text);
+        stagesSummaryDoc.setPageData((Map) cutWordMap);
+
+        return stagesSummaryDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "记录日期",
+            "患者姓名(住院)",
+            "性别",
+            "年龄",
+            "原因",
+            "入院日期",
+            "入院情况",
+            "入院诊断",
+            "治疗经过",
+            "目前情况",
+            "目前诊断",
+            "诊疗计划",
+            "签名",
+            "签名时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=",
+            "患者姓名(住院)=",
+            "主管护士++++责任护士=护理",
+            "其他住院医师++++其他人员=其他人员",
+            "性别=",
+            "年龄=",
+            "原因=",
+            "入院日期=",
+            "入院情况=",
+            "入院诊断++++初步诊断=入院诊断",
+            "治疗经过=",
+            "目前情况=",
+            "目前诊断=",
+            "诊疗计划++++下一步诊疗计划=诊疗计划",
+            "签名++++=签名",
+            "签名时间="
+    );
+
+}

+ 308 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunThreeLevelWardDocTrans.java

@@ -0,0 +1,308 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.dbanaly.lt.facade.ModelHospitalFacade;
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.GeneralDoctorWardDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 查房记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+@Setter
+public class BeiLunThreeLevelWardDocTrans extends ModelDocTrans {
+
+    private List<String> recTitles;
+    private List<OperationDoc> operationDocs;
+
+    @Override
+    public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
+        ModelHospitalFacade modelHospitalFacade = SpringContextUtil.getBean(ModelHospitalFacade.class);
+        recTitles = modelHospitalFacade.getRecTitles(1l, 4l);
+
+        List<ThreeLevelWardDoc> retList = Lists.newArrayList();
+        ThreeLevelWardDoc threeLevelWardDoc = new ThreeLevelWardDoc();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            classifyThreeLevelWardDoc(threeLevelWardDoc, contentMap);
+        });
+        retList.add(threeLevelWardDoc);
+        return retList;
+    }
+
+    private void classifyThreeLevelWardDoc(ThreeLevelWardDoc threeLevelWardDoc, Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        String recTitle = contentMap.get("recTitle").toString();
+        if (recTitles.contains(recTitle)) {
+            xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        }
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+        structureMap.put("查房日期", structureMap.get("记录时间"));
+
+        Map<String, String> cutWordMap = Maps.newHashMap();
+        String text = CxXmlUtil.getXmlText(content);
+        if (StringUtil.isNotBlank(text)) {
+            if (StringUtil.isBlank(structureMap.get("病情记录"))) {
+                structureMap.put("病情记录", text);
+            }
+            cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+            if (StringUtil.isBlank(structureMap.get("记录医师"))) {
+                Pattern p = Pattern.compile("^[^\\u4e00-\\u9fa5]+$");//分词结果如果不包含中文为日期,则不覆盖
+                if (StringUtil.isNotEmpty(cutWordMap.get("医师签名"))) {
+                    Matcher m = p.matcher(cutWordMap.get("医师签名"));
+                    if (!m.matches()) {
+                        structureMap.put("记录医师", cutWordMap.get("医师签名"));
+                    }
+                }
+                if (StringUtil.isNotEmpty(cutWordMap.get("记录医生"))) {
+                    Matcher m = p.matcher(cutWordMap.get("记录医生"));
+                    if (!m.matches()) {
+                        structureMap.put("记录医师", cutWordMap.get("记录医生"));
+                    }
+                }
+            }
+        }
+
+        //总的查房记录 汇总
+        ThreeLevelWardDoc allDoctorWradDoc = new ThreeLevelWardDoc();
+        allDoctorWradDoc.setStructureMap(structureMap);
+        allDoctorWradDoc.setPageData((Map) structureMap);
+        threeLevelWardDoc.addAllDoctorWradDoc(allDoctorWradDoc);
+
+        //主任医师查房
+        DirectorDoctorWardDoc directorDoctorWardDoc = findDirectorDoctorWardDoc(structureMap);
+        if (directorDoctorWardDoc != null) {
+            threeLevelWardDoc.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
+        }
+        //主治医师查房
+        AttendingDoctorWardDoc attendingDoctorWardDoc = findAttendingDoctorWardDoc(structureMap);
+        if (attendingDoctorWardDoc != null) {
+            threeLevelWardDoc.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
+        }
+        //普通医师查房
+        if (directorDoctorWardDoc == null && attendingDoctorWardDoc == null) {
+            GeneralDoctorWardDoc generalDoctorWardDoc = new GeneralDoctorWardDoc();
+            generalDoctorWardDoc.setStructureMap(structureMap);
+            generalDoctorWardDoc.setPageData((Map) structureMap);
+            threeLevelWardDoc.addGeneralDoctorWardDoc(generalDoctorWardDoc);
+        }
+    }
+
+    /**
+     * 主任医师查房
+     *
+     * @param structureMap
+     */
+    private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String content = structureMap.get("病情记录");
+        String recordDateStr = structureMap.get("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        //标题有代字
+        DirectorDoctorWardDoc directorDoctorWardDoc = null;
+        if (StringUtil.isNotBlank(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) || findDirector(title, content)) {
+                directorDoctorWardDoc = new DirectorDoctorWardDoc();
+                directorDoctorWardDoc.setStructureMap(structureMap);
+                directorDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return directorDoctorWardDoc;
+    }
+
+    /**
+     * 主治医师查房
+     *
+     * @param structureMap
+     */
+    private AttendingDoctorWardDoc findAttendingDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String content = structureMap.get("病情记录");
+        String recordDateStr = structureMap.get("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        AttendingDoctorWardDoc attendingDoctorWardDoc = null;
+        //标题有代字
+        if (StringUtil.isNotBlank(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治"))
+                    || findAttend(title, content)) {
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return attendingDoctorWardDoc;
+    }
+
+    /**
+     * 共同照护讨论记录中找主任查房
+     *
+     * @param title
+     * @param content
+     * @return
+     */
+    private boolean findDirector(String title, String content) {
+        return title.contains("共同照护讨论记录") && content.contains("主任");
+    }
+
+    /**
+     * 共同照护讨论记录中找主治查房
+     *
+     * @param title
+     * @param content
+     * @return
+     */
+    private boolean findAttend(String title, String content) {
+        Pattern p = Pattern.compile("(?<=主治医师).+?(?=住院医师)");
+        Matcher m = p.matcher(content);
+        String result = "";
+        while(m.find())
+        {
+            result = m.group().trim();
+        }
+        return title.contains("共同照护讨论记录") && StringUtil.isNotEmpty(result.replace(":","").replace(":",""));
+    }
+
+    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> sourceTitles = Lists.newArrayList(
+            "医师签名",
+            "记录医生"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病程记录标题=查房标题",
+            "在此输入查房记录=病情记录",
+            "签名++++=记录医师",
+            "在此输入副主任医师代主治医师查房记录++++文本框=病情记录",
+            "日常病程记录++++文本框=病情记录",
+            "在此输入副主任医师查房记录++++文本框=病情记录",
+            "在此输入副主任兼主刀医师查房记录++++文本框=病情记录",
+            "在此输入副主任医师代主治医师查房记录++++文本框=病情记录",
+            "科主任=三级医师",
+            "入院诊断++++初步诊断=入院诊断",
+            "记录日期=记录时间"
+    );
+
+    /**
+     * 获取主刀医师/一助职称(取距离查房记录时间最近的一次手术记录)
+     *
+     * @param operationDocs
+     * @return
+     */
+    public static String getDoctorTitle(List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+        String title = "";
+        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
+        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String chiefSurgeon = structureMap.get(findTitle);
+            String operatorEndDateStr = structureMap.get("手术结束时间");
+
+            if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                continue;
+            }
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+            if (doctor != null) {
+                String professor = doctor.get("professor");
+                Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                if (operatorEndDate != null) {
+                    long timeDifference = timeDifference(operatorEndDate, recordDate);
+                    if (timeDifference == 0){
+                        continue;
+                    }
+                    if (timeDiff == 0 || timeDiff > timeDifference) {
+                        /* 取距离此次主刀医师查房最近的一次手术时间 */
+                        timeDiff = timeDifference;
+                        title = professor;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+    public static long timeDifference(Date firstDate, Date secondDate) {
+        long timeDifference = 0L;
+        if (firstDate == null || secondDate == null) {
+            return timeDifference;
+        }
+        boolean flag = false;
+        if (firstDate.before(secondDate)) {
+            flag = true;
+        }
+        Calendar calendarS = Calendar.getInstance();
+        Calendar calendarE = Calendar.getInstance();
+        long timeS, timeE;
+        try {
+            calendarS.setTime(firstDate);
+            calendarE.setTime(secondDate);
+
+            timeS = calendarS.getTimeInMillis();
+            timeE = calendarE.getTimeInMillis();
+
+            if (flag) {
+                timeDifference = (timeE - timeS) / (1000 * 60);
+            } else {
+                timeDifference = (timeS - timeE) / (1000 * 60);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return timeDifference;
+    }
+
+}

+ 240 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunTransferRecordDocTrans.java

@@ -0,0 +1,240 @@
+package com.lantone.qc.trans.beilun;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @Description: 转科记录文档生成
+ * @author: rengb
+ * @time: 2020/3/20 16:10
+ */
+public class BeiLunTransferRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public TransferRecordDoc extract(MedrecVo medrecVo) {
+        TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return transferRecordDoc;
+        }
+        List<Map<String, Object>> into = (List) contentMap.get("转入记录");
+        List<Map<String, Object>> out = (List) contentMap.get("转出记录");
+        List<Map<String, Object>> all = new ArrayList<>();
+
+        Map<String, TransferIntoDoc> transferIntoDocMap = new HashMap<>();
+        Map<String, TransferOutDoc> transferOutDocMap = new HashMap<>();
+        if (into != null) {
+            all.addAll(into);
+            transferIntoDocMap = getTransferIntoDocMap(into);
+        }
+        if (out != null) {
+            all.addAll(out);
+            transferOutDocMap = getTransferOutDocMap(out);
+        }
+        Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
+
+        //转入
+        Map<Date, TransferIntoDoc> dateRecordIn = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
+            Map<String, String> structureMap = transferIntoDoc.getStructureMap();
+            String inDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(inDateStr)) {
+                continue;
+            }
+            Date inDate = StringUtil.parseDateTime(inDateStr);
+            if (inDate == null) {
+                continue;
+            }
+            dateRecordIn.put(inDate, transferIntoDoc);
+        }
+        transferRecordDoc.setTransferIntoDocs(new ArrayList<>(dateRecordIn.values()));
+        //转出
+        Map<Date, TransferOutDoc> dateRecordOut = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
+            Map<String, String> structureMap = transferOutDoc.getStructureMap();
+            String outDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(outDateStr)) {
+                continue;
+            }
+            Date outDate = StringUtil.parseDateTime(outDateStr);
+            if (outDate == null) {
+                continue;
+            }
+            dateRecordOut.put(outDate, transferOutDoc);
+        }
+        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                continue;
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
+
+        return transferRecordDoc;
+    }
+
+
+    /**************************************************转入*******************************************************/
+    private Map<String, TransferIntoDoc> getTransferIntoDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferIntoDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferIntoDoc transferIntoDoc = getTransferIntoDoc(contentMap);
+            transferIntoDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferIntoDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferIntoDoc getTransferIntoDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        //        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+        transferIntoDoc.setText(content);
+        transferIntoDoc.setStructureMap(structureMap);
+        transferIntoDoc.setPageData((Map) structureMap);
+
+        return transferIntoDoc;
+    }
+
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferRecordDoc transferRecordDoc = getTransferAllDoc(contentMap);
+            transferRecordDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+        transferAllDoc.setText(content);
+        transferAllDoc.setStructureMap(structureMap);
+        transferAllDoc.setPageData((Map) structureMap);
+        return transferAllDoc;
+    }
+
+
+    /**************************************************转出*******************************************************/
+    private Map<String, TransferOutDoc> getTransferOutDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferOutDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferOutDoc transferOutDoc = getTransferOutDoc(contentMap);
+            transferOutDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferOutDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferOutDoc getTransferOutDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        TransferOutDoc transferOutDoc = new TransferOutDoc();
+        transferOutDoc.setText(content);
+        transferOutDoc.setStructureMap(structureMap);
+        transferOutDoc.setPageData((Map) structureMap);
+
+        return transferOutDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "转出日期=转科日期",
+            "转入日期=转科日期",
+            "转出日期=转科日期",
+            "姓名++++患者姓名=姓名",
+            "签名++++=医师签名",
+            "++++入院日期=入院日期",
+            "入院诊断++++初步诊断=初步诊断",
+            "转入目的++++目的=转入目的",
+            "转出目的++++目的=转出目的"
+    );
+}

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

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

+ 17 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunLeaveHospitalHtmlAnalysis.java

@@ -0,0 +1,17 @@
+package com.lantone.qc.trans.beilun.util;
+
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/9/9 11:24
+ */
+public class BeiLunLeaveHospitalHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        return null;
+    }
+
+}