Parcourir la source

义务基础添加

rengb il y a 4 ans
Parent
commit
5af0f5719f
31 fichiers modifiés avec 80748 ajouts et 0 suppressions
  1. 73 0
      dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/yiwu/YiWuXmlUtil.java
  2. 133 0
      kernel/src/main/resources/cache/5/concept_clinic_bodypart_properties.dict
  3. 38387 0
      kernel/src/main/resources/cache/5/concept_diag_properties.dict
  4. 38387 0
      kernel/src/main/resources/cache/5/hospital_diag_info.dict
  5. 813 0
      kernel/src/main/resources/cache/5/hospital_doctor_info.dict
  6. 253 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuBeHospitalizedDocTrans.java
  7. 55 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuClinicBloodEffectDocTrans.java
  8. 59 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuClinicalBloodDocTrans.java
  9. 220 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuConsultationDocTrans.java
  10. 56 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuCrisisValueReportDocTrans.java
  11. 54 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuCriticallyIllNoticeDocTrans.java
  12. 59 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDeathCaseDiscussDocTrans.java
  13. 55 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDeathRecordDocTrans.java
  14. 61 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDifficultCaseDiscussDocTrans.java
  15. 313 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDocTrans.java
  16. 36 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDoctorAdviceDocTrans.java
  17. 98 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuFirstCourseRecordDocTrans.java
  18. 269 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuFirstPageRecordDocTrans.java
  19. 18 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuInformedConsentDocTrans.java
  20. 57 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuLeaveHospitalDocTrans.java
  21. 26 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuMedicalRecordInfoDocTrans.java
  22. 51 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuMedicalWritingDocTrans.java
  23. 23 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuNoticeOfConversationDocTrans.java
  24. 352 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuOperationDocTrans.java
  25. 40 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuOutDepDocTrans.java
  26. 55 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuPathologyShipDocTrans.java
  27. 58 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuRescueDocTrans.java
  28. 53 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuSeriouslyIllNoticeDocTrans.java
  29. 58 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuStagesSummaryDocTrans.java
  30. 323 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuThreeLevelWardDocTrans.java
  31. 253 0
      trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuTransferRecordDocTrans.java

+ 73 - 0
dbanaly/src/main/java/com/lantone/qc/dbanaly/facade/yiwu/YiWuXmlUtil.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.dbanaly.facade.yiwu;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.FileUtil;
+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 YiWuXmlUtil {
+
+    public static Map<String, String> xmlToMap(String xml) {
+        Map<String, String> map = Maps.newHashMap();
+        try {
+            String content = FileUtil.fileRead("C:\\Users\\Administrator\\Desktop\\义务\\jiexi\\n3.xml");
+            Document doc = DocumentHelper.parseText(content);
+            Element root = (Element) doc.selectSingleNode("//XTextDocument/XElements/Element[@xsi:type='XTextBody']/XElements");
+            findElement(root, "XInputField").forEach(i -> {
+                xInputField(map, i);
+            });
+            findElement(root, "XTextTable").forEach(tableElement -> {
+                findElement(tableElement.element("XElements"), "XTextTableRow").forEach(rowElement -> {
+                    findElement(rowElement.element("XElements"), "XTextTableCell").forEach(cellElement -> {
+                        findElement(cellElement.element("XElements"), "XInputField").forEach(xInputFieldElement -> {
+                            xInputField(map, xInputFieldElement);
+                        });
+                    });
+                });
+            });
+        } catch (Exception e) {
+        }
+        map.keySet().forEach(key -> {
+            System.out.println(key + "----" + map.get(key));
+        });
+        return map;
+    }
+
+    public static List<Element> findElement(Element element, String attual) {
+        List<Element> ret = Lists.newArrayList();
+        ((List<Element>) (element.elements())).forEach(i -> {
+            if (StringUtil.isNotBlank(i.attributeValue("type")) && i.attributeValue("type").equals(attual)) {
+                ret.add(i);
+            }
+        });
+        return ret;
+    }
+
+    public static void xInputField(Map<String, String> map, Element xInputFieldElement) {
+        String key = null, value = null;
+        String[] elementNames = { "ToolTip", "Name", "BackgroundText" };
+        for (String elementName : elementNames) {
+            key = xInputFieldElement.elementTextTrim(elementName);
+            if (StringUtil.isNotBlank(key)) {
+                break;
+            }
+        }
+        value = xInputFieldElement.elementTextTrim("InnerValue");
+        if (StringUtil.isNotBlank(key)) {
+            map.put(key, value);
+        }
+    }
+
+
+}

+ 133 - 0
kernel/src/main/resources/cache/5/concept_clinic_bodypart_properties.dict

@@ -0,0 +1,133 @@
+LAphuzvX0+1zUunA7M09Hw==
+wGKkm1Axrl8=
+KkqtLy22gBtRq6Y4vkNXyQ==
+sPonp8kD0PlDfsMr80o2tQ==
+Dp+xJKT1n8g=
+ZCI0+I1MKLGoU+yPtmhbJw==
+DOXrtCrKcXSFIWuMj59JFg==
+01OrraAAmcE=
+MfpZ5926ns4HjnX6dZF4Ew==
+eJVLnFBt3h4=
+MCVPu99GbLxp84i3DCFu/g==
+2Hhy8O0hODI=
+5r1+UeeRdz0fVJH7s8MZNQ==
+Q2fNzojA4fA=
+vW3dTpk0tFiQiw2jWjwfPA==
+MNTZtG8f9LQ=
+ogVQVbsCHOI=
+Ce2UXUa+3KsfVJH7s8MZNQ==
+wmRvRyr6N5yg1rmFJe9Z2g==
+V7VA3KYNqxQ=
+aC5xv6h4kt5c5OTNuAf37Q==
+Z0C+uRrbTghAxhoGdRmsYg==
+Rpy4rqBnq0xXxvYNaFTw2Q==
+I7vcOPzkQOo=
+MAJlaU83a4ioU+yPtmhbJw==
+uUfXVwqAQBs=
+TvEGDdLx11J/ufBPhFj0Ww==
+dn2Qsy3GvOgfVJH7s8MZNQ==
++ojTIp5v4bQHjnX6dZF4Ew==
+c06lMwdsMGY=
+zfymW7X/poA=
+hj3oPwd2A8wfVJH7s8MZNQ==
+6F5GQVOYgyui7/G0BOLWvmb0NA6xAPvZ
+eh0gnqWcoodAxhoGdRmsYg==
+HBi62z4VqkA=
+eOtp99ION5B/ufBPhFj0Ww==
+PQlTF2j6ne2bIZQhpl3bRg==
+W5f3x2qRae4=
+0dseB0FG4fk=
+9Oafm8Bskj0=
+z3AdaerZRVwfVJH7s8MZNQ==
+zdISnbEr02KedPJCHzSuhw==
+8wtXCXbnt2cfVJH7s8MZNQ==
+DvDTv3eRhQxM/KLa6uVUSQ==
+hK5uiQNYMutrynAbi7Nl7g==
+93ZjDiJwkDEcuBfsuGV26Q==
+H6hvNux0DMVfB2OTCSmksg==
+oapSrFpo1xzKZlVMzaya/w==
+cA6kPjEpsoJc5OTNuAf37Q==
+zK3IJj4OCNK63Wt9pi+oDw==
+eE2lKBuqkGxc5OTNuAf37Q==
+He8DX2NE4io=
+xrxCCtiW1kQ=
+1IKx7GtShHg=
+WlxWJO1bvWM=
+JB2E9WXZ5MgUCMxgY7oByw==
+enu6avlk5YoG1YmqGz3h9g==
+XvltMqvZ0rG4vnEZ8kLHbg==
+LQ4RQ5c6TvEfVJH7s8MZNQ==
+3IQA5HUrujc=
+13MHrUqG1pcfVJH7s8MZNQ==
+qDJCWQ+e+n6edPJCHzSuhw==
+xDC1Ti9ss3U=
+ovmPnAT+BYs=
+GgfSGissd7DNjYGroWncAQ==
+oujtg2YhATc=
+2IQUTK7lEyM=
+8iRAY6UGp0YVY3fFFOFg2g==
+Hif1tO4NCkk=
+pnIIwZAPIIPBAIkf/X0ufw==
+JJw0vZQlXuxp84i3DCFu/g==
+aGH61MJKMS7BAIkf/X0ufw==
+mA0dp7Zpk/MfVJH7s8MZNQ==
+el7aO7TjFOkHjnX6dZF4Ew==
+u7zlp9tdgNmRKVPbAeWYEg==
+9zqzljbiYu8=
+6kIlhnYnjOC/WZ1+qt48kw==
+bYP4eZXu1JMfVJH7s8MZNQ==
+38rBhrBd2ZA=
+/i2W9Ldeb+I=
+CMHCsSygook=
+J1XqrY7xMtY=
+oStcY3ItFdZp84i3DCFu/g==
+idBQS4aIrNa5fhcvExqbXw==
+DwvME4SMq1+bOR+EdoRoFg==
+tr3mC/s6c9sVY3fFFOFg2g==
+H45LTbfORk8=
+H8iHeeS1rXY=
+MOuKy1wkq4b7Dji9AZqQog==
+De0vhPcQSMBYGLQ8FmimcA==
+3BvyzjY734Zp84i3DCFu/g==
+HM89DEXwIpZbnoRDJ143bg==
+rz3JZr31IyPYt42Urg1Jzw==
+syl6GnJDiUoHjnX6dZF4Ew==
+aD5eU1o4MmM+03JbZpPE8K74oEbqwDfN
+OgJkiiRLMa0fVJH7s8MZNQ==
+36HIq5sBqNHNjYGroWncAQ==
+PTX9F+XFiHM=
+FXYCcRyAS3o=
+QqPqll5V3q+ken3TgiVM7Q==
+MgaLJr/9B1a4ACWlx8X4SA==
+SUTiIJK8tCefXEA0j/uq7Q==
+PV15+/MoQVT69Mxpvjn8ew==
++37KuiO62gI=
+OxBAAUKmMB00iPLsFnfW9Q==
+TkKCqeWSukfkqT33kNdg7XtqtAiTi3CE
++XIIOz+kxpCUAfTSDenAAg==
+noFHr1hkTNjL15F1MBXHSA==
+Az2U7M6QU8cHjnX6dZF4Ew==
+ypYq0llNvxtI/qHgUfgHEQ==
+JPNNI7Mn7GkOCoFD2N6+gg==
+0sR5tvt5nTkfVJH7s8MZNQ==
+qDsVL3hjCgxefGaE90oS7A==
+CCwoTxnngSQfVJH7s8MZNQ==
+imwDTINwXfjYlg1d8mP6iA==
+eXtihU+dgoH+XFxDriiYrA==
+qIWekMxNvsIfVJH7s8MZNQ==
+KZUjBH3QG1G82j8JYvRviu4snVNHMRDd
+qJUZMtAw/WiAhcQlN1BQqQ==
+lwGHWf1Es9kfVJH7s8MZNQ==
+H5rQ7wE9KYA=
+Ia0GAZyPZmQfVJH7s8MZNQ==
+QUV0SLvhn8MkVYph1YGRZQ==
+KSzY6T6+c7txOA0SFqxXjw==
+rmxr1ubN35NRq6Y4vkNXyQ==
+9ON7f+cfbFKQDSBz6+VqxQ==
+RRmtNZvkAQNdGy/Xru8l0w==
+tEpz4Ws2I3E=
+8d20YPKZX9MHjnX6dZF4Ew==
+KUKo8hZ4qfUfVJH7s8MZNQ==
+V8p/97BlQ1uBggh8N37P8g==
+6ByZH6ejZBQHjnX6dZF4Ew==
+GwjNkWrksZShsfR9iW7TiQ==

Fichier diff supprimé car celui-ci est trop grand
+ 38387 - 0
kernel/src/main/resources/cache/5/concept_diag_properties.dict


Fichier diff supprimé car celui-ci est trop grand
+ 38387 - 0
kernel/src/main/resources/cache/5/hospital_diag_info.dict


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

