Browse Source

Merge remote-tracking branch 'origin/dev'

louhr 5 years ago
parent
commit
c90d3939a5
63 changed files with 3388 additions and 129 deletions
  1. 6 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/controller/DbController.java
  2. 2 2
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/comsis/ModuleHelper.java
  3. 3 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/comsis/XmlDataAnalysisFacade.java
  4. 51 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/shaoyf/ShaoyfXmlDataAnalysisFacade.java
  5. 57 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/shaoyf/ShaoyfXmlUtil.java
  6. 73 27
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0011.java
  7. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02940.java
  8. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02978.java
  9. 30 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02979.java
  10. 45 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0382.java
  11. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0296.java
  12. 35 40
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0095.java
  13. 9 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0500.java
  14. 11 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0175.java
  15. 17 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0192.java
  16. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02972.java
  17. 14 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0148.java
  18. 9 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0149.java
  19. 9 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0515.java
  20. 4 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0328.java
  21. 7 7
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/LeaveHospitalAI.java
  22. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessThreeLevelWard.java
  23. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/util/CacheFileManager.java
  24. 1 1
      kernel/src/main/resources/application.yml
  25. 84 0
      kernel/src/main/resources/cache/2/concept_clinic_bodypart_properties.dict
  26. 0 0
      kernel/src/main/resources/cache/2/concept_diag_properties.dict
  27. 0 0
      kernel/src/main/resources/cache/2/hospital_diag_info.dict
  28. 0 0
      kernel/src/main/resources/cache/2/hospital_doctor_info.dict
  29. 1 1
      public/src/main/java/com/lantone/qc/pub/model/label/PresentLabel.java
  30. 9 1
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxOperationDocTrans.java
  31. 45 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfAnesthesiaRelatedDocTrans.java
  32. 198 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfBeHospitalizedDocTrans.java
  33. 47 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfClinicBloodEffectDocTrans.java
  34. 52 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfClinicalBloodDocTrans.java
  35. 207 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfConsultationDocTrans.java
  36. 48 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfCrisisValueReportDocTrans.java
  37. 49 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfCriticallyIllNoticeDocTrans.java
  38. 46 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDeathCaseDiscussDocTrans.java
  39. 45 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDeathRecordDocTrans.java
  40. 53 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDifficultCaseDiscussDocTrans.java
  41. 327 3
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDocTrans.java
  42. 36 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDoctorAdviceDocTrans.java
  43. 46 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDutyShiftSystemDocTrans.java
  44. 93 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfFirstCourseRecordDocTrans.java
  45. 258 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfFirstPageRecordDocTrans.java
  46. 18 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfInformedConsentDocTrans.java
  47. 45 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfInvasiveOperationDocTrans.java
  48. 49 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfLeaveHospitalDocTrans.java
  49. 26 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfMedicalRecordInfoDocTrans.java
  50. 45 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfMedicalWritingDocTrans.java
  51. 23 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfNoticeOfConversationDocTrans.java
  52. 38 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfNursingSystemDocTrans.java
  53. 305 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfOperationDocTrans.java
  54. 47 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfPathologyShipDocTrans.java
  55. 45 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfReasonableDiagnosisDocTrans.java
  56. 49 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfRescueDocTrans.java
  57. 49 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfSeriouslyIllNoticeDocTrans.java
  58. 50 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfStagesSummaryDocTrans.java
  59. 252 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfThreeLevelWardDocTrans.java
  60. 240 0
      trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfTransferRecordDocTrans.java
  61. 1 0
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouBeHospitalizedDocTrans.java
  62. 1 0
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouConsultationDocTrans.java
  63. 6 2
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouTransferRecordDocTrans.java

+ 6 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/controller/DbController.java

@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
 import com.lantone.qc.dbanaly.facade.changx.ChangxXmlDataAnalysisFacade;
 import com.lantone.qc.dbanaly.facade.comsis.ModuleHelper;
 import com.lantone.qc.dbanaly.facade.comsis.RedisFacade;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlDataAnalysisFacade;
 import com.lantone.qc.dbanaly.facade.taizhou.TaiZhouXmlDataAnalysisFacade;
 import com.lantone.qc.dbanaly.util.RedisUtil;
 import com.lantone.qc.dbanaly.vo.AnalyzeXmlVO;
@@ -38,6 +39,8 @@ public class DbController {
     @Autowired
     private TaiZhouXmlDataAnalysisFacade taiZhouXmlDataAnalysisFacade;
     @Autowired
+    private ShaoyfXmlDataAnalysisFacade shaoyfXmlDataAnalysisFacade;
+    @Autowired
     private RedisFacade redisFacade;
 
     @ApiOperation(value = "模板信息加载")
@@ -56,9 +59,12 @@ public class DbController {
         Long hospitalId = analyzeXmlVO.getHospitalId();
         if (hospitalId == null) {
             msgList.addAll(changxXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds()));
+            msgList.addAll(shaoyfXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds()));
             msgList.addAll(taiZhouXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds()));
         } else if (hospitalId == 1) {
             msgList = changxXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds());
+        } else if (hospitalId == 2) {
+            msgList = shaoyfXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds());
         } else if (hospitalId == 3) {
             msgList = taiZhouXmlDataAnalysisFacade.analyzeXml(analyzeXmlVO.getModeIds());
         }

+ 2 - 2
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/comsis/ModuleHelper.java

