浏览代码

修改xml解析代码

lipc 4 年之前
父节点
当前提交
463abdeca5
共有 28 个文件被更改,包括 3158 次插入1 次删除
  1. 67 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/wenfuyi/WenfuyiXmlUtil.java
  2. 1 1
      kernel/src/main/resources/bootstrap.yml
  3. 385 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java
  4. 58 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java
  5. 75 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicalBloodDocTrans.java
  6. 241 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java
  7. 54 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/CrisisValueReportDocTrans.java
  8. 58 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/CriticallyIllNoticeDocTrans.java
  9. 57 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathCaseDiscussDocTrans.java
  10. 55 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathRecordDocTrans.java
  11. 80 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java
  12. 32 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DoctorAdviceDocTrans.java
  13. 73 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java
  14. 254 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstPageRecordDocTrans.java
  15. 16 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/InformedConsentDocTrans.java
  16. 41 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/LeaveHospitalDocTrans.java
  17. 22 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/MedicalRecordInfoDocTrans.java
  18. 21 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/NoticeOfConversationDocTrans.java
  19. 412 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/OperationDocTrans.java
  20. 36 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/OutDepDocTrans.java
  21. 52 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/PathologyShipDocTrans.java
  22. 82 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/RescueDocTrans.java
  23. 51 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/SeriouslyIllNoticeDocTrans.java
  24. 72 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/StagesSummaryDocTrans.java
  25. 338 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ThreeLevelWardDocTrans.java
  26. 250 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/TransferRecordDocTrans.java
  27. 268 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/WenfuyiDocTrans.java
  28. 7 0
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/XmlAnalysis.java

+ 67 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/wenfuyi/WenfuyiXmlUtil.java

@@ -0,0 +1,67 @@
+package com.lantone.qc.dbanaly.facade.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: xml解析工具
+ * @author: rengb
+ * @time: 2020/3/28 14:23
+ */
+@Slf4j
+public class WenfuyiXmlUtil {
+
+    public static Map<String, String> xmlToMap(String xml) {
+        Map<String, String> map = Maps.newHashMap();
+        try {
+            Document doc = DocumentHelper.parseText(xml);
+            Element root = (Element) doc.selectSingleNode("//m_wsjl_xml/list");
+            findElement(root).forEach(i -> {
+                map.put(i.element("mc").getTextTrim(), i.element("nr").getTextTrim());
+            });
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    public static Map<String, String> behospitalInfoXmlToMap(String xml) {
+
+        Map<String, String> map = Maps.newHashMap();
+
+        try {
+            xml = xml.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "|<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+            String[] a = xml.split("\\|");
+            for (String s : a) {
+                if (StringUtil.isNotBlank(s)) {
+                    Document doc = DocumentHelper.parseText(s);
+                    Element root = (Element) doc.selectSingleNode("//m_wsjl_xml/list");
+                    findElement(root).forEach(i -> {
+                        map.put(i.element("mc").getTextTrim(), i.element("nr").getTextTrim());
+                    });
+                }
+            }
+
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    public static List<Element> findElement(Element element) {
+        List<Element> ret = Lists.newArrayList();
+        ((List<Element>) (element.elements())).forEach(i -> {
+            ret.add(i);
+        });
+        return ret;
+    }
+}

+ 1 - 1
kernel/src/main/resources/bootstrap.yml

@@ -15,7 +15,7 @@ spring:
     active: local
 
 qc:
-  hospital_id: 1,2,3,4,5,6,7,8,10,15,20
+  hospital_id: 1,2,3,4,5,6,7,8,10,13,15,20
 
 logging:          # 日志
   config: classpath:logback-spring.xml

+ 385 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java

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

+ 58 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @desc 输血后效果评价
+ **/
+
+public class ClinicBloodEffectDocTrans extends ModelDocTrans {
+    private String modeId = "32";
+
+    @Override
+    public List<ClinicBloodEffectDoc> extract(MedrecVo medrecVo) {
+        List<ClinicBloodEffectDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicBloodEffectDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ClinicBloodEffectDoc getClinicBloodEffectDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        ClinicBloodEffectDoc clinicBloodEffectDoc = new ClinicBloodEffectDoc();
+        clinicBloodEffectDoc.setStructureMap(structureMap);
+        clinicBloodEffectDoc.setPageData((Map) structureMap);
+
+        return clinicBloodEffectDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病程时间=病历日期",
+            "病程标题=病程标题",//提示:页面暂时缺少对应的展示列
+            "病程内容=评估结论",
+            "记录医师签名=评估医师"
+    );
+}

+ 75 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicalBloodDocTrans.java

@@ -0,0 +1,75 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+public class ClinicalBloodDocTrans extends ModelDocTrans {
+    private String modeId = "10";
+
+    @Override
+    public List<ClinicalBloodDoc> extract(MedrecVo medrecVo) {
+        List<ClinicalBloodDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicalBloodDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+        if (MapUtils.isNotEmpty(structureMap)) {
+            String CliBDateStr = structureMap.get("输血日期");
+            if (StringUtil.isNotBlank(CliBDateStr) && CliBDateStr.length() == 39) {
+                structureMap.put("输注开始", CliBDateStr.substring(0, 19));
+                structureMap.put("输注结束", CliBDateStr.substring(20));
+            }
+        }
+
+        ClinicalBloodDoc clinicalBloodDoc = new ClinicalBloodDoc();
+        clinicalBloodDoc.setStructureMap(structureMap);
+        clinicalBloodDoc.setPageData((Map) structureMap);
+        return clinicalBloodDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            /*"开始时间=输注开始",
+            "医生=记录医生",
+            "记录医师=记录医生",
+            "结束时间=输注结束",
+            "内容=输注后效果评价",
+            "输血原因(可多选)=输注原因",
+            "ABO=血型",
+            "医师签名=记录医生",
+            "记录医师签名=记录医生",
+            "病程时间=记录时间",
+            "病情内容=病历内容",
+            "病程内容=病历内容"*/
+            "病程时间=病历日期",
+            "病程标题=标题",
+            "病程内容=病历内容",
+            "记录医师签名=记录医生",
+            "病程时间=记录时间"
+    );
+}

+ 241 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java

@@ -0,0 +1,241 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 会诊文档生成
+ */
+public class ConsultationDocTrans extends ModelDocTrans {
+    /**
+     * 会诊记录包含3个模块:会诊申请单,会诊结果单,会诊记录
+     * 配套放置,华卓需要注意顺序问题,没有字段可以关联,我们做不到check
+     *
+     * @param medrecVo
+     * @return
+     */
+    @Override
+    public List<ConsultationDoc> extract(MedrecVo medrecVo) {
+        List<ConsultationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        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 modeId = "7";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+
+            //按指定标题切词
+            List<String> titles = Lists.newArrayList("记录医师", "会诊意见的执行情况", "会诊医师",
+                    "会诊科室", "会诊时间", "会诊意见");
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationRecord_keyContrasts, modeId);
+        }
+
+        ConsultationRecordDoc consultationRecordDoc = new ConsultationRecordDoc();
+        consultationRecordDoc.setStructureMap(structureMap);
+        consultationRecordDoc.setPageData((Map) structureMap);
+        return consultationRecordDoc;
+    }
+
+    // 会诊记录映射字段
+    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 modeId = "31";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            List<String> titles = Lists.newArrayList("会诊记录", "会诊科室", "会诊医师", "会诊意见",
+                    "会诊后采取措施", "记录医师", "会诊原因","会诊时间","记录时间");
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationResults_keyContrasts, modeId);
+        }
+
+        ConsultationResultsDoc consultationResultsDoc = new ConsultationResultsDoc();
+        consultationResultsDoc.setStructureMap(structureMap);
+        consultationResultsDoc.setPageData((Map) structureMap);
+        return consultationResultsDoc;
+    }
+
+    // 会诊结果映射字段
+    private List<String> consultationResults_keyContrasts = Lists.newArrayList(
+         /*   "会诊诊断=当前诊断",
+            "事件日期1(会诊申请日期)=申请日期",
+            "医生=医师签名",
+            "本人姓名=姓名",
+            "病史描述=病史回顾描述",
+            "病历日期=会诊日期及时间",
+            "记录及建议=会诊意见",
+            "临床科室1=申请科室",
+            "申请医生1=申请医生"*/
+//            "会诊记录","会诊科室","会诊医师","会诊意见","会诊后采取措施","记录医师"
+    );
+
+
+    /**************************************************会诊申请单*******************************************************/
+    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 modeId = "30";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationApplication_keyContrasts, modeId);
+        }
+
+        ConsultationApplicationDoc consultationApplicationDoc = new ConsultationApplicationDoc();
+        consultationApplicationDoc.setStructureMap(structureMap);
+        consultationApplicationDoc.setPageData((Map) structureMap);
+
+        return consultationApplicationDoc;
+    }
+
+    // 会诊申请单映射字段
+    private List<String> consultationApplication_keyContrasts = Lists.newArrayList(
+            "事件日期=申请日期",
+            "会诊类别=会诊分类",
+            "会诊理由和目的=申请理由目的",
+            "病历日期=会诊日期及时间",
+            "本人姓名=姓名",
+            "病历号=病案号",
+            "临床科室=申请科室"
+    );
+}