@@ -0,0 +1,813 @@
+6hT1OVoaNlagM5YH+yDTtfXoNDUrhiv7
+Fh1JlwgrF2zu4Pxoj58PNbgGJlVSiNEL
+AOOWeC5zUWxL86ojSlzKJqa1qpic2S+n
+z4cG6L1+zR1o/zq5s0YgzPXoNDUrhiv7
+xc4yRK3jS2GtC0YcG9FdC/XoNDUrhiv7
+T+JAG2TD01rODl/ivj20vdwlBhK2CH9tW6M7h6GPKpQ=
+qYZmLFYjnUdo8Gf+NV8z8fXoNDUrhiv7
+xqNCqDB4gjfPCalK+86QLLgGJlVSiNEL
+gyAiWVLPeo8n2WDvor0mDPXoNDUrhiv7
+WnC/fPTenKKj6vNuWukNGvXoNDUrhiv7
+EJu5L3xchUmmGJWwPB3qBbgGJlVSiNEL
+NnZy5Wl7M7YtVgM7HwWgwrgGJlVSiNEL
+7V/9VwpcYcsv8CMlIIAJgrgGJlVSiNEL
+z4AM2WpNw/a+iINuFdS3wLgGJlVSiNEL
+JDOxipZrsgakDJVzUpVGyNwlBhK2CH9tW6M7h6GPKpQ=
+h5BMuTUa930n2WDvor0mDPXoNDUrhiv7
+C5huix+K8TXZabIkyJTnkLgGJlVSiNEL
+LaqhWe3CXiR/agBuRiIq2H+Ay2htUmISQfh5YR4fO9M=
++TlsoNGtua8SMaA4+jz6kLgGJlVSiNEL
+ngeGqo761ZevG6gyJwoDPbgGJlVSiNEL
+IYqF0LUtSl9GMbKieRsuUgtgcgd4YfgS
+wjYxx1LCBeI3U8qvF5VqlXqts9tVT1Ku
+FQubT9ZjJrTZx5fTRR/qO7gGJlVSiNEL
+koZbwX/Hgw22i+SMvNz1nPXoNDUrhiv7
+fTBw/cbsiJoQ4PZcyIDqcvXoNDUrhiv7
+3yioTk0452BeenVEi9gwK3+Ay2htUmISQfh5YR4fO9M=
+ycbxmeIS3p3LW+sRFeNERLgGJlVSiNEL
+t3Rc9WzQtGBzle+T5q9f5qa1qpic2S+n
+TWm9AztYc9Un2WDvor0mDPXoNDUrhiv7
+FOnjVlt6qt/YQXSIysQsDrgGJlVSiNEL
+CNljJhWl34rhGkT51NwbkLgGJlVSiNEL
+NBKt3QQfKihYNGCKqZ68ArgGJlVSiNEL
+3FQDFc4iZndBM+MxxBGBLLgGJlVSiNEL
+qIkGX9KFbwtG6+EhqZxzbbgGJlVSiNEL
+sCFTj/6v3rsCeiSpU3a8+7gGJlVSiNEL
+uR22qOT7UfX62ovjwb6WvvXoNDUrhiv7
+sqY7GyImuvGMChJvsMA6/nqts9tVT1Ku
+R4nU7Fwh7euT2jP4kHoFurgGJlVSiNEL
+2VWViiBmoNTSa8WcotP3L7gGJlVSiNEL
+Zit65qT7oS6j6vNuWukNGvXoNDUrhiv7
+lWSMHCBFZVds9ivh/ZJUSbgGJlVSiNEL
+WQoHBvs2D0aQjlc6WO5+YNwlBhK2CH9tW6M7h6GPKpQ=
+2HkpvEn+N6UEN8L+RZAXXwtgcgd4YfgS
+E0UAobjqRTZV8L5Fbzfst6a1qpic2S+n
+vEWengXBpmKoFegasCse53qts9tVT1Ku
+0d9sboFEsxuhs413x2g1jLgGJlVSiNEL
+QnuEUWuwGRao1SuRvy4n46a1qpic2S+n
+N+tqdHGpn1/+6KDrJpNNM/XoNDUrhiv7
+/mtCv4H8QmC461o0a+M5laa1qpic2S+n
+Dbgo7TG2keCtC0YcG9FdC/XoNDUrhiv7
+OC9+pnKVJoeUgIINajRGmKp1f11xx5q7
+TU9eANAnd3rWZYQinuZQVKa1qpic2S+n
+/oF/hDLrcQDu6S5wdO50fdwlBhK2CH9tW6M7h6GPKpQ=
+1pbdZ3iaMRSj6vNuWukNGvXoNDUrhiv7
+eTSlPhNeB+Zo8Gf+NV8z8fXoNDUrhiv7
+X5JTzMlYUv5Q9vSlqkARPdwlBhK2CH9tW6M7h6GPKpQ=
+8hzP3UeymdOZZ4LT6eBp5LgGJlVSiNEL
+FN1V2e2tHaKKactkljG/Z9wlBhK2CH9tW6M7h6GPKpQ=
+iAWJ8rqriiqBuaEy5Iwte6p1f11xx5q7
+zWWFbBoRuddrPvv+GqGMsX+Ay2htUmISQfh5YR4fO9M=
+7jAKa2EZgluFBtMU8CtI93qts9tVT1Ku
+DRnv2B4u8RRlcaN1KLQPVHqts9tVT1Ku
+0CEciftQCXxj99HTi8QNbrgGJlVSiNEL
+cv3ODupX0GNZohr5KT8XHNwlBhK2CH9tW6M7h6GPKpQ=
+PdB3HucbQQvK/+Ck99lOJrgGJlVSiNEL
+TSqgo6yzH3cYyJZgVYGMgKa1qpic2S+n
+Q9jaRKSWwQB1bZVCyUz+WtwlBhK2CH9tW6M7h6GPKpQ=
+N4dPgv72Czjol9qPihQJtbgGJlVSiNEL
+ANWVothVF/StGnFER8fSr7gGJlVSiNEL
+ZywP/q/7UeXK8QOtoLb267gGJlVSiNEL
+9+KKMiJ3a9QQVdpOFWwfObgGJlVSiNEL
+A6HmRnzpHiGHMKYym78eObgGJlVSiNEL
+Sub/dQAcDI5+QPLlJb6W8LgGJlVSiNEL
++AR4QgAydtq1ZuTRcHwqz7gGJlVSiNEL
+E+9taPm8VbeCKISlo491frgGJlVSiNEL
+BmvC2XQHjjZCKYcdpYSTLbgGJlVSiNEL
+utLTjusWLRvSKFvD/F/957gGJlVSiNEL
+iapAsnjd1A5TP02jZeu00rgGJlVSiNEL
+5B/1qFQozkXyL9M8ZTxdNLgGJlVSiNEL
+GefvOQcOUEa2i+SMvNz1nPXoNDUrhiv7
+4oY7dTMyzj36VQCyPzbS67gGJlVSiNEL
+ttmf8Cl34Z97aqSVCYnzy3+Ay2htUmISQfh5YR4fO9M=
+sHO0Ko4VQU/9yVpOXBOjvbgGJlVSiNEL
+YZOBIkhtSdTim1B9ItLebLgGJlVSiNEL
+ZBSY5/Z69UXUcGh2DIWJgPXoNDUrhiv7
+B2FOXLWyTBn+6KDrJpNNM/XoNDUrhiv7
+kyboDJ/S9NNKQoLhT6+0RLgGJlVSiNEL
+3NKYDYemxllB3HqKlrvyhbgGJlVSiNEL
+peRLhvzCNCX62ovjwb6WvvXoNDUrhiv7
+iQW7oyfolqtaGbK8bzqvbLgGJlVSiNEL
+yJa5klV9HR/mbUBSO6b8UrgGJlVSiNEL
+Z+vh8o7eIaJLaMfoL3bNEdwlBhK2CH9tW6M7h6GPKpQ=
+ttaT2ETdhNvPed+g9QcOlbgGJlVSiNEL
+pH6b8tPC/CL4IDcH9vYLJ+ZVB7mY8h37LKs3fnGbwV4=
+xJlFntLVQIOm/zGwF/KgabgGJlVSiNEL
+wNbMzABo1G6D0eKcppz07bgGJlVSiNEL
++uuGgyymrkXHTTGH7fxwnfXoNDUrhiv7
+WIM5Oys2CeCtC0YcG9FdC/XoNDUrhiv7
+gAe/4jW6dE+xy1eU3/0RsOZVB7mY8h37LKs3fnGbwV4=
+mO7yGoXkpsrrqyJJG4fBgqp1f11xx5q7
++VwLubUgn9NkR0LxB6d2UrgGJlVSiNEL
+KEd1opcfol1MYLkt9GN95rgGJlVSiNEL
+oqAceMVfjBjOyc9g8i214twlBhK2CH9tW6M7h6GPKpQ=
+tYSAIHSf5LhxqoIchdz5NbgGJlVSiNEL
+UNxTFQ/lRTmuhUYeF6H0QbgGJlVSiNEL
+KC0lnuWnhX2j6vNuWukNGvXoNDUrhiv7
+Ptk2qZXETnqtC0YcG9FdC/XoNDUrhiv7
+bLN3QJXySa7+6KDrJpNNM/XoNDUrhiv7
+iozrrJfSVeFdNuPyQpRzXk+5TjAW0UK0prWqmJzZL6c=
+Fo5+2aMHjPY7tLIJcyGULbgGJlVSiNEL
+fhqibOXDyP8eVOg+NwOpzLgGJlVSiNEL
+m0XjTYO9NVEgpTf7FdisstwlBhK2CH9tW6M7h6GPKpQ=
+XdhiJplmX1cz0fmFDQscA9wlBhK2CH9tW6M7h6GPKpQ=
+UnOwK6Q5xE762ovjwb6WvvXoNDUrhiv7
+YYB2Ur7UwMqaWfjcp7IEjKp1f11xx5q7
+Y0rhB8hsobYk2c5rjChcxrgGJlVSiNEL
+acSpCEbs63eavitBRycrgbgGJlVSiNEL
++hhPOWZxVpgNc4jfM1Ex1LgGJlVSiNEL
+nS2PBFVjU5TZabIkyJTnkLgGJlVSiNEL
+2IO8aZbiI54Q4PZcyIDqcvXoNDUrhiv7
+ABsoMzYRFf+n1XBAC0KW5LgGJlVSiNEL
+S5QWNslBBVd+xGSUV4UpX7gGJlVSiNEL
+/s/90ESeV66zil6DkHWhgrgGJlVSiNEL
+IZuj22Sd4LOzjFbf7t4dWLgGJlVSiNEL
+VGlUHbOkKxRLzXZVGEU9YLgGJlVSiNEL
+NS9Tav6S+ZcbJ+XdHTgBZNwlBhK2CH9tW6M7h6GPKpQ=
+6XQ+MJ6Va4+jYM4ZVf5/oLgGJlVSiNEL
+w0UdY92mY+bHC8sEl1kYigtgcgd4YfgS
+0adCG8MGDPRINq5d88gIGbgGJlVSiNEL
+OWLFxQFUVy1c4DipzL8Xv3qts9tVT1Ku
+nX2gyuDX6HRIYh/spKcjE3qts9tVT1Ku
+YJPaAMTXMSbkWTESjzKU8Xqts9tVT1Ku
+vX3E7ayXLE/rLdDMB/gpBLgGJlVSiNEL
+3S76JqWInnJawh3tvgMCVPXoNDUrhiv7
+J0AHF2RoBTm5WZkOBuG0U7gGJlVSiNEL
+1rTy5ZH91dLUcGh2DIWJgPXoNDUrhiv7
+Fzzi0NOuSjH3wlnHP/DPWLgGJlVSiNEL
+l0xN5zgstTUGtz0VGJvsd7gGJlVSiNEL
+74GMHNSFqBPyL9M8ZTxdNLgGJlVSiNEL
+IphgHxz25yatC0YcG9FdC/XoNDUrhiv7
+2pY5aPkl5p7MOve1ljC1HAtgcgd4YfgS
+oeHAjXv8kYwtbzRx55ZQ9bgGJlVSiNEL
+d2p2J4EHhX49qqCQTLS7OdwlBhK2CH9tW6M7h6GPKpQ=
+iv1mDnmdrxgv2cKb46nP8Kp1f11xx5q7
+1T+d53x/r4t6jVuFqnzlOrgGJlVSiNEL
+O1h3xT6OvyyvrjLEXxRB+LgGJlVSiNEL
+zvfpjiJEUkBO+5duBkZT83+Ay2htUmISQfh5YR4fO9M=
+u5fvZSVt2hXZ/+Y1o9dNUbgGJlVSiNEL
+mh4hK0en3c27l7hemHZDO+ZVB7mY8h37LKs3fnGbwV4=
+vqCfZfW4TgtGkckKZ9vWlXqts9tVT1Ku
+SXxYorjHl6bAlZjvSA3xVbgGJlVSiNEL
+re5iXICVGVMo4rLB7PChEPXoNDUrhiv7
+gyUem54+c7+7AAyFgsw4zaa1qpic2S+n
+i6O3tx4FQor+6KDrJpNNM/XoNDUrhiv7
+PV/M9ZSgi+pwL/UURlBWSbgGJlVSiNEL
+Firap1lsAucnHRQU+iKhHsWAX6LVNdgPqnV/XXHHmrs=
+ngWGN8DKwIeOkLbSf9uvCrgGJlVSiNEL
+ORVVuKwnmXapqcqRjrARUXqts9tVT1Ku
+Qxy45pNfTtJyNsGw78/xrap1f11xx5q7
+PRDHeNKqLxJxY4f0Y/CzXbgGJlVSiNEL
+NmVEYlkVHlOZyh/3tUTDHqsCWjXCNazg
+k4bLsZ1ZFv9LgY/8xLFqNbgGJlVSiNEL
+cDa99ESEVzJc0wjeQ5nV+LgGJlVSiNEL
+rwcq50XHVDZGMbKieRsuUgtgcgd4YfgS
+HNSRFWUvtkzswpdOWK5M4bgGJlVSiNEL
+/4PqiiITu3qAXVHfBA5YXaa1qpic2S+n
+9DJim9tUTPBSpHwK6tV0RdwlBhK2CH9tW6M7h6GPKpQ=
+FYDHiHTEGbKyRBK94oQGEbgGJlVSiNEL
+ekRKIEAC8UaF8PjblcEC2bgGJlVSiNEL
+nKXcdMN1pP1aOrvqKsrz8aa1qpic2S+n
+Z2KaAqn9JOo/0IWG5A4qQ7gGJlVSiNEL
+BNrvTLhqFE92F4X3owYtstwlBhK2CH9tW6M7h6GPKpQ=
+tEFiQ1SOEqbJGEoopCOxmLgGJlVSiNEL
+2srRFw/HxsCErhjmTH1BIvXoNDUrhiv7
+hMp69llMq4WDxIBGg7Kg3qp1f11xx5q7
+3KuYs0O6O8nK8QOtoLb267gGJlVSiNEL
+WLrkbbfFPbsF9DtBDTlbGdwlBhK2CH9tW6M7h6GPKpQ=
+aYFQ8P5XJMlzOKdyDhcjJvXoNDUrhiv7
+O/pNF6lEEXrK8QOtoLb267gGJlVSiNEL
+6DUTLb1+MhmZrz4bhA82ULgGJlVSiNEL
+Ej06mCNlnza0N/SZL3DWMLgGJlVSiNEL
+4Y5bS/F5qX6nZidAXRTlTrgGJlVSiNEL
+LQZYz44dh/yN+/S6BZ2qxtwlBhK2CH9tW6M7h6GPKpQ=
+yq8Yh0bjf2wtb0QuxfJqRXqts9tVT1Ku
+MmyZ0rIWvxy/5uPBHaxTJAtgcgd4YfgS
+I2co2kOKWdB5b6sFmirByLgGJlVSiNEL
+clh2XuB3FepnvyNbq+MLgLgGJlVSiNEL
+XuMh355fY+on2WDvor0mDPXoNDUrhiv7
+qO6Xw9fulfDL7lot+sXMWbgGJlVSiNEL
+s4zT8FrA51FOloiPYHyORnqts9tVT1Ku
+5XNYcTDnBhAt6IGJt6PrcYyHjcJv2FpA
+AQp4O9wL9k/zfwIwx7pO8rgGJlVSiNEL
+3IVUJ8Vrfggh2pbOyoCWCLgGJlVSiNEL
+22A4KSmV3eEFDeW5PX1LU7gGJlVSiNEL
+j5VgAye5nFcQ8EE2Ip/OnHqts9tVT1Ku
+bCB/d/O0tKmw4ZqjfsNMO9wlBhK2CH9tW6M7h6GPKpQ=
+1vtHxM/Gzbb76f3+iJXYkfXoNDUrhiv7
+OjLzFaltJOeFLv+u44+bCwb4W33SKZJwSmARnfpRl/s=
+B6UlrsM5I09fN8j5j2XDwLgGJlVSiNEL
+P5t31/YRzfVXKw+1CBXs47gGJlVSiNEL
+65C4svHUHShq16mc+jPvT7gGJlVSiNEL
+IjIypEClIYbaB3okOlhe0bgGJlVSiNEL
+pQ9QhDVKNmX+6KDrJpNNM/XoNDUrhiv7
+mVZQ8Rzwzi1h61yDR+g317gGJlVSiNEL
+/AQ59jOLyXIQ4PZcyIDqcvXoNDUrhiv7
+/cKn1RuS6/60R0LkKceDzn+Ay2htUmISQfh5YR4fO9M=
+MKuA+Y7zKQ9EXszumP67mrgGJlVSiNEL
+GXF/P5x/gPeaNPXtMKa6f7gGJlVSiNEL
+AfwKS7kCpOStC0YcG9FdC/XoNDUrhiv7
+awbGicrRkgmuRuO8Iw10G7gGJlVSiNEL
+PjcUiO1eRv2i4W7bwS2f07gGJlVSiNEL
++ulpjp8r1gfM5hmwK/ZVzbgGJlVSiNEL
+4OfBGK/WU2r+6KDrJpNNM/XoNDUrhiv7
+9zIxvYLPOCVUI5kJCyLnyrgGJlVSiNEL
+UeegLU3bsgMghmYFRr41dLgGJlVSiNEL
+gHxY2ZztwOwC37GBtnQaaasCWjXCNazg
+OAjPXKyr5sGCKISlo491frgGJlVSiNEL
+RGn7yFg0vxFKmKSW1cLnrbgGJlVSiNEL
+dvdyjiRPbJyRvsF0zx4GcqsCWjXCNazg
+Wrxztwf+wS3S5qMXxAfqZuZVB7mY8h37LKs3fnGbwV4=
+6QU34YMaYa4EBIyWhbshVLgGJlVSiNEL
+J0o+6RD2Tn8slWnNkv5sUrgGJlVSiNEL
+ZFYu9Wh7W38UKf3L6cw6i6p1f11xx5q7
+Ld2aAtbb3WKD0eKcppz07bgGJlVSiNEL
+oDCQHFNA4fY5iei+2/SOSrgGJlVSiNEL
+tYlIG0HLwv/9krvLV1nKargGJlVSiNEL
+yaR4TMKD+lv+1abMuL6PALgGJlVSiNEL
+gJs/g6YjBO96a2o7ERffvaa1qpic2S+n
+xOnWtGfLTYLo1kK5QTOKi7gGJlVSiNEL
+Y70BKnyskZ3iVXvaF2dCH3qts9tVT1Ku
+wWdh7zMNjTMU48aEfIPucrgGJlVSiNEL
+dFghi4xL3UlErXgHbVuHDrgGJlVSiNEL
+5K+60KseO9C+dX/yNciHJqp1f11xx5q7
+EqYnrxF52mFcQokajwqsQ3qts9tVT1Ku
+RJ2KWgi8FOHqXB9G2xFi3qqHdeHVfA/zC2ByB3hh+BI=
+sAEkRS35hib4zUqiLkaDOSCOlDI1vq4kW6M7h6GPKpQ=
+99HPlnjIbL1br8scIdXxhCCOlDI1vq4kW6M7h6GPKpQ=
+OPMJvmDYUQ3FYIHyLzYDkNeTR/XZs3VKwLWSZ8yoDks=
+ks1KeswX8+Ojg6v0O7nGq8WAX6LVNdgPqnV/XXHHmrs=
+o5g+GnMmmfBGDAqyzJowuyyrN35xm8Fe
+K/28E85J46TzBOxg5UkU25dkzcPpM0pSUpDYf7GcLwU=
+KioIf/vwSjFNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+yB13ip1+ff4obvE/ESfyQRkRZaY/U9MJaW/3PQhnPR4=
+NBO3C8TJXneRPqwAptcVSMY5DkwsDicsSmARnfpRl/s=
+8ox/3+RrftbtCxtzDiOymh2An0yhn8nnMHSvDnioeQ8=
+NQfbVoOWQZbIw0ocFppZqiCOlDI1vq4kMHSvDnioeQ8=
+Ycj4KVq9QMinmIpTern3N5dkzcPpM0pSUpDYf7GcLwU=
+xTORlJOgaiHz4dSuUu4HzZdkzcPpM0pSUpDYf7GcLwU=
+XHjIqXRjURvcSdPuM3cbUx2An0yhn8nnMHSvDnioeQ8=
+mMxR4jiMJWPuqUqHjKeTEKOtthW9wiK6UpDYf7GcLwU=
+2KJ3444pakYBOvmM+ANn4cWAX6LVNdgPGHx0E7OBc/Q=
+xeDUBoRpq/grwvBRB45y4aOtthW9wiK6UpDYf7GcLwU=
+2zvR3L6ORIL/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+YThhFIviAU8HxcQYhp8tjqOtthW9wiK6UpDYf7GcLwU=
+3Sr8cksfK0Kp/v3EqUGwkcWAX6LVNdgPGHx0E7OBc/Q=
+KlVpD76hVvOfgGcLCvKeC8WAX6LVNdgPGHx0E7OBc/Q=
+JJYZStjJZ5wX6+SikxqoQcY5DkwsDicsSmARnfpRl/s=
+bRhSCteG8B4/fZwryJpXi8WAX6LVNdgPGHx0E7OBc/Q=
+gWfjY3ScbvzTMWSHDC6i6Rh8dBOzgXP0
+bsyJCRSx4+OPFvNYk0OZICCOlDI1vq4kMHSvDnioeQ8=
+JS2zAlu2T38H0IvzczhLLZdkzcPpM0pSUpDYf7GcLwU=
+GW4/5GQMgaon2WDvor0mDGTgEgmQimDg
+hL7sUP2BwO5lwspzsJKosRh8dBOzgXP0
+Hb65TsNASpaa+N1ykeW5rz0okq5DXPoQ
+CvPpv98PrMYLs7bHqkYTe8WAX6LVNdgPGHx0E7OBc/Q=
+ga7f4a8i78GVuOZ0pfuwLqOtthW9wiK6UpDYf7GcLwU=
+G6+Vt8WjfoWoRlBdkBJFssWAX6LVNdgPGHx0E7OBc/Q=
+5wIaB+xDhEE1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+/7NNhd+h32PMFIu3ici9MqOtthW9wiK6UpDYf7GcLwU=
+nAwYCEPAd9I2Ygj2xVdZclKQ2H+xnC8F
+5XNYcTDnBhBG5Xd2EtrZYfcLCvtq0hz5
+U4j2bqKyWM9eewRh/Q0v0oMEakZ0IrV8
+D2IwcL16bPsJo73fVyHyOR2An0yhn8nnMHSvDnioeQ8=
+BJNbIWEULni5Ij/FLINEgB2An0yhn8nnMHSvDnioeQ8=
+UUfcio9lAXTXPUOJ17cMy5dkzcPpM0pSUpDYf7GcLwU=
+guVAmxBP1rRzl0kwgGEd5R2An0yhn8nnMHSvDnioeQ8=
+tpJPSuM/iEdcJh+DXDsSkh2An0yhn8nnMHSvDnioeQ8=
+GkTJU9fAWf0dq7Bvuix/2h2An0yhn8nnMHSvDnioeQ8=
+LMwGnb8jOApFKiHwttsti1KQ2H+xnC8F
+3oFf/xWDe+UQJFW+to7FHB2An0yhn8nnMHSvDnioeQ8=
+QQJyIUQ9FKfM4FIKdZszt6OtthW9wiK6UpDYf7GcLwU=
+vTCge+/gzv/3gibjVSs7MaOtthW9wiK6UpDYf7GcLwU=
+taX3Gxi3fzENP13NUcUjU6OtthW9wiK6UpDYf7GcLwU=
+65va6QU4eu4vsjWFDkbuyaOtthW9wiK6UpDYf7GcLwU=
+z84AVL2ZXR04dzsy/MkHyB2An0yhn8nnMHSvDnioeQ8=
+xCEjy0RPh4n/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+M6TT19kPijy0LR+RcM3klh2An0yhn8nnMHSvDnioeQ8=
+T5AUsdP08nxQR93ST55FRx2An0yhn8nnMHSvDnioeQ8=
+yAl7R1nbx1Dh8fcp8Vmb5Rh8dBOzgXP0
+rvxVolqSwBouKp8EMOTcO6OtthW9wiK6UpDYf7GcLwU=
+hTBUpeaw/iSRPqwAptcVSMY5DkwsDicsSmARnfpRl/s=
+uQvy2xGkLulEqQk8jWf3hMY5DkwsDicsSmARnfpRl/s=
+Hq9NuO/+/371RkTRK3SA0B2An0yhn8nnMHSvDnioeQ8=
+QHD9x0dz3QhHeT8qX4gNwMWAX6LVNdgPGHx0E7OBc/Q=
+/VhEByiN/bOBOENZ7wsn46OtthW9wiK6UpDYf7GcLwU=
+ngWGN8DKwIcFXYdHSJbsQR2An0yhn8nnMHSvDnioeQ8=
+dkyHjkLEgw0RQt5nfTjx3x2An0yhn8nnMHSvDnioeQ8=
+RnQ26/5KkzQIRYJtJ6vqvqOtthW9wiK6UpDYf7GcLwU=
+VXrq8zAvYjKfe0C+ySB4uaOtthW9wiK6UpDYf7GcLwU=
+eCC6Dl7OTgwXESDttwlnjR2An0yhn8nnMHSvDnioeQ8=
+rXZRli0vX6CYk7S43yMNsqOtthW9wiK6UpDYf7GcLwU=
+7V3EkTO65+UrwvBRB45y4aOtthW9wiK6UpDYf7GcLwU=
+ZxHoPTuV4+cAndunemKUz6OtthW9wiK6UpDYf7GcLwU=
+EqXqbLH1d0NhqlshazZ5YqOtthW9wiK6UpDYf7GcLwU=
+HRgf2eKZpRoz/wK8Xgk4fhh8dBOzgXP0
+56IdglCcSLSN89cL5n6BOBkRZaY/U9MJaW/3PQhnPR4=
+YFKwZQ0tlkZSJ/xoBTITYj0okq5DXPoQ
+xwSXGAFAcsNVaTv+5quJRh2An0yhn8nnMHSvDnioeQ8=
+r1pNwRvmUDr15UPyX+PVh5dkzcPpM0pSUpDYf7GcLwU=
+DBkwcY05ySNyj4sRMljGT5dkzcPpM0pSUpDYf7GcLwU=
+swrqbhPkSlcqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+QpmzpxGw4NnO+iL/axEY6MWAX6LVNdgPGHx0E7OBc/Q=
+UURppwkU66+rTjL0eQamZ8WAX6LVNdgPGHx0E7OBc/Q=
+/Ip3HPcdFke6Y8rxRTNAzYMEakZ0IrV8
+G9hnx2OUgDhxVImAwcpxIRkRZaY/U9MJaW/3PQhnPR4=
+qhmV4uiNzGMBtld9wMpcehh8dBOzgXP0
+Ta8Db/paj7nflRdTHJ9yxZdkzcPpM0pSUpDYf7GcLwU=
+32KstLuHjTWtyA+ttxPuSBh8dBOzgXP0
+R0BKWexlhKi+zOtc5Fwah4MEakZ0IrV8
+Nem2om6StDc0cxRxSBtSRhh8dBOzgXP0
+o5t4VBdu69n8Oz82iy9RTYMEakZ0IrV8
+fxfJ6RoMGI+4ix4oiZX2k6OtthW9wiK6UpDYf7GcLwU=
+jI5QtUCYYAgsKsPfHh1azcWAX6LVNdgPGHx0E7OBc/Q=
+tGgdDEAjRMvtRWCoq0Oalhh8dBOzgXP0
+b214gJJ6rf9H4CQlYSiaJdeTR/XZs3VK9wsK+2rSHPk=
+fO4QvyH7UNT7sR8MeJwcX2CaWtEhOWcx
+0e9o0KttUaHTGP2eo1YQfib/KxfYdxS6
+PGKr6QvO2ej4Vsqryo5tyMY5DkwsDicsSmARnfpRl/s=
+V0tDiVFWaYY4wif77e5MshkRZaY/U9MJaW/3PQhnPR4=
+LnMBad+fmKutEQr5FjJ1VaOtthW9wiK6UpDYf7GcLwU=
+ZhrzfKcmdRiPFvNYk0OZIB2An0yhn8nnMHSvDnioeQ8=
+5+/DapC0OAbGzne6S+VAbyb/KxfYdxS6
+xo0fNF/FZipm1cuUmJKtvMY5DkwsDicsSmARnfpRl/s=
+saozIdzc//b3ZuttqK5Pu4MEakZ0IrV8
+kQCKl968VncTUFwMdEoHOKOtthW9wiK6UpDYf7GcLwU=
+GuK8q30Rd+EyvXWOV9YsNR2An0yhn8nnMHSvDnioeQ8=
+wXFrN5AIpzRNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+lsWkkEK+Ki7WDXdMyxenYaOtthW9wiK6UpDYf7GcLwU=
+axNjrUXgZaVm1cuUmJKtvMY5DkwsDicsSmARnfpRl/s=
+4yYYPZE/G2yekoUW0EwcUteTR/XZs3VK9wsK+2rSHPk=
+AOmoKUmWERWfV1m0CzUCqcY5DkwsDicsSmARnfpRl/s=
+MHDIkxYgbthNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+W0k5qPxTB6Wj3n/1SNP4kB2An0yhn8nnMHSvDnioeQ8=
+CRfnUfHQHHAQMk+tErpQjyCOlDI1vq4kMHSvDnioeQ8=
+z7t5SfKMCd9FKiHwttsti1KQ2H+xnC8F
+XR33j7h38nVseXKeCCrBqBh8dBOzgXP0
+A320qzeUPAL78UBzNhUFKRh8dBOzgXP0
+KVeilKSy6HfEiw+nRvF8pIMEakZ0IrV8
+JZVeWlWnqfAtbPkZ4QHzHqOtthW9wiK6UpDYf7GcLwU=
+jmpRMchH9XZP5r3MsmwzYaOtthW9wiK6UpDYf7GcLwU=
+5G9I6UEbysVCqqe56B9q16OtthW9wiK6UpDYf7GcLwU=
+nD6fTSt5uKST7HFCueSsYcWAX6LVNdgPGHx0E7OBc/Q=
+FYNhFdNzeaWutrkkUhl/aIMEakZ0IrV8
+NQY9mwurZkNNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+xQxLinTYaTSdCCSK6wg7+oMEakZ0IrV8
+iWOQV773k//AjgYMsni0VYMEakZ0IrV8
+wNNCqjrujy9r2xEnfCwpzh2An0yhn8nnMHSvDnioeQ8=
+fzIdYIZg41dpndkbpI/j79kkrh6n8/H/gwRqRnQitXw=
+3DPu0cSTVVhNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+b30B3PDWMR/VU14/tiowI1KQ2H+xnC8F
+fZGN2fo5mIi0wkBtAWeSaoMEakZ0IrV8
+fzIRmGqe+BjwvThTNBgJK5dkzcPpM0pSUpDYf7GcLwU=
++46rNRzkPK1F2TtCjyWPXVKQ2H+xnC8F
+nkCG9J64YaQ2QI4TIjBJaBh8dBOzgXP0
+4Y5bS/F5qX6gP8TaFxWYmhh8dBOzgXP0
+EijTSP2IiON5wnewXFhUeIMEakZ0IrV8
+dJEfqjuN2ihh+3jcbo/swRh8dBOzgXP0
+uSFy2OcB2jgHZ4qPGqZvOIMEakZ0IrV8
+jAHK0s8Rjb6C2VfKeWohQpdkzcPpM0pSUpDYf7GcLwU=
+KO7pGmytWvnsjnDzp3PFt4MEakZ0IrV8
+3g2+jKcqWObFEE7safZ3fYMEakZ0IrV8
+xlqtHu+d9v7aHrbJcEhgJRh8dBOzgXP0
+szhbqzDvZLU+eIAVmqYEuoMEakZ0IrV8
+Lt85CacVKRbWO3iuTCXLIoMEakZ0IrV8
+Rjw1F4f0QqVYkQlwVnhyN6OtthW9wiK6UpDYf7GcLwU=
+keCeaoHyP7nnTNBCwWmcGhh8dBOzgXP0
+dkwhJNDluk6HNoUDFzZD74MEakZ0IrV8
+too6iVg0TmAuC9bKqa/sy4MEakZ0IrV8
+GPuQUT+rE8DZbmhnJVX52RkRZaY/U9MJaW/3PQhnPR4=
+He3loJpb80BF2TtCjyWPXVKQ2H+xnC8F
+zeoGqUJo3TMUrAGgjSIHl6OtthW9wiK6UpDYf7GcLwU=
+Q0vzJKIVyQrf1f4BmONUt6OtthW9wiK6UpDYf7GcLwU=
+QdZjIvCLI0MqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+sFKDI4oo3x34Vsqryo5tyMY5DkwsDicsSmARnfpRl/s=
+gGiNkCwWYE/y4jFmiynwN5dkzcPpM0pSUpDYf7GcLwU=
+tnIenaVZgSg1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+Qm7oXyQT0VKOvqVfCNLOER2An0yhn8nnMHSvDnioeQ8=
+DfbiQc3FjNSfV1m0CzUCqcY5DkwsDicsSmARnfpRl/s=
+6HHMxcIViBA1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+oJpaxhx4LFYVSTgPnkj7LJdkzcPpM0pSUpDYf7GcLwU=
+wKrjKNtNHKl7tDlQu4FE8B2An0yhn8nnMHSvDnioeQ8=
+jRs6uH5bcXWRJZetKGfVX9eTR/XZs3VK9wsK+2rSHPk=
+sGu1vnbYpo0mxPDNnSAAIBh8dBOzgXP0
+QN187PuAEjn8vDwuFZfo2ZdkzcPpM0pSUpDYf7GcLwU=
+Jdze9NUgiNEkvd/hxQfqrZdkzcPpM0pSUpDYf7GcLwU=
+WsWCpln2mTXWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+dCzxNGa4961kGJQHy79+3MWAX6LVNdgPGHx0E7OBc/Q=
+VCKMbhoLs/lXeT3S3+RTbRkRZaY/U9MJaW/3PQhnPR4=
+9mDyhDBKIrG2DxSyM5ceQyCOlDI1vq4kMHSvDnioeQ8=
+XOuLut56ciG2DxSyM5ceQyCOlDI1vq4kMHSvDnioeQ8=
+zeLZlL+XifE4ga1aDE80gteTR/XZs3VK9wsK+2rSHPk=
+6ksdkkgr0JZex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+raOe6pdfsMZm1cuUmJKtvMY5DkwsDicsSmARnfpRl/s=
+r+l2cStew1CEneb6erNr6CCOlDI1vq4kMHSvDnioeQ8=
+xR/VtpKsxdVxVImAwcpxIRkRZaY/U9MJaW/3PQhnPR4=
+gLZQkEEnWbkqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
++PMx0RkserbIxJr44Kg9S6OtthW9wiK6UpDYf7GcLwU=
+OvBLGYjamyFQcXKnr7ifmNeTR/XZs3VK9wsK+2rSHPk=
+WUwQe9JgHPj9gcurp44+L8WAX6LVNdgPGHx0E7OBc/Q=
+LChKm/jG64JxVImAwcpxIRkRZaY/U9MJaW/3PQhnPR4=
+1GlacRGfvG8TfbkFXURMqteTR/XZs3VK9wsK+2rSHPk=
+fLuapIr5dGX8vDwuFZfo2ZdkzcPpM0pSUpDYf7GcLwU=
+i1eF0Sx9Xh93clC2fphCksWAX6LVNdgPGHx0E7OBc/Q=
+hRaVyFnOjRNgoUBhEqfoORh8dBOzgXP0
+A6ci44/J07FQqLczy7Zd4R2An0yhn8nnMHSvDnioeQ8=
+lL6bIUXSOYaZ3Og/a67uDJdkzcPpM0pSUpDYf7GcLwU=
+vZLXuKxY03Vex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+jpsjeU+KsxZaeztfliRTaRh8dBOzgXP0
+bA5WWs7Qg7oiNpDDEibprNeTR/XZs3VK9wsK+2rSHPk=
+p3EuzoI5DhcxGxdAAgoKm4MEakZ0IrV8
++IMGmmjYDoW/5uPBHaxTJCb/KxfYdxS6
+LQUFUHjnr7UttVHlF3HFoYMEakZ0IrV8
+/Mm8mCa2HlzKu6ryUYTVdoMEakZ0IrV8
+JWcUfmJpGsds+tE269ScU4MEakZ0IrV8
+nP1oCbpGVLv+6KDrJpNNM2TgEgmQimDg
+Yez1ERbxQeamiI3+sMo70IMEakZ0IrV8
+5LkHFbt8yoq/5uPBHaxTJCb/KxfYdxS6
+73Tswbd3YgKutrkkUhl/aIMEakZ0IrV8
+8l6mqwfmk+xBcTLWzKa+voMEakZ0IrV8
+am/8tXL10PqeL1iPrOCbVBh8dBOzgXP0
+bUWe25D0HypdyzHXGGGs8xh8dBOzgXP0
+s+WJENYjmlXxbIQot5MRj8Y5DkwsDicsSmARnfpRl/s=
+tFu0h5Rte4jR2YjYyiilDcWAX6LVNdgPGHx0E7OBc/Q=
+cbnjyj3XVJE7803jm/yXbiCOlDI1vq4kMHSvDnioeQ8=
+3R8sNENbI57asvejoa6HcBh8dBOzgXP0
+8qjvJhATBfEOnS2dCbQqt5dkzcPpM0pSUpDYf7GcLwU=
+kQYvGCYGG30l18oDvxWrSCb/KxfYdxS6
+LLXJ4Gf1sja+1wWbigsLCB2An0yhn8nnMHSvDnioeQ8=
+unke1pTFk0iRwOknXSjgtRh8dBOzgXP0
+k6FmLcYl5bPBxzYNxsK2P4MEakZ0IrV8
+Crr0UkO3MIjjKKKTXK8RniCOlDI1vq4kMHSvDnioeQ8=
+S+lZ/TuxeJz/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+34uUjROpFWxex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+FgjMaICJfZEmhdN5xe9ePZdkzcPpM0pSUpDYf7GcLwU=
+4nr+8jIhGeAB7KuaDDIO1h2An0yhn8nnMHSvDnioeQ8=
+qjo6QStEMcWjCA0mZTXe/BkRZaY/U9MJaW/3PQhnPR4=
+w28xlbBhJb+qknOoQbyhkKOtthW9wiK6UpDYf7GcLwU=
+OAfiPmGWCWmy0O3xuiPyBJdkzcPpM0pSUpDYf7GcLwU=
+p65X7IfJ60X0FAzewXMZLZdkzcPpM0pSUpDYf7GcLwU=
+Ux2jmAezWlymiczS51AAkB2An0yhn8nnMHSvDnioeQ8=
+HTNums8nF2k+o1XI7wFy6MWAX6LVNdgPGHx0E7OBc/Q=
+5BdhD8ALRTjYdo0YyFSUzteTR/XZs3VK9wsK+2rSHPk=
+BR2fTQVfTic2Ygj2xVdZclKQ2H+xnC8F
+Y72NZ665aWtIDMkTJ7H4VBh8dBOzgXP0
+cTrWqFl05U1+/NxwjEIRQ4MEakZ0IrV8
++gmt5JsGII1n5hfF+sVT7xh8dBOzgXP0
+9CB7Y38Iruc7+640anOZlSb/KxfYdxS6
+Kjriis2eMzzBciCaqmLN54MEakZ0IrV8
+uKx+/aC8O5iSfOjaarKwDyb/KxfYdxS6
+lknc/1UHONkFH9riPu68rx2An0yhn8nnMHSvDnioeQ8=
+jsMAyl92GAj7RIFjH5BfQZdkzcPpM0pSUpDYf7GcLwU=
+nnKGp+irlWm+dX/yNciHJhh8dBOzgXP0
+j1jXZjExGI29NB9hNSRILBh8dBOzgXP0
+BATpDi4lLfGIDgQg/Fvt3Rh8dBOzgXP0
+k/dRUuexklP8Oz82iy9RTYMEakZ0IrV8
+4VjrLD4FWL07+640anOZlSb/KxfYdxS6
+Ovwx7OFKrM4kwAaC1fb8pRh8dBOzgXP0
+re9PQmMzUqkgvwipfvcNZRh8dBOzgXP0
+JEt7OjmS6+zsk0UrmZ9Ha4MEakZ0IrV8
+85C3w2lkbXnTtNdCIEz+SIMEakZ0IrV8
+XSmroEw9FS03lO+T+coNWoMEakZ0IrV8
+DPGNCfdoBE5v35rsf16PZoMEakZ0IrV8
+Bc16H0Z/CwucGp+BC4pZG5dkzcPpM0pSUpDYf7GcLwU=
+8LAKWJolIS9rH63ZvpfOXZdkzcPpM0pSUpDYf7GcLwU=
+v99ds9+lWDNKNwQ9DS6xKoMEakZ0IrV8
+yz5mSnANrQSpmYlND1T08Bh8dBOzgXP0
++QotMI0XlGMHLJ1H+9SaVyCOlDI1vq4kMHSvDnioeQ8=
+A137zV+G8sroVMYmXl4Mi5dkzcPpM0pSUpDYf7GcLwU=
+lgdzyxxqvyG30z/h++1MrZdkzcPpM0pSUpDYf7GcLwU=
+27k8UPPlunrsQtdwNvzkAB2An0yhn8nnMHSvDnioeQ8=
+xFhzXpymT0LWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+cr6vwEFWQXGidcSUYpMSYMWAX6LVNdgPGHx0E7OBc/Q=
+v3eFXjALU5Bex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+dqjssxu/jdkvmauKEvAaY8WAX6LVNdgPGHx0E7OBc/Q=
+WpPwd6TTUGHUcqTseE17+KOtthW9wiK6UpDYf7GcLwU=
+x49OpYaGFoNEpBEygT7H6qOtthW9wiK6UpDYf7GcLwU=
+SnFAvZNKdwY9UzAj9Xt34aOtthW9wiK6UpDYf7GcLwU=
+CJR4+H1OO4etyA+ttxPuSBh8dBOzgXP0
+EN2z4UXNGl0B2JImnC+Hl9eTR/XZs3VK9wsK+2rSHPk=
+xm4HmVU2cgwXESDttwlnjSCOlDI1vq4kMHSvDnioeQ8=
+RDZl49UFK9ABJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+9d8P4DbtI0UkjpEAne6RAKOtthW9wiK6UpDYf7GcLwU=
+CRd2E1ewdnnWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+dLBRMlMKPCcp6R/9jooRm6OtthW9wiK6UpDYf7GcLwU=
+uRxDHPZmfczJPsskCXgQ0IMEakZ0IrV8
++szoJVJk1mzFMy9XEaJfzCb/KxfYdxS6
+dZvNsvXrBKGAiHc+YESedMY5DkwsDicsSmARnfpRl/s=
+dwXvhW7qqik0r9vQ/94VZKOtthW9wiK6UpDYf7GcLwU=
+PEwzODYeESvWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+lFI/Il9mQLTmE9DvkqV+vYMEakZ0IrV8
+xYD0BTHv+Rf/Hxu1OzY2P9eTR/XZs3VK9wsK+2rSHPk=
+lE5e47O0eNySfOjaarKwDyb/KxfYdxS6
+VbSVFqXmT6aRPqwAptcVSMY5DkwsDicsSmARnfpRl/s=
+mtpgBJ5Os0I5zUkbnLOgWIMEakZ0IrV8
+EMdo3vKWNVxz0/SFIgYbVVKQ2H+xnC8F
+mMkl88PFcehgIP7YuyNph4MEakZ0IrV8
+/qjXnd6tWuQnqYRJMZm8H4MEakZ0IrV8
+KPrD75PhOfwl18oDvxWrSCb/KxfYdxS6
+3sq8FTWCQ068Z/rQSVVCiIMEakZ0IrV8
+/Aqv/sG2LBiWgznSh+iLhtwlBhK2CH9tMHSvDnioeQ8=
+gJYgWFwANLoye3UgOZx3YBh8dBOzgXP0
+PgM9Huc5hWsAIv6jblFCbcWAX6LVNdgPGHx0E7OBc/Q=
+DTW4YQVTpzkhQHWoZSWkGMWAX6LVNdgPGHx0E7OBc/Q=
+CqKXTAJUghfiFx9NAB+QUxh8dBOzgXP0
+9aQb1mSb1rtmxA3pXGemOBkRZaY/U9MJaW/3PQhnPR4=
+M1c424hvhlqD8eNfQOzEVMWAX6LVNdgPGHx0E7OBc/Q=
+MFqn2Ts+2PxgrFsNX2XR69eTR/XZs3VK9wsK+2rSHPk=
+H2CmnsRTaJJQls/CEvTHydeTR/XZs3VK9wsK+2rSHPk=
+CpEbbDTHSVn/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+8S1Vq3o77rvzrdpn+f5OWMWAX6LVNdgPGHx0E7OBc/Q=
+promyYCf2xnAiwXfJ1CCuIMEakZ0IrV8
+a8n2gh4DzxTGzne6S+VAbyb/KxfYdxS6
+UnvS/Ju3I/gXGPhbCd5TE8WAX6LVNdgPGHx0E7OBc/Q=
+GTxF2VIQGQeabwesfUX3QsWAX6LVNdgPGHx0E7OBc/Q=
+q3iZCh5/w9/m+8SDb1QGbMWAX6LVNdgPGHx0E7OBc/Q=
+rivPGeOq1kVn8Cl7DNPnfpdkzcPpM0pSUpDYf7GcLwU=
+Pc1kWCpPeeJo67I3dC4aAJdkzcPpM0pSUpDYf7GcLwU=
+7h0Fnz5v+95ON+qbG7arZZdkzcPpM0pSUpDYf7GcLwU=
+Houc0VCoGXYy1XmB8BCeJ8WAX6LVNdgPGHx0E7OBc/Q=
+1Z8Am5tt6CdyP6Qn2DCpIcWAX6LVNdgPGHx0E7OBc/Q=
+FVxKh9fJOIAHScCpRFo0IR2An0yhn8nnMHSvDnioeQ8=
+dRNd+r6qEbZWcLGKFAhHV5dkzcPpM0pSUpDYf7GcLwU=
+PJ0BQd2W8tNLEZdp6egwu8Y5DkwsDicsSmARnfpRl/s=
+cl57lapWXM74Vsqryo5tyMY5DkwsDicsSmARnfpRl/s=
+Ipfu1UCaOjRFKiHwttsti1KQ2H+xnC8F
+JTPTDc5nGVT8vDwuFZfo2ZdkzcPpM0pSUpDYf7GcLwU=
+7mQJ0kRJhTPMZVa9eXN2PqOtthW9wiK6UpDYf7GcLwU=
+DIuBiKURTLABJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+cD7DDlDZSIL/UIxFuvEKEcWAX6LVNdgPGHx0E7OBc/Q=
+qm5Z0OqWI3hex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+PdvYvOtKOvuRh8Hu5xnz2pdkzcPpM0pSUpDYf7GcLwU=
+uutDS6WaDahTjRBTfKsty1KQ2H+xnC8F
+ULSJLS1qAWoZ32H6X7NNZx2An0yhn8nnMHSvDnioeQ8=
+V+eZVR81gU8nRbvWH9bE9h2An0yhn8nnMHSvDnioeQ8=
+cC2Qql0ACOB0HjSFPR43MoMEakZ0IrV8
+54vALJTBZvr8V9bm6Ooyy9eTR/XZs3VK9wsK+2rSHPk=
+Mf4pBvzFyuOf2dzMPCXVyBh8dBOzgXP0
+veWV+dwdZ/dsnQ9ow8rxmoMEakZ0IrV8
+jggCbYWeWJfb42D2b8mjtYMEakZ0IrV8
+Jns9zQioaZeeTVCLXRXsAKOtthW9wiK6UpDYf7GcLwU=
+ro0/TXuaAxjElV/Mnhvw+NeTR/XZs3VK9wsK+2rSHPk=
+R2V9cgv/pqo3wOkC9+0HINeTR/XZs3VK9wsK+2rSHPk=
+iNlze4E4/jpvKQhlpA5plJdkzcPpM0pSUpDYf7GcLwU=
+yT4TSjQKMeEikfmChjmepsWAX6LVNdgPGHx0E7OBc/Q=
+HdZ31gzQF9c7OuXnwdU6cxkRZaY/U9MJaW/3PQhnPR4=
+NVzrmXRZsbLHhHCapeGwIJdkzcPpM0pSUpDYf7GcLwU=
+uyOinz2/J1LJKqbLImLj78WAX6LVNdgPGHx0E7OBc/Q=
+7XNdhyWh1GNuf007IkcH75dkzcPpM0pSUpDYf7GcLwU=
+NdfEzAeaK0pJuFZCZMhG7BkRZaY/U9MJaW/3PQhnPR4=
+Hci5nGIm8FD/rnqmYXghPcWAX6LVNdgPGHx0E7OBc/Q=
++s7io0k4FyYBJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+qleeHbSGRZByYm1ZSCssTteTR/XZs3VK9wsK+2rSHPk=
+7krlETqOp60vjLhIuq6sgD0okq5DXPoQ
+G9eCM06xA5VaGyDoRHUsdsWAX6LVNdgPGHx0E7OBc/Q=
+wD1JbNSf726PouNM8CbR15dkzcPpM0pSUpDYf7GcLwU=
+U1FNRgoxCgxMsQgeX0FwVpdkzcPpM0pSUpDYf7GcLwU=
+b5rlHGSdN5IAdZcia36pjsWAX6LVNdgPGHx0E7OBc/Q=
++br1L66mZkO9XvSJdL9MyteTR/XZs3VK9wsK+2rSHPk=
+PoHWaBvBmZNQTN9mSYvDJJdkzcPpM0pSUpDYf7GcLwU=
+UzTSoCUeqm6fyPuEyzS5ZNeTR/XZs3VK9wsK+2rSHPk=
+Cn/QlnjOGoJgvWE3q1auqMWAX6LVNdgPGHx0E7OBc/Q=
+o88BkQpEMUd7yoYa02wYnsWAX6LVNdgPGHx0E7OBc/Q=
+ErgQxb3CVz9AfHPdI01wN6qHdeHVfA/zJv8rF9h3FLo=
+Qsv5maA/dF3Z8QIPCkHhO5dkzcPpM0pSUpDYf7GcLwU=
+79Lg5CUKDmo1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+ZtLkBkMZ0INxoX1YBnywpqOtthW9wiK6UpDYf7GcLwU=
+mQ3q7TokPuEZ+T2p6IwG+sWAX6LVNdgPGHx0E7OBc/Q=
+ucjlA/Hm3WY75YXEVqChw8WAX6LVNdgPGHx0E7OBc/Q=
+y4E47bkD6PRNwtcmXV5vlsWAX6LVNdgPGHx0E7OBc/Q=
+0eiySVjpJZaRkc/RzaYxuteTR/XZs3VK9wsK+2rSHPk=
+zk/hzPkjAbywAElBDLCFxMY5DkwsDicsSmARnfpRl/s=
+sYEV1UAWY9xKl+n5U/v6kRh8dBOzgXP0
+L9bmOzgk+WfZWTXWrY+kZsY5DkwsDicsSmARnfpRl/s=
+WfVD+H52M/R7o4odWO++N/cLCvtq0hz5
+hiYqvtKHjHlrebaRdc+sfiCOlDI1vq4kMHSvDnioeQ8=
+ySLtgXCj++7wx4pyZK17msWAX6LVNdgPGHx0E7OBc/Q=
+Nw8gqWSHqFuAiHc+YESedMY5DkwsDicsSmARnfpRl/s=
+wU1WlNtiAiV+7AYbTNYw4MWAX6LVNdgPGHx0E7OBc/Q=
+vYqBgWqbd6wwso41jtrsKcWAX6LVNdgPGHx0E7OBc/Q=
+gjVSL91rc/ntDKREquMk/CCOlDI1vq4kMHSvDnioeQ8=
++tmQ/uqREgNXeT3S3+RTbRkRZaY/U9MJaW/3PQhnPR4=
+PibuOrUQ7CKGI6KxAN5lc8WAX6LVNdgPGHx0E7OBc/Q=
+Mddit7e9ibzRuQVwPidg/cWAX6LVNdgPGHx0E7OBc/Q=
+h5FEpOVRAKvxbIQot5MRj8Y5DkwsDicsSmARnfpRl/s=
+OoGr8CqMd+r7RIFjH5BfQZdkzcPpM0pSUpDYf7GcLwU=
+ZKxms5FCA30Bk6Fegii9mR2An0yhn8nnMHSvDnioeQ8=
+GNRwBzQ1Jf+y0O3xuiPyBJdkzcPpM0pSUpDYf7GcLwU=
+z9yWaFqq8NqpYttBxY4WySCOlDI1vq4kMHSvDnioeQ8=
+T2Ik/5URWdf8V9bm6Ooyy9eTR/XZs3VK9wsK+2rSHPk=
+XXRZ/77uf11kJAXZn2d3zaqHdeHVfA/zJv8rF9h3FLo=
+TbMBgbZMeMeCzGKd8LXRhh2An0yhn8nnMHSvDnioeQ8=
+IVGUDAcnZK9eZwVzMJT18cWAX6LVNdgPGHx0E7OBc/Q=
+TrBnQxslfgABJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+JskPCaWlqH0AdZcia36pjsWAX6LVNdgPGHx0E7OBc/Q=
+nAAyT/GpUcSmZrh4182cJJdkzcPpM0pSUpDYf7GcLwU=
+RpTMlS4Fwr1w1w5o5HHGjNeTR/XZs3VK9wsK+2rSHPk=
+3mE30tIvwTgm7xT0wJidLteTR/XZs3VK9wsK+2rSHPk=
+MyQjwXfXD6Xe6qbgYozgjdeTR/XZs3VK9wsK+2rSHPk=
+s9M7XS+rLVjFQKB7O/PJVCCOlDI1vq4kMHSvDnioeQ8=
+/GVTwYSH2SIiQ0OReIiET2CaWtEhOWcx
+id/fPIwrHufWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+qZByg6Lqc+b/Hxu1OzY2P9eTR/XZs3VK9wsK+2rSHPk=
+Z285T8ObHXPUK2pdUDEVwU+5TjAW0UK0gwRqRnQitXw=
+lDSuTjIrpvOwAElBDLCFxMY5DkwsDicsSmARnfpRl/s=
+iZVXFvOtRtUfASsrC8SHW9eTR/XZs3VK9wsK+2rSHPk=
+c+dCNEkQf0SEKB4HNpwOUZdkzcPpM0pSUpDYf7GcLwU=
+DAUTwVhtYeyfV1m0CzUCqcY5DkwsDicsSmARnfpRl/s=
+KWSH/hpKWpBUFs54FTOaBiCOlDI1vq4kMHSvDnioeQ8=
+nQta+2/zegZI8kgWKt2ugaOtthW9wiK6UpDYf7GcLwU=
+gxjC7V1sACVjsboY6LVle5dkzcPpM0pSUpDYf7GcLwU=
+udZI8wSG5BIBJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+b3g/g8g3CKcmTMw6+cFe2MWAX6LVNdgPGHx0E7OBc/Q=
+CnJ/iIs1rUDm4iPHM0n2byCOlDI1vq4kMHSvDnioeQ8=
+Eatv52yqxh8X6+SikxqoQcY5DkwsDicsSmARnfpRl/s=
+gEpZqLyf6Ggkvd/hxQfqrZdkzcPpM0pSUpDYf7GcLwU=
+pT+XmluPMFP8vDwuFZfo2ZdkzcPpM0pSUpDYf7GcLwU=
+JkS/1c5zqMDWfyli4rRcqNeTR/XZs3VK9wsK+2rSHPk=
+R5WXzA1/tPSq4/AgJNI0m5dkzcPpM0pSUpDYf7GcLwU=
+4RFXvd6YmGsq3WV1a+i5CteTR/XZs3VK9wsK+2rSHPk=
+RjeCaXmDcGvuvqZdEK+q/sWAX6LVNdgPGHx0E7OBc/Q=
+Wro0kuJkLAmRh8Hu5xnz2qOtthW9wiK6UpDYf7GcLwU=
+sGdIjpxcpF+7wqHkTIRxghh8dBOzgXP0
+Np/XRe7jhiUPUKWUFMdfu8WAX6LVNdgPGHx0E7OBc/Q=
+BnIOAeHnAqUnX3KKbA5juZdkzcPpM0pSUpDYf7GcLwU=
+NFyZpMW6G7lqF4wvcoOiEpdkzcPpM0pSUpDYf7GcLwU=
+P6gGMNQrCF0+/mUpmgrzM8WAX6LVNdgPGHx0E7OBc/Q=
+/CCSf2XKOmwBY7C7uLmJQyCOlDI1vq4kMHSvDnioeQ8=
+PeATEvxbIPEyResgrmUIKMWAX6LVNdgPGHx0E7OBc/Q=
+3/KaKYe/uFepvXk7rAC36qOtthW9wiK6UpDYf7GcLwU=
+koRxEeiub/efV1m0CzUCqcY5DkwsDicsSmARnfpRl/s=
+ncrtOGRy1DRZMMbwkriszJdkzcPpM0pSUpDYf7GcLwU=
+jgBsxlsCNsEmZbmgnl4inRh8dBOzgXP0
+4Onwgi1RC+XvtjRWuPZHv6OtthW9wiK6UpDYf7GcLwU=
+tlM09cIcyDlvIKTSTmDUg6OtthW9wiK6UpDYf7GcLwU=
+pZ0sQHS7H/M/PrLXpUlI6qOtthW9wiK6UpDYf7GcLwU=
+W5Ce+rf8QEVNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+vyWyp/5/7es+tOjElU85kMWAX6LVNdgPGHx0E7OBc/Q=
+xCbyEX4yIxkqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+8+2C7IKsc4JRT6Ca/eCpzsWAX6LVNdgPGHx0E7OBc/Q=
+gYoVKQpT9Kway//XQnaHm6OtthW9wiK6UpDYf7GcLwU=
++uSC9DCwHDLZbmhnJVX52RkRZaY/U9MJaW/3PQhnPR4=
+YrbEzaai8aMwW011FvoFfsWAX6LVNdgPGHx0E7OBc/Q=
+KcuDORUG3SyHcHBtdNBSqxkRZaY/U9MJaW/3PQhnPR4=
+/DHYbgVWHbcqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+SHuBeCeq5Rc1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+AWwrb+vxtIo1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+BGWz5zIXr5FWcLGKFAhHV5dkzcPpM0pSUpDYf7GcLwU=
+0aMpxo3ShoRm1cuUmJKtvMY5DkwsDicsSmARnfpRl/s=
+tTXC7NnySWD7RIFjH5BfQZdkzcPpM0pSUpDYf7GcLwU=
+t3hwllPoKkY5yBh5zkn/6KOtthW9wiK6UpDYf7GcLwU=
+hh8j3bWk6x5ms1SZ9iDXwcWAX6LVNdgPGHx0E7OBc/Q=
+XtY6LZ76Dz//CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+Z2aEqflvwabNOxiW/N+/5pdkzcPpM0pSUpDYf7GcLwU=
+G0x9jgNM66N3MpdYJGMpIx2An0yhn8nnMHSvDnioeQ8=
+vG+M8f8RvfkT4Du5zQ0eVR2An0yhn8nnMHSvDnioeQ8=
+w+Yk/ChZoak+cWfjnFY5hhkRZaY/U9MJaW/3PQhnPR4=
+d7/3ZMAVv6cX6+SikxqoQcY5DkwsDicsSmARnfpRl/s=
+XioDMImnztozhdUlSVu59BkRZaY/U9MJaW/3PQhnPR4=
+OH4PF68qqMRcd0Pv+DvZlMWAX6LVNdgPGHx0E7OBc/Q=
+bIbZNt+yyu9IICx65f04CpdkzcPpM0pSUpDYf7GcLwU=
+qJk6aG0SBGQ1aRPPSnB+UsY5DkwsDicsSmARnfpRl/s=
+Q1eIXcX/t4rn7MKSnyfBd6OtthW9wiK6UpDYf7GcLwU=
+o7bY4ZFhHpOPB4uyqg/0LaOtthW9wiK6UpDYf7GcLwU=
+QEDlY0EIH03VU14/tiowI1KQ2H+xnC8F
+mtHkENsw+4i11nd7u1J+mB2An0yhn8nnMHSvDnioeQ8=
+JkVqWmDtItp7LTFKqw4ek6OtthW9wiK6UpDYf7GcLwU=
+y5vfU25mxHLWUCgs2La+QqOtthW9wiK6UpDYf7GcLwU=
+KVv6uruXXdezuOZFqz3FDdeTR/XZs3VK9wsK+2rSHPk=
+HdKROqC9gbn4Vsqryo5tyMY5DkwsDicsSmARnfpRl/s=
+eK6VRfg0P0hyVOIAlhFWFxh8dBOzgXP0
+6mGZloafwFA8gBAue4OStRkRZaY/U9MJaW/3PQhnPR4=
+iKQBMV73pH5CTNPvg7cvTcY5DkwsDicsSmARnfpRl/s=
+4swpKBXNHDnlQcqWXv98WNeTR/XZs3VK9wsK+2rSHPk=
+kL1LjFsFOVQb3BIFiUkIi5dkzcPpM0pSUpDYf7GcLwU=
+GLUHV7uBRY6lUi9deTLwVMWAX6LVNdgPGHx0E7OBc/Q=
+DOkU4LDDh/UzZ4tR7YPyiMWAX6LVNdgPGHx0E7OBc/Q=
+4h/n3CzQk0EqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+XqC3e0ITrpuCKI1BQAxl1SCOlDI1vq4kMHSvDnioeQ8=
+pRO0XMPVqKQmpfxwYE04p9eTR/XZs3VK9wsK+2rSHPk=
+OjRY1HXM+z1r1B96hNGmsKOtthW9wiK6UpDYf7GcLwU=
+hNTj5dYP6GgpQli/oD6eAaOtthW9wiK6UpDYf7GcLwU=
+IVpaSmd17umwAElBDLCFxMY5DkwsDicsSmARnfpRl/s=
+HZzCCoYeqOzIDpMHFDXpTcWAX6LVNdgPGHx0E7OBc/Q=
+gYW05s7cbXEHngdJkood0B2An0yhn8nnMHSvDnioeQ8=
+eX6dwWJVaMBm1cuUmJKtvMY5DkwsDicsSmARnfpRl/s=
+kD6XiOxky4+lUi9deTLwVMWAX6LVNdgPGHx0E7OBc/Q=
+Fn3CKg99Bm5yHmx1jHSyDBkRZaY/U9MJaW/3PQhnPR4=
+8y6+LYb83zpVnmsygPmaI6OtthW9wiK6UpDYf7GcLwU=
+b3NrmWfB0oRNXiucgF9Qb8Y5DkwsDicsSmARnfpRl/s=
+c30ty2K47Yp9V7HH7a8mix2An0yhn8nnMHSvDnioeQ8=
+dp0UNvNRReiYbYRf1nVvfaOtthW9wiK6UpDYf7GcLwU=
+XESmjpa/j13joOSu6lYi8aOtthW9wiK6UpDYf7GcLwU=
+NpHW879/YmH7rv+ayztEd6OtthW9wiK6UpDYf7GcLwU=
+gSsx6VI6aazUsErpmDr7Thh8dBOzgXP0
+9nH77u3/7UlcqkANzIjv0xh8dBOzgXP0
+lIiITirSJTITUFwMdEoHOKOtthW9wiK6UpDYf7GcLwU=
+u4dDw975AEBbQnoE+7hVaqOtthW9wiK6UpDYf7GcLwU=
+8YjWakHF8BpuSEWRQFVEANeTR/XZs3VK9wsK+2rSHPk=
+GO2wunuwBP6P0bJRwF21S6OtthW9wiK6UpDYf7GcLwU=
+Rnt+UDMs1M2hLyOLw9N3acWAX6LVNdgPGHx0E7OBc/Q=
+TNh576fEyHDWLQOWJYxFjRkRZaY/U9MJaW/3PQhnPR4=
+Wcpvoz/cHSBIrySmxlyYjKOtthW9wiK6UpDYf7GcLwU=
+eurDrabRH/wtqFMmGRxxKqOtthW9wiK6UpDYf7GcLwU=
+SNz8notuOeMqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+/SJhPqEfiyHKsms8QTljzCCOlDI1vq4kMHSvDnioeQ8=
++iav2cv7dyBbZyIIG7jyM9eTR/XZs3VK9wsK+2rSHPk=
+7QDiToNHBdvhwzFBfYgVaJdkzcPpM0pSUpDYf7GcLwU=
+V33Rj/sin1yVpn1mzCkw7pdkzcPpM0pSUpDYf7GcLwU=
+/h8HxTq92f05kyaMNadVFB2An0yhn8nnMHSvDnioeQ8=
+01JwpLKNytT/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+8HNCj9e89dGg8Jrpm038ZYMEakZ0IrV8
+xLtfJr6bHLz1XEcithQEdKOtthW9wiK6UpDYf7GcLwU=
+ADH8fRlKBa2jZP+265Fm8BkRZaY/U9MJaW/3PQhnPR4=
+S5r9ehg8hwmqMEfhWQDt5yCOlDI1vq4kMHSvDnioeQ8=
+66sxuMU+HF3w+RbvRp7Hy5dkzcPpM0pSUpDYf7GcLwU=
+e/V2W8XaLZzesYX5FbcaWh2An0yhn8nnMHSvDnioeQ8=
+m+cCCJFzWbD2ZdxSvQC7EsWAX6LVNdgPGHx0E7OBc/Q=
+fzIdYIZg41dEK1aJ14hFtSCOlDI1vq4kMHSvDnioeQ8=
+2HP2Kc9wCe69EncC198aeeZVB7mY8h37aW/3PQhnPR4=
+JBWF7pUD15Dpf/37+XRA5x2An0yhn8nnMHSvDnioeQ8=
++MLWVWV8uiz/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+8jDvhuMI3m329ywIMbfV+aOtthW9wiK6UpDYf7GcLwU=
+9s3cRUx75sbQjEWjb8/VyR2An0yhn8nnMHSvDnioeQ8=
+GMhL8lDkS8iskJRp3v9GeMY5DkwsDicsSmARnfpRl/s=
+TKjhositePFnJhXnWkz1h9eTR/XZs3VK9wsK+2rSHPk=
+9njJj9YuXebyfCLXFkCdfhh8dBOzgXP0
+fhSJTALQpei2DxSyM5ceQyCOlDI1vq4kMHSvDnioeQ8=
+kG68RZPkFXBcEe7N73MVbteTR/XZs3VK9wsK+2rSHPk=
+OFxOWAu5tbO2DxSyM5ceQyCOlDI1vq4kMHSvDnioeQ8=
+fnbCNY2tym5950ynmoF1rJdkzcPpM0pSUpDYf7GcLwU=
+3Te/nvKGDLcQaKsreiJw9CCOlDI1vq4kMHSvDnioeQ8=
+Aul6jSkWg7KxTxFeS1hpQhh8dBOzgXP0
+skRy3KohSH33pAl/v9Xu2cWAX6LVNdgPGHx0E7OBc/Q=
+OOl3oxzwgnOy0O3xuiPyBJdkzcPpM0pSUpDYf7GcLwU=
+QnpWdsNSm4xPKfCb+n1fLcWAX6LVNdgPGHx0E7OBc/Q=
+hXf546brDVFadXYDgsAJ7x2An0yhn8nnMHSvDnioeQ8=
+s4Shv7aydq6X1U0N4zGKCx2An0yhn8nnMHSvDnioeQ8=
+IehX2LlU9Mc8gBAue4OStRkRZaY/U9MJaW/3PQhnPR4=
+noKUvDkE0Ztv+9C3VzVlydeTR/XZs3VK9wsK+2rSHPk=
+OB1CLA6CiukGVu1YRoB9TSCOlDI1vq4kMHSvDnioeQ8=
+b6mcIx5Ng9jOfCqz7BPkQyCOlDI1vq4kMHSvDnioeQ8=
+GoEW/ejxQ288gBAue4OStRkRZaY/U9MJaW/3PQhnPR4=
+tH0QSYwhm12RPqwAptcVSMY5DkwsDicsSmARnfpRl/s=
+z5/GDYH2SEB5gEMVGBETmKOtthW9wiK6UpDYf7GcLwU=
+TTONaIF0eOj+6KDrJpNNM2TgEgmQimDg
+SmGhVYgW4yInyIeqDT55DyCOlDI1vq4kMHSvDnioeQ8=
+xcfYqytJG2+Twp4juMWvM6OtthW9wiK6UpDYf7GcLwU=
+1r/PiLOaDwoX6+SikxqoQcY5DkwsDicsSmARnfpRl/s=
+EKmEwCTw8CWpx0+4nd3UTcWAX6LVNdgPGHx0E7OBc/Q=
+K3rC3ryXSlnEl8q+pkR6FNeTR/XZs3VK9wsK+2rSHPk=
+yzK+Yuf799fwx4pyZK17msWAX6LVNdgPGHx0E7OBc/Q=
+g/Hgt0/Jjjm3VYGDkP8Ot5dkzcPpM0pSUpDYf7GcLwU=
+Atwqo+Tu3Ueqwql/yeDx3MWAX6LVNdgPGHx0E7OBc/Q=
+iOuAOrxcyTdrgXjFVn4oM8WAX6LVNdgPGHx0E7OBc/Q=
+C8mMemdJawhc8oezOyWf+8WAX6LVNdgPGHx0E7OBc/Q=
+Dsgg4sKl941V5sGNHfssKSCOlDI1vq4kMHSvDnioeQ8=
+FR7gvbKWc7s4ga1aDE80gteTR/XZs3VK9wsK+2rSHPk=
+g0C8NkGzea+YKIsAPEcUmNeTR/XZs3VK9wsK+2rSHPk=
+VW5D+k2xaY29RtWk3sezJCCOlDI1vq4kMHSvDnioeQ8=
+/ODghHzeBL29Za9jhpiUjteTR/XZs3VK9wsK+2rSHPk=
+wsOBA4KoSTizuOZFqz3FDdeTR/XZs3VK9wsK+2rSHPk=
+6lpwCr9FwunK3IYDhLkaF8WAX6LVNdgPGHx0E7OBc/Q=
+BNuT2mewF5sBJBHzh/mfgZdkzcPpM0pSUpDYf7GcLwU=
+Qxyf2ZLqZyaLPmyI0ov+MMWAX6LVNdgPGHx0E7OBc/Q=
+oWDvK4BkrvEj/zDfTnDF7GCaWtEhOWcx
+/vhPOMB458j/CqshHti1ehkRZaY/U9MJaW/3PQhnPR4=
+BPMuhEQHX9oRzKbMJo8xS8WAX6LVNdgPGHx0E7OBc/Q=
+rnkIoTWEgFIePyL0b/W/KMWAX6LVNdgPGHx0E7OBc/Q=
++wG9CRcrHj1jsboY6LVle6OtthW9wiK6UpDYf7GcLwU=
+9LZh6B6KWXJLS5w8d5sWeMWAX6LVNdgPGHx0E7OBc/Q=
+FXP8QE2NyiYqRGfLZlV9U8WAX6LVNdgPGHx0E7OBc/Q=
+fGR1aUruk2gExLa1GQth8sWAX6LVNdgPGHx0E7OBc/Q=
+wqq+Z0thtXZex925X9CvAyCOlDI1vq4kMHSvDnioeQ8=
+6FSs1w+frjz5FRCh77OensWAX6LVNdgPGHx0E7OBc/Q=
+XzPnJOBMz/dCTNPvg7cvTcY5DkwsDicsSmARnfpRl/s=
+ozOz+yvfxH5Yy9T9qe/NedeTR/XZs3VK9wsK+2rSHPk=
+LVdJE+8Cs8t/ULiYecGzYZdkzcPpM0pSUpDYf7GcLwU=
+fWBo+MiWaIZjPFVJfjuMaMWAX6LVNdgPGHx0E7OBc/Q=
+X5zGza9d+XT66dV+o0NSIZdkzcPpM0pSUpDYf7GcLwU=
+UodjVCPAfr+wAElBDLCFxMY5DkwsDicsSmARnfpRl/s=
+qgcvFmJtWk/4Vsqryo5tyMY5DkwsDicsSmARnfpRl/s=
+7JUszTiZrBE4wif77e5MshkRZaY/U9MJaW/3PQhnPR4=
+hrsDmo1TAHItmO4KHNWldSCOlDI1vq4kMHSvDnioeQ8=
+3+gQwX7OBLyqwql/yeDx3MWAX6LVNdgPGHx0E7OBc/Q=
+MloFpoN0JD62SPDyKy/5AyCOlDI1vq4kMHSvDnioeQ8=
+mqhmM7xJx7Gy0O3xuiPyBJdkzcPpM0pSUpDYf7GcLwU=
++ykMwym9S2nag9+Lsh57vpdkzcPpM0pSUpDYf7GcLwU=
+cZcSD1ce40p+S8OOqNse+8WAX6LVNdgPGHx0E7OBc/Q=
+w9gOp689frvZWTXWrY+kZsY5DkwsDicsSmARnfpRl/s=
+FB5clMRTzqfnrf2oo3Lk0NeTR/XZs3VK9wsK+2rSHPk=
+64P8ZBpG8uauNU7tBpvQDNeTR/XZs3VK9wsK+2rSHPk=
+bRZNLpk4nbxju3EQf8neUh2An0yhn8nnMHSvDnioeQ8=
+j8oidAXZUQ4EleYWgB/h49eTR/XZs3VK9wsK+2rSHPk=
+WHueRm/w+zQuLIyDFlNkBJdkzcPpM0pSUpDYf7GcLwU=
+zYJ5BMhpcMvrZlH/HWfc48WAX6LVNdgPGHx0E7OBc/Q=
+AVtLW31C8xoqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+5y4fghiFmJtbMSFJXe5a9ZdkzcPpM0pSUpDYf7GcLwU=
+/Kar5pijjzPIcvDI/izKd5dkzcPpM0pSUpDYf7GcLwU=
+L1RYL9NnSN3TyeBNGIJLr9eTR/XZs3VK9wsK+2rSHPk=
+p0RCoowijcQqWaeElU15ypdkzcPpM0pSUpDYf7GcLwU=
+6QcN6oSnAdLnrf2oo3Lk0NeTR/XZs3VK9wsK+2rSHPk=
+1NYTbMR28hY45OA+okEbzdeTR/XZs3VK9wsK+2rSHPk=
+bo5SpPvwj9u+g/+zqFG10MWAX6LVNdgPGHx0E7OBc/Q=

