互联互通数据推送

简介: 需求是基于治疗数据,推送给平台,使用xml对数据进行组装,同时进行加密,里面包含所有的治疗数据与pdf,而生成是在完成治疗后进行数据的推送。这个过程是实时的,因此就需要考虑性能的问题,同时不能影响主流程。因此使用异步进行数据的推送,同时对生成的pdf需要进行加密,放入xml中。而提前的数据信息使用并行流的方式对数据进行组装。这里主要解决推送过程的方式。下面是最近的需求和解决的思路和方式。

1.需求的产生

医院信息互联互通测评的项目应用评价分为七个等级,由低到高依次为一级、二级、三级、四级乙等、四级甲等、五级乙等、五级甲等,每个等级的要求由低到高逐级覆盖累加,即较高等级包含较低等级的全部要求。因此通常只要需要评级的医院,都离不开做互联互通,使用平台对医院的数据进行联网。因此,就有了下面的需求,完成与平台的互联互通。

需求是基于治疗数据,推送给平台,使用xml对数据进行组装,同时进行加密,里面包含所有的治疗数据与pdf,而生成是在完成治疗后进行数据的推送。这个过程是实时的,因此就需要考虑性能的问题,同时不能影响主流程。因此使用异步进行数据的推送,同时对生成的pdf需要进行加密,放入xml中。而提前的数据信息使用并行流的方式对数据进行组装。这里主要解决推送过程的方式。下面是最近的需求和解决的思路和方式。

2.推送的类型

通常医院的数据推送分为两类:一类是和医院his、lis以及影像资料对接对接的数据,一类是和平台对接的数据。通常和医院对接的数据通常是规则的,同时数据可以采用MQ或者webservice进行对接,比如医嘱对接使用MQ进行对接。而和平台对接,通常是患者的治疗数据和pdf记录单等,此类数据通常使用webService的soap进行推送。

3.推送过程思路

而这类数据通常是在xml中进行,因为推送的数据除了患者的基本治疗数据外和包含了一个pdf的信息,通常采用HL7协议进行数据的组装,此时就会涉及到对患者数据的组装,而组装的过程中,通常是在患者治疗下机后,就会产生记录单信息,而产生记录单信息的同时还需要对其进行pdf的生成,而生成后,根据生成的pdf路径,对pdf进行base64加密,然后在自定义的xml中组装节点元素,然后推送给平台,根据平台返回的想要信息,获取节点中返回的响应,然后进行确认,类似于ack确认;如果推送失败,则进行失败重试,如果重试失败,则将失败的信息记录到日志中,方便查看,然后进行人工干预,将数据进行手动推送。由于通常平台是根据国家要求,通常会使用基于卫生部的规范进行数据的cda规范推送。

4.推送的内容

而推送的过程包含两部分:一部分是注册xml信息,通常是由平台提供样例,然后根据样例进行xml节点元素的组装,另一部分是需要推送的数据信息,通常会包含两部分:一部分是患者的信息和患者的资料所有信息,采用soap方式进行推送。

5.推送的方式

下图是推送的数据方式:


微信图片_20221214032438.png

推送过平台的数据,通常平台会根据我们推送的数据,进行解析,通常会根据我们提供的治疗所有信息的样例,进行平台代码的编写,或者根据我们提供的治疗消息样例,进行修改,然后推送他们想要的数据。

为了方便消息丢失问题的出现,这里需要将我们的失败日志信息写入到数据库中,夜间根据失败的日志数据进行重推到平台中,防止我们推送的数据丢失的情况。

推送并响应:

微信图片_20221214032441.png


由于不同医院选择的互联互通的第三方平台,因此互联互通方案也会存在一定的差异性。

6.接口信息

平台那边需要的数据:

微信图片_20221214032446.png

从里面我们可以看到平台需要的接口信息、接口名称、接口方法、参数信息、要发送的消息、返回信息。