+ 54 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/CrisisValueReportDocTrans.java

@@ -0,0 +1,54 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 危急值记录文档生成
+ */
+public class CrisisValueReportDocTrans extends ModelDocTrans {
+    private String modeId = "23";
+
+    @Override
+    public List<CrisisValueReportDoc> extract(MedrecVo medrecVo) {
+        List<CrisisValueReportDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCrisisValueReportDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CrisisValueReportDoc getCrisisValueReportDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        CrisisValueReportDoc crisisValueReportDoc = new CrisisValueReportDoc();
+        crisisValueReportDoc.setStructureMap(structureMap);
+        crisisValueReportDoc.setPageData((Map) structureMap);
+
+        return crisisValueReportDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病历日期=记录时间"
+    );
+}

+ 58 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/CriticallyIllNoticeDocTrans.java

@@ -0,0 +1,58 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病危通知书文档生成
+ */
+public class CriticallyIllNoticeDocTrans extends ModelDocTrans {
+    private String modeId = "25";
+
+    @Override
+    public List<CriticallyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<CriticallyIllNoticeDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCriticallyIllNoticeDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            List<String> titles = Lists.newArrayList("防范措施","","目前病情");
+            String text = sourceMap.get("原始文本");
+            titles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
+
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        CriticallyIllNoticeDoc criticallyIllNoticeDoc = new CriticallyIllNoticeDoc();
+        criticallyIllNoticeDoc.setStructureMap(structureMap);
+        criticallyIllNoticeDoc.setPageData((Map) structureMap);
+
+        return criticallyIllNoticeDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+}

+ 57 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DeathCaseDiscussDocTrans.java