+ 253 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuBeHospitalizedDocTrans.java

@@ -0,0 +1,253 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+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.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: rengb
+ * @time: 2020/3/5 15:47
+ */
+public class YiWuBeHospitalizedDocTrans extends ModelDocTrans {
+    private String modeId = "1";
+
+    /**
+     * @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> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+            OrdinaryAssistant.removeBlank(structureMap);
+        }
+        /*if (StringUtils.isEmpty(structureMap.get("入院时间")) && StringUtils.isNotEmpty(structureMap.get("入病房时间"))) {
+            structureMap.put("入院时间", structureMap.get("入病房时间"));
+        }
+         */
+        //如果有入院时间,优先使用
+        addKeyMapping(structureMap, "入院时间", "入病房时间");
+        //如果有职业,优先使用
+        addKeyMapping(structureMap, "职业", "工作性质");
+        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);
+        if (StringUtil.isBlank(structureMap.get("主诉"))) {
+            beHospitalizedDoc.setChiefLabel(null);
+        }
+        //        structureMap.remove("主诉");
+
+        // 走模型
+        PresentLabel presentLabel = new PresentLabel();
+        presentLabel.setText(structureMap.get("现病史"));
+        beHospitalizedDoc.setPresentLabel(presentLabel);
+        if (StringUtil.isBlank(structureMap.get("现病史"))) {
+            beHospitalizedDoc.setPresentLabel(null);
+        }
+        //        structureMap.remove("现病史");
+
+        PastLabel pastLabel = new PastLabel();
+        pastLabel.setCrfLabel(false);
+        pastLabel.setText(structureMap.get("既往史"));
+        beHospitalizedDoc.setPastLabel(pastLabel);
+        if (StringUtil.isBlank(structureMap.get("既往史"))) {
+            beHospitalizedDoc.setPastLabel(null);
+        }
+        //        structureMap.remove("既往史");
+
+        PersonalLabel personalLabel = new PersonalLabel();
+        personalLabel.setCrfLabel(false);
+        personalLabel.setText(structureMap.get("个人史"));
+        beHospitalizedDoc.setPersonalLabel(personalLabel);
+        if (StringUtil.isBlank(structureMap.get("个人史"))) {
+            beHospitalizedDoc.setPersonalLabel(null);
+        }
+        //        structureMap.remove("个人史");
+
+        MaritalLabel maritalLabel = new MaritalLabel();
+        maritalLabel.setCrfLabel(false);
+        maritalLabel.setText("婚育史: " + structureMap.get("婚育史"));
+        beHospitalizedDoc.setMaritalLabel(maritalLabel);
+        if (StringUtil.isBlank(structureMap.get("婚育史"))) {
+            beHospitalizedDoc.setMaritalLabel(null);
+        }
+        //        structureMap.remove("婚育史");
+
+        MenstrualLabel menstrualLabel = new MenstrualLabel();
+        menstrualLabel.setCrfLabel(false);
+        menstrualLabel.setText("月经史:" + structureMap.get("月经史"));
+        beHospitalizedDoc.setMenstrualLabel(menstrualLabel);
+        if (StringUtil.isBlank(structureMap.get("月经史"))) {
+            beHospitalizedDoc.setMenstrualLabel(null);
+        }
+        //        structureMap.remove("月经史");
+
+        FamilyLabel familyLabel = new FamilyLabel();
+        familyLabel.setCrfLabel(false);
+        familyLabel.setText(structureMap.get("家族史"));
+        beHospitalizedDoc.setFamilyLabel(familyLabel);
+        if (StringUtil.isBlank(structureMap.get("家族史"))) {
+            beHospitalizedDoc.setFamilyLabel(null);
+        }
+        //        structureMap.remove("家族史");
+
+        VitalLabel vitalLabel = new VitalLabel();
+        vitalLabel.setCrfLabel(false);
+        vitalLabel.setText(structureMap.get("体格检查"));
+        beHospitalizedDoc.setVitalLabel(vitalLabel);
+        if (StringUtil.isBlank(structureMap.get("体格检查"))) {
+            beHospitalizedDoc.setVitalLabel(null);
+        }
+        //        structureMap.remove("体格检查");
+
+        VitalLabelSpecial vitalLabelSpecial = new VitalLabelSpecial();
+        vitalLabelSpecial.setCrfLabel(false);
+        vitalLabelSpecial.setText(structureMap.get("专科体格检查"));
+        beHospitalizedDoc.setVitalLabelSpecial(vitalLabelSpecial);
+        if (StringUtil.isBlank(structureMap.get("专科体格检查"))) {
+            beHospitalizedDoc.setVitalLabelSpecial(null);
+        }
+        //        structureMap.remove("专科体格检查");
+
+        // 走模型
+        PacsLabel pacsLabel = new PacsLabel();
+        pacsLabel.setCrfLabel(false);
+        pacsLabel.setText(structureMap.get("辅助检查"));
+        beHospitalizedDoc.setPacsLabel(pacsLabel);
+        if (StringUtil.isBlank(structureMap.get("辅助检查"))) {
+            beHospitalizedDoc.setPacsLabel(null);
+        }
+        //        structureMap.remove("辅助检查");
+
+        // 走模型
+        DiagLabel initialDiagLabel = new DiagLabel();
+        initialDiagLabel.setText(structureMap.get("初步诊断"));
+        beHospitalizedDoc.setInitialDiagLabel(initialDiagLabel);
+        if (StringUtil.isBlank(structureMap.get("初步诊断"))) {
+            beHospitalizedDoc.setInitialDiagLabel(null);
+        }
+        //        structureMap.remove("初步诊断");
+
+        // 走模型
+        DiagLabel revisedDiagLabel = new DiagLabel();
+        revisedDiagLabel.setText(structureMap.get("修正诊断"));
+        beHospitalizedDoc.setRevisedDiagLabel(revisedDiagLabel);
+        if (StringUtil.isBlank(structureMap.get("修正诊断"))) {
+            beHospitalizedDoc.setRevisedDiagLabel(null);
+        }
+        //        structureMap.remove("修正诊断");
+
+        // 走模型
+        DiagLabel suppleDiagLabel = new DiagLabel();
+        suppleDiagLabel.setText(structureMap.get("补充诊断"));
+        beHospitalizedDoc.setSuppleDiagLabel(suppleDiagLabel);
+        if (StringUtil.isBlank(structureMap.get("补充诊断"))) {
+            beHospitalizedDoc.setSuppleDiagLabel(null);
+        }
+        //        structureMap.remove("补充诊断");
+
+        beHospitalizedDoc.setStructureMap(structureMap);
+
+        return beHospitalizedDoc;
+    }
+
+    /**
+     * 给structureMap添加一个key(映射)
+     *
+     * @param structureMap
+     * @param target       需要用到的key
+     * @param source       structureMap中含有的key
+     */
+    protected void addKeyMapping(Map<String, String> structureMap, String target, String source) {
+        if (StringUtils.isEmpty(structureMap.get(target)) && StringUtils.isNotEmpty(structureMap.get(source))) {
+            structureMap.put(target, structureMap.get(source));
+        }
+    }
+
+}

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuClinicBloodEffectDocTrans.java

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