@@ -52,7 +52,7 @@ public class ModuleHelper {
      */
     public boolean loadModuleInfo() {
         try {
-            List<String> xmlDataTypeHospitalIds = Lists.newArrayList("1", "3");
+            List<String> xmlDataTypeHospitalIds = Lists.newArrayList("1", "2", "3");
             for (String hospitalId : hospitalIds.split(",")) {
                 if (!xmlDataTypeHospitalIds.contains(hospitalId)) {
                     continue;
@@ -72,7 +72,7 @@ public class ModuleHelper {
         QueryWrapper<ModuleInfo> moduleInfoQe = new QueryWrapper<>();
         moduleInfoQe.eq("is_deleted", "N");
         moduleInfoQe.eq("hospital_id", Long.parseLong(hospitalId));
-        moduleInfoQe.select("id","mode_id");
+        moduleInfoQe.select("id", "mode_id");
         List<ModuleInfo> moduleInfoList = moduleInfoService.list(moduleInfoQe);
         if (ListUtil.isEmpty(moduleInfoList)) {
             return;

+ 3 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/comsis/XmlDataAnalysisFacade.java

@@ -5,6 +5,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.lantone.qc.dbanaly.facade.changx.CxXmlUtil;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
 import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
 import com.lantone.qc.dbanaly.lt.entity.Abnormal;
 import com.lantone.qc.dbanaly.lt.entity.BehospitalInfo;
@@ -329,6 +330,8 @@ public class XmlDataAnalysisFacade {
         Set<String> keys = new HashSet<>();
         if (hospitalId == 1) {
             keys.addAll(CxXmlUtil.firstLevelNodeValue(xml).keySet());
+        } else if (hospitalId == 2) {
+            keys.addAll(ShaoyfXmlUtil.getXmlToMap(xml).keySet());
         } else if (hospitalId == 3) {
             keys.addAll(TzXmlUtil.getXmlToMapForTZ(xml).keySet());
         }

+ 51 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/shaoyf/ShaoyfXmlDataAnalysisFacade.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.dbanaly.facade.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.comsis.XmlDataAnalysisFacade;
+import com.lantone.qc.dbanaly.lt.facade.ModeFacade;
+import com.lantone.qc.pub.util.ListUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @author: rengb
+ * @time: 2020/6/3 16:44
+ */
+@Slf4j
+@Component
+public class ShaoyfXmlDataAnalysisFacade {
+    @Autowired
+    private XmlDataAnalysisFacade xmlDataAnalysisFacade;
+    @Autowired
+    private ModeFacade modeFacade;
+
+    public List<String> analyzeXml(List<Long> modeIds) {
+        List<String> retList = Lists.newArrayList();
+        if (ListUtil.isEmpty(modeIds)) {
+            modeIds = Arrays.asList(1l, 2l, 3l, 4l, 5l, 11l, 17l, 18l, 19l, 22l, 24l, 25l, 27l, 28l, 30l, 31l);
+        }
+        Map<Long, String> modeMap = modeFacade.getModeMap();
+        List<String> recTitles = null;
+        String modeName = null;
+        for (Long modeId : modeIds) {
+            recTitles = xmlDataAnalysisFacade.getRecTitles(2l, modeId);
+            modeName = modeMap.get(modeId);
+            for (String recTitle : recTitles) {
+                try {
+                    xmlDataAnalysisFacade.analysisByRecTitle(2l, modeId, modeName, recTitle, null, "");
+                } catch (Exception e) {
+                    retList.add("[邵逸夫-" + modeId + "-" + recTitle + "]执行失败");
+                    log.error("[邵逸夫-" + modeId + "-" + recTitle + "]执行失败--" + e.getMessage(), e);
+                }
+            }
+        }
+        return retList;
+    }
+
+}

+ 57 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/shaoyf/ShaoyfXmlUtil.java

@@ -0,0 +1,57 @@
+package com.lantone.qc.dbanaly.facade.shaoyf;
+
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.comsis.XmlUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.dom4j.Document;
+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
+ */
+public class ShaoyfXmlUtil {
+
+    /**
+     * getText()获取当前节点的文本内容,getStringValue()获取所有子节点拼接后的文本内容
+     *
+     * @param xml
+     * @return
+     */
+
+    public static Map<String, String> getXmlToMap(String xml) {
+        Map<String, String> retMap = Maps.newLinkedHashMap();
+        try {
+            Document doc = DocumentHelper.parseText(XmlUtil.xmlErrorCorrection(xml));
+            List<Element> emrTermElements = doc.getRootElement().element("TermList").elements("EMR-TERM");
+            String ename, setnomark, text;
+            for (Element emrTermElement : emrTermElements) {
+                ename = emrTermElement.attributeValue("ename");
+                if (StringUtil.isBlank(ename)) {
+                    continue;
+                }
+                //                ename = StringUtil.removeBlank(ename);
+                setnomark = emrTermElement.attributeValue("setnomark");
+                setnomark = setnomark == null ? "" : setnomark;
+                setnomark = setnomark.trim().replaceAll("&nbsp;", "");
+                text = emrTermElement.getStringValue().trim().replaceAll("&nbsp;", "");
+                if (StringUtil.isBlank(retMap.get(ename))) {
+                    if (StringUtil.isBlank(text)) {
+                        retMap.put(ename, setnomark);
+                    } else {
+                        retMap.put(ename, text);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return XmlUtil.correctMapOfXml(retMap);
+    }
+
+}

+ 73 - 27
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0011.java

@@ -1,50 +1,98 @@
 package com.lantone.qc.kernel.catalogue.behospitalized;
+
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
-import com.lantone.qc.kernel.util.CatalogueUtil;
-import com.lantone.qc.dbanaly.util.KernelConstants;
-import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.entity.Diag;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.lantone.qc.pub.model.entity.GeneralDesc;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @ClassName : BEH0011
- * @Description : 入院诊断不完整
- * 初步诊断没有既往史里的慢性疾病
+ * @Description : 初步诊断不完整
+ * 原逻辑 --初步诊断没有既往史里的慢性疾病
+ * 现逻辑 --检查现病史中一般情况之后的疾病名称,既往史中的疾病名称是否都在初步诊断里
  * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28
  */
 @Component
 public class BEH0011 extends QCCatalogue {
-    @Autowired
-    private SpecialStorageUtil specialStorageUtil;
+//    @Autowired
+//    private SpecialStorageUtil specialStorageUtil;
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if(inputInfo.getBeHospitalizedDoc() == null){
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        PresentLabel presentLabel = inputInfo.getBeHospitalizedDoc().getPresentLabel();
+        DiagLabel initialDiagLabel = inputInfo.getBeHospitalizedDoc().getInitialDiagLabel();
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        if (initialDiagLabel == null || pastLabel == null || presentLabel == null) {
             status.set("0");
             return;
         }
-        Map<String, Map<String, Object>> diagMap = specialStorageUtil.getJsonStringValue(KernelConstants.CONCEPT_DIAG_PROPERTY_MAP);
-        String initDiagText = CatalogueUtil.removeSpecialChar(inputInfo.getBeHospitalizedDoc().getInitialDiagLabel().getText());
-        List<Diag> diags = inputInfo.getBeHospitalizedDoc().getPastLabel().getDiags().stream().filter(diag -> diag.getNegative() == null).collect(Collectors.toList());
-        if(StringUtils.isNotEmpty(initDiagText)){
+        String presentText = presentLabel.getText();
+        List<Diag> presentDiags = presentLabel.getDiags();
+        List<String> presentPastDiag = new ArrayList<>();
+        /* 取现病史中一般情况之后的疾病名称 */
+        if (StringUtil.isNotBlank(presentText) && presentDiags.size() > 0) {
+            List<GeneralDesc> generals = presentLabel.getGenerals();
+            String lastGeneral = generals.get(generals.size() - 1).getName();
+            int lastGeneralIndex = presentText.indexOf(lastGeneral);
+            for (Diag presentDiag : presentDiags) {
+                if (presentDiag.getNegative() != null) {
+                    continue;
+                }
+                /* 现病史中一般情况之后的疾病名称 */
+                if (presentText.indexOf(presentDiag.getHospitalDiagName()) > lastGeneralIndex) {
+                    presentPastDiag.add(presentDiag.getHospitalDiagName());
+                }
+            }
+        }
+        /* 取既往史中疾病名称 */
+        List<Diag> pastDiags = pastLabel.getDiags();
+        addDiagHospitalName(presentPastDiag, pastDiags);
+        /* 取初步诊断中疾病名称 */
+        List<String> initDiag = new ArrayList<>();
+        List<Diag> initialDiagDiags = initialDiagLabel.getDiags();
+        addDiagHospitalName(initDiag, initialDiagDiags);
+
+        if (initDiag.containsAll(presentPastDiag)){
+            status.set("0");
+        }
+    }
+
+    private void addDiagHospitalName(List<String> presentPastDiag, List<Diag> pastDiags) {
+        for (Diag pastDiag : pastDiags) {
+            if (pastDiag.getNegative() != null) {
+                continue;
+            }
+            presentPastDiag.add(pastDiag.getHospitalDiagName());
+        }
+    }
+    /* 原逻辑
+    Map<String, Map<String, Object>> diagMap = specialStorageUtil.getJsonStringValue(KernelConstants.CONCEPT_DIAG_PROPERTY_MAP);
+    String initDiagText = CatalogueUtil.removeSpecialChar(initialDiagLabel.getText());
+        if (pastLabel.getDiags() != null) {
+            List<Diag> diags = pastLabel.getDiags().stream().filter(diag -> diag.getNegative() == null).collect(Collectors.toList());
             List<String> initDiags = Arrays.asList(initDiagText.split(","));
-            if(diags.size()>0){
-                for (Diag diag:diags) {
+            if (diags.size() > 0) {
+                for (Diag diag : diags) {
                     Map<String, Object> map = (Map<String, Object>) diagMap.get(diag.getName());
-                    if(map != null && map.size() >0){
+                    if (map != null && map.size() > 0) {
                         String chronic = (String) map.get("chronic");//1是慢病
-                        if("1".equals(chronic) && !initDiags.contains(diag.getName())){
-                            if(StringUtils.isEmpty(info.get())){
+                        if ("1".equals(chronic) && !initDiags.contains(diag.getName())) {
+                            if (StringUtils.isEmpty(info.get())) {
                                 info.set(diag.getName());
-                            }else {
+                            } else {
                                 info.set(info.get() + "," + diag.getName());
                             }
                         }
@@ -52,10 +100,8 @@ public class BEH0011 extends QCCatalogue {
                 }
             }
         }
-        if(StringUtils.isEmpty(info.get())){
+        if (StringUtils.isEmpty(info.get())) {
             status.set("0");
         }
-
-
-    }
+     */
 }

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

@@ -23,7 +23,7 @@ public class BEH02940 extends QCCatalogue {
             return;
         }
         Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
-        if (StringUtil.isBlank(beHospitalStructureMap.get("内科疾病史(其它)"))) {
+        if (StringUtil.isBlank(beHospitalStructureMap.get("内科疾病史其它"))) {
             status.set("-1");
         }
     }

+ 33 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02978.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.Map;
+
+/**
+ * @ClassName : BEH02978
+ * @Description : 药物过敏史描述与病案首页不一致(结构化数据)
+ * @Author : 楼辉荣
+ * @Date: 2020-06-20 15:00
+ */
+public class BEH02978 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null || inputInfo.getFirstPageRecordDoc() == null) {
+            return;
+        }
+        String bhAllergy = inputInfo.getBeHospitalizedDoc().getStructureMap().get("过敏史");
+        String fipAllergy = inputInfo.getFirstPageRecordDoc().getStructureMap().get("过敏药物");
+        if (StringUtil.isBlank(bhAllergy) || StringUtil.isBlank(fipAllergy)){
+            return;
+        }
+
+        if (!bhAllergy.equals(fipAllergy)){
+            status.set("-1");
+        }
+    }
+}

+ 30 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02979.java

@@ -0,0 +1,30 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : BEH02979
+ * @Description :  子女健康状况未描述(结构化数据)
+ * @Author : 胡敬
+ * @Date: 2020-06-22 10:16
+ */
+@Component
+public class BEH02979 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        if (StringUtil.isBlank(beHospitalStructureMap.get("子女健康状况"))) {
+            status.set("-1");
+        }
+    }
+}

+ 45 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0382.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.kernel.catalogue.consultation;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 化验结果为危急值的,6小时内危急值记录中没有体现危急值记录
+ * 在没有化验报告单之前,以记录时间和接收时间的比较为准
+ * @author: Mark
+ * @time: 2020/6/19 13:34
+ */
+@Component
+public class CON0382 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<CrisisValueReportDoc> crisisValueReportDocs = inputInfo.getCrisisValueReportDocs();
+        if (ListUtil.isNotEmpty(crisisValueReportDocs)) {
+            crisisValueReportDocs.forEach(crisisValueReportDoc -> {
+                if (StringUtil.isBlank(crisisValueReportDoc.getStructureMap().get("危急值记录内容"))) {
+                    String record_time = crisisValueReportDoc.getStructureMap().get("记录时间");
+                    String receive_time = crisisValueReportDoc.getStructureMap().get("接收时间");
+                    String crisisVal = crisisValueReportDoc.getStructureMap().get("危急值记录内容").trim();
+
+                    Date record = StringUtil.parseDateTime(record_time);
+                    Date receive = StringUtil.parseDateTime(receive_time);
+                    if (crisisVal.length()==0 || CatalogueUtil.compareTime(receive, record, 6*60L) ) {
+                        status.set("-1");
+                    }
+                }
+            });
+        }
+    }
+
+}

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0296.java

@@ -40,7 +40,7 @@ public class DUT0296 extends QCCatalogue {
         String leaveDate = structureMap_leave.get("出院时间");//2019-12-10 10:49
         /* 住院天数小于30天不报错*/
         int lengthOfStayNum = 0;
-        if (StringUtil.isNotBlank(beDate) || StringUtil.isNotBlank(leaveDate)) {
+        if (StringUtil.isNotBlank(beDate) && StringUtil.isNotBlank(leaveDate)) {
             lengthOfStayNum = dateDifference(beDate, leaveDate);
             if (lengthOfStayNum < 30) {
                 return;

+ 35 - 40
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0095.java

@@ -3,8 +3,8 @@ package com.lantone.qc.kernel.catalogue.firstcourserecord;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
-import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
 import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.entity.GeneralDesc;
 import com.lantone.qc.pub.model.label.DiagLabel;
 import com.lantone.qc.pub.model.label.PastLabel;
 import com.lantone.qc.pub.model.label.PresentLabel;
@@ -24,59 +24,54 @@ import java.util.List;
 @Component
 public class FIRC0095 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        //        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
-        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
-        if (beHospitalizedDoc == null) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
             return;
         }
-        //DiagLabel initialDiagLabel = firstCourseRecordDoc.getInitialDiagLabel();
-        PresentLabel presentLabel = beHospitalizedDoc.getPresentLabel();
-        PastLabel pastLabel = beHospitalizedDoc.getPastLabel();
-        DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
-
-        if (initialDiagLabel == null) {
+        PresentLabel presentLabel = inputInfo.getBeHospitalizedDoc().getPresentLabel();
+        DiagLabel initialDiagLabel = inputInfo.getBeHospitalizedDoc().getInitialDiagLabel();
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        if (initialDiagLabel == null || pastLabel == null || presentLabel == null) {
             status.set("0");
             return;
         }
-        List<String> bhDiags = new ArrayList<>();
-        /* 现病史诊断 */
-        if (presentLabel != null && presentLabel.getDiags() != null) {
-            List<Diag> presentDiags = presentLabel.getDiags();
-            copyDiag(presentDiags, bhDiags);
-        }
-        /* 既往史诊断 */
-        if (pastLabel != null && pastLabel.getDiags() != null) {
-            List<Diag> pastDiags = pastLabel.getDiags();
-            copyDiag(pastDiags, bhDiags);
-        }
-        /* 初步诊断 */
-        List<Diag> diags = initialDiagLabel.getDiags();
-        List<String> initDiags = new ArrayList<>();
-        if (diags != null) {
-            copyDiag(diags, initDiags);
+        String presentText = presentLabel.getText();
+        List<Diag> presentDiags = presentLabel.getDiags();
+        List<String> presentPastDiag = new ArrayList<>();
+        /* 取现病史中一般情况之后的疾病名称 */
+        if (StringUtil.isNotBlank(presentText) && presentDiags.size() > 0) {
+            List<GeneralDesc> generals = presentLabel.getGenerals();
+            String lastGeneral = generals.get(generals.size() - 1).getName();
+            int lastGeneralIndex = presentText.indexOf(lastGeneral);
+            for (Diag presentDiag : presentDiags) {
+                if (presentDiag.getNegative() != null) {
+                    continue;
+                }
+                /* 现病史中一般情况之后的疾病名称 */
+                if (presentText.indexOf(presentDiag.getHospitalDiagName()) > lastGeneralIndex) {
+                    presentPastDiag.add(presentDiag.getHospitalDiagName());
+                }
+            }
         }
+        /* 取既往史中疾病名称 */
+        List<Diag> pastDiags = pastLabel.getDiags();
+        addDiagHospitalName(presentPastDiag, pastDiags);
+        /* 取初步诊断中疾病名称 */
+        List<String> initDiag = new ArrayList<>();
+        List<Diag> initialDiagDiags = initialDiagLabel.getDiags();
+        addDiagHospitalName(initDiag, initialDiagDiags);
 
-        //List<Diag> diags1 = initialDiagLabel1.getDiags();
-        /* 初步诊断包含现病史诊断和既往史诊断 */
-        if (initDiags.containsAll(bhDiags)) {
+        if (initDiag.containsAll(presentPastDiag)){
             status.set("0");
         }
     }
 
-    private void copyDiag(List<Diag> diags, List<String> diagList) {
-        String hospitalDiagName, name;
-        for (Diag diag : diags) {
-            if (diag.getNegative() != null) {
+    private void addDiagHospitalName(List<String> presentPastDiag, List<Diag> pastDiags) {
+        for (Diag pastDiag : pastDiags) {
+            if (pastDiag.getNegative() != null) {
                 continue;
             }
-            hospitalDiagName = diag.getHospitalDiagName();
-            name = diag.getName();
-            if (StringUtil.isNotBlank(hospitalDiagName)) {
-                diagList.add(hospitalDiagName);
-            } else if (StringUtil.isNotBlank(name)) {
-                diagList.add(name);
-            }
+            presentPastDiag.add(pastDiag.getHospitalDiagName());
         }
     }
 }

+ 9 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0500.java

@@ -44,6 +44,15 @@ public class FIRC0500 extends QCCatalogue {
                 return;
             }
         }
+        //结构化再获取病历特点,判断是否包含主诉内容
+        firstCourseChief = structureMap.get("病例特点");
+        if (StringUtil.isNotBlank(firstCourseChief)) {
+            firstCourseChief = firstCourseChief.replaceAll("[\\p{Punct}\\pP。]", "");
+            if (firstCourseChief.contains(chief_text)) { //首程病历特点.contains(入院记录主诉)
+                status.set("0");
+                return;
+            }
+        }
         if (firstCourseRecordDoc.getText().contains(chief_text)) {
             status.set("0");
         }

+ 11 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0175.java

@@ -1,5 +1,6 @@
 package com.lantone.qc.kernel.catalogue.firstpagerecord;
 
+import com.google.common.collect.Lists;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
@@ -9,7 +10,6 @@ import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.util.ListUtil;
 import org.springframework.stereotype.Component;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -21,28 +21,32 @@ import java.util.Map;
  */
 @Component
 public class FIRP0175 extends QCCatalogue {
-    private static String[] strings = {"2型糖尿病"};
+    List<String> diags = Lists.newArrayList("2型糖尿病");
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null
-                && inputInfo.getLeaveHospitalDoc() != null && inputInfo.getLeaveHospitalDoc().getLeaveDiagLabel() != null) {
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getLeaveHospitalDoc() != null) {
             Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
             //病案首页出院诊断
             List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag);
             //出院小结诊断
-            List<Diag> leaveDiags = inputInfo.getLeaveHospitalDoc().getLeaveDiagLabel().getDiags();
+            List<Diag> leaveDiags = null;
+            if (inputInfo.getLeaveHospitalDoc().getLeaveDiagLabel() != null) {
+                leaveDiags = inputInfo.getLeaveHospitalDoc().getLeaveDiagLabel().getDiags();
+            }
             if (ListUtil.isEmpty(dischargeDiag) || ListUtil.isEmpty(leaveDiags)) {
                 return;
             }
             String firstpageleaveDiag = dischargeDiag.get(0).get(Content.diagnoseName);
             String leaveDiag = leaveDiags.get(0).getHospitalDiagName();
             //判断是否有2型糖尿病这种病如果没有,把疾病前的数字去掉
-            if(!Arrays.asList(strings).contains(leaveDiag)){
-                leaveDiag = leaveDiag.replaceAll("^[0-9]","");
+            if (!diags.contains(leaveDiag)) {
+                leaveDiag = leaveDiag.replaceAll("^[0-9]", "");
             }
             if (!CatalogueUtil.compareToken(firstpageleaveDiag, leaveDiag)) {
                 status.set("-1");
             }
+
         }
     }
 }

+ 17 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0192.java

@@ -22,23 +22,25 @@ import java.util.Map;
 @Component
 public class FIRP0192 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
         FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-        if (operationDocs != null && operationDocs.size() > 0) {
-            OperationDoc operationDoc = operationDocs.get(0);
-            OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
-            if (operationDiscussionDoc != null) {
-                Map<String, String> docStructureMap = operationDiscussionDoc.getStructureMap();
-                Map<String, Object> firstPageRecordDocStructureMap = firstPageRecordDoc.getStructureExtMap();
-                String opertaion = docStructureMap.get("手术方式");
-                List<Map<String, String>> mapList = (List<Map<String, String>>) firstPageRecordDocStructureMap.get(Content.operative_information);
-                if (mapList != null && mapList.size() > 0) {
-                    Map<String, String> op = mapList.get(0);
-                    String oName = op.get(Content.operative_name);
-                    if (StringUtils.isNotEmpty(opertaion) && !opertaion.equals(oName)) {
-                        status.set("-1");
-                    }
+        if (firstPageRecordDoc == null || operationDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        Map<String, Object> firstPageRecordDocStructureMap = firstPageRecordDoc.getStructureExtMap();
+        List<Map<String, String>> mapList = (List<Map<String, String>>) firstPageRecordDocStructureMap.get(Content.operative_information);
+        if (mapList != null && mapList.size() > 0) {
+            Map<String, String> op = mapList.get(0);
+            String oName = op.get(Content.operative_name);
+            for (OperationDoc operationDoc : operationDocs) {
+                if (operationDoc.getOperationRecordDoc() == null) {
+                    continue;
+                }
+                String operationName = operationDoc.getOperationRecordDoc().getStructureMap().get("手术名称");
+                if (operationName.contains(oName)){
+                    status.set("0");
+                    return;
                 }
             }
         }

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02972.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP02972
+ * @Description : 现住址要具体到门牌号
+ * @Author : Mark
+ * @Date: 2020-06-19 10:23
+ */
+@Component
+public class FIRP02972 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String address = firstpageStructureMap.get(Content.current_address);
+            if (!CatalogueUtil.isEmpty(address)) {
+                String suffix = (address.length()<=5)?address:(address.substring(address.length()-5));
+                String regex = "[\\d]+(-[\\d]+)*";
+                if (!suffix.matches(regex)) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

+ 14 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0148.java

@@ -26,22 +26,21 @@ public class LEA0148 extends QCCatalogue {
             status.set("0");
             return;
         }
-        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
-        if (deathRecordDoc == null || deathRecordDoc.getText() != null) {
+        if (inputInfo.getDeathRecordDoc() != null || inputInfo.getDeathCaseDiscussDoc() != null) {
             status.set("0");
-        } else {
-            String timeQm = leaveHospitalDoc.getStructureMap().get("签名时间");
-            String timeCy = leaveHospitalDoc.getStructureMap().get("出院时间");
-            if (StringUtil.isNotBlank(timeQm) && StringUtil.isNotBlank(timeCy)) {
-                Date timeQmDate = StringUtil.parseDateTime(timeQm);
-                Date timeCyDate = StringUtil.parseDateTime(timeCy);
-                if (timeQmDate == null && timeCyDate == null) {
-                    status.set("0");
-                    return;
-                }
-                if (!CatalogueUtil.compareTime(timeCyDate, timeQmDate, 24 * 60L)) {
-                    status.set("0");
-                }
+            return;
+        }
+        String timeQm = leaveHospitalDoc.getStructureMap().get("签名时间");
+        String timeCy = leaveHospitalDoc.getStructureMap().get("出院时间");
+        if (StringUtil.isNotBlank(timeQm) && StringUtil.isNotBlank(timeCy)) {
+            Date timeQmDate = StringUtil.parseDateTime(timeQm);
+            Date timeCyDate = StringUtil.parseDateTime(timeCy);
+            if (timeQmDate == null && timeCyDate == null) {
+                status.set("0");
+                return;
+            }
+            if (!CatalogueUtil.compareTime(timeCyDate, timeQmDate, 24 * 60L)) {
+                status.set("0");
             }
         }
     }

+ 9 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0149.java

@@ -41,9 +41,13 @@ public class LEA0149 extends QCCatalogue {
             String bhChief = CatalogueUtil.int2ChineseNum(chiefLabel.getText().replaceAll("[\\p{Punct}\\pP。-]", ""));
             String leaveChief = lhStructureMap.get("主诉");
             String bhThings = lhStructureMap.get("入院情况");
+            String reThings = lhStructureMap.get("入院原因");   //邵逸夫主诉在入院原因内
             if (StringUtil.isNotBlank(bhThings)) {
                 bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
             }
+            if (StringUtil.isNotBlank(reThings)) {
+                reThings = CatalogueUtil.int2ChineseNum(reThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+            }
 
             //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
             if (StringUtil.isNotBlank(leaveChief)) {
@@ -57,6 +61,11 @@ public class LEA0149 extends QCCatalogue {
                 status.set("0");
                 return;
             }
+            //邵逸夫主诉写在入院原因
+            if (StringUtil.isNotBlank(reThings) && reThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                status.set("0");
+                return;
+            }
             Pattern compile = Pattern.compile("(?<=2.).*(?=3.体格检查)");
             Matcher matcher = compile.matcher(bhThings);
             while (matcher.find()) {

+ 9 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0515.java

@@ -28,9 +28,16 @@ public class LEA0515 extends QCCatalogue {
         if (deathRecordDoc == null || deathRecordDoc.getText() == null) {
             Map<String, String> leaveHospitalStructureMap = leaveHospitalDoc.getStructureMap();
             if (leaveHospitalStructureMap != null) {
-                if (CatalogueUtil.isEmpty(leaveHospitalStructureMap.get("健康教育"))) {
-                    status.set("-1");
+                if (!CatalogueUtil.isEmpty(leaveHospitalStructureMap.get("健康教育"))) {
+                    status.set("0");
+                    return;
                 }
+                //邵逸夫其他指导即健康教育
+                if (!CatalogueUtil.isEmpty(leaveHospitalStructureMap.get("其他指导"))) {
+                    status.set("0");
+                    return;
+                }
+                status.set("-1");
             }
         }
     }

+ 4 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0328.java

@@ -62,8 +62,9 @@ public class PRE0328 extends QCCatalogue {
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
         if (firstCourseRecordDoc != null) {
             String treatPlan = firstCourseRecordDoc.getStructureMap().get("诊疗计划");
+            // 根据医学部要求,加入“急症”和“术”
             if (StringUtil.isNotBlank(treatPlan)) {
-                String regex = ".*急诊.*术.*";
+                String regex = ".*急诊.*术.*|.*急症.*术.*";
                 return treatPlan.matches(regex);
             }
         }
@@ -78,8 +79,9 @@ public class PRE0328 extends QCCatalogue {
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
         for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
             String content = threeLevelWardDoc.getStructureMap().get("病情记录");
+            // 根据医学部要求,加入“急症”和“术”
             if (StringUtil.isNotBlank(content)) {
-                String regex = ".*急诊.*术.*";
+                String regex = ".*急诊.*术.*|.*急症.*术.*";
                 if (content.matches(regex)) {
                     return true;
                 }

+ 7 - 7
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/LeaveHospitalAI.java

@@ -56,13 +56,13 @@ public class LeaveHospitalAI extends ModelAI {
                     putContent(crfContent, medicalTextType.get(1), dischargeDiag, Content.dischargeDiag);
                 }
             }
-        }
-        JSONObject midData = loadAI(inputInfo.isUseCrfCache(), inputInfo.getMedicalRecordInfoDoc().getStructureMap().get("behospitalCode"), crfContent, crfServiceClient);//crf返回数据
-        if (midData.containsKey(Content.discharge)) {
-            putDischargeCrfData(midData.getJSONObject(Content.discharge), inputInfo);//出院小结
-        }
-        if (midData.containsKey(Content.dischargeDiag)) {
-            putDischargeCrfData(midData.getJSONObject(Content.dischargeDiag), inputInfo);//出院诊断
+            JSONObject midData = loadAI(inputInfo.isUseCrfCache(), inputInfo.getMedicalRecordInfoDoc().getStructureMap().get("behospitalCode"), crfContent, crfServiceClient);//crf返回数据
+            if (midData.containsKey(Content.discharge)) {
+                putDischargeCrfData(midData.getJSONObject(Content.discharge), inputInfo);//出院小结
+            }
+            if (midData.containsKey(Content.dischargeDiag)) {
+                putDischargeCrfData(midData.getJSONObject(Content.dischargeDiag), inputInfo);//出院诊断
+            }
         }
     }
 

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessThreeLevelWard.java

@@ -203,7 +203,8 @@ public class EntityProcessThreeLevelWard extends EntityProcess {
                     start = Integer.parseInt(lemma.getPosition());
                     title = lemma.getProperty();//截取的这一段文本的标题
                 } else {
-                    subContentIndex = start + lemma.getText().length() + 1 + "," + Integer.parseInt(lemma.getPosition());
+                    /*subContentIndex = start + lemma.getText().length() + 1 + "," + Integer.parseInt(lemma.getPosition());*/
+                    subContentIndex = start + "," + Integer.parseInt(lemma.getPosition());
                     putSubContent(titleText, title, subContentIndex);
                     start = Integer.parseInt(lemma.getPosition());
                     title = lemma.getProperty();//截取的这一段文本的标题

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/util/CacheFileManager.java

@@ -27,7 +27,7 @@ public class CacheFileManager {
     private String password;
     private String url;
 
-    private static String hospitalId = "3";
+    private static String hospitalId = "2";
 
     private String path = "";
 

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

@@ -15,7 +15,7 @@ spring:
     active: db
 
 qc:
-  hospital_id: 1,3
+  hospital_id: 1,2,3
 
 CRF:
   url: http://192.168.2.234:3456/api/mr_info_ex/entity_predict

+ 84 - 0
kernel/src/main/resources/cache/2/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,84 @@
+sjwPlFuzwYtdGy/Xru8l0w==
+sjwPlFuzwYuOwjk+wlafMb496h/s94Lp
+GaEOqMDeIR/A3JPjaU/OYQ==
+KUZ84E/l6BtIxYdpVp2d2udw4JKVz6fxOAPHyqzXUMY=
+ClvKDL868eyBa0I3oBBXTiLG5UIUjigm
+cpVuhYfN0VLL15lmAanTHLudBba0KZdGSmARnfpRl/s=
+tgLfZiBNXVfe46uqWooJfQ==
++elokrz+5ZZ4nftSAgjXeP9VC/9mRBPm
+u18AKL/dfo8=
+FXYCcRyAS3o=
+1y8RNUzpzDDA3JPjaU/OYQ==
+GDAzhKkwugqOwjk+wlafMb496h/s94Lp
+vVsbjXwCHtKFIWuMj59JFg==
+S00FGSMpzFYRJHHOrCiJIw==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+KkqtLy22gBtRq6Y4vkNXyQ==
+FpNKk6eB+A78k09Y7waUfQ==
+55LO8f+DGuqsZzaaPHDG7A==
+anCWsr9KEAcfVJH7s8MZNQ==
+Ms4itbwo4woHjnX6dZF4Ew==
+eE2lKBuqkGwbZW204O8pbL496h/s94Lp
+KPTiLOQlvfcHjnX6dZF4Ew==
+EHYxrOGlbsJINCuQrfA+Qw==
+IoIoNIGjGAkfVJH7s8MZNQ==
+TkKCqeWSukdcNzQgT7Qg/y/95Ux1UGf/
+5sS2G/r6ssUfVJH7s8MZNQ==
+Fz6WuGDyOlM=
+6BJE0DCYV4PN7oAmfhVFQqHIcEkBIHl+SmARnfpRl/s=
+ClvKDL868ewfVJH7s8MZNQ==
+IoIoNIGjGAmt+3FIqYSLwA==
+qjVzhjIuUT4fVJH7s8MZNQ==
+fAvCqq32iRGYkjXG21GhdA==
+Qz54IR1t0pxhD8mu55a07QB9XVjkemQO
+VDAaAfFpalOc8iRXg5Txmg==
+v2wP8zYN7yUfVJH7s8MZNQ==
+2O+0+BuTK7hnAFNeF32DwQ==
+LRQ8TiPskP8=
+MHWWVpSYUhZp84i3DCFu/g==
+4a+BNcRWzuwuxVbFLjJEww==
+yWJqJiL6qWQskpnR2QjFRA==
+LkBZ8uh2sivD7O64F4fyYD26Q3FauFTq
+vU9OSQNfzsdHGRV53JQHXTZxIOEr6XT/
+Z0A2kuK86msFZwSJa38bOw==
+qglFhT75KVY=
+J47wTSKVIotrynAbi7Nl7g==
+PSCtbA3GBCLqcUHlnbz5ig==
+pGzYL5VYctXxzUrAtKDMFg==
+J47wTSKVIotWP8N6Zu8teQ==
+hnOhzeqPs7c=
+FpNKk6eB+A60ivUVDCQonmb0NA6xAPvZ
+6eB67p+u3VA=
+38rBhrBd2ZA=
+WlxWJO1bvWM=
+/UTzDiOxLWpNfh/SNay22g==
+PLBt3Oha1AAOSE8k2YZYMw==
+cA6kPjEpsoKKXDwNc4sbZv9VC/9mRBPm
+ubvY7WEHsf0HjnX6dZF4Ew==
+NI9su0Z8kvY=
+z5dpaPXQysM+03JbZpPE8K74oEbqwDfN
+e7OvqkV6Qx5DhU/YuJZA4A==
+vnSKQ0o1HZO5fhcvExqbXw==
+5j32mrEC41Q=
+teXiWF5i95089VmH6nOntT26Q3FauFTq
+C5DNXPfJ3MsXUKrj9yaJVQ==
+aBDrcQGdFjgXTO+Ia0kzAA==
+EyuDTtt1Nh1c5OTNuAf37Q==
+0NhZqdATkZ4=
+1IKx7GtShHg=
+h/OwYNYyciw=
+kGg6y+QB2f8=
+et0S9LyTiS4MhEBuylTk2g==
+goFZ0v8zcPc=
+cA6kPjEpsoJc5OTNuAf37Q==
+BZNVMNz30Z00iPLsFnfW9Q==
+FUNtEl6WjOUfVJH7s8MZNQ==
+1boew8BvzsDzIpTnzy5Qnw==
+/CIzubCbNzzkzFf+CBlT64JiFWxfW6DV
+teXiWF5i953EeSAoaVSW+wBBqlZ1ciHqSmARnfpRl/s=
+CTNjqF5g7EIfVJH7s8MZNQ==
+OOQuqjL/h5M16D9aZjbrRw==
+ZfWBQ/To1p1p84i3DCFu/g==
+Q449MTqnm/c=
+xmHl5DY7FyM=
+hV3gMCbT8x+fXEA0j/uq7Q==

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


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


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


+ 1 - 1
public/src/main/java/com/lantone/qc/pub/model/label/PresentLabel.java

@@ -29,7 +29,7 @@ public class PresentLabel extends GeneralLabel {
     //一般情况
     private List<General> gens = new ArrayList<>();
     //一般情况描述
-    private List<GeneralDesc> generals;
+    private List<GeneralDesc> generals = new ArrayList<>();
     //诱因
     private List<Cause> causes;
     //疾病信息

+ 9 - 1
trans/src/main/java/com/lantone/qc/trans/changx/ChangxOperationDocTrans.java

@@ -135,10 +135,13 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
             "手术开始时间=",
             "手术结束时间=",
             "麻醉方式=",
+            "麻醉医生=麻醉医师",
             "手术方式=",
+            "手术人员=手术相关人员",
             "手术方式++++手术名称=手术方式",
             "术中诊断++++初步诊断=术中诊断",
             "术中诊断++++术后诊断=术中诊断",
+            "并发症++++手术并发症=术中并发症",
             "手术经过=手术简要经过",
             "患者术后情况=",
             "术后处理措施=",
@@ -147,7 +150,7 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
             "患者签名=",
             "签名时间=代理人签名时间",
             "签字++++患者授权的其他代理人签字=代理人签名",
-            "签名++++="
+            "签名++++=医生签名"
     );
 
 
@@ -322,6 +325,7 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
 
     private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
             "讨论时间++++记录日期=记录时间",
+            "签字时间=主刀医师签字时间",
             "参加人员姓名=参加人员",
             "病情摘要++++简要病情=简要病情",
             "术前诊断++++初步诊断=术前诊断",
@@ -333,6 +337,10 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
             "手术风险及预防措施++++文本框=可能意外和防范措施",
             "术中注意事项=术前术后注意事项",
             "术后注意事项=",
+            "目前使用的药物=目前服用药物",
+            "诊疗计划=治疗计划和措施",
+            "注意事项=术前术后注意事项",
+            "手术名称及方式=拟施手术方式名称及可能的变更与禁忌症",
             "拟施手术方式、名称及可能的变更与禁忌征=拟施手术方式名称及可能的变更与禁忌症"
     );
 

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfAnesthesiaRelatedDocTrans.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 麻醉相关文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+public class ShaoyfAnesthesiaRelatedDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<AnesthesiaRelatedDoc> extract(MedrecVo medrecVo) {
+        List<AnesthesiaRelatedDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getAnesthesiaRelatedDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private AnesthesiaRelatedDoc getAnesthesiaRelatedDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = ShaoyfXmlUtil.getXmlToMap(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        AnesthesiaRelatedDoc anesthesiaRelatedDoc = new AnesthesiaRelatedDoc();
+        anesthesiaRelatedDoc.setStructureMap(structureMap);
+
+        return anesthesiaRelatedDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 198 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfBeHospitalizedDocTrans.java

@@ -0,0 +1,198 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.FamilyLabel;
+import com.lantone.qc.pub.model.label.MaritalLabel;
+import com.lantone.qc.pub.model.label.MenstrualLabel;
+import com.lantone.qc.pub.model.label.PacsLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PersonalLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.model.label.VitalLabel;
+import com.lantone.qc.pub.model.label.VitalLabelSpecial;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 入院记录文档生成
+ * @author: rengb
+ * @time: 2020/3/5 15:47
+ */
+public class ShaoyfBeHospitalizedDocTrans extends ModelDocTrans {
+
+    /**
+     * @param medrecVo
+     * @return
+     */
+    @Override
+    public BeHospitalizedDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+        OrdinaryAssistant.removeBlank(structureMap);
+        //如果有入院时间,优先使用
+        if (StringUtils.isEmpty(structureMap.get("入院时间")) && StringUtils.isNotEmpty(structureMap.get("入病房时间"))) {
+            structureMap.put("入院时间", structureMap.get("入病房时间"));
+        }
+
+        BeHospitalizedDoc beHospitalizedDoc = beHospitalizedDocGen(structureMap); // 不走共用
+        beHospitalizedDoc.setPageData((Map) structureMap);
+        return beHospitalizedDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "性别=性别",
+            "年龄=年龄",
+            "民族=民族",
+            "职业=职业",
+            "出生地址=出生地",
+            "出生、生长史=出生生长史",
+            "婚姻状况=婚姻",
+            "地址=联系地址",
+            "现住址=联系地址",
+            "工作场所=工作单位",
+            "信息来源=病史陈述者",
+            "病史可靠程度=病史可靠性",
+            "生日=出生日期",
+            "出生时间=出生日期",
+            "病人出生日期=出生日期",
+            "新生儿出生日期=出生日期",
+            "出生地址=户口地址",
+            "本人电话=电话",
+            "联系电话=联系人电话",
+            "入院日期=入院日期",
+            "入病房时间=入院日期",
+            "入院日期时间=入院日期",
+            "病历日期=记录日期",
+            "主诉=主诉",
+            "现病史=现病史",
+            "一般健康状况=既往健康状况",
+            "婚姻家庭关系和睦=夫妻关系",
+            "体格检查=体格检查",
+            "专科检查=专科体格检查",
+            "初步诊断=初步诊断",
+            "修正诊断=修正诊断",
+            "当前诊断=死亡诊断",
+            "喂养间隔=间隔时间",
+            "出院状态=出院情况",
+            "医生=医师签名",
+            "补充诊断=补充诊断",
+            "户口地址=联系地址",
+            "内科疾病史(其它)=内科疾病史其它",
+            "家属提供的信息可信吗=病史可靠性",
+            "入院诊断(中医疾病)=中医诊断",
+            "长期用药情况(包括可能成瘾的药物)=长期用药",
+            "体温(口)=体温",
+            "常规产前检查=产前检查",
+            "复诊科室=科别"
+    );
+
+
+    /**
+     * 入院记录
+     *
+     * @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);
+        //        structureMap.remove("主诉");
+
+        // 走模型
+        PresentLabel presentLabel = new PresentLabel();
+        presentLabel.setText(structureMap.get("现病史"));
+        beHospitalizedDoc.setPresentLabel(presentLabel);
+        //        structureMap.remove("现病史");
+
+        PastLabel pastLabel = new PastLabel();
+        pastLabel.setCrfLabel(false);
+        pastLabel.setText(structureMap.get("既往史"));
+        beHospitalizedDoc.setPastLabel(pastLabel);
+        //        structureMap.remove("既往史");
+
+        PersonalLabel personalLabel = new PersonalLabel();
+        personalLabel.setCrfLabel(false);
+        personalLabel.setText(structureMap.get("个人史"));
+        beHospitalizedDoc.setPersonalLabel(personalLabel);
+        //        structureMap.remove("个人史");
+
+        MaritalLabel maritalLabel = new MaritalLabel();
+        maritalLabel.setCrfLabel(false);
+        maritalLabel.setText("婚育史: " + structureMap.get("婚育史"));
+        beHospitalizedDoc.setMaritalLabel(maritalLabel);
+        //        structureMap.remove("婚育史");
+
+        MenstrualLabel menstrualLabel = new MenstrualLabel();
+        menstrualLabel.setCrfLabel(false);
+        menstrualLabel.setText("月经史:" + structureMap.get("月经史"));
+        beHospitalizedDoc.setMenstrualLabel(menstrualLabel);
+        //        structureMap.remove("月经史");
+
+        FamilyLabel familyLabel = new FamilyLabel();
+        familyLabel.setCrfLabel(false);
+        familyLabel.setText(structureMap.get("家族史"));
+        beHospitalizedDoc.setFamilyLabel(familyLabel);
+        //        structureMap.remove("家族史");
+
+        VitalLabel vitalLabel = new VitalLabel();
+        vitalLabel.setCrfLabel(false);
+        vitalLabel.setText(structureMap.get("体格检查"));
+        beHospitalizedDoc.setVitalLabel(vitalLabel);
+        //        structureMap.remove("体格检查");
+
+        VitalLabelSpecial vitalLabelSpecial = new VitalLabelSpecial();
+        vitalLabelSpecial.setCrfLabel(false);
+        vitalLabelSpecial.setText(structureMap.get("专科体格检查"));
+        beHospitalizedDoc.setVitalLabelSpecial(vitalLabelSpecial);
+        //        structureMap.remove("专科体格检查");
+
+        // 走模型
+        PacsLabel pacsLabel = new PacsLabel();
+        pacsLabel.setCrfLabel(false);
+        pacsLabel.setText(structureMap.get("辅助检查"));
+        beHospitalizedDoc.setPacsLabel(pacsLabel);
+        //        structureMap.remove("辅助检查");
+
+        // 走模型
+        DiagLabel initialDiagLabel = new DiagLabel();
+        initialDiagLabel.setText(structureMap.get("初步诊断"));
+        beHospitalizedDoc.setInitialDiagLabel(initialDiagLabel);
+        //        structureMap.remove("初步诊断");
+
+        // 走模型
+        DiagLabel revisedDiagLabel = new DiagLabel();
+        revisedDiagLabel.setText(structureMap.get("修正诊断"));
+        beHospitalizedDoc.setRevisedDiagLabel(revisedDiagLabel);
+        //        structureMap.remove("修正诊断");
+
+        // 走模型
+        DiagLabel suppleDiagLabel = new DiagLabel();
+        suppleDiagLabel.setText(structureMap.get("补充诊断"));
+        beHospitalizedDoc.setSuppleDiagLabel(suppleDiagLabel);
+        //        structureMap.remove("补充诊断");
+
+        beHospitalizedDoc.setStructureMap(structureMap);
+
+        return beHospitalizedDoc;
+    }
+
+}

+ 47 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfClinicBloodEffectDocTrans.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : TaiZhouClinicBloodEffectDocTrans
+ * @Description : 输血后效果评价
+ * @Author : 楼辉荣
+ * @Date: 2020-04-19 17:53
+ */
+public class ShaoyfClinicBloodEffectDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ClinicBloodEffectDoc> extract(MedrecVo medrecVo) {
+        List<ClinicBloodEffectDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicBloodEffectDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ClinicBloodEffectDoc getClinicBloodEffectDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        ClinicBloodEffectDoc clinicBloodEffectDoc = new ClinicBloodEffectDoc();
+        clinicBloodEffectDoc.setStructureMap(structureMap);
+        clinicBloodEffectDoc.setPageData((Map) structureMap);
+
+        return clinicBloodEffectDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfClinicalBloodDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 输血/血制品病程记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:21
+ */
+public class ShaoyfClinicalBloodDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ClinicalBloodDoc> extract(MedrecVo medrecVo) {
+        List<ClinicalBloodDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getClinicalBloodDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        ClinicalBloodDoc clinicalBloodDoc = new ClinicalBloodDoc();
+        clinicalBloodDoc.setStructureMap(structureMap);
+        clinicalBloodDoc.setPageData((Map) structureMap);
+        return clinicalBloodDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "开始时间=输注开始",
+            "医生=记录医师",
+            "结束时间=输注结束",
+            "输血原因=输血目的",
+            "事件日期=病历日期",
+            "内容=输注后效果评价"
+    );
+
+}

+ 207 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfConsultationDocTrans.java

@@ -0,0 +1,207 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 会诊文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+public class ShaoyfConsultationDocTrans 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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationRecord_keyContrasts);
+
+        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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationResults_keyContrasts);
+
+        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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationApplication_keyContrasts);
+
+        if (structureMap.get("会诊医生") != null) {
+            String ra = structureMap.get("会诊医生").replaceAll("&amp;nbsp;", "");
+            structureMap.put("会诊医生", ra);
+        }
+        ConsultationApplicationDoc consultationApplicationDoc = new ConsultationApplicationDoc();
+        consultationApplicationDoc.setStructureMap(structureMap);
+        consultationApplicationDoc.setPageData((Map) structureMap);
+
+        return consultationApplicationDoc;
+    }
+
+    // 会诊申请单映射字段
+    private List<String> consultationApplication_keyContrasts = Lists.newArrayList(
+            "事件日期=申请日期",
+            "会诊类别=会诊分类",
+            "会诊理由和目的=申请理由目的",
+            "病历日期=会诊日期及时间",
+            "本人姓名=姓名",
+            "病历号=病案号",
+            "临床科室=申请科室"
+    );
+
+}

+ 48 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfCrisisValueReportDocTrans.java

@@ -0,0 +1,48 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 危急值记录文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class ShaoyfCrisisValueReportDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CrisisValueReportDoc> extract(MedrecVo medrecVo) {
+        List<CrisisValueReportDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCrisisValueReportDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CrisisValueReportDoc getCrisisValueReportDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        CrisisValueReportDoc crisisValueReportDoc = new CrisisValueReportDoc();
+        crisisValueReportDoc.setStructureMap(structureMap);
+        crisisValueReportDoc.setPageData((Map) structureMap);
+
+        return crisisValueReportDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "危急=危急值"
+    );
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfCriticallyIllNoticeDocTrans.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病危通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class ShaoyfCriticallyIllNoticeDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<CriticallyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<CriticallyIllNoticeDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCriticallyIllNoticeDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        CriticallyIllNoticeDoc criticallyIllNoticeDoc = new CriticallyIllNoticeDoc();
+        criticallyIllNoticeDoc.setStructureMap(structureMap);
+        criticallyIllNoticeDoc.setPageData((Map) structureMap);
+
+        return criticallyIllNoticeDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "查房记录=简要病情",
+            "本人姓名=姓名"
+    );
+
+}

+ 46 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDeathCaseDiscussDocTrans.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.DeathCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+public class ShaoyfDeathCaseDiscussDocTrans extends ModelDocTrans {
+
+    @Override
+    public DeathCaseDiscussDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        DeathCaseDiscussDoc deathCaseDiscussDoc = new DeathCaseDiscussDoc();
+        deathCaseDiscussDoc.setStructureMap(structureMap);
+        deathCaseDiscussDoc.setPageData((Map) structureMap);
+
+        return deathCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "主持人=讨论主持人",
+            "死亡日期=死亡时间",
+            "讨论意见=讨论内容",
+            "事件日期=讨论日期",
+            "现病史- 发病情况=入院情况",
+            "医生=记录医师",
+            "本人姓名=姓名"
+    );
+
+}

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDeathRecordDocTrans.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 死亡记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+public class ShaoyfDeathRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public DeathRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        DeathRecordDoc deathRecordDoc = new DeathRecordDoc();
+        deathRecordDoc.setStructureMap(structureMap);
+        deathRecordDoc.setPageData((Map) structureMap);
+
+        return deathRecordDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "当前诊断=死亡诊断",
+            "死亡日期=死亡时间",
+            "初步诊断=入院诊断",
+            "诊治经过=诊疗经过",
+            "本人姓名=姓名",
+            "现病史- 发病情况=发病情况"
+    );
+
+}

+ 53 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDifficultCaseDiscussDocTrans.java

@@ -0,0 +1,53 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+public class ShaoyfDifficultCaseDiscussDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DifficultCaseDiscussDoc> extract(MedrecVo medrecVo) {
+        List<DifficultCaseDiscussDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDifficultCaseDiscussDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        DifficultCaseDiscussDoc difficultCaseDiscussDoc = new DifficultCaseDiscussDoc();
+        difficultCaseDiscussDoc.setStructureMap(structureMap);
+        difficultCaseDiscussDoc.setPageData((Map) structureMap);
+
+        return difficultCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "医生=记录者",
+            "讨论小结=结论",
+            "结 论=结论",
+            "讨论意见=讨论内容",
+            "事件日期=讨论时间",
+            "本人姓名=姓名"
+    );
+
+}

+ 327 - 3
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDocTrans.java

@@ -1,19 +1,343 @@
 package com.lantone.qc.trans.shaoyf;
 
+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 com.lantone.qc.trans.shaoyf.ShaoyfBeHospitalizedDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfClinicBloodEffectDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfClinicalBloodDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfConsultationDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfCrisisValueReportDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfCriticallyIllNoticeDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfDeathCaseDiscussDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfDeathRecordDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfDifficultCaseDiscussDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfDoctorAdviceDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfDutyShiftSystemDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfFirstCourseRecordDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfFirstPageRecordDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfLeaveHospitalDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfMedicalRecordInfoDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfNursingSystemDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfOperationDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfPathologyShipDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfRescueDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfSeriouslyIllNoticeDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfStagesSummaryDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfThreeLevelWardDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfTransferRecordDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfInformedConsentDocTrans;
+import com.lantone.qc.trans.shaoyf.ShaoyfNoticeOfConversationDocTrans;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
- * @ClassName : TaiZhouDocTrans
+ * @ClassName : ShaoyfDocTrans
  * @Description :
  * @Author : 楼辉荣
  * @Date: 2020-03-03 19:47
  */
 public class ShaoyfDocTrans extends DocTrans {
-    public InputInfo extract(QueryVo queryVo) {
-        return null;
+
+    @Override
+    protected InputInfo extract(QueryVo queryVo) {
+        InputInfo inputInfo = new InputInfo();
+        for (MedrecVo i : queryVo.getMedrec()) {
+            switch (i.getTitle()) {
+                case "会诊":
+                    ShaoyfConsultationDocTrans consultationDocTrans = new ShaoyfConsultationDocTrans();
+                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+                    break;
+                case "手术":
+                    ShaoyfOperationDocTrans operationDocTrans = new ShaoyfOperationDocTrans();
+                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
+                    break;
+                case "转科":
+                    ShaoyfTransferRecordDocTrans transferRecordDocTrans = new ShaoyfTransferRecordDocTrans();
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+                    break;
+                case "入院记录":
+                    ShaoyfBeHospitalizedDocTrans beHospitalizedDocTrans = new ShaoyfBeHospitalizedDocTrans();
+                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+                    break;
+                case "输血/血制品病程记录":
+                    ShaoyfClinicalBloodDocTrans clinicalBloodDocTrans = new ShaoyfClinicalBloodDocTrans();
+                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+                    break;
+                case "危急值记录":
+                    ShaoyfCrisisValueReportDocTrans crisisValueReportDocTrans = new ShaoyfCrisisValueReportDocTrans();
+                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+                    break;
+                case "病危通知书":
+                    ShaoyfCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new ShaoyfCriticallyIllNoticeDocTrans();
+                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+                    break;
+                case "死亡病例讨论记录":
+                    ShaoyfDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new ShaoyfDeathCaseDiscussDocTrans();
+                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+                    break;
+                case "死亡记录":
+                    ShaoyfDeathRecordDocTrans deathRecordDocTrans = new ShaoyfDeathRecordDocTrans();
+                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+                    break;
+                case "疑难病例讨论记录":
+                    ShaoyfDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new ShaoyfDifficultCaseDiscussDocTrans();
+                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+                    break;
+                case "医嘱信息":
+                    ShaoyfDoctorAdviceDocTrans doctorAdviceDocTrans = new ShaoyfDoctorAdviceDocTrans();
+                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+                    break;
+                case "值班交接制度":
+                    ShaoyfDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new ShaoyfDutyShiftSystemDocTrans();
+                    /*inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));*/
+                    break;
+                case "首次病程录":
+                    ShaoyfFirstCourseRecordDocTrans firstCourseRecordDocTrans = new ShaoyfFirstCourseRecordDocTrans();
+                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+                    break;
+                case "病案首页":
+                    ShaoyfFirstPageRecordDocTrans firstPageRecordDocTrans = new ShaoyfFirstPageRecordDocTrans();
+                    if (inputInfo.getFirstPageRecordDoc() == null) {
+                        inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+                    }
+                    break;
+                case "出院小结":
+                    ShaoyfLeaveHospitalDocTrans leaveHospitalDocTrans = new ShaoyfLeaveHospitalDocTrans();
+                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+                    break;
+                case "分级护理制度":
+                    ShaoyfNursingSystemDocTrans nursingSystemDocTrans = new ShaoyfNursingSystemDocTrans();
+                    /*inputInfo.setNursingSystemDoc(nursingSystemDocTrans.extract(i));*/
+                    break;
+                case "抢救记录":
+                    ShaoyfRescueDocTrans rescueDocTrans = new ShaoyfRescueDocTrans();
+                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+                    break;
+                case "病重通知书":
+                    ShaoyfSeriouslyIllNoticeDocTrans seriouslyIllNoticeDocTrans = new ShaoyfSeriouslyIllNoticeDocTrans();
+                    inputInfo.setSeriouslyIllNoticeDocs(seriouslyIllNoticeDocTrans.extract(i));
+                    break;
+                case "阶段小结":
+                    ShaoyfStagesSummaryDocTrans stagesSummaryDocTrans = new ShaoyfStagesSummaryDocTrans();
+                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+                    break;
+                case "查房记录":
+                    ShaoyfThreeLevelWardDocTrans threeLevelWardDocTrans = new ShaoyfThreeLevelWardDocTrans();
+                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+                    break;
+                case "输血后效果评价":
+                    ShaoyfClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new ShaoyfClinicBloodEffectDocTrans();
+                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
+                    break;
+                case "病理检验送检单":
+                    ShaoyfPathologyShipDocTrans pathologyShipDocTrans = new ShaoyfPathologyShipDocTrans();
+                    inputInfo.setPathologyShipDocs(pathologyShipDocTrans.extract(i));
+                    break;
+                case "知情同意书":
+                    ShaoyfInformedConsentDocTrans informedConsentDocTrans = new ShaoyfInformedConsentDocTrans();
+                    inputInfo.setInformedConsentDoc(informedConsentDocTrans.extract(i));
+                    break;
+                case "谈话告知书":
+                    ShaoyfNoticeOfConversationDocTrans shaoyfNoticeOfConversationDocTrans = new ShaoyfNoticeOfConversationDocTrans();
+                    inputInfo.setNoticeOfConversationDoc(shaoyfNoticeOfConversationDocTrans.extract(i));
+                    break;
+                case "住院病历信息":
+                    ShaoyfMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new ShaoyfMedicalRecordInfoDocTrans();
+                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+                default:
+                    break;
+            }
+        }
+        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.getDeathRecordDoc() == null && inputInfo.getLeaveHospitalDoc() != null) {
+            inputInfo.getPageData().put("出院小结", Lists.newArrayList(inputInfo.getLeaveHospitalDoc().getPageData()));
+        }
+        //        if (inputInfo.getNursingSystemDoc() != null) {
+        //            inputInfo.getPageData().put("分级护理制度", Lists.newArrayList(inputInfo.getNursingSystemDoc().getPageData()));
+        //        }
+        if (inputInfo.getFirstPageRecordDoc() != null) {
+            inputInfo.getPageData().put("病案首页", Lists.newArrayList(inputInfo.getFirstPageRecordDoc().getPageData()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
+            inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
+            inputInfo.getPageData().put("输血后效果评价", inputInfo.getClinicBloodEffectDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
+            inputInfo.getPageData().put(
+                    "危急值记录",
+                    inputInfo.getCrisisValueReportDocs()
+                            .stream()
+                            .map(i -> i.getPageData())
+                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "病历日期", "yyyy-MM-dd HH:mm"))
+                            .collect(Collectors.toList())
+            );
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getCriticallyIllNoticeDocs())) {
+            inputInfo.getPageData().put("病危通知书", inputInfo.getCriticallyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getDifficultCaseDiscussDocs())) {
+            inputInfo.getPageData().put("疑难病例讨论记录", inputInfo.getDifficultCaseDiscussDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getDoctorAdviceDocs())) {
+        //            inputInfo.getPageData().put("医嘱信息", inputInfo.getDoctorAdviceDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getDutyShiftSystemDocs())) {
+        //            inputInfo.getPageData().put("值班交接制度", inputInfo.getDutyShiftSystemDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        if (ListUtil.isNotEmpty(inputInfo.getRescueDocs())) {
+            inputInfo.getPageData().put(
+                    "抢救记录",
+                    inputInfo.getRescueDocs()
+                            .stream()
+                            .map(i -> i.getPageData())
+                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "事件日期", "yyyy/MM/dd HH:mm"))
+                            .collect(Collectors.toList())
+            );
+        }
+        //        if (ListUtil.isNotEmpty(inputInfo.getSeriouslyIllNoticeDocs())) {
+        //            inputInfo.getPageData().put("病重通知书", inputInfo.getSeriouslyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        //        }
+        if (ListUtil.isNotEmpty(inputInfo.getStagesSummaryDocs())) {
+            inputInfo.getPageData().put("阶段小结", inputInfo.getStagesSummaryDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getThreeLevelWardDocs())) {
+            List<Map<String, Object>> pageDatas = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList());
+            inputInfo.getPageData().put("查房记录", pageDatas);
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getPathologyShipDocs())) {
+            inputInfo.getPageData().put("病理检验送检单", inputInfo.getPathologyShipDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
+        }
+
+        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
+            List<Map<String, Object>> crePageDataList = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
+                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(crePageDataList)) {
+                inputInfo.getPageData().put("会诊记录", crePageDataList);
+            }
+
+            List<Map<String, Object>> caPageDataList = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
+                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "申请日期", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(caPageDataList)) {
+                inputInfo.getPageData().put("会诊申请单", caPageDataList);
+            }
+
+            List<Map<String, Object>> crsPageDataList = inputInfo.getConsultationDocs()
+                    .stream()
+                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
+                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
+                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "申请日期", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(crsPageDataList)) {
+                inputInfo.getPageData().put("会诊结果单", crsPageDataList);
+            }
+        }
+        if (ListUtil.isNotEmpty(inputInfo.getOperationDocs())) {
+            List<Map<String, Object>> odPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationDiscussionDoc().getPageData())
+                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "手术日期", "yyyy/MM/dd"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(odPageDataList)) {
+                inputInfo.getPageData().put("术后首次病程及谈话记录", odPageDataList);
+            }
+
+            List<Map<String, Object>> orPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationRecordDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationRecordDoc().getPageData())
+                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "开始时间", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(orPageDataList)) {
+                inputInfo.getPageData().put("手术记录", orPageDataList);
+            }
+
+            List<Map<String, Object>> pdPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getPreoperativeDiscussionDoc() != null)
+                    .map(operationDoc -> operationDoc.getPreoperativeDiscussionDoc().getPageData())
+                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "讨论时间", "yyyy年MM月dd日 HH时mm分"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(pdPageDataList)) {
+                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
+            }
+
+            /*List<Map<String, Object>> oicPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationInformedConsentDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationInformedConsentDoc().getPageData())
+                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "谈话日期", "yyyy/MM/dd HH:mm"))
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(oicPageDataList)) {
+                inputInfo.getPageData().put("手术知情同意书", oicPageDataList);
+            }*/
+
+            List<Map<String, Object>> oscPageDataList = inputInfo.getOperationDocs()
+                    .stream()
+                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationSafetyChecklistDoc() != null)
+                    .map(operationDoc -> operationDoc.getOperationSafetyChecklistDoc().getPageData())
+                    .collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(oscPageDataList)) {
+                inputInfo.getPageData().put("手术安全核查表", oscPageDataList);
+            }
+        }
+        if (inputInfo.getTransferRecordDocs() != null) {
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferIntoDocs())) {
+                inputInfo.getPageData().put(
+                        "转入记录",
+                        inputInfo.getTransferRecordDocs().getTransferIntoDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferOutDocs())) {
+                inputInfo.getPageData().put(
+                        "转出记录",
+                        inputInfo.getTransferRecordDocs().getTransferOutDocs()
+                                .stream()
+                                .filter(i -> i != null)
+                                .map(i -> i.getPageData())
+                                .collect(Collectors.toList())
+                );
+            }
+        }
     }