@@ -0,0 +1,57 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.DeathCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.MapUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡病例讨论记录文档生成
+ */
+public class DeathCaseDiscussDocTrans extends ModelDocTrans {
+    private String modeId = "3";
+
+    @Override
+    public DeathCaseDiscussDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        MapUtil.keyAssig(structureMap, "参加讨论人员", "参加人员及职称医生", "参加人员及职称");
+        DeathCaseDiscussDoc deathCaseDiscussDoc = new DeathCaseDiscussDoc();
+        deathCaseDiscussDoc.setStructureMap(structureMap);
+        deathCaseDiscussDoc.setPageData((Map) structureMap);
+
+        return deathCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "主持人=讨论主持人",
+            "死亡日期=死亡时间",
+            "讨论意见=讨论内容",
+            "现病史- 发病情况=入院情况",
+            "医生=记录医师",
+            "本人姓名=姓名",
+            "事件日期=讨论时间",
+            "当前诊断=死亡诊断",
+            "病历日期=记录时间",
+            "讨论小结=结论"
+    );
+}

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

@@ -0,0 +1,55 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡记录文档生成
+ */
+public class DeathRecordDocTrans extends ModelDocTrans {
+    private String modeId = "24";
+
+    @Override
+    public DeathRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        DeathRecordDoc deathRecordDoc = new DeathRecordDoc();
+        deathRecordDoc.setStructureMap(structureMap);
+        deathRecordDoc.setPageData((Map) structureMap);
+
+        return deathRecordDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "当前诊断=死亡诊断",
+            "死亡日期=死亡时间",
+            "初步诊断=入院诊断",
+            "诊治经过=诊疗经过",
+            "本人姓名=姓名",
+            "现病史- 发病情况=发病情况",
+            "病历日期=记录时间",
+            "医生=记录医师",
+            "死亡时间=死亡日期"
+    );
+}

+ 80 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java

@@ -0,0 +1,80 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难病例讨论记录文档生成
+ */
+public class DifficultCaseDiscussDocTrans extends ModelDocTrans {
+    private String modeId = "19";
+
+    @Override
+    public List<DifficultCaseDiscussDoc> extract(MedrecVo medrecVo) {
+        List<DifficultCaseDiscussDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDifficultCaseDiscussDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            List<String> titles = Lists.newArrayList("讨论日期","讨论意见", "地点","主持人","参加人员的姓名及专业技术职务","主持人小结",
+            "记录医师","记录医师签名","主持人签名","汇报病情","讨论目的");
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        DifficultCaseDiscussDoc difficultCaseDiscussDoc = new DifficultCaseDiscussDoc();
+        difficultCaseDiscussDoc.setStructureMap(structureMap);
+        difficultCaseDiscussDoc.setPageData((Map) structureMap);
+
+        return difficultCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            /*"医生=记录者",
+            "讨论小结=主持人小结",
+            "讨论意见=具体讨论意见",
+            "讨论日期时间=讨论日期",
+            "本人姓名=姓名",
+            "参加人员及职称(护士)=参加人员的姓名及专业技术职务",
+            "患者姓名=姓名",
+            "性别代码=性别",
+            "年龄 (岁)=年龄",
+            "当前科室=科别",
+            "主持人姓名=主持人姓名及专业技术职务",
+            "参加讨论人员名单=参加人员的姓名及专业技术职务",
+            "讨论内容=具体讨论意见",
+            "讨论时间=讨论日期"*/
+            "病程时间=记录时间",
+            "地点=讨论地点",
+            "主持人=主持人姓名及专业技术职务",
+            "主持人小结=主持人总结",
+            "汇报病情=汇报病史",
+            "讨论意见=讨论发言",
+            "记录医师签名=记录医生"
+    );
+}

+ 32 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DoctorAdviceDocTrans.java

@@ -0,0 +1,32 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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: 医嘱信息文档生成
+ */
+public class DoctorAdviceDocTrans 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;
+    }
+}

+ 73 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.MapUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static com.lantone.qc.trans.comsis.ModelDocGenerate.structureMapJoin;
+
+/**
+ * @Description: 首次病程录文档生成
+ */
+public class FirstCourseRecordDocTrans extends ModelDocTrans {
+    private String modeId = "2";
+    @Override
+    public FirstCourseRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        structureMap.put("诊疗计划-crf", MapUtil.getSelectString(structureMap, Arrays.asList(
+                "检查计划",
+                "治疗计划和措施"
+                ))
+        );
+
+        // 诊疗计划
+        FirstCourseRecordDoc firstCourseRecordDoc = ModelDocGenerate.firstCourseRecordDocGen(structureMap);
+        firstCourseRecordDoc.setPageData((Map) structureMap);
+        List<String> keys = Lists.newArrayList("检查计划", "治疗计划", "诊疗计划");
+        String treatPlanJoin = structureMapJoin(structureMap, keys);
+        firstCourseRecordDoc.getTreatPlanLabel().setAiText(treatPlanJoin);
+        return firstCourseRecordDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "现病史- 发病情况=现病史",
+            "现病史- 发病情况=现病史",
+            "医生=记录医生",
+            "治疗计划和措施=治疗计划",
+            "体温(耳)=体温耳",
+            "体温(口)=体温口",
+            "病程时间=病历日期",
+            "记录医师=记录医生",
+            "病例日期=病历日期",
+            "一般情况=病历内容",
+            "3.鉴别诊断=鉴别诊断",
+            "1.初步诊断=初步诊断",
+            "2.诊断依据=诊断依据","患者基本情况=病历内容"
+    );
+}

+ 254 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstPageRecordDocTrans.java

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

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

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

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

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+public class LeaveHospitalDocTrans extends ModelDocTrans {
+    private String modeId = "5";
+
+    @Override
+    public LeaveHospitalDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+        LeaveHospitalDoc leaveHospitalDoc = new LeaveHospitalDoc();
+        leaveHospitalDoc.setStructureMap(structureMap);
+        leaveHospitalDoc.setPageData((Map) structureMap);
+        return leaveHospitalDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "时    间=时间"
+
+    );
+}

+ 22 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/MedicalRecordInfoDocTrans.java