+ 59 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuClinicalBloodDocTrans.java

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

+ 220 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuConsultationDocTrans.java

@@ -0,0 +1,220 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 会诊文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:22
+ */
+public class YiWuConsultationDocTrans extends ModelDocTrans {
+    private String modeId = "31";
+
+    /**
+     * 会诊记录包含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> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationRecord_keyContrasts, modeId);
+        }
+
+        ConsultationRecordDoc consultationRecordDoc = new ConsultationRecordDoc();
+        consultationRecordDoc.setStructureMap(structureMap);
+        consultationRecordDoc.setPageData((Map) structureMap);
+        return consultationRecordDoc;
+    }
+
+    // 会诊记录映射字段
+    private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
+            "事件日期=记录时间",
+            "医生=记录医师",
+            "会诊执行情况=会诊情况"
+    );
+
+
+    /**************************************************会诊结果单*******************************************************/
+    private Map<String, ConsultationResultsDoc> getConsultationResultsDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationResultsDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationResultsDoc consultationResultsDoc = getConsultationResultsDoc(contentMap);
+            consultationResultsDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationResultsDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationResultsDoc getConsultationResultsDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationResults_keyContrasts, modeId);
+        }
+
+        ConsultationResultsDoc consultationResultsDoc = new ConsultationResultsDoc();
+        consultationResultsDoc.setStructureMap(structureMap);
+        consultationResultsDoc.setPageData((Map) structureMap);
+        return consultationResultsDoc;
+    }
+
+    // 会诊结果映射字段
+    private List<String> consultationResults_keyContrasts = Lists.newArrayList(
+            "会诊诊断=当前诊断",
+            "事件日期1(会诊申请日期)=申请日期",
+            "医生=医师签名",
+            "本人姓名=姓名",
+            "病史描述=病史回顾描述",
+            "病历日期=会诊日期及时间",
+            "记录及建议=会诊意见",
+            "临床科室1=申请科室",
+            "申请医生1=申请医生"
+    );
+
+
+    /**************************************************会诊申请单*******************************************************/
+    private Map<String, ConsultationApplicationDoc> getConsultationApplicationDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, ConsultationApplicationDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String consultationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            consultationName = index + "";
+            ConsultationApplicationDoc consultationApplicationDoc = getConsultationApplicationDoc(contentMap);
+            consultationApplicationDoc.setConsultationName(consultationName);
+            retMap.put(consultationName, consultationApplicationDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private ConsultationApplicationDoc getConsultationApplicationDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, consultationApplication_keyContrasts, modeId);
+        }
+
+        ConsultationApplicationDoc consultationApplicationDoc = new ConsultationApplicationDoc();
+        consultationApplicationDoc.setStructureMap(structureMap);
+        consultationApplicationDoc.setPageData((Map) structureMap);
+
+        return consultationApplicationDoc;
+    }
+
+    // 会诊申请单映射字段
+    private List<String> consultationApplication_keyContrasts = Lists.newArrayList(
+            "事件日期=申请日期",
+            "会诊类别=会诊分类",
+            "会诊理由和目的=申请理由目的",
+            "病历日期=会诊日期及时间",
+            "本人姓名=姓名",
+            "病历号=病案号",
+            "临床科室=申请科室"
+    );
+
+}