+
 }

+ 36 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDoctorAdviceDocTrans.java

@@ -0,0 +1,36 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 医嘱信息文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class ShaoyfDoctorAdviceDocTrans 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;
+    }
+
+}

+ 46 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfDutyShiftSystemDocTrans.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.pub.model.doc.DutyShiftSystemDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 值班交接制度文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:24
+ */
+public class ShaoyfDutyShiftSystemDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<DutyShiftSystemDoc> extract(MedrecVo medrecVo) {
+        List<DutyShiftSystemDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDutyShiftSystemDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DutyShiftSystemDoc getDutyShiftSystemDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(TzXmlUtil.getXmlToMapForTZ(content), keyContrasts);
+
+        DutyShiftSystemDoc dutyShiftSystemDoc = new DutyShiftSystemDoc();
+        dutyShiftSystemDoc.setStructureMap(structureMap);
+        dutyShiftSystemDoc.setPageData((Map) sourceMap);
+        return dutyShiftSystemDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 93 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfFirstCourseRecordDocTrans.java

@@ -0,0 +1,93 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.MapUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static com.lantone.qc.trans.comsis.ModelDocGenerate.structureMapJoin;
+
+/**
+ * @Description: 首次病程录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+public class ShaoyfFirstCourseRecordDocTrans extends ModelDocTrans {
+
+    @Override
+    public FirstCourseRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        if (sourceMap.get("主诊医生") != null) {
+            sourceMap.put("主诊医生", sourceMap.get("主诊医生").replace("&amp;amp;nbsp;", ""));
+        }
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+        // 病例特点=主诉+现病史-发病情况+专科检查+实验室检查+影像学检查+辅助检查结果+呼吸+脉搏+体温+血压
+        //        structureMap.put("病例特点", MapUtil.getSelectString(structureMap, Arrays.asList(
+        //                "主诉",
+        //                "现病史-发病情况",
+        //                "专科检查",
+        //                "实验室检查",
+        //                "影像学检查",
+        //                "辅助检查结果",
+        //                "呼吸",
+        //                "脉搏",
+        //                "体温",
+        //                "血压"
+        //                ))
+        //        );
+        // 诊断依据=性别+年龄+主诉+现病史-发病情况+专科检查+实验室检查+影像学检查+辅助检查结果+呼吸+脉搏+体温+血压
+        //        structureMap.put("诊断依据", MapUtil.getSelectString(structureMap, Arrays.asList(
+        //                "性别",
+        //                "年龄",
+        //                "主诉",
+        //                "现病史-发病情况",
+        //                "专科检查",
+        //                "实验室检查",
+        //                "影像学检查",
+        //                "辅助检查结果",
+        //                "呼吸",
+        //                "脉搏",
+        //                "体温",
+        //                "血压"
+        //                ))
+        //        );
+        // 诊疗计划=检查计划+治疗计划和措施
+        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(
+                        "本人姓名=姓名",
+            "现病史- 发病情况=发病经过",
+            "入院原因=主诉",
+            "医生=医师签名",
+            "治疗计划和措施=治疗计划",
+            "体温(耳)=体温耳",
+            "体温(口)=体温口"
+    );
+
+}

+ 258 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfFirstPageRecordDocTrans.java

@@ -0,0 +1,258 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.util.ModuleMappingUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病案首页文档生成
+ * @author: 胡敬
+ * @time: 2020/3/16 17:47
+ */
+public class ShaoyfFirstPageRecordDocTrans extends ModelDocTrans {
+
+    @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));
+        //        structureExtMap.put(Content.pathologyDiagnose, FastJsonUtils.getJsonToBean(content.get(Content.pathologyDiagnose), Object.class));
+        firstPageRecordDoc.setStructureExtMap(structureExtMap);
+
+        Map<String, String> setMap = Maps.newHashMap();
+        setMap.put("mode_id=6", "");
+        String modeId = ModuleMappingUtil.getXmlDataTypeModuleId(setMap);
+        if (StringUtil.isNotBlank(modeId)) {
+            medrecVo.getContent().put("mode_id", modeId);
+        }
+        firstPageRecordDoc.setPageData(medrecVo.getContent());
+
+        return firstPageRecordDoc;
+        //        String content = ((List<String>) medrecVo.getContent().get("content")).get(0);
+        //
+        //
+        //        FirstPageRecordDoc firstPageRecordDoc = new FirstPageRecordDoc();
+        //        firstPageRecordDoc.setStructureMap(structureMap);
+        //
+        //        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.不确定=放射与病理"
+    );
+
+}