@@ -0,0 +1,22 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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: 住院病历信息
+ */
+public class MedicalRecordInfoDocTrans 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;
+    }
+}

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

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

+ 412 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/OperationDocTrans.java

@@ -0,0 +1,412 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.operation.*;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ */
+public class OperationDocTrans extends ModelDocTrans {
+    /**
+     * 手术文档包含:术后首次病程及谈话记录;手术记录;术前讨论、术前小结;手术知情同意书;手术安全核查表
+     *
+     * @param medrecVo
+     * @return
+     */
+    @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 modeId = "18";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            List<String> titles = Lists.newArrayList(
+                    "术后处理措施","医师签名","患方签名",
+                    "记录医师","术后注意事项","术后处理措施","术后诊断",
+                    "手术方式","麻醉方式","术中诊断","手术结束时间","手术开始时间","手术简要经过",
+                    "手术名称","手术时间","术前诊断","手术医生","助手","手术经过","术后生命体征",
+                    "患者家属签名");
+
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts, modeId);
+
+        }
+
+        OperationDiscussionDoc operationDiscussionDoc = new OperationDiscussionDoc();
+        operationDiscussionDoc.setStructureMap(structureMap);
+        operationDiscussionDoc.setPageData((Map) structureMap);
+
+        return operationDiscussionDoc;
+    }
+
+    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 modeId = "17";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            List<String> titles = Lists.newArrayList("手术开始时间", "手术结束时间","术中诊断","手术简要经过","主    刀",
+                    "第一助手", "第二助手","第三助手","洗手护士", "巡回护士","麻醉方式","手术方式","麻醉医师","手术标本","冰冻切片结果",
+                    "术中并发症","术中失血量","手术经过及处理","手术简要经过","医师签名","主刀医师签名","时间",
+                    "患方签名","记录时间");
+
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationRecord_keyContrasts, modeId);
+            //出血量、输血量有些有ml有些没有,统一一下
+            if(structureMap.containsKey("输血量")){
+                structureMap.put("输血量",structureMap.get("输血量").replaceAll("ml",""));
+            }
+            OrdinaryAssistant.removeBlank(structureMap);
+        }
+        OperationRecordDoc operationRecordDoc = new OperationRecordDoc();
+        operationRecordDoc.setStructureMap(structureMap);
+        operationRecordDoc.setPageData((Map) structureMap);
+        return operationRecordDoc;
+    }
+
+    // 手术记录
+    private List<String> operationRecord_keyContrasts = Lists.newArrayList(
+            "病程时间=病历日期","病程标题=标题","麻醉医师=麻醉人员","巡回护士姓名=巡回护士",
+            "待产日期=手术日期",
+            "医生=主刀医师签名",
+            "助手=一助",
+            "本人姓名=姓名",
+            "手术记录手术开始日期=开始时间",
+            "手术开始时间=开始时间",
+            "手术记录手术结束日期=结束时间",
+            "手术结束日期时间=结束时间",
+            "手术结束时间=结束时间",
+            "术后诊断=术中后诊断",
+            "术中后诊断=术中后诊断",
+            "术中诊断=术中后诊断",
+            "手术记录手术过程=手术经过",
+            "手术简要经过=手术经过",
+            "主刀医师=主刀医师",
+            "Ⅰ助姓名=一助",
+            "Ⅱ助姓名=二助",
+            "手术记录麻醉方式=麻醉方式",
+            "麻醉医师签名=麻醉医师",
+            "主刀医师签名=医师签名",
+            "医师签名=医师签名",
+            "记录时间=医师签名时间",
+            "时间=医师签名时间"
+    );
+
+
+    /**********************************************术前讨论、术前小结****************************************************/
+    private Map<String, PreoperativeDiscussionDoc> getPreoperativeDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, PreoperativeDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
+            preoperativeDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, preoperativeDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private PreoperativeDiscussionDoc getPreoperativeDiscussionDoc(Map<String, Object> contentMap) {
+        String modeId = "11";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            List<String> titles = Lists.newArrayList("简要病情","术前诊断","手术指征","手术禁忌症",
+                    "拟施手术名称和方式","拟施麻醉方式","其他术前相关情况","术中或术后可能发生的并发症","手术风险及防治对策",
+                    "术前与患方谈话及签定手术知情同意书情况","注意事项","术前准备","记录医师","手术名称"
+            );
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts, modeId);
+        }
+        PreoperativeDiscussionDoc preoperativeDiscussionDoc = new PreoperativeDiscussionDoc();
+        preoperativeDiscussionDoc.setStructureMap(structureMap);
+        preoperativeDiscussionDoc.setPageData((Map) structureMap);
+        return preoperativeDiscussionDoc;
+    }
+
+    private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
+            "拟施手术名称和方式=拟施手术名称及方式",
+            "拟行术式=拟施手术名称及方式",
+            "病程标题=文书标题",
+            "临床诊断=术前诊断",
+            "术前准备内容=术前准备",
+            "中术后可能出现的风险及应对措施=风险及防范措施",
+            "术中、术后应当充分注意的事项=术中术后注意事项",
+            "术中术后注意事项含护理事项=术中术后注意事项","注意事项=术中术后注意事项",
+            "手术风险及防治对策=风险及防范措施",
+            "主要术中、术后风险及防范措施=风险及防范措施",
+            "意外及防范措施=风险及防范措施",
+            "术前术后注意事项=注意事项",
+            "麻醉方式=拟施麻醉方式",
+            "记录医师签名=记录医生"
+    );
+
+    /**********************************************手术知情同意书****************************************************/
+    private Map<String, OperationInformedConsentDoc> getOperationInformedConsentDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationInformedConsentDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationInformedConsentDoc operationInformedConsentDoc = getOperationInformedConsentDoc(contentMap);
+            operationInformedConsentDoc.setOperationName(operationName);
+            retMap.put(operationName, operationInformedConsentDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationInformedConsentDoc getOperationInformedConsentDoc(Map<String, Object> contentMap) {
+        String modeId = "16";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationInformedConsent_keyContrasts, modeId);
+        }
+        OperationInformedConsentDoc operationInformedConsentDoc = new OperationInformedConsentDoc();
+        operationInformedConsentDoc.setStructureMap(structureMap);
+        operationInformedConsentDoc.setPageData((Map) structureMap);
+        return operationInformedConsentDoc;
+    }
+
+    private List<String> operationInformedConsent_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=病区",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "手术医生=",
+            "目前诊断=",
+            "手术名称=",
+            "手术指征=手术指征与禁忌",
+            "风险及并发症=",
+            "++++保守治疗=保守治疗",
+            "++++其他手术=其他手术",
+            "签名++++=签名",
+            "签名时间=签名时间",
+            "术前准备内容=术前准备"
+    );
+
+
+    /**********************************************手术安全核查表****************************************************/
+    private Map<String, OperationSafetyChecklistDoc> getOperationSafetyChecklistDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationSafetyChecklistDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationSafetyChecklistDoc operationSafetyChecklistDoc = getOperationSafetyChecklistDoc(contentMap);
+            operationSafetyChecklistDoc.setOperationName(operationName);
+            retMap.put(operationName, operationSafetyChecklistDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(Map<String, Object> contentMap) {
+        String modeId = "21";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationSafetyChecklist_keyContrasts, modeId);
+        }
+        OperationSafetyChecklistDoc operationSafetyChecklistDoc = new OperationSafetyChecklistDoc();
+        operationSafetyChecklistDoc.setStructureMap(structureMap);
+        operationSafetyChecklistDoc.setPageData((Map) structureMap);
+
+        return operationSafetyChecklistDoc;
+    }
+
+    private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号++++住院号=病案号",
+            "签名++++=签名"
+    );
+
+    /**
+     * 给structureMap添加一个key(映射)
+     *
+     * @param structureMap
+     * @param target       需要用到的key
+     * @param source       structureMap中含有的key
+     */
+    protected void addKeyMapping(Map<String, String> structureMap, String target, String source) {
+        if (StringUtils.isEmpty(structureMap.get(target)) && StringUtils.isNotEmpty(structureMap.get(source))) {
+            structureMap.put(target, structureMap.get(source));
+        }
+    }
+}

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

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.wenfuyi;
+
+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: 门诊入院记录文档生成
+ */
+public class OutDepDocTrans 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;
+    }
+}

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

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