+ 56 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuCrisisValueReportDocTrans.java

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

+ 54 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuCriticallyIllNoticeDocTrans.java

@@ -0,0 +1,54 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病危通知书文档生成
+ * @author: rengb
+ * @time: 2020/3/19 19:41
+ */
+public class YiWuCriticallyIllNoticeDocTrans extends ModelDocTrans {
+    private String modeId = "25";
+
+    @Override
+    public List<CriticallyIllNoticeDoc> extract(MedrecVo medrecVo) {
+        List<CriticallyIllNoticeDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getCriticallyIllNoticeDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private CriticallyIllNoticeDoc getCriticallyIllNoticeDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        CriticallyIllNoticeDoc criticallyIllNoticeDoc = new CriticallyIllNoticeDoc();
+        criticallyIllNoticeDoc.setStructureMap(structureMap);
+        criticallyIllNoticeDoc.setPageData((Map) structureMap);
+
+        return criticallyIllNoticeDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList();
+
+}

+ 59 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDeathCaseDiscussDocTrans.java

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

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDeathRecordDocTrans.java

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

+ 61 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDifficultCaseDiscussDocTrans.java

@@ -0,0 +1,61 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 疑难病例讨论记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:23
+ */
+public class YiWuDifficultCaseDiscussDocTrans extends ModelDocTrans {
+    private String modeId = "19";
+
+    @Override
+    public List<DifficultCaseDiscussDoc> extract(MedrecVo medrecVo) {
+        List<DifficultCaseDiscussDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+        contentMaps.forEach(contentMap -> {
+            retList.add(getDifficultCaseDiscussDoc(contentMap));
+        });
+        return retList;
+    }
+
+    private DifficultCaseDiscussDoc getDifficultCaseDiscussDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+
+        DifficultCaseDiscussDoc difficultCaseDiscussDoc = new DifficultCaseDiscussDoc();
+        difficultCaseDiscussDoc.setStructureMap(structureMap);
+        difficultCaseDiscussDoc.setPageData((Map) structureMap);
+
+        return difficultCaseDiscussDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "医生=记录者",
+            "讨论小结=结 论",
+            "讨论意见=讨论内容",
+            "事件日期=讨论时间",
+            "本人姓名=姓名",
+            "参加人员及职称(护士)=参加讨论者"
+    );
+
+}