+ 18 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfInformedConsentDocTrans.java

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

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfInvasiveOperationDocTrans.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.InvasiveOperationDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 有创操作记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+public class ShaoyfInvasiveOperationDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<InvasiveOperationDoc> extract(MedrecVo medrecVo) {
+        List<InvasiveOperationDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getInvasiveOperationDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private InvasiveOperationDoc getInvasiveOperationDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = ShaoyfXmlUtil.getXmlToMap(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        InvasiveOperationDoc invasiveOperationDoc = new InvasiveOperationDoc();
+        invasiveOperationDoc.setStructureMap(structureMap);
+
+        return invasiveOperationDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfLeaveHospitalDocTrans.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 出院小结文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:25
+ */
+public class ShaoyfLeaveHospitalDocTrans extends ModelDocTrans {
+
+    @Override
+    public LeaveHospitalDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+        LeaveHospitalDoc leaveHospitalDoc = new LeaveHospitalDoc();
+        leaveHospitalDoc.setStructureMap(structureMap);
+        leaveHospitalDoc.setPageData((Map) structureMap);
+
+        return leaveHospitalDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "入院日期=入院时间",
+            "实际住院天数=住院天数",
+            "出院时情况=出院情况",
+            //            "注意事项=健康教育",
+            "复诊时间=随访计划",
+            "出院指导=健康教育",
+            "医生=医师签名",
+            "病历日期=签名时间",
+            "体温(耳)=体温耳"
+    );
+
+}

+ 26 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfMedicalRecordInfoDocTrans.java

@@ -0,0 +1,26 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.lantone.qc.pub.model.doc.MedicalRecordInfoDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 住院病历信息
+ * @author: 胡敬
+ * @time: 2020/6/3 15:45
+ */
+public class ShaoyfMedicalRecordInfoDocTrans 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;
+    }
+
+}

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfMedicalWritingDocTrans.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.MedicalWritingDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病历书写规范文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+public class ShaoyfMedicalWritingDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<MedicalWritingDoc> extract(MedrecVo medrecVo) {
+        List<MedicalWritingDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getMedicalWritingDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private MedicalWritingDoc getMedicalWritingDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> xmlNodeValueMap = ShaoyfXmlUtil.getXmlToMap(content);
+        xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        MedicalWritingDoc medicalWritingDoc = new MedicalWritingDoc();
+        medicalWritingDoc.setStructureMap(structureMap);
+
+        return medicalWritingDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 23 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfNoticeOfConversationDocTrans.java

@@ -0,0 +1,23 @@
+package com.lantone.qc.trans.shaoyf;
+
+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: 谈话告知书
+ * @author: wangyu
+ * @time: 2020/4/20 18:06
+ */
+public class ShaoyfNoticeOfConversationDocTrans 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;
+    }
+}