+ 82 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/RescueDocTrans.java

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

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

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

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

@@ -0,0 +1,72 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 阶段小结文档生成
+ */
+public class StagesSummaryDocTrans extends ModelDocTrans {
+    private String modeId = "28";
+
+    @Override
+    public List<StagesSummaryDoc> extract(MedrecVo medrecVo) {
+        List<StagesSummaryDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getStagesSummaryDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private StagesSummaryDoc getStagesSummaryDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            List<String> titles = Lists.newArrayList("入院情况", "入院诊断", "辅助检查",
+                    "诊疗经过", "目前情况", "目前诊断", "进一步诊疗方案",
+                    "记录医师","诊疗计划");
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            if(structureMap.containsKey("主诉")){
+                structureMap.put("主诉",structureMap.get("主诉").split("入院情况")[0]);
+            }
+        }
+
+        StagesSummaryDoc stagesSummaryDoc = new StagesSummaryDoc();
+        stagesSummaryDoc.setStructureMap(structureMap);
+        stagesSummaryDoc.setPageData((Map) structureMap);
+
+        return stagesSummaryDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "现病史- 发病情况=发病情况",
+            "体温(耳)=体温耳",
+            "医师签名=记录医生",
+            "进一步诊疗方案=诊疗计划",
+            "记录医师=记录医生",
+            "病程时间=病历日期",
+            "病程内容=主诉",
+            "诊疗经过=诊治经过"
+            );
+}

+ 338 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ThreeLevelWardDocTrans.java