+ 313 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuDocTrans.java

@@ -0,0 +1,313 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.model.vo.QueryVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.trans.DocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : TaiZhouDocTrans
+ * @Description :
+ * @Author : 楼辉荣
+ * @Date: 2020-03-03 19:47
+ */
+public class YiWuDocTrans extends DocTrans {
+
+    @Override
+    protected InputInfo extract(QueryVo queryVo) {
+        InputInfo inputInfo = new InputInfo();
+        for (MedrecVo i : queryVo.getMedrec()) {
+            switch (i.getTitle()) {
+                case "会诊":
+                    YiWuConsultationDocTrans consultationDocTrans = new YiWuConsultationDocTrans();
+                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+                    break;
+                case "手术":
+                    YiWuOperationDocTrans operationDocTrans = new YiWuOperationDocTrans();
+                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
+                    break;
+                case "转科":
+                    YiWuTransferRecordDocTrans transferRecordDocTrans = new YiWuTransferRecordDocTrans();
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+                    break;
+                case "入院记录":
+                    YiWuBeHospitalizedDocTrans beHospitalizedDocTrans = new YiWuBeHospitalizedDocTrans();
+                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
+                    break;
+                case "输血/血制品病程记录":
+                    YiWuClinicalBloodDocTrans clinicalBloodDocTrans = new YiWuClinicalBloodDocTrans();
+                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
+                    break;
+                case "危急值记录":
+                    YiWuCrisisValueReportDocTrans crisisValueReportDocTrans = new YiWuCrisisValueReportDocTrans();
+                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
+                    break;
+                case "病危通知书":
+                    YiWuCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new YiWuCriticallyIllNoticeDocTrans();
+                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
+                    break;
+                case "死亡病例讨论记录":
+                    YiWuDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new YiWuDeathCaseDiscussDocTrans();
+                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
+                    break;
+                case "死亡记录":
+                    YiWuDeathRecordDocTrans deathRecordDocTrans = new YiWuDeathRecordDocTrans();
+                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
+                    break;
+                case "疑难病例讨论记录":
+                    YiWuDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new YiWuDifficultCaseDiscussDocTrans();
+                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
+                    break;
+                case "医嘱信息":
+                    YiWuDoctorAdviceDocTrans doctorAdviceDocTrans = new YiWuDoctorAdviceDocTrans();
+                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
+                    break;
+                case "首次病程录":
+                    YiWuFirstCourseRecordDocTrans firstCourseRecordDocTrans = new YiWuFirstCourseRecordDocTrans();
+                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
+                    break;
+                case "病案首页":
+                    YiWuFirstPageRecordDocTrans firstPageRecordDocTrans = new YiWuFirstPageRecordDocTrans();
+                    if (inputInfo.getFirstPageRecordDoc() == null) {
+                        inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
+                    }
+                    break;
+                case "出院小结":
+                    YiWuLeaveHospitalDocTrans leaveHospitalDocTrans = new YiWuLeaveHospitalDocTrans();
+                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
+                    break;
+                case "抢救记录":
+                    YiWuRescueDocTrans rescueDocTrans = new YiWuRescueDocTrans();
+                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
+                    break;
+                case "病重通知书":
+                    YiWuSeriouslyIllNoticeDocTrans seriouslyIllNoticeDocTrans = new YiWuSeriouslyIllNoticeDocTrans();
+                    inputInfo.setSeriouslyIllNoticeDocs(seriouslyIllNoticeDocTrans.extract(i));
+                    break;
+                case "阶段小结":
+                    YiWuStagesSummaryDocTrans stagesSummaryDocTrans = new YiWuStagesSummaryDocTrans();
+                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
+                    break;
+                case "查房记录":
+                    YiWuThreeLevelWardDocTrans threeLevelWardDocTrans = new YiWuThreeLevelWardDocTrans();
+                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
+                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
+                    break;
+                case "输血后效果评价":
+                    YiWuClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new YiWuClinicBloodEffectDocTrans();
+                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
+                    break;
+                case "病理检验送检单":
+                    YiWuPathologyShipDocTrans pathologyShipDocTrans = new YiWuPathologyShipDocTrans();
+                    inputInfo.setPathologyShipDocs(pathologyShipDocTrans.extract(i));
+                    break;
+                case "知情同意书":
+                    YiWuInformedConsentDocTrans taizhouInformedConsentDocTrans = new YiWuInformedConsentDocTrans();
+                    inputInfo.setInformedConsentDoc(taizhouInformedConsentDocTrans.extract(i));
+                    break;
+                case "谈话告知书":
+                    YiWuNoticeOfConversationDocTrans taizhouNoticeOfConversationDocTrans = new YiWuNoticeOfConversationDocTrans();
+                    inputInfo.setNoticeOfConversationDoc(taizhouNoticeOfConversationDocTrans.extract(i));
+                    break;
+                case "住院病历信息":
+                    YiWuMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new YiWuMedicalRecordInfoDocTrans();
+                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
+                case  "门诊":
+                    YiWuOutDepDocTrans taiZhouOutDepDocTrans = new YiWuOutDepDocTrans();
+                    inputInfo.setBeHospitalizedDoc(taiZhouOutDepDocTrans.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/yiwu/YiWuDoctorAdviceDocTrans.java

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

+ 98 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuFirstCourseRecordDocTrans.java

@@ -0,0 +1,98 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.MapUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.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 YiWuFirstCourseRecordDocTrans extends ModelDocTrans {
+    private String modeId = "2";
+
+    @Override
+    public FirstCourseRecordDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+        // 病例特点=主诉+现病史-发病情况+专科检查+实验室检查+影像学检查+辅助检查结果+呼吸+脉搏+体温+血压
+        //        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(
+            "本人姓名=姓名",
+            "现病史- 发病情况=现病史",
+            "现病史- 发病情况=现病史",
+            "医生=医师签名",
+            "治疗计划和措施=治疗计划",
+            "体温(耳)=体温耳",
+            "体温(口)=体温口",
+            "病历日期=记录时间"
+    );
+
+}

+ 269 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuFirstPageRecordDocTrans.java

@@ -0,0 +1,269 @@
+package com.lantone.qc.trans.yiwu;
+
+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 YiWuFirstPageRecordDocTrans 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));
+
+        List<Map<String, String>> dischargeDiag = (List) structureExtMap.get(Content.dischargeDiag);
+        if (dischargeDiag != null && dischargeDiag.size() > 0) {
+            for (Map<String, String> diag : dischargeDiag) {
+                String diagCategory = diag.get("诊断类别");
+                if (StringUtil.isNotBlank(diagCategory) && "1".equals(diagCategory)) {
+                    diag.put("诊断类别", "主要诊断");
+                    break;
+                }
+            }
+        }
+        //        structureExtMap.put(Content.pathologyDiagnose, FastJsonUtils.getJsonToBean(content.get(Content.pathologyDiagnose), Object.class));
+        firstPageRecordDoc.setStructureExtMap(structureExtMap);
+
+        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/yiwu/YiWuInformedConsentDocTrans.java

@@ -0,0 +1,18 @@
+package com.lantone.qc.trans.yiwu;
+
+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 YiWuInformedConsentDocTrans extends ModelDocTrans {
+    @Override
+    public InformedConsentDoc extract(MedrecVo medrecVo) {
+        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
+        return informedConsentDoc;
+    }
+}

+ 57 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuLeaveHospitalDocTrans.java

@@ -0,0 +1,57 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.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 YiWuLeaveHospitalDocTrans extends ModelDocTrans {
+    private String modeId = "5";
+
+    @Override
+    public LeaveHospitalDoc extract(MedrecVo medrecVo) {
+        Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+        }
+        LeaveHospitalDoc leaveHospitalDoc = new LeaveHospitalDoc();
+        leaveHospitalDoc.setStructureMap(structureMap);
+        leaveHospitalDoc.setPageData((Map) structureMap);
+
+        return leaveHospitalDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "入院日期=入院时间",
+            "实际住院天数=住院天数",
+            "出院时情况=出院情况",
+            //            "注意事项=健康教育",
+            "复诊时间=随访计划",
+            "出院指导=健康教育",
+            "医生=医师签名",
+            "病历日期=签名时间",
+            "体温(耳)=体温耳",
+            "主诉=入院情况"
+    );
+
+}

+ 26 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuMedicalRecordInfoDocTrans.java

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

+ 51 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuMedicalWritingDocTrans.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.pub.model.doc.MedicalWritingDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 病历书写规范文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+public class YiWuMedicalWritingDocTrans 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> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> xmlNodeValueMap = TzXmlUtil.getXmlToMapForTZ(content);
+            xmlNodeValueMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            xmlNodeValueMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            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/yiwu/YiWuNoticeOfConversationDocTrans.java

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

+ 352 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuOperationDocTrans.java

@@ -0,0 +1,352 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+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.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description: 手术文档生成
+ * @author: rengb
+ * @time: 2020/3/20 17:11
+ */
+public class YiWuOperationDocTrans extends ModelDocTrans {
+
+    /**
+     * 手术文档包含:术后首次病程及谈话记录;手术记录;术前讨论、术前小结;手术知情同意书;手术安全核查表
+     *
+     * @param medrecVo
+     * @return
+     */
+    @Override
+    public List<OperationDoc> extract(MedrecVo medrecVo) {
+        List<OperationDoc> retList = Lists.newArrayList();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return retList;
+        }
+
+        Map<String, OperationDiscussionDoc> operationDiscussionDocMap = getOperationDiscussionDocMap((List) contentMap.get("术后首次病程及谈话记录"));
+        Map<String, OperationRecordDoc> operationRecordDocMap = getOperationRecordDocMap((List) contentMap.get("手术记录"));
+        Map<String, PreoperativeDiscussionDoc> preoperativeDiscussionDocMap = getPreoperativeDiscussionDocMap((List) contentMap.get("术前讨论、术前小结"));
+        Map<String, OperationInformedConsentDoc> operationInformedConsentDocMap = getOperationInformedConsentDocMap((List) contentMap.get("手术知情同意书"));
+        Map<String, OperationSafetyChecklistDoc> operationSafetyChecklistDocMap = getOperationSafetyChecklistDocMap((List) contentMap.get("手术安全核查表"));
+
+        Set<String> operationNameSet = Sets.newHashSet();
+        operationNameSet.addAll(operationDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationRecordDocMap.keySet());
+        operationNameSet.addAll(preoperativeDiscussionDocMap.keySet());
+        operationNameSet.addAll(operationInformedConsentDocMap.keySet());
+        operationNameSet.addAll(operationSafetyChecklistDocMap.keySet());
+
+        operationNameSet.forEach(operationName -> {
+            OperationDoc operationDoc = new OperationDoc();
+            operationDoc.setOperationName(operationName);
+            operationDoc.setOperationDiscussionDoc(operationDiscussionDocMap.get(operationName));
+            operationDoc.setOperationRecordDoc(operationRecordDocMap.get(operationName));
+            operationDoc.setPreoperativeDiscussionDoc(preoperativeDiscussionDocMap.get(operationName));
+            operationDoc.setOperationInformedConsentDoc(operationInformedConsentDocMap.get(operationName));
+            operationDoc.setOperationSafetyChecklistDoc(operationSafetyChecklistDocMap.get(operationName));
+            retList.add(operationDoc);
+        });
+        return retList;
+    }
+
+
+    /*******************************************术后首次病程及谈话记录***************************************************/
+    private Map<String, OperationDiscussionDoc> getOperationDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationDiscussionDoc operationDiscussionDoc = getOperationDiscussionDoc(contentMap);
+            operationDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, operationDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationDiscussionDoc getOperationDiscussionDoc(Map<String, Object> contentMap) {
+        String modeId = "18";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationDiscussion_keyContrasts, modeId);
+        }
+
+        OperationDiscussionDoc operationDiscussionDoc = new OperationDiscussionDoc();
+        operationDiscussionDoc.setStructureMap(structureMap);
+        operationDiscussionDoc.setPageData((Map) structureMap);
+
+        return operationDiscussionDoc;
+    }
+
+    private List<String> operationDiscussion_keyContrasts = Lists.newArrayList(
+            "本人姓名=姓名",
+            "开始时间=手术开始时间",
+            "结束时间=手术结束时间",
+            "书写日期=记录日期",
+            "注意事项=术后注意事项",
+            "治疗计划和措施=术后处理措施"
+    );
+
+
+    /**********************************************手术记录*************************************************************/
+    private Map<String, OperationRecordDoc> getOperationRecordDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationRecordDoc operationRecordDoc = getOperationRecordDoc(contentMap);
+            operationRecordDoc.setOperationName(operationName);
+            retMap.put(operationName, operationRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationRecordDoc getOperationRecordDoc(Map<String, Object> contentMap) {
+        String modeId = "17";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationRecord_keyContrasts, modeId);
+            OrdinaryAssistant.removeBlank(structureMap);
+        }
+        OperationRecordDoc operationRecordDoc = new OperationRecordDoc();
+        operationRecordDoc.setStructureMap(structureMap);
+        operationRecordDoc.setPageData((Map) structureMap);
+        return operationRecordDoc;
+    }
+
+    // 手术记录
+    private List<String> operationRecord_keyContrasts = Lists.newArrayList(
+            "结束时间=手术结束时间",
+            "开始时间=手术开始时间",
+            "医生=主刀医师签名",
+            "手术医师=主刀医师",
+            "助手=一助",
+            "本人姓名=姓名"
+    );
+
+
+    /**********************************************术前讨论、术前小结****************************************************/
+    private Map<String, PreoperativeDiscussionDoc> getPreoperativeDiscussionDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, PreoperativeDiscussionDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = getPreoperativeDiscussionDoc(contentMap);
+            preoperativeDiscussionDoc.setOperationName(operationName);
+            retMap.put(operationName, preoperativeDiscussionDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private PreoperativeDiscussionDoc getPreoperativeDiscussionDoc(Map<String, Object> contentMap) {
+        String modeId = "11";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts, modeId);
+            addKeyMapping(structureMap, "麻醉方式", "拟施手术名称及麻醉方式");
+            addKeyMapping(structureMap, "主刀医师签名", "主刀医生");
+            addKeyMapping(structureMap, "既往疾病史", "其他");
+            addKeyMapping(structureMap, "诊疗计划", "治疗计划和措施");
+        }
+        PreoperativeDiscussionDoc preoperativeDiscussionDoc = new PreoperativeDiscussionDoc();
+        preoperativeDiscussionDoc.setStructureMap(structureMap);
+        preoperativeDiscussionDoc.setPageData((Map) structureMap);
+        return preoperativeDiscussionDoc;
+    }
+
+    private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
+            "参加人员及职称=参加人员",
+            "主刀医师=主刀医师签名",
+            "术前准备=术前准备内容",
+            "注意事项=术前术后注意事项",
+            "其他术前相关情况=术前术后注意事项",
+            "辅助检查结果=辅助检查",
+            "术中、术后防范措施=可能意外和防范措施",
+            "现病史- 发病情况=发病经过",
+            "本人姓名=姓名",
+            "拟施手术名称和方式=拟行术式"
+    );
+
+    /**********************************************手术知情同意书****************************************************/
+    private Map<String, OperationInformedConsentDoc> getOperationInformedConsentDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationInformedConsentDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationInformedConsentDoc operationInformedConsentDoc = getOperationInformedConsentDoc(contentMap);
+            operationInformedConsentDoc.setOperationName(operationName);
+            retMap.put(operationName, operationInformedConsentDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationInformedConsentDoc getOperationInformedConsentDoc(Map<String, Object> contentMap) {
+        String modeId = "16";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationInformedConsent_keyContrasts, modeId);
+        }
+        OperationInformedConsentDoc operationInformedConsentDoc = new OperationInformedConsentDoc();
+        operationInformedConsentDoc.setStructureMap(structureMap);
+        operationInformedConsentDoc.setPageData((Map) structureMap);
+        return operationInformedConsentDoc;
+    }
+
+    private List<String> operationInformedConsent_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别=",
+            "病区++++病区名称=病区",
+            "床号=",
+            "病案号++++住院号=病案号",
+            "手术医生=",
+            "目前诊断=",
+            "手术名称=",
+            "手术指征=",
+            "风险及并发症=",
+            "++++保守治疗=保守治疗",
+            "++++其他手术=其他手术",
+            "签名++++=签名",
+            "签名时间=签名时间"
+    );
+
+
+    /**********************************************手术安全核查表****************************************************/
+    private Map<String, OperationSafetyChecklistDoc> getOperationSafetyChecklistDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, OperationSafetyChecklistDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String operationName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            operationName = index + "";
+            OperationSafetyChecklistDoc operationSafetyChecklistDoc = getOperationSafetyChecklistDoc(contentMap);
+            operationSafetyChecklistDoc.setOperationName(operationName);
+            retMap.put(operationName, operationSafetyChecklistDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(Map<String, Object> contentMap) {
+        String modeId = "21";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, operationSafetyChecklist_keyContrasts, modeId);
+        }
+        OperationSafetyChecklistDoc operationSafetyChecklistDoc = new OperationSafetyChecklistDoc();
+        operationSafetyChecklistDoc.setStructureMap(structureMap);
+        operationSafetyChecklistDoc.setPageData((Map) structureMap);
+
+        return operationSafetyChecklistDoc;
+    }
+
+    private List<String> operationSafetyChecklist_keyContrasts = Lists.newArrayList(
+            "姓名++++患者姓名=姓名",
+            "性别",
+            "病区",
+            "床号",
+            "病案号++++住院号=病案号",
+            "签名++++=签名"
+    );
+
+    /**
+     * 给structureMap添加一个key(映射)
+     *
+     * @param structureMap
+     * @param target       需要用到的key
+     * @param source       structureMap中含有的key
+     */
+    protected void addKeyMapping(Map<String, String> structureMap, String target, String source) {
+        if (StringUtils.isEmpty(structureMap.get(target)) && StringUtils.isNotEmpty(structureMap.get(source))) {
+            structureMap.put(target, structureMap.get(source));
+        }
+    }
+
+}