根据他们提供的消息样例组装xml信息,然后进行推送。

cda文档类型,下面截图部分:

微信图片_20221214032449.png

以上只是一部分,而这些cda的数据,通常都是医院的不同系统建立起来的。

对于推送,里面最重要的就是message,上面提到的参数里面。

也即我们想在需要做的就是将消息中需要的信息拿到,然后根据拿到的信息进行组装:

通常组装的xml中:下面截取xml中的一小部分内容,下面的数据有修改。

<RCMR_IN000002UV02ITSVersion="XML_1.0"xmlns="urn:hl7-org:v3"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="urn:hl7-org:v3 ../multicacheschemas/RCMR_IN000002UV02.xsd"><idroot="3.2.5.1.1"extension="200200000000728"></id><creationTimevalue="20210430165413"></creationTime><interactionIdroot="3.2.5.1.2"extension="RCMR_IN000002UV02"></interactionId><processingCodecode="P"></processingCode><processingModeCode></processingModeCode><acceptAckCodecode="AL"></acceptAckCode><receivertypeCode="RCV">   ...
</receiver><sendertypeCode="SND">    ...
</sender><controlActProcessclassCode="STC"moodCode="APT"><subjecttypeCode="SUBJ"><clinicalDocumentclassCode="DOCCLIN"moodCode="EVN"><id><itemroot="3.2.5.1.24"extension="900200000000728"></item></id><codecode="EMR-SD-08"codeSystem="3.2.5.1.23"codeSystemName="文档类型代码"><displayNamevalue="治疗记录"></displayName></code>       ...
<versionNumbervalue="1"></versionNumber><storageCode><!--需要存储的加密信息 --><originalTextvalue=""></originalText><translation></translation></storageCode>      ...
</clinicalDocument>        ...
</subject></controlActProcess></RCMR_IN000002UV02>