@@ -0,0 +1,338 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.wenfuyi.WenfuyiXmlUtil;
+import com.lantone.qc.dbanaly.lt.facade.ModelHospitalFacade;
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.GeneralDoctorWardDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 查房记录文档生成
+ */
+public class ThreeLevelWardDocTrans extends ModelDocTrans {
+    private String modeId = "4";
+    private List<String> recTitles;
+    private List<OperationDoc> operationDocs;
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病程时间=查房日期",
+            "病程标题=查房标题",
+            "病程内容=病情记录",
+            "记录医师=记录医生"
+    );
+
+    @Override
+    public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
+        ModelHospitalFacade modelHospitalFacade = SpringContextUtil.getBean(ModelHospitalFacade.class);
+        recTitles = modelHospitalFacade.getRecTitles(5l, 4l);
+
+        List<ThreeLevelWardDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+
+        ThreeLevelWardDoc result = new ThreeLevelWardDoc();
+        contentMaps.forEach(contentMap -> {
+            classifyThreeLevelWardDoc(result, contentMap);
+        });
+        retList.add(result);
+        return retList;
+    }
+
+    private void classifyThreeLevelWardDoc(ThreeLevelWardDoc result, Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = WenfuyiXmlUtil.xmlToMap(content);
+            List<String> titles = Lists.newArrayList(
+                    "记录医师");
+
+            String text = sourceMap.get("原始文本");
+            List<String> sortTitles = CommonAnalysisUtil.sortTitles(titles, text);
+            CommonAnalysisUtil.cutByTitles(text, sortTitles, 0, sourceMap);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            String recTitle = contentMap.get("recTitle").toString();
+            if (recTitles.contains(recTitle)) {
+                sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            }
+            //病程内容未解析出来 则在原始文本中获取病程内容
+            addContent(sourceMap);
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+
+            if (StringUtils.isEmpty(structureMap.get("查房日期"))) {
+                return;
+            }
+            //不能简单的标准转化,如果有查房标题,优先使用
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房备注"))) {
+                structureMap.put("查房标题", structureMap.get("查房备注"));
+            }
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房类别"))) {
+                structureMap.put("查房标题", structureMap.get("查房类别"));
+            }
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("上级查房医生职称"))) {
+                structureMap.put("查房标题", structureMap.get("上级查房医生职称"));
+            }
+        }
+        //总的查房记录 汇总
+        ThreeLevelWardDoc allDoctorWradDoc = new ThreeLevelWardDoc();
+        allDoctorWradDoc.setStructureMap(structureMap);
+        allDoctorWradDoc.setPageData((Map) structureMap);
+        result.addAllDoctorWradDoc(allDoctorWradDoc);
+
+        //主任医师查房
+        DirectorDoctorWardDoc directorDoctorWardDoc = findDirectorDoctorWardDoc(structureMap);
+        if (directorDoctorWardDoc != null) {
+            result.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
+        }
+        //主治医师查房
+        AttendingDoctorWardDoc attendingDoctorWardDoc = findAttendingDoctorWardDoc(structureMap);
+        if (attendingDoctorWardDoc != null) {
+            result.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
+        }
+        //普通医师查房
+        if (directorDoctorWardDoc == null && attendingDoctorWardDoc == null) {
+            GeneralDoctorWardDoc generalDoctorWardDoc = new GeneralDoctorWardDoc();
+            generalDoctorWardDoc.setStructureMap(structureMap);
+            generalDoctorWardDoc.setPageData((Map) structureMap);
+            result.addGeneralDoctorWardDoc(generalDoctorWardDoc);
+        }
+    }
+
+    private void addContent(Map<String, String> sourceMap) {
+        try {
+            if (sourceMap.containsKey("病程内容") && StringUtil.isBlank(sourceMap.get("病程内容"))
+                    && sourceMap.containsKey("原始文本") && StringUtil.isNotBlank(sourceMap.get("原始文本"))
+                    && sourceMap.containsKey("病程标题") && StringUtil.isNotBlank(sourceMap.get("病程标题"))) {
+                String content = StringUtil.trim(sourceMap.get("原始文本").split(sourceMap.get("病程标题"))[1]);
+                if (content.contains("记录医师")) {
+                    content = StringUtil.trim(content.split("记录医师")[0]);
+                }
+                sourceMap.put("病程内容", content);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 主任医师查房
+     *
+     * @param structureMap
+     */
+    private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String recordDateStr = structureMap.get("查房日期");
+        String chiefSurgeon = structureMap.get("主刀医师");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        DirectorDoctorWardDoc directorDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) {    //标题有代字)
+                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 recordDateStr = structureMap.get("查房日期");
+        String chiefSurgeon = structureMap.get("主刀医师");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        AttendingDoctorWardDoc attendingDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) {    //标题有代字)
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return attendingDoctorWardDoc;
+    }
+
+    public static String subTitle(String srcText) {
+        String title = "";
+        if (StringUtil.isNotBlank(srcText)) {
+            //标题不包含代字,直接返回原标题
+            if (!srcText.contains("代")) {
+                return srcText;
+            }
+            //有携、兼字时,取携、兼字之前部分
+            if (srcText.contains("携")) {
+                title += srcText.substring(0, srcText.indexOf("携"));
+            } else if (srcText.contains("兼")) {
+                title += srcText.substring(0, srcText.indexOf("兼"));
+            }
+            //有代字时,取代字之后部分
+            if (srcText.contains("代") && srcText.indexOf("代") != srcText.length() - 1) {
+                title += srcText.substring(srcText.lastIndexOf("代") + 1);
+            } else {
+                return srcText;
+            }
+        }
+        return title;
+    }
+
+    /**
+     * 获取主刀医师/一助职称(取距离查房记录时间最近的一次手术记录)
+     *
+     * @param operationDocs
+     * @return
+     */
+    public static String getDoctorTitle(String chiefSurgeonFromWard, List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+        String title = "";
+        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
+        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+        //如果查房记录中有主刀医师姓名,直接用这个姓名获取对应职称
+        if (StringUtil.isNotBlank(chiefSurgeonFromWard)) {
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeonFromWard);
+            if (doctor != null) {
+                title = doctor.get("professor");
+                if (StringUtil.isNotBlank(title)) {
+                    return title;
+                }
+            }
+        }
+
+        //只有术前小结,没有手术记录情况下,直接取术前小结的医师姓名
+        if (operationDocs != null) {
+            long operationCount = operationDocs.stream().map(OperationDoc::getOperationRecordDoc).filter(Objects::nonNull).count();
+            long preoperativeCount = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).count();
+            if (operationCount == 0 && preoperativeCount > 0) {
+                long timeDiff = 0L;
+                List<PreoperativeDiscussionDoc> preoperativeDoc = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).collect(Collectors.toList());
+                for (PreoperativeDiscussionDoc doc : preoperativeDoc) {
+                    Map<String, String> structureMap = doc.getStructureMap();
+                    String chiefSurgeon = structureMap.get(findTitle + "签名");
+                    String operatorEndDateStr = structureMap.get("主刀医师签字时间");
+                    if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                        continue;
+                    }
+                    Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+                    if (doctor != null) {
+                        String professor = doctor.get("professor");
+                        Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                        if (operatorEndDate != null) {
+                            long timeDifference = timeDifference(operatorEndDate, recordDate);
+                            if (timeDifference == 0) {
+                                continue;
+                            }
+                            if (timeDiff == 0 || timeDiff > timeDifference) {
+                                /* 取距离此次主刀医师查房最近的一次术前讨论时间 */
+                                timeDiff = timeDifference;
+                                title = professor;
+                            }
+                        }
+                    }
+                }
+                if (StringUtil.isNotBlank(title)) {
+                    return title;
+                }
+            }
+            /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+            long timeDiff = 0L;
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    continue;
+                }
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String chiefSurgeon = structureMap.get(findTitle);
+                String operatorEndDateStr = structureMap.get("手术结束时间");
+
+                if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                    continue;
+                }
+                Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+                if (doctor != null) {
+                    String professor = doctor.get("professor");
+                    Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                    if (operatorEndDate != null) {
+                        long timeDifference = timeDifference(operatorEndDate, recordDate);
+                        if (timeDifference == 0) {
+                            continue;
+                        }
+                        if (timeDiff == 0 || timeDiff > timeDifference) {
+                            /* 取距离此次主刀医师查房最近的一次手术时间 */
+                            timeDiff = timeDifference;
+                            title = professor;
+                        }
+                    }
+                }
+            }
+        }
+        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;
+    }
+}