+ 38 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfNursingSystemDocTrans.java

@@ -0,0 +1,38 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.NursingSystemDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 分级护理制度文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:26
+ */
+public class ShaoyfNursingSystemDocTrans extends ModelDocTrans {
+
+    @Override
+    public NursingSystemDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        NursingSystemDoc nursingSystemDoc = new NursingSystemDoc();
+        nursingSystemDoc.setStructureMap(structureMap);
+
+        return nursingSystemDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 305 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfOperationDocTrans.java

@@ -0,0 +1,305 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationInformedConsentDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationSafetyChecklistDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
+ */
+public class ShaoyfOperationDocTrans 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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts);
+
+        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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationRecord_keyContrasts);
+        OrdinaryAssistant.removeBlank(structureMap);
+        OperationRecordDoc operationRecordDoc = new OperationRecordDoc();
+        operationRecordDoc.setStructureMap(structureMap);
+        operationRecordDoc.setPageData((Map) structureMap);
+        return operationRecordDoc;
+    }
+
+    // 手术记录
+    private List<String> operationRecord_keyContrasts = Lists.newArrayList(
+            "结束时间=手术结束时间",
+            "开始时间=手术开始时间",
+            "手术医师=主刀医师",
+            "助手=一助",
+            "助手II=二助",
+            "补救措施1=补救措施",
+            "本人姓名=姓名"
+    );
+
+
+    /**********************************************术前讨论、术前小结****************************************************/
+    private Map<String, PreoperativeDiscussionDoc> getPreoperativeDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, PreoperativeDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
+            preoperativeDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, preoperativeDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private PreoperativeDiscussionDoc getPreoperativeDiscussionDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts);
+
+        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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationInformedConsent_keyContrasts);
+
+        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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationSafetyChecklist_keyContrasts);
+
+        OperationSafetyChecklistDoc operationSafetyChecklistDoc = new OperationSafetyChecklistDoc();
+        operationSafetyChecklistDoc.setStructureMap(structureMap);
+        operationSafetyChecklistDoc.setPageData((Map) structureMap);
+
+        return operationSafetyChecklistDoc;
+    }
+
+    private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号++++住院号=病案号",
+            "签名++++=签名"
+    );
+
+}