+ 40 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuOutDepDocTrans.java

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

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuPathologyShipDocTrans.java

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

+ 58 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuRescueDocTrans.java

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

+ 53 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuSeriouslyIllNoticeDocTrans.java

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

+ 58 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuStagesSummaryDocTrans.java

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

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

@@ -0,0 +1,323 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+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.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.GeneralDoctorWardDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.SpringContextUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.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;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 查房记录文档生成
+ * @author: rengb
+ * @time: 2020/3/17 13:27
+ */
+@Setter
+public class YiWuThreeLevelWardDocTrans extends ModelDocTrans {
+    private String modeId = "4";
+    private List<String> recTitles;
+    private List<OperationDoc> operationDocs;
+
+    @Override
+    public List<ThreeLevelWardDoc> extract(MedrecVo medrecVo) {
+        ModelHospitalFacade modelHospitalFacade = SpringContextUtil.getBean(ModelHospitalFacade.class);
+        recTitles = modelHospitalFacade.getRecTitles(3l, 4l);
+
+        List<ThreeLevelWardDoc> retList = Lists.newArrayList();
+        List<Map<String, Object>> contentMaps = (List) medrecVo.getContent().get("content");
+
+        ThreeLevelWardDoc result = new ThreeLevelWardDoc();
+        contentMaps.forEach(contentMap -> {
+            classifyThreeLevelWardDoc(result, contentMap);
+        });
+        retList.add(result);
+        return retList;
+    }
+
+    private void classifyThreeLevelWardDoc(ThreeLevelWardDoc result, Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            Map<String, String> sourceMap = YiWuXmlUtil.xmlToMap(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(), "");
+            }
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts, modeId);
+
+            if (StringUtils.isEmpty(structureMap.get("查房日期"))) {
+                return;
+            }
+            //不能简单的标准转化,如果有查房标题,优先使用
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房备注"))) {
+                structureMap.put("查房标题", structureMap.get("查房备注"));
+            }
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("查房类别"))) {
+                structureMap.put("查房标题", structureMap.get("查房类别"));
+            }
+            if (StringUtils.isEmpty(structureMap.get("查房标题")) && StringUtils.isNotEmpty(structureMap.get("上级查房医生职称"))) {
+                structureMap.put("查房标题", structureMap.get("上级查房医生职称"));
+            }
+        }
+        //总的查房记录 汇总
+        ThreeLevelWardDoc allDoctorWradDoc = new ThreeLevelWardDoc();
+        allDoctorWradDoc.setStructureMap(structureMap);
+        allDoctorWradDoc.setPageData((Map) structureMap);
+        result.addAllDoctorWradDoc(allDoctorWradDoc);
+
+        //主任医师查房
+        DirectorDoctorWardDoc directorDoctorWardDoc = findDirectorDoctorWardDoc(structureMap);
+        if (directorDoctorWardDoc != null) {
+            result.addDirectorDoctorWardDoc(findDirectorDoctorWardDoc(structureMap));
+        }
+        //主治医师查房
+        AttendingDoctorWardDoc attendingDoctorWardDoc = findAttendingDoctorWardDoc(structureMap);
+        if (attendingDoctorWardDoc != null) {
+            result.addAttendingDoctorWardDoc(attendingDoctorWardDoc);
+        }
+        //普通医师查房
+        if (directorDoctorWardDoc == null && attendingDoctorWardDoc == null) {
+            GeneralDoctorWardDoc generalDoctorWardDoc = new GeneralDoctorWardDoc();
+            generalDoctorWardDoc.setStructureMap(structureMap);
+            generalDoctorWardDoc.setPageData((Map) structureMap);
+            result.addGeneralDoctorWardDoc(generalDoctorWardDoc);
+        }
+    }
+
+    /**
+     * 主任医师查房
+     *
+     * @param structureMap
+     */
+    private DirectorDoctorWardDoc findDirectorDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String recordDateStr = structureMap.get("查房日期");
+        String chiefSurgeon = structureMap.get("主刀医师");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        DirectorDoctorWardDoc directorDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主任")) {    //标题有代字)
+                directorDoctorWardDoc = new DirectorDoctorWardDoc();
+                directorDoctorWardDoc.setStructureMap(structureMap);
+                directorDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return directorDoctorWardDoc;
+    }
+
+    /**
+     * 主治医师查房
+     *
+     * @param structureMap
+     */
+    private AttendingDoctorWardDoc findAttendingDoctorWardDoc(Map<String, String> structureMap) {
+        String title = structureMap.get("查房标题");
+        String recordDateStr = structureMap.get("查房日期");
+        String chiefSurgeon = structureMap.get("主刀医师");
+        Date recordDate = StringUtil.parseDateTime(recordDateStr);
+        AttendingDoctorWardDoc attendingDoctorWardDoc = null;
+        if (StringUtils.isNotEmpty(title)) {
+            if (title.contains("主刀")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = getDoctorTitle(chiefSurgeon, operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) {    //标题有代字)
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
+        }
+        return attendingDoctorWardDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "事件日期=记录时间",
+            "事件日期=查房日期",
+            "简要病情=病情记录",
+            "查房记录=病情记录",
+            "医生=记录医师"
+    );
+
+    public static String subTitle(String srcText) {
+        String title = "";
+        if (StringUtil.isNotBlank(srcText)) {
+            //标题不包含代字,直接返回原标题
+            if (!srcText.contains("代")) {
+                return srcText;
+            }
+            //有携、兼字时,取携、兼字之前部分
+            if (srcText.contains("携")) {
+                title += srcText.substring(0, srcText.indexOf("携"));
+            } else if (srcText.contains("兼")) {
+                title += srcText.substring(0, srcText.indexOf("兼"));
+            }
+            //有代字时,取代字之后部分
+            if (srcText.contains("代") && srcText.indexOf("代") != srcText.length() - 1) {
+                title += srcText.substring(srcText.lastIndexOf("代") + 1);
+            } else {
+                return srcText;
+            }
+        }
+        return title;
+    }
+
+    /**
+     * 获取主刀医师/一助职称(取距离查房记录时间最近的一次手术记录)
+     *
+     * @param operationDocs
+     * @return
+     */
+    public static String getDoctorTitle(String chiefSurgeonFromWard, List<OperationDoc> operationDocs, Date recordDate, String findTitle) {
+        String title = "";
+        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
+        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+        //如果查房记录中有主刀医师姓名,直接用这个姓名获取对应职称
+        if (StringUtil.isNotBlank(chiefSurgeonFromWard)) {
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeonFromWard);
+            if (doctor != null) {
+                title = doctor.get("professor");
+                if (StringUtil.isNotBlank(title)) {
+                    return title;
+                }
+            }
+        }
+
+        //只有术前小结,没有手术记录情况下,直接取术前小结的医师姓名
+        long operationCount = operationDocs.stream().map(OperationDoc::getOperationRecordDoc).filter(Objects::nonNull).count();
+        long preoperativeCount = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).count();
+        if (operationCount == 0 && preoperativeCount > 0) {
+            long timeDiff = 0L;
+            List<PreoperativeDiscussionDoc> preoperativeDoc = operationDocs.stream().map(OperationDoc::getPreoperativeDiscussionDoc).filter(Objects::nonNull).collect(Collectors.toList());
+            for (PreoperativeDiscussionDoc doc : preoperativeDoc) {
+                Map<String, String> structureMap = doc.getStructureMap();
+                String chiefSurgeon = structureMap.get(findTitle + "签名");
+                String operatorEndDateStr = structureMap.get("主刀医师签字时间");
+                if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                    continue;
+                }
+                Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+                if (doctor != null) {
+                    String professor = doctor.get("professor");
+                    Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                    if (operatorEndDate != null) {
+                        long timeDifference = timeDifference(operatorEndDate, recordDate);
+                        if (timeDifference == 0) {
+                            continue;
+                        }
+                        if (timeDiff == 0 || timeDiff > timeDifference) {
+                            /* 取距离此次主刀医师查房最近的一次术前讨论时间 */
+                            timeDiff = timeDifference;
+                            title = professor;
+                        }
+                    }
+                }
+            }
+            if (StringUtil.isNotBlank(title)) {
+                return title;
+            }
+        }
+
+        /* 用于存放手术结束时间距离查房时间最近的一次时间差 */
+        long timeDiff = 0L;
+        for (
+                OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String chiefSurgeon = structureMap.get(findTitle);
+            String operatorEndDateStr = structureMap.get("手术结束时间");
+
+            if (StringUtil.isBlank(chiefSurgeon) || StringUtil.isBlank(operatorEndDateStr)) {
+                continue;
+            }
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+            if (doctor != null) {
+                String professor = doctor.get("professor");
+                Date operatorEndDate = StringUtil.parseDateTime(operatorEndDateStr);
+                if (operatorEndDate != null) {
+                    long timeDifference = timeDifference(operatorEndDate, recordDate);
+                    if (timeDifference == 0) {
+                        continue;
+                    }
+                    if (timeDiff == 0 || timeDiff > timeDifference) {
+                        /* 取距离此次主刀医师查房最近的一次手术时间 */
+                        timeDiff = timeDifference;
+                        title = professor;
+                    }
+                }
+            }
+        }
+        return title;
+    }
+
+    public static long timeDifference(Date firstDate, Date secondDate) {
+        long timeDifference = 0L;
+        if (firstDate == null || secondDate == null) {
+            return timeDifference;
+        }
+        boolean flag = false;
+        if (firstDate.before(secondDate)) {
+            flag = true;
+        }
+        Calendar calendarS = Calendar.getInstance();
+        Calendar calendarE = Calendar.getInstance();
+        long timeS, timeE;
+        try {
+            calendarS.setTime(firstDate);
+            calendarE.setTime(secondDate);
+
+            timeS = calendarS.getTimeInMillis();
+            timeE = calendarE.getTimeInMillis();
+
+            if (flag) {
+                timeDifference = (timeE - timeS) / (1000 * 60);
+            } else {
+                timeDifference = (timeS - timeE) / (1000 * 60);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return timeDifference;
+    }
+
+}

+ 253 - 0
trans/src/main/java/com/lantone/qc/trans/yiwu/YiWuTransferRecordDocTrans.java

@@ -0,0 +1,253 @@
+package com.lantone.qc.trans.yiwu;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.dbanaly.facade.taizhou.TzXmlUtil;
+import com.lantone.qc.dbanaly.facade.yiwu.YiWuXmlUtil;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferIntoDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.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 YiWuTransferRecordDocTrans extends ModelDocTrans {
+
+    public TransferRecordDoc extract(MedrecVo medrecVo) {
+        TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
+
+        Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
+        if (contentMap == null) {
+            return transferRecordDoc;
+        }
+        List<Map<String, Object>> into = (List) contentMap.get("转入记录");
+        List<Map<String, Object>> out = (List) contentMap.get("转出记录");
+        List<Map<String, Object>> all = new ArrayList<>();
+        if (into != null) {
+            all.addAll(into);
+        }
+        if (out != null) {
+            all.addAll(out);
+        }
+        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(into);
+        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(out);
+        Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
+
+        //转入
+        Map<Date, TransferIntoDoc> dateRecordIn = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
+            Map<String, String> structureMap = transferIntoDoc.getStructureMap();
+            String inDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(inDateStr)) {
+                continue;
+            }
+            Date inDate = StringUtil.parseDateTime(inDateStr);
+            if (inDate == null) {
+                continue;
+            }
+            dateRecordIn.put(inDate, transferIntoDoc);
+        }
+        transferRecordDoc.setTransferIntoDocs(new ArrayList<>(dateRecordIn.values()));
+        //转出
+        Map<Date, TransferOutDoc> dateRecordOut = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
+            Map<String, String> structureMap = transferOutDoc.getStructureMap();
+            String outDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(outDateStr)) {
+                continue;
+            }
+            Date outDate = StringUtil.parseDateTime(outDateStr);
+            if (outDate == null) {
+                continue;
+            }
+            dateRecordOut.put(outDate, transferOutDoc);
+        }
+        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                continue;
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
+
+        return transferRecordDoc;
+    }
+
+
+    /**************************************************转入*******************************************************/
+    private Map<String, TransferIntoDoc> getTransferIntoDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferIntoDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferIntoDoc transferIntoDoc = getTransferIntoDoc(contentMap);
+            transferIntoDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferIntoDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferIntoDoc getTransferIntoDoc(Map<String, Object> contentMap) {
+        String modeId = "26";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts, modeId);
+        }
+
+        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+        transferIntoDoc.setText(content);
+        transferIntoDoc.setStructureMap(structureMap);
+        transferIntoDoc.setPageData((Map) sourceMap);
+
+        return transferIntoDoc;
+    }
+
+    private List<String> transferInto_keyContrasts = Lists.newArrayList(
+            "书写日期=记录日期",
+            "本人姓名=姓名"
+    );
+
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferRecordDoc transferRecordDoc = getTransferAllDoc(contentMap);
+            transferRecordDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(Map<String, Object> contentMap) {
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferInto_keyContrasts);
+        }
+        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+        transferAllDoc.setText(content);
+        transferAllDoc.setStructureMap(structureMap);
+        transferAllDoc.setPageData((Map) sourceMap);
+        return transferAllDoc;
+    }
+
+    /**************************************************转出*******************************************************/
+    private Map<String, TransferOutDoc> getTransferOutDocMap(List<Map<String, Object>> contentMaps) {
+        Map<String, TransferOutDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contentMaps)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (Map<String, Object> contentMap : contentMaps) {
+            if (contentMap.get("xmlText") == null || StringUtil.isBlank(contentMap.get("xmlText").toString())) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferOutDoc transferOutDoc = getTransferOutDoc(contentMap);
+            transferOutDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferOutDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferOutDoc getTransferOutDoc(Map<String, Object> contentMap) {
+        String modeId = "27";
+        String content = contentMap.get("xmlText").toString();
+        Map<String, String> structureMap = null;
+        Map<String, String> sourceMap = null;
+        if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+            structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+        } else {
+            sourceMap = YiWuXmlUtil.xmlToMap(content);
+            sourceMap.put("mode_id=" + contentMap.get("modeId").toString(), "");
+            sourceMap.put("rec_title=" + contentMap.get("recTitle").toString(), "");
+            structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, transferOut_keyContrasts, modeId);
+        }
+        TransferOutDoc transferOutDoc = new TransferOutDoc();
+        transferOutDoc.setText(content);
+        transferOutDoc.setStructureMap(structureMap);
+        transferOutDoc.setPageData((Map) sourceMap);
+
+        return transferOutDoc;
+    }
+
+    private List<String> transferOut_keyContrasts = Lists.newArrayList(
+            "书写日期=记录日期",
+            "本人姓名=姓名"
+    );
+
+}