+ 250 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/TransferRecordDocTrans.java

@@ -0,0 +1,250 @@
+package com.lantone.qc.trans.wenfuyi;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.*;
+
+/**
+ * @Description: 转科记录文档生成
+ */
+public class TransferRecordDocTrans extends ModelDocTrans {
+    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<>();
+        if (into != null) {
+            all.addAll(into);
+        }
+        if (out != null) {
+            all.addAll(out);
+        }
+        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(into);
+        Map<String, TransferOutDoc> 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 modeId = "26";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts, modeId);
+        }
+
+        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+        transferIntoDoc.setText(content);
+        transferIntoDoc.setStructureMap(structureMap);
+        transferIntoDoc.setPageData((Map) sourceMap);
+
+        return transferIntoDoc;
+    }
+
+    private List<String> transferInto_keyContrasts = Lists.newArrayList(
+            "书写日期=记录日期",
+            "转入时间=转入日期",
+            "本人姓名=姓名"
+    );
+
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        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 modeId = "34";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts);
+        }
+        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+        transferAllDoc.setText(content);
+        transferAllDoc.setStructureMap(structureMap);
+        transferAllDoc.setPageData((Map) sourceMap);
+        return transferAllDoc;
+    }
+
+    /**************************************************转出*******************************************************/
+    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 modeId = "27";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id", ModuleMappingUtil.getDeptModuleId(modeId));
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferOut_keyContrasts, modeId);
+        }
+        TransferOutDoc transferOutDoc = new TransferOutDoc();
+        transferOutDoc.setText(content);
+        transferOutDoc.setStructureMap(structureMap);
+        transferOutDoc.setPageData((Map) sourceMap);
+
+        return transferOutDoc;
+    }
+
+    private List<String> transferOut_keyContrasts = Lists.newArrayList(
+            "书写日期=记录日期",
+            "转出时间=转入日期",
+            "本人姓名=姓名"
+    );
+}

+ 268 - 0
trans/src/main/java/com/lantone/qc/trans/wenfuyi/WenfuyiDocTrans.java