而组装的方式可以是采用最为直接的stringbuffer进行组装,但是这样的话,容易产生硬编码的现象,同时扩展性的话,不够直接,但是如果是采用节点组装的方式,这样的话,下次进行扩展的时候会方便一些。其实xml的组装在安卓用得比较多。组装的方式采用xml属性和xml元素的方式进行组装,通常属性是xml标签里面的属性信息,而xml元素则是可以放入元素+属性信息,从而进行进一步的节点组装。同时我发现如果他们提供的样例如果节点设置并列关系多一点,数据结构的组装会方便很多,但是当时他们提供的组装样例麻烦,因此写出来的组装相对来说,嵌套会多一些。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="RCMR_IN000002UV02", namespace="urn:hl7-org:v3")
publicclassRCMR_IN000002UV02 {
@XmlAttribute(name="xmlns")
publicStringxmlns="urn:hl7-org:v3";
@XmlAttribute(name="xmlns:xsi")
publicStringxsi="http://www.w3.org/2001/XMLSchema-instance";
@XmlAttribute(name="xsi:schemaLocation")
publicStringschemaLocation="urn:hl7-org:v3 ../multicacheschemas/RCMR_IN000002UV02.xsd";
@XmlElement(name="id")
publicNodeAttrid;
@XmlElement(name="creationTime")
publicNodeAttrcreationTime;
@XmlElement(name="interactionId")
publicNodeAttrinteractionId;
    ...
// 省略get/set    }

属性信息使用 @XmlAttribute和元素信息@XmlElement对元素关系和元素结构进行组装,然后就可以构建好自定义的xml。

组装完数据,接着是对平台响应的xml信息进行获取,然后进行确认,如果成功,则不做处理,如果失败,则将失败的患者治疗id信息和治疗时间进行记录,存入失败表中,然后在晚上使用定时任务将失败的数据信息进行同步。除此之外,还将失败的数据信息打到日志管理界面中,日志管理界面通常会保存两个星期的审计日志数据。同时提供界面给实施人员进行下载,方便排查问题和反馈给开发进行解决。

<acceptAckCodecode="AL"/><receivertypeCode="RCV"><deviceclassCode="DEV"determinerCode="INSTANCE">    ....
</device></receiver><sendertypeCode="SND"><deviceclassCode="DEV"determinerCode="INSTANCE">    ....
</device></sender><!--处理结果,比如AA是成功,AF是失败--><acknowledgementtypeCode="AA"><!--请求消息ID--><targetMessage><idroot="3.2.5.1.1"extension="请求的消息 ID"/></targetMessage><!--处理结果说明--><acknowledgementDetail><textvalue="处理结果说明"/></acknowledgementDetail></acknowledgement></MCCI_IN000002UV01>

这里可以基于其返回的处理结果,进行确认对方是否收到了发过去的数据,这个结果类似于我们进行手动ack确认的依据。此时拿到处理结果:

Documentdoc=DocumentHelper.parseText(s);
Elementroot=doc.getRootElement();
Elementresponse=root.element("acknowledgement");
//拿到处理结果response.attribute("typeCode").getValue();

进行判断,从而进行相应的处理。

7.总结

而推送的过程中涉及到治疗信息的pdf生成和加密以及xml的组装,同时将信息放入到xml中过程。为了不影响主流程业务,通常我们会使用异步的方式进行消息的推送,因此我们这里使用线程池对其进行推送,数据的获取使用并行流的方式。当然,除了自己拼接xml进行解析外,还可以使用xstream进行解析。

目录
相关文章
|
安全 网络安全 数据库
达梦数据库 忘记 SYSDBA 密码 处理方法
达梦数据库支持四种安全验证模式:数据库身份验证、基于操作系统的身份验证、外部身份验证和UKEY验证。当忘记SYSDBA密码时,可通过启用操作系统认证模式来恢复:修改`dm.ini`配置文件启用`ENABLE_LOCAL_OSAUTH = 1`,重启服务后,使用`disql / as sysdba`登录修改密码。之后,禁用操作系统认证,恢复原验证模式,确保数据库安全。
5963 0
|
Kubernetes Linux 容器
【kubernetes】修复 systemctl status sshd Failed to get D-Bus connection: Operation not permitted
【kubernetes】修复 systemctl status sshd Failed to get D-Bus connection: Operation not permitted
1205 0
|
8月前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
7963 8
|
9月前
|
监控 应用服务中间件 nginx
别再手写 Nginx 配置了!用 Nginx UI 图形化管理你的 Web 服务!
Nginx UI 是一款轻量级图形化管理工具,让 Nginx 配置告别手写与 reload 煎熬。支持站点管理、反向代理、HTTPS 一键申请/续期、日志查看、配置版本回滚与语法校验,Docker 一键部署,适配单机及集群,真正将 Nginx 变成“可视化管家”。
1656 3
|
网络协议 Linux Ruby
CentOS7各个版本镜像下载地址
CentOS7各个版本镜像下载地址
49795 0
|
XML 小程序 Java
【Android App】给三维魔方贴图以及旋转动画讲解和实战(附源码和演示视频 超详细必看)
【Android App】给三维魔方贴图以及旋转动画讲解和实战(附源码和演示视频 超详细必看)
560 0
|
应用服务中间件 nginx
413 request entity too large 解决办法
413 request entity too large 解决办法
9560 0
|
Python
python编程:graphviz库绘制流程图
python编程:graphviz库绘制流程图
1204 0
python编程:graphviz库绘制流程图
|
数据可视化 Linux Python
第128天:Seaborn-可视化数据集的分布
第128天:Seaborn-可视化数据集的分布
664 0
第128天:Seaborn-可视化数据集的分布
|
Linux Windows
Linux-通过Windows远程桌面访问CentOS
  我的环境是CentOS 7.2,首先要确保该环境能上网。 首先安装【epel-release-latest-7.noarch.rpm】 rpm -Uvh https://dl.
3383 0