+ 47 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfPathologyShipDocTrans.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.PathologyShipDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : PathologyShipDocTrans
+ * @Description : 病理检验送检单
+ * @Author : 楼辉荣
+ * @Date: 2020-04-19 17:49
+ */
+public class ShaoyfPathologyShipDocTrans extends ModelDocTrans {
+    @Override
+    public List<PathologyShipDoc> extract(MedrecVo medrecVo) {
+        List<PathologyShipDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getPathologyShipDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private PathologyShipDoc getPathologyShipDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        PathologyShipDoc pathologyShipDoc = new PathologyShipDoc();
+        pathologyShipDoc.setStructureMap(structureMap);
+        pathologyShipDoc.setPageData((Map) structureMap);
+        return pathologyShipDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList("检验标本=送检标本名称",
+            "本人姓名=姓名",
+            "术中发现=手术所见");
+
+}

+ 45 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfReasonableDiagnosisDocTrans.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.ReasonableDiagnosisDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 诊疗合理性文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+public class ShaoyfReasonableDiagnosisDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<ReasonableDiagnosisDoc> extract(MedrecVo medrecVo) {
+        List<ReasonableDiagnosisDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getReasonableDiagnosisDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private ReasonableDiagnosisDoc getReasonableDiagnosisDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        ReasonableDiagnosisDoc reasonableDiagnosisDoc = new ReasonableDiagnosisDoc();
+        reasonableDiagnosisDoc.setStructureMap(structureMap);
+
+        return reasonableDiagnosisDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfRescueDocTrans.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.RescueDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 抢救记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 17:34
+ */
+public class ShaoyfRescueDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<RescueDoc> extract(MedrecVo medrecVo) {
+        List<RescueDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getRescueDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private RescueDoc getRescueDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        RescueDoc rescueDoc = new RescueDoc();
+        rescueDoc.setStructureMap(structureMap);
+        rescueDoc.setPageData((Map) structureMap);
+
+        return rescueDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "事件日期=抢救开始时间",
+            "本人姓名=姓名"
+    );
+
+}

+ 49 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfSeriouslyIllNoticeDocTrans.java

@@ -0,0 +1,49 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.SeriouslyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病重通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class ShaoyfSeriouslyIllNoticeDocTrans extends ModelDocTrans {
+
+    @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> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        SeriouslyIllNoticeDoc seriouslyIllNoticeDoc = new SeriouslyIllNoticeDoc();
+        seriouslyIllNoticeDoc.setStructureMap(structureMap);
+        seriouslyIllNoticeDoc.setPageData((Map) structureMap);
+
+        return seriouslyIllNoticeDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "查房记录=简要病情",
+            "本人姓名=姓名"
+    );
+
+}