@@ -0,0 +1,268 @@
+package com.lantone.qc.trans.wenfuyi;
+
+/**
+ * @Description:嵊州人民医院解析
+ * @Author:liuqq
+ * @time: ${DATE} ${TIME}
+ **/
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+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 lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+//import com.lantone.qc.trans..*;
+
+@Slf4j
+public class WenfuyiDocTrans extends DocTrans {
+    @Override
+    protected InputInfo extract(QueryVo queryVo) {
+        InputInfo inputInfo = new InputInfo();
+        for (MedrecVo i : queryVo.getMedrec()) {
+            if (i.getTitle() != null) {
+                if (i.getTitle().equals("会诊")) {
+                    ConsultationDocTrans consultationDocTrans = new ConsultationDocTrans();
+                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("手术")) {
+                    OperationDocTrans operationDocTrans = new OperationDocTrans();
+                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("转科")) {
+                    TransferRecordDocTrans transferRecordDocTrans = new TransferRecordDocTrans();
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("入院记录")) {
+                    BeHospitalizedDocTrans beHospitalizedDocTrans = new BeHospitalizedDocTrans();
+                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血/血制品病程记录")) {
+                    ClinicalBloodDocTrans clinicalBloodDocTrans = new ClinicalBloodDocTrans();
+                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("输血后效果评价")) {
+                    ClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new ClinicBloodEffectDocTrans();
+                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值记录")) {
+                    CrisisValueReportDocTrans crisisValueReportDocTrans = new CrisisValueReportDocTrans();
+                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("危急值")) {
+                    /*CrisisInfoDocTrans crisisInfoDocTrans = new CrisisInfoDocTrans();
+                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));*/
+                }
+                if (i.getTitle().equals("病危通知书")) {
+                    CriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new CriticallyIllNoticeDocTrans();
+                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡病例讨论记录")) {
+                    DeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new DeathCaseDiscussDocTrans();
+                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("死亡记录")) {
+                    DeathRecordDocTrans deathRecordDocTrans = new DeathRecordDocTrans();
+                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("疑难病例讨论记录")) {
+                    DifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new DifficultCaseDiscussDocTrans();
+                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("医嘱信息")) {
+                    DoctorAdviceDocTrans doctorAdviceDocTrans = new DoctorAdviceDocTrans();
+                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("值班交接制度")) {
+                    /*DutyShiftSystemDocTrans dutyShiftSystemDocTrans = new DutyShiftSystemDocTrans();
+                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));*/
+                }
+                if (i.getTitle().equals("首次病程录")) {
+                    FirstCourseRecordDocTrans firstCourseRecordDocTrans = new FirstCourseRecordDocTrans();
+                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("病案首页")) {
+                    FirstPageRecordDocTrans firstPageRecordDocTrans = new FirstPageRecordDocTrans();
+                    inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("出院小结")) {
+                    LeaveHospitalDocTrans leaveHospitalDocTrans = new LeaveHospitalDocTrans();
+                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("抢救记录")) {
+                    RescueDocTrans rescueDocTrans = new RescueDocTrans();
+                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("阶段小结")) {
+                    StagesSummaryDocTrans stagesSummaryDocTrans = new StagesSummaryDocTrans();
+                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("查房记录")) {
+                    ThreeLevelWardDocTrans threeLevelWardDocTrans = new ThreeLevelWardDocTrans();
+//                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("住院病历信息")) {
+                    MedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new MedicalRecordInfoDocTrans();
+                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+                }
+                if (i.getTitle().equals("化验")) {
+                 /*   LisDocTrans lisDocTrans = new LisDocTrans();
+                    inputInfo.setLisDocs(lisDocTrans.extract(i));*/
+                }
+                if (i.getTitle().equals("辅检")) {
+                  /*  PacsDocTrans pacsDocTrans = new PacsDocTrans();
+                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));*/
+                }
+                if (i.getTitle().equals("门诊")) {
+                    OutDepDocTrans outDepDocTrans = new OutDepDocTrans();
+                    inputInfo.setBeHospitalizedDoc(outDepDocTrans.extract(i));
+                }
+            }
+        }
+        pageDataHandle(inputInfo);
+        return inputInfo;
+    }
+
+    private void pageDataHandle(InputInfo inputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() != null) {
+            inputInfo.getPageData().put("入院记录", Lists.newArrayList(inputInfo.getBeHospitalizedDoc().getPageData()));
+        }
+        if (inputInfo.getDeathCaseDiscussDoc() != null) {
+            inputInfo.getPageData().put("死亡病例讨论记录", Lists.newArrayList(inputInfo.getDeathCaseDiscussDoc().getPageData()));
+        }
+        if (inputInfo.getDeathRecordDoc() != null) {
+            inputInfo.getPageData().put("死亡记录", Lists.newArrayList(inputInfo.getDeathRecordDoc().getPageData()));
+        }
+        if (inputInfo.getFirstCourseRecordDoc() != null) {
+            inputInfo.getPageData().put("首次病程录", Lists.newArrayList(inputInfo.getFirstCourseRecordDoc().getPageData()));
+        }
+        if (inputInfo.getLeaveHospitalDoc() != null) {
+            inputInfo.getPageData().put("出院小结", Lists.newArrayList(inputInfo.getLeaveHospitalDoc().getPageData()));
+        }
+        if (inputInfo.getFirstPageRecordDoc() != null) {
+            inputInfo.getPageData().put("病案首页", Lists.newArrayList(inputInfo.getFirstPageRecordDoc().getPageData()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
+            inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+//            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
+            inputInfo.getPageData().put(
+                    "输血后效果评价",
+                    inputInfo.getClinicBloodEffectDocs()
+                            .stream()
+                            .map(i -> i.getPageData())
+                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy-MM-dd HH:mm"))
+                            .collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
+            inputInfo.getPageData().put("危急值记录", inputInfo.getCrisisValueReportDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCriticallyIllNoticeDocs())) {
+            inputInfo.getPageData().put("病危通知书", inputInfo.getCriticallyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDifficultCaseDiscussDocs())) {
+            inputInfo.getPageData().put("疑难病例讨论记录", inputInfo.getDifficultCaseDiscussDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDutyShiftSystemDocs())) {
+            inputInfo.getPageData().put("值班交接制度", inputInfo.getDutyShiftSystemDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getRescueDocs())) {
+            inputInfo.getPageData().put("抢救记录", inputInfo.getRescueDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getStagesSummaryDocs())) {
+            inputInfo.getPageData().put("阶段小结", inputInfo.getStagesSummaryDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getThreeLevelWardDocs())) {
+            inputInfo.getPageData().put("查房记录", inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
+            List<Map<String, Object>> crPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(crPd)) {
+                inputInfo.getPageData().put("会诊记录", crPd);
+            }
+
+            List<Map<String, Object>> caPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(caPd)) {
+                inputInfo.getPageData().put("会诊申请单", caPd);
+            }
+
+            List<Map<String, Object>> ctPd = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(ctPd)) {
+                inputInfo.getPageData().put("会诊结果单", ctPd);
+            }
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getOperationDocs())) {
+            List<Map<String, Object>> odPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationDiscussionDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(odPageDataList)) {
+                inputInfo.getPageData().put("术后首次病程及谈话记录", odPageDataList);
+            }
+
+            List<Map<String, Object>> orPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationRecordDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationRecordDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(orPageDataList)) {
+                inputInfo.getPageData().put("手术记录", orPageDataList);
+            }
+
+            List<Map<String, Object>> pdPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getPreoperativeDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getPreoperativeDiscussionDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(pdPageDataList)) {
+                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
+            }
+        }
+        if (inputInfo.getTransferRecordDocs() != null) {
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferIntoDocs())) {
+                inputInfo.getPageData().put(
+                        "转入记录",
+                        inputInfo.getTransferRecordDocs().getTransferIntoDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferOutDocs())) {
+                inputInfo.getPageData().put(
+                        "转出记录",
+                        inputInfo.getTransferRecordDocs().getTransferOutDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+        }
+    }
+}

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

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