+ 50 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfStagesSummaryDocTrans.java

@@ -0,0 +1,50 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 阶段小结文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class ShaoyfStagesSummaryDocTrans extends ModelDocTrans {
+
+    @Override
+    public List<StagesSummaryDoc> extract(MedrecVo medrecVo) {
+        List<StagesSummaryDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getStagesSummaryDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private StagesSummaryDoc getStagesSummaryDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        StagesSummaryDoc stagesSummaryDoc = new StagesSummaryDoc();
+        stagesSummaryDoc.setStructureMap(structureMap);
+        stagesSummaryDoc.setPageData((Map) structureMap);
+
+        return stagesSummaryDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "现病史- 发病情况=发病情况",
+            "体温(耳)=体温耳"
+    );
+
+}

+ 252 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfThreeLevelWardDocTrans.java

@@ -0,0 +1,252 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.dbanaly.lt.facade.ModelHospitalFacade;
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.GeneralDoctorWardDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 查房记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+@Setter
+public class ShaoyfThreeLevelWardDocTrans extends ModelDocTrans {
+
+    private List<String> recTitles;
+    private List<OperationDoc> operationDocs;
+
+    @Override
+    public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
+        ModelHospitalFacade modelHospitalFacade = SpringContextUtil.getBean(ModelHospitalFacade.class);
+        recTitles = modelHospitalFacade.getRecTitles(2l, 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> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        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(), "");
+        }
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+
+        if (StringUtils.isEmpty(structureMap.get("查房日期"))) {
+            if (!StringUtils.isEmpty(structureMap.get("病历日期"))) {
+                structureMap.put("查房日期", structureMap.get("病历日期"));
+            } else {
+                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);
+        }
+    }
+
+    /**
+     * 主任医师查房
+     *
+     * @param structureMap
+     */
+    private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String recordDateStr = structureMap.get("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        DirectorDoctorWardDoc directorDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) {    //标题有代字)
+                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("查房日期");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        AttendingDoctorWardDoc attendingDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) {    //标题有代字)
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return attendingDoctorWardDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "事件日期=记录时间",
+            "事件日期=查房日期",
+            "简要病情=病情记录",
+            "查房记录=病情记录",
+            "医生=记录医师"
+    );
+
+    public static String subTitle(String srcText) {
+        if (StringUtil.isNotBlank(srcText) && srcText.contains("代") && srcText.indexOf("代") != srcText.length() - 1) {
+            srcText = srcText.substring(srcText.lastIndexOf("代") + 1);
+        }
+        return srcText;
+    }
+
+    /**
+     * 获取主刀医师/一助职称(取距离查房记录时间最近的一次手术记录)
+     *
+     * @param operationDocs
+     * @return
+     */
+    public static String getDoctorTitle(List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+        String title = "";
+        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
+        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        long timeDiff = 0L;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String chiefSurgeon = structureMap.get(findTitle);
+            String operatorEndDateStr = structureMap.get("手术结束时间");
+
+            if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                continue;
+            }
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+            if (doctor != null) {
+                String professor = doctor.get("professor");
+                Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                if (operatorEndDate != null) {
+                    long timeDifference = timeDifference(operatorEndDate, recordDate);
+                    if (timeDifference == 0) {
+                        continue;
+                    }
+                    if (timeDiff == 0 || timeDiff > timeDifference) {
+                        /* 取距离此次主刀医师查房最近的一次手术时间 */
+                        timeDiff = timeDifference;
+                        title = professor;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+    public static long timeDifference(Date firstDate, Date secondDate) {
+        long timeDifference = 0L;
+        if (firstDate == null || secondDate == null) {
+            return timeDifference;
+        }
+        boolean flag = false;
+        if (firstDate.before(secondDate)) {
+            flag = true;
+        }
+        Calendar calendarS = Calendar.getInstance();
+        Calendar calendarE = Calendar.getInstance();
+        long timeS, timeE;
+        try {
+            calendarS.setTime(firstDate);
+            calendarE.setTime(secondDate);
+
+            timeS = calendarS.getTimeInMillis();
+            timeE = calendarE.getTimeInMillis();
+
+            if (flag) {
+                timeDifference = (timeE - timeS) / (1000 * 60);
+            } else {
+                timeDifference = (timeS - timeE) / (1000 * 60);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return timeDifference;
+    }
+
+}

+ 240 - 0
trans/src/main/java/com/lantone/qc/trans/shaoyf/ShaoyfTransferRecordDocTrans.java

@@ -0,0 +1,240 @@
+package com.lantone.qc.trans.shaoyf;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.shaoyf.ShaoyfXmlUtil;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @Description: 转科记录文档生成
+ * @author: rengb
+ * @time: 2020/3/20 16:10
+ */
+public class ShaoyfTransferRecordDocTrans 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 (ListUtil.isNotEmpty(into)) {
+            all.addAll(into);
+        }
+        if (ListUtil.isNotEmpty(out)) {
+            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.getTransferIntoDocs().add(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.getTransferOutDocs().add(transferOutDoc);
+        }
+//        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                continue;
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
+
+        return transferRecordDoc;
+    }
+
+
+    /**************************************************转入*******************************************************/
+    private Map<String, TransferIntoDoc> getTransferIntoDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferIntoDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferIntoDoc transferIntoDoc = getTransferIntoDoc(contentMap);
+            transferIntoDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferIntoDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferIntoDoc getTransferIntoDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts);
+
+        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+        transferIntoDoc.setText(content);
+        transferIntoDoc.setStructureMap(structureMap);
+        transferIntoDoc.setPageData((Map) structureMap);
+
+        return transferIntoDoc;
+    }
+
+    private List<String> transferInto_keyContrasts = Lists.newArrayList(
+            "书写日期=病历日期",
+            "转科目的=转科原因",
+            "入ICU前诊治经过=诊治经过",
+            "辅助检查=辅助检查结果",
+            "治疗计划=治疗计划和措施",
+            "书写内容=转运途中情况",
+            "本人姓名=姓名"
+    );
+
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferRecordDoc transferRecordDoc = getTransferAllDoc(contentMap);
+            transferRecordDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        Map<String, String> 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 content = contentMap.get("xmlText").toString();
+        Map<String, String> sourceMap = ShaoyfXmlUtil.getXmlToMap(content);
+        sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+        sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferOut_keyContrasts);
+
+        TransferOutDoc transferOutDoc = new TransferOutDoc();
+        transferOutDoc.setText(content);
+        transferOutDoc.setStructureMap(structureMap);
+        transferOutDoc.setPageData((Map) structureMap);
+
+        return transferOutDoc;
+    }
+
+    private List<String> transferOut_keyContrasts = Lists.newArrayList(
+            "书写日期=病历日期",
+            "转科目的=转科原因",
+            "本人姓名=姓名"
+    );
+
+}

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouBeHospitalizedDocTrans.java

@@ -77,6 +77,7 @@ public class TaiZhouBeHospitalizedDocTrans extends ModelDocTrans {
             "病历日期=记录日期",
             "主诉=主诉",
             "现病史=现病史",
+            "内科疾病史(其它)=内科疾病史其它",
             "一般健康状况=既往健康状况",
             "婚姻家庭关系和睦=夫妻关系",
             "体格检查=体格检查",

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouConsultationDocTrans.java

@@ -193,6 +193,7 @@ public class TaiZhouConsultationDocTrans extends ModelDocTrans {
             "事件日期=申请日期",
             "会诊类别=会诊分类",
             "会诊理由和目的=申请理由目的",
+            "病历日期=会诊日期及时间",
             "本人姓名=姓名",
             "病历号=病案号",
             "临床科室=申请科室"

+ 6 - 2
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouTransferRecordDocTrans.java

@@ -36,8 +36,12 @@ public class TaiZhouTransferRecordDocTrans extends ModelDocTrans {
         List<Map<String, Object>> into = (List) contentMap.get("转入记录");
         List<Map<String, Object>> out = (List) contentMap.get("转出记录");
         List<Map<String, Object>> all = new ArrayList<>();
-        all.addAll(into);
-        all.addAll(out);
+        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);