一、前言
hl7协议相信医疗行业的it人员都不陌生,笔者由于接触时间比较短,乍一听“协议”还是比较懵,不自觉就把它和“http”、"soap”之类的网络协议挂上关联,可事实上这个hl7只是一种数据格式,传输方式也可以使用最简单的socket。
二、正文
本文中用到的代码都做了部分敏感字删减,使用过程如遇到编译错误合理调整即可。
笔者调试中用到的工具及问题记录都会放到文末供大家参考。
1、环境配置
引入maven依赖,笔者使用的hl7-2.6版本,所以只引入v26即可
<dependency>
<groupid>ca.uhn.hapi</groupid>
<artifactid>hapi-base</artifactid>
<version>2.3</version> <!-- 请根据实际情况选择最新版本 -->
</dependency>
<dependency>
<groupid>ca.uhn.hapi</groupid>
<artifactid>hapi-structures-v26</artifactid>
<version>2.3</version> <!-- 请根据实际情况选择最新版本 -->
</dependency>增加配置文件作为hl7协议单独配置
#是否开启监听 0-关闭、1-开启 hl7socket.server.flag=0 #端口号 hl7socket.server.port=30000
2、数据接收:hl7monitor
使用jdk自带注解@postconstrust作为初始化启动监听,直接使用依赖中封装的api即可,需要注意的是,可以将一些数据校验关闭,否则在接受过程中直接阻断消息接收。
启动监听服务仅需要端口号即可,另外要将接收数据后的业务处理类对象作为参数传入registerapplication方法。
import ca.uhn.hl7v2.defaulthapicontext;
import ca.uhn.hl7v2.hapicontext;
import ca.uhn.hl7v2.app.hl7service;
import ca.uhn.hl7v2.app.serverconfiguration;
import ca.uhn.hl7v2.llp.minlowerlayerprotocol;
import ca.uhn.hl7v2.parser.parserconfiguration;
import ca.uhn.hl7v2.parser.pipeparser;
import ca.uhn.hl7v2.validation.validationcontext;
import ca.uhn.hl7v2.validation.impl.defaultvalidation;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.component;
import javax.annotation.postconstruct;
import java.util.concurrent.arrayblockingqueue;
import java.util.concurrent.threadpoolexecutor;
import java.util.concurrent.timeunit;
/**
* 使用hl7监听器,监控目标端口收到的协议
*/
@component
@slf4j(topic = "hl7message")
public class hl7monitor {
@autowired
private hl7properties mhl7properties;
@autowired
private hl7business mhl7business;
private static hapicontext context = new defaulthapicontext();
@postconstruct
public void startwatchhl7(){
if (!"1".equals(mhl7properties.getflag())) {
return;
}
try {
threadpoolexecutor executor = new threadpoolexecutor(
10, 3100,
30, timeunit.seconds,
new arrayblockingqueue<runnable>(100));
executor.setrejectedexecutionhandler(new threadpoolexecutor.callerrunspolicy());
minlowerlayerprotocol mllp = new minlowerlayerprotocol();
mllp.setcharset("utf-8");
context.setlowerlayerprotocol(mllp);
context.setexecutorservice(executor);
//设置hl7不校验字段值
parserconfiguration tparserconfiguration = new parserconfiguration();
tparserconfiguration.setvalidating(false);
context.setparserconfiguration(tparserconfiguration);
//创建监听服务
boolean usesecureconnection = false;
hl7service ourhl7server = context.newserver(mhl7properties.getport(), usesecureconnection);
ourhl7server.registerapplication(mhl7business);
ourhl7server.startandwait();
} catch (exception e) {
log.info("hl7协议监听失败:" + e.getmessage());
e.printstacktrace();
}
}
}3、数据解析:hl7business
数据解析和数据处理在一起,笔者这边的业务是将数据接收到后解析出来,直接使用websocket推送给前端,前端会将接收到的数据echart渲染到页面,例如:各个波形图、检测数值等都会实时展示。
import ca.uhn.hl7v2.hl7exception;
import ca.uhn.hl7v2.model.extracomponents;
import ca.uhn.hl7v2.model.message;
import ca.uhn.hl7v2.model.type;
import ca.uhn.hl7v2.model.varies;
import ca.uhn.hl7v2.model.v26.datatype.cx;
import ca.uhn.hl7v2.model.v26.datatype.na;
import ca.uhn.hl7v2.model.v26.datatype.xpn;
import ca.uhn.hl7v2.model.v26.group.oru_r01_observation;
import ca.uhn.hl7v2.model.v26.group.oru_r01_order_observation;
import ca.uhn.hl7v2.model.v26.group.oru_r01_patient;
import ca.uhn.hl7v2.model.v26.group.oru_r01_patient_result;
import ca.uhn.hl7v2.model.v26.segment.msh;
import ca.uhn.hl7v2.model.v26.segment.obr;
import ca.uhn.hl7v2.model.v26.segment.obx;
import ca.uhn.hl7v2.model.v26.segment.pv1;
import ca.uhn.hl7v2.protocol.receivingapplication;
import com.google.gson.gson;
import com.google.gson.gsonbuilder;
import lombok.extern.slf4j.slf4j;
import org.apache.commons.lang3.stringutils;
import org.springframework.beans.beanutils;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.component;
import tk.mybatis.mapper.entity.example;
import java.text.parseexception;
import java.text.simpledateformat;
import java.util.*;
/**
* 接收到hl7消息,业务处理逻辑类
*/
@component
@slf4j(topic = "hl7message")
public class hl7business implements receivingapplication {
@autowired
private outcardao moutcardao;
@autowired
private lifesignservice lifesignservice;
private gson mgson = new gsonbuilder().serializenulls().create();
public static list<jianhuyilistview> mjianhuyilistview = new arraylist<>();
public static map<string, boolean> mlifesigndonemap = new hashmap<>();//标识监护仪体征信息是否采集过,true为采集过
@override
public message processmessage(message themessage, map themetadata) {
message response = null;
try {
//判断进入何种解析模式
this.analysismodule_1(themessage);
response = themessage.generateack();
} catch (exception e) {
log.info("hl7协议数据解析失败!" + e.getmessage());
log.error(e.getmessage());
e.printstacktrace();
}
return response;
}
/**
* 利用messge转对象模式解析协议
* msh|^~\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152606000||oru^r01^oru_r01|411|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso
* pid|||^^^hospital^pi||^^^^^^l
* pv1||i
* obr|1||411^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152605710|20231024152606710
* obx|1|na|150452^mdc_puls_oxim_pleth^mdc|1.3.1.150452|94^94^92^83^78^72^67^63^60^57^56^54^53^52^51^49^48^46^44^42^40^38^36^35^33^31^27^27^24^21^18^16^15^16^20^27^37^49^61^72^80^86^89^89^86^83^78^73^68^64^60^55^54^54^54^54^54^53^52^50|262656^mdc_dim_dimless^mdc
* obx|2|nm|0^mdc_attr_samp_rate^mdc|1.3.1.150452.1|60|264608^mdc_dim_per_sec^mdc
* obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.3.1.150452.2|1.000000|262656^mdc_dim_dimless^mdc
* obx|4|nm|262196^mdc_evt_inop^mdc|1.3.1.150452.3|32767
*/
public void analysismodule_1(message hapimsg) throws hl7exception, parseexception {
log.info(hapimsg.tostring());
jianhuyiview tjianhuyiview = new jianhuyiview();
//1、msh
msh msh = (msh) hapimsg.get("msh");
string tseries_no = msh.getmsh3_sendingapplication().gethd2_universalid().getvalue();
if (stringutils.isblank(tseries_no)) {
log.error("设备号获取为空!");
return;
}
string value7 = msh.getmsh7_datetimeofmessage().getvalue();
if (stringutils.isnotblank(value7)) {
string ttime = (value7.length() > 17) ? value7.substring(0, 17) : value7;
date tdate = new simpledateformat("yyyymmddhhmmsssss").parse(ttime);
tjianhuyiview.settime(new simpledateformat("yyyy-mm-dd hh:mm:ss").format(tdate));
}
//2、patient_result
oru_r01_patient_result oru_r01_patient_result = (oru_r01_patient_result) hapimsg.get("patient_result");
//2.1、patient_result——>patient
oru_r01_patient patientresult = oru_r01_patient_result.getpatient();
cx[] pid3patientidentifierlist = patientresult.getpid().getpid3_patientidentifierlist();
xpn[] pid5patientname = patientresult.getpid().getpid5_patientname();
pv1 pv1 = patientresult.getvisit().getpv1();
//2.2、patient_result——>order_observation
oru_r01_order_observation orderobservation = (oru_r01_order_observation) oru_r01_patient_result.get("order_observation");
//2.2.1、patient_result——>order_observation——>obr
obr obr = orderobservation.getobr();
//2.2.2、patient_result——>patient——>order_observation——>observations
list<oru_r01_observation> observationall = orderobservation.getobservationall();
list<double> tmdc_puls_oxim_pleths = new arraylist<>();
list<double> tmdc_ecg_elec_potl_iis = new arraylist<>();
list<double> tmdc_imped_tthors = new arraylist<>();
string twavetype = "";
for (oru_r01_observation toru_r01_observation : observationall) {
obx obx = toru_r01_observation.getobx();
string ttype = obx.getobx3_observationidentifier().gettext().getvalue();
if ("mdc_puls_oxim_pleth".equals(ttype)) {
twavetype = "pleth";
varies[] obx5observationvalue = obx.getobx5_observationvalue();
na data = (na) obx5observationvalue[0].getdata();
//获取前四个
type[] components = data.getcomponents();
for (type s : components) {
if (s != null) tmdc_puls_oxim_pleths.add(double.parsedouble(s.tostring()));
}
//获取剩余部分
extracomponents extracomponents = data.getextracomponents();
int num = extracomponents.numcomponents();
for (int i = 0; i < num; i++) {
tmdc_puls_oxim_pleths.add(double.parsedouble(string.valueof(extracomponents.getcomponent(i).getdata())));
}
}
if ("mdc_ecg_elec_potl_ii".equals(ttype)) {
twavetype = "ecg";
varies[] obx5observationvalue = obx.getobx5_observationvalue();
na data = (na) obx5observationvalue[0].getdata();
//获取前四个
type[] components = data.getcomponents();
for (type s : components) {
if (s != null) tmdc_ecg_elec_potl_iis.add(double.parsedouble(s.tostring()));
}
//获取剩余部分
extracomponents extracomponents = data.getextracomponents();
int num = extracomponents.numcomponents();
for (int i = 0; i < num; i++) {
tmdc_ecg_elec_potl_iis.add(double.parsedouble(string.valueof(extracomponents.getcomponent(i).getdata())));
}
}
if ("mdc_imped_tthor".equals(ttype)) {
twavetype = "resp";
varies[] obx5observationvalue = obx.getobx5_observationvalue();
na data = (na) obx5observationvalue[0].getdata();
//获取前四个
type[] components = data.getcomponents();
for (type s : components) {
if (s != null) tmdc_imped_tthors.add(double.parsedouble(s.tostring()));
}
//获取剩余部分
extracomponents extracomponents = data.getextracomponents();
int num = extracomponents.numcomponents();
for (int i = 0; i < num; i++) {
tmdc_imped_tthors.add(double.parsedouble(string.valueof(extracomponents.getcomponent(i).getdata())));
}
}
if ("mdc_puls_oxim_sat_o2".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setspo2_value(datav);
}
if ("mdc_puls_oxim_puls_rate".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setpr_value(datav);
}
if ("mdc_tthor_resp_rate".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setresp_value(datav);
}
if ("mdc_ecg_heart_rate".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setecg_value(datav);
}
if ("mdc_press_cuff_sys".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setsbp_value(datav);
}
if ("mdc_press_cuff_mean".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setmean_value(datav);
}
if ("mdc_press_cuff_dia".equals(ttype)) {
varies[] obx5observationvalue = obx.getobx5_observationvalue();
string datav = obx5observationvalue[0].getdata().tostring();
tjianhuyiview.setdbp_value(datav);
}
}
tjianhuyiview.setmdc_puls_oxim_pleth(tmdc_puls_oxim_pleths);
tjianhuyiview.setmdc_ecg_elec_potl_ii(tmdc_ecg_elec_potl_iis);
tjianhuyiview.setmdc_imped_tthor(tmdc_imped_tthors);
this.pushmessage(tjianhuyiview, tseries_no, twavetype);
}
/**
* 推送消息逻辑处理
* @param tjianhuyiview
* @param tseries_no
*/
private void pushmessage(jianhuyiview tjianhuyiview, string tseries_no, string twavetype) {
//判断全局对象是否包含本次监测设备信息
boolean tflag = false;
for (jianhuyilistview tjianhuyilist : mjianhuyilistview) {
tjianhuyilist.seta(stringutils.isblank(twavetype) ? "value" : twavetype);
if (tseries_no.equals(tjianhuyilist.getseries_no())) {
//保留上次数值,防止频闪
jianhuyiview toldview = tjianhuyilist.getjianhuyi_info();
if (stringutils.isblank(tjianhuyiview.getpr_value())) {
tjianhuyiview.setpr_value(toldview.getpr_value());
}
if (stringutils.isblank(tjianhuyiview.getspo2_value())) {
tjianhuyiview.setspo2_value(toldview.getspo2_value());
}
if (stringutils.isblank(tjianhuyiview.getsbp_value())) {
tjianhuyiview.setsbp_value(toldview.getsbp_value());
}
if (stringutils.isblank(tjianhuyiview.getdbp_value())) {
tjianhuyiview.setdbp_value(toldview.getdbp_value());
}
if (stringutils.isblank(tjianhuyiview.getmean_value())) {
tjianhuyiview.setmean_value(toldview.getmean_value());
}
if (stringutils.isblank(tjianhuyiview.getresp_value())) {
tjianhuyiview.setresp_value(toldview.getresp_value());
}
if (stringutils.isblank(tjianhuyiview.getecg_value())) {
tjianhuyiview.setecg_value(toldview.getecg_value());
}
tjianhuyilist.setjianhuyi_info(tjianhuyiview);
tflag = true;
}
}
//判断上述循环是否拿到了设备信息,若没有则加载进去
if (!tflag) {
jianhuyilistview tjianhuyilistview = new jianhuyilistview();
outcarvo toutcarvo = moutcardao.getoutcarvobymonitorno(tseries_no);
if (toutcarvo != null) {
tjianhuyilistview.setcar_code(toutcarvo.getcar_code());
tjianhuyilistview.setseries_no(tseries_no);
tjianhuyilistview.setjianhuyi_info(tjianhuyiview);
mlifesigndonemap.put(tseries_no, false);
//新增前判断当前集合是否有重复车牌
boolean subflag = false;
for (jianhuyilistview tjianhuyilist : mjianhuyilistview) {
if (toutcarvo.getcar_code().equals(tjianhuyilist.getcar_code())) {
beanutils.copyproperties(tjianhuyilistview, tjianhuyilist);
subflag = true;
break;
}
}
//判断当前集合没有重复车牌,则添加到最后
if(!subflag) mjianhuyilistview.add(tjianhuyilistview);
}
}
//获取监护仪信息更新到体征表
this.updatelifesign(tjianhuyiview, tseries_no);
//推送监护仪信息
hl7websocket.broadcast(mgson.tojson(mjianhuyilistview));
}
}与前端交互的websocket逻辑如下:
package com.medex.mdap.hl7.ws;
import com.google.gson.gson;
import com.google.gson.gsonbuilder;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.controller;
import javax.websocket.*;
import javax.websocket.server.serverendpoint;
import java.io.ioexception;
import java.util.*;
@controller
@serverendpoint(value = "/websocket/hl7message")
@slf4j
public class hl7websocket {
private gson mgson = new gsonbuilder().serializenulls().create();
private static set<session> sessions = new hashset<>();
@onopen
public void open(session session) {
hl7websocket.sessions.add(session);
log.info("有新连接加入");
}
@onmessage
public void receive(session session, string msg) {
try {
log.info("收到新的消息请求:" + msg);
string[] split = msg.split(",");
//遍历当前推送的车辆信息,将缺失的车辆补充进来
for (string tcardcode : split) {
boolean tflag = false;
for (jianhuyilistview tjianhuyilistview : hl7business.mjianhuyilistview) {
if (tcardcode.equals(tjianhuyilistview.getcar_code())) {
tflag = true;
break;
}
}
if (!tflag) {
jianhuyilistview ttjianhuyilistview = new jianhuyilistview();
ttjianhuyilistview.init(tcardcode);
hl7business.mjianhuyilistview.add(ttjianhuyilistview);
}
}
//遍历当前推送信息,将多余的车辆移除
iterator<jianhuyilistview> iterator = hl7business.mjianhuyilistview.iterator();
while(iterator.hasnext()){
jianhuyilistview tjianhuyilistview = iterator.next();
boolean tflag = false;
for (string tcardcode : split) {
if (tcardcode.equals(tjianhuyilistview.getcar_code())) {
tflag = true;
break;
}
}
if (!tflag) {
iterator.remove();
}
}
this.sortcarcode(hl7business.mjianhuyilistview, arrays.aslist(split));
this.broadcast(session, mgson.tojson(hl7business.mjianhuyilistview));
} catch (exception e) {
e.printstacktrace();
log.info("receive异常:" + e.getmessage());
}
}
public void broadcast(session session, string msg) {
try {
if (session != null) {
session.getbasicremote().sendtext(msg);
}
} catch (exception e) {
log.error("websocket推送失败");
e.printstacktrace();
}
}
public static void broadcast(string msg) {
log.info("推送hl7转义消息:" + msg);
for (session ses : hl7websocket.sessions) {
try {
ses.getbasicremote().sendtext(msg);
} catch (exception e) {
log.error("websocket推送失败");
e.printstacktrace();
hl7websocket.sessions.remove(ses);
}
}
}
/**
* 发生异常错误
*
* @param session
* @param error
* @throws ioexception
*/
@onerror
public void onerror(session session, throwable error) throws ioexception {
log.error("websocket发生错误");
error.printstacktrace();
if (session.isopen()) {
session.close();
}
}
/**
* 关闭网页时调用
*
* @param session
* @throws ioexception
*/
@onclose
public void close(session session) {
try {
iterator<session> iterator = sessions.iterator();
while (iterator.hasnext()) {
if (iterator.next().equals(session)) {
iterator.remove();
}
}
} catch (exception e) {
log.error("websocket连接关闭异常");
e.printstacktrace();
}
}
/**
* a集合参照b集合顺序进行排序
* @param a
* @param b
*/
public void sortcarcode(list<jianhuyilistview> a, list<string> b) {
collections.sort(a, ((o1, o2) -> {
int io1 = b.indexof(o1.getcar_code());
int io2 = b.indexof(o2.getcar_code());
if (io1 != -1) {
io1 = a.size() - io1;
}
if (io2 != -1) {
io2 = a.size() - io2;
}
return io2 - io1;
}));
}
}4、补充逻辑
在笔者前期调研过程中也写了一部分测试代码,现整理后发出记录下
import ca.uhn.hl7v2.defaulthapicontext;
import ca.uhn.hl7v2.hl7exception;
import ca.uhn.hl7v2.hapicontext;
import ca.uhn.hl7v2.model.message;
import ca.uhn.hl7v2.model.v26.datatype.cx;
import ca.uhn.hl7v2.model.v26.datatype.ei;
import ca.uhn.hl7v2.model.v26.datatype.xpn;
import ca.uhn.hl7v2.model.v26.group.oru_r01_order_observation;
import ca.uhn.hl7v2.model.v26.group.oru_r01_patient;
import ca.uhn.hl7v2.model.v26.group.oru_r01_patient_result;
import ca.uhn.hl7v2.model.v26.group.oru_r01_visit;
import ca.uhn.hl7v2.model.v26.segment.msh;
import ca.uhn.hl7v2.model.v26.segment.obr;
import ca.uhn.hl7v2.model.v26.segment.pv1;
import ca.uhn.hl7v2.parser.parser;
import ca.uhn.hl7v2.parser.pipeparser;
import ca.uhn.hl7v2.util.terser;
import java.util.regex.matcher;
import java.util.regex.pattern;
/**
* hl7解析demo
*/
public class hl7messageanalysis {
public static void main(string[] args) throws hl7exception {
string ss = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152606000||oru^r01^oru_r01|411|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||411^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152605710|20231024152606710\r" +
"obx|1|na|150452^mdc_puls_oxim_pleth^mdc|1.3.1.150452|94^94^92^83^78^72^67^63^60^57^56^54^53^52^51^49^48^46^44^42^40^38^36^35^33^31^27^27^24^21^18^16^15^16^20^27^37^49^61^72^80^86^89^89^86^83^78^73^68^64^60^55^54^54^54^54^54^53^52^50|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.3.1.150452.1|60|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.3.1.150452.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.3.1.150452.3|32767";
pipeparser p = pipeparser.getinstancewithnovalidation();
message hapimsg;
try {
hapimsg = p.parse(ss);
} catch (hl7exception e) {
e.printstacktrace();
return;
}
new hl7messageanalysis().analysisterser(hapimsg);
new hl7messageanalysis().analysis(hapimsg);
}
/**
* 转terser解析
* @param hapimsg
* @throws hl7exception
*/
public void analysisterser(message hapimsg) throws hl7exception {
terser terser = new terser(hapimsg);
terser.get("/patient_result/order_observation/observation(1)/obx-1");
string s = terser.get("/patient_result/order_observation/observation(1)/obx-4");
string s1 = terser.get("/patient_result/order_observation/observation(0)/obx-5");
string observationvalue = terser.get("/.observation(0)/obx-5");
// 将 observation value 字段中的数值部分拆分为数组
string[] values = observationvalue.split("\\^");
system.out.println(values);
}
/**
* 转对象解析
* @param hapimsg
* @throws hl7exception
*/
public void analysis(message hapimsg) throws hl7exception {
/**
* 2.6解析
* */
msh msh = (msh) hapimsg.get("msh");
string value1 = msh.getmsh3_sendingapplication().gethd1_namespaceid().getvalue();
string value2 = msh.getmsh3_sendingapplication().gethd2_universalid().getvalue();
string value3 = msh.getmsh3_sendingapplication().gethd3_universalidtype().getvalue();
oru_r01_patient_result oru_r01_patient_result = (oru_r01_patient_result) hapimsg.get("patient_result");
oru_r01_patient patientresult = oru_r01_patient_result.getpatient();
//patient
cx[] pid3patientidentifierlist = patientresult.getpid().getpid3_patientidentifierlist();
xpn[] pid5patientname = patientresult.getpid().getpid5_patientname();
oru_r01_visit visit = patientresult.getvisit();
pv1 pv1 = visit.getpv1();
//obr
oru_r01_order_observation orderobservation = (oru_r01_order_observation) oru_r01_patient_result.get("order_observation");
obr obr = orderobservation.getobr();
//obr节点2
string obr1value = obr.getobr1_setidobr().getvalue();
//obr节点3
ei obr3fillerordernumber = obr.getobr3_fillerordernumber();
string obr3_1value = obr3fillerordernumber.getei1_entityidentifier().getvalue();
string obr3_2value = obr3fillerordernumber.getei2_namespaceid().getvalue();
string obr3_3value = obr3fillerordernumber.getei3_universalid().getvalue();
string obr3_4value = obr3fillerordernumber.getei4_universalidtype().getvalue();
//obr节点4
string obr4_1value = obr.getobr4_universalserviceidentifier().getidentifier().getvalue();
//obr节点7 8
string obr7value = obr.getobr7_observationdatetime().getvalue();
string obr8value = obr.getobr8_observationenddatetime().getvalue();
}
}三、总结
1、工具分享
笔者使用的是:7edit 可以模拟发送hl7协议数据用于socket调试使用,具体用法可以参考其他博主的文章,本来想截几个工具的图片,但是试用期已过不让打开了......
调试过程中可以用上述工具观察解析结果,但是要大规模,大密度模拟报文就需要手动写几个测试类调用了,下述是笔者测试中用到的工具类,分享给大家。
访问路径为:aikes/hl7/20,具体访问频次可自行调整。
import ca.uhn.hl7v2.defaulthapicontext;
import ca.uhn.hl7v2.hl7exception;
import ca.uhn.hl7v2.hapicontext;
import ca.uhn.hl7v2.model.message;
import ca.uhn.hl7v2.parser.parser;
import ca.uhn.hl7v2.parser.parserconfiguration;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
import java.io.ioexception;
import java.text.parseexception;
@restcontroller
@requestmapping("aikes")
@slf4j
public class aikescontroller {
@autowired
private hl7business mhl7business;
@getmapping("/hl7/[code]")
public string testx(@pathvariable(value = "code") string param1) throws ioexception, hl7exception, parseexception {
int param = integer.parseint(param1);
string s1 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|49|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||49^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152405710|20231024152406710\r" +
"obx|1|na|131330^mdc_ecg_elec_potl_ii^mdc|1.7.6.131330|1840^1820^1740^1596^1412^1204^996^788^596^420^268^136^20^-72^-148^-212^-264^-304^-332^-356^-368^-376^-380^-384^-384^-380^-376^-376^-376^-368^-364^-356^-348^-340^-332^-324^-316^-312^-308^-308^-304^-300^-296^-288^-284^-276^-268^-260^-256^-252^-248^-240^-232^-224^-216^-212^-204^-200^-196^-192^-188^-184^-176^-168^-160^-156^-152^-148^-144^-140^-136^-128^-124^-116^-108^-100^-92^-84^-76^-72^-68^-64^-60^-56^-52^-48^-44^-32^-24^-16^-8^0^12^20^24^28^32^36^40^48^52^56^64^72^80^92^96^108^112^120^124^128^132^132^140^140^140^144^140^136^136^132^128^124^116^108^100^88^72^60^44^32^12^-4^-20^-36^-52^-68^-84^-100^-112^-124^-136^-148^-160^-168^-172^-176^-180^-184^-184^-184^-180^-176^-176^-172^-168^-164^-164^-168^-168^-168^-164^-164^-160^-152^-148^-144^-140^-136^-136^-132^-124^-120^-116^-112^-108^-108^-104^-104^-100^-100^-96^-96^-92^-92^-92^-92^-92^-88^-88^-84^-80^-76^-72^-68^-68^-68^-68^-68^-64^-64^-64^-64^-60^-60^-56^-56^-52^-52^-48^-44^-44^-44^-44^-44^-40^-44^-44^-48^-48^-48^-44^-44^-40^-40^-32^-32^-28^-28^-24^-20^-20^-16^-12^-12^-12^-12^-12^-12^-12^-12^-16^-16^-16^-16^-12^-12^-8^0^4^12^20^28^36^40^48^52^52^56^60^64^64^68^68^72^76^76^72^68^68^68^64^64^60^56^52^44^32^24^16^8^0^-8^-12^-20^-24^-24^-28^-32^-32^-32^-36^-36^-40^-44^-44^-44^-44^-40^-36^-32^-24^-20^-12^-8^0^0^0^0^0^-8^-20^-36^-56^-68^-80^-80^-68^-32^24^112^228^372^544^736^944^1160^1364^1548^1700^1796^1832^1800^1704^1552^1368^1164^956^756^572^412^268^144^44^-36^-104^-156^-200^-232^-256^-280^-296^-304^-312^-316^-320^-320^-320^-316^-312^-304^-296^-292^-280^-272^-268^-256^-252^-248^-244^-240^-236^-232^-228^-228^-224^-224^-220^-216^-208^-204^-196^-188^-180^-176^-168^-164^-160^-156^-152^-148^-144^-140^-132^-124^-116^-108^-100^-92^-88^-84^-76^-72^-64^-60^-56^-52^-48^-48^-44^-44^-40^-32^-24^-24^-16^-12^-8^0^4^8^16^24^32^40^48^56^64^68^76^80^84^92^100^104^112^116^120^128^132^136^144^148^156^164^172^176^180^180^180^180^180^176^172^168^164^160^148^136^124^108^88^68^52^32^12^-4^-24^-40^-60^-72^-84^-96^-108^-120^-128^-140^-148^-152^-164^-168^-172^-172^-176^-176^-176^-180^-180^-180^-180^-180^-176^-172^-164^-156^-148^-144^-140^-136|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.6.131330.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.6.131330.2|0.001221|266418^mdc_dim_milli_volt^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.6.131330.3|32767";
string s11 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|49|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||49^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152405710|20231024152406710\r" +
"obx|1|na|131330^mdc_ecg_elec_potl_ii^mdc|1.7.6.131330|-132^-132^-132^-132^-132^-132^-132^-132^-132^-132^-132^-128^-128^-124^-120^-116^-108^-104^-100^-96^-92^-92^-88^-88^-84^-80^-80^-76^-76^-76^-76^-80^-80^-80^-80^-80^-76^-80^-80^-80^-80^-80^-80^-80^-80^-76^-72^-72^-68^-64^-64^-64^-64^-64^-64^-68^-68^-72^-72^-72^-72^-72^-68^-64^-64^-60^-60^-56^-56^-56^-56^-60^-60^-60^-64^-64^-64^-64^-64^-60^-60^-64^-60^-60^-56^-56^-52^-48^-44^-44^-44^-44^-48^-48^-52^-52^-56^-56^-56^-52^-52^-48^-44^-36^-32^-28^-24^-20^-16^-12^-8^-8^-4^-4^-4^0^0^0^4^8^12^20^24^28^36^36^36^36^36^36^32^28^20^16^8^4^-4^-8^-16^-28^-32^-40^-44^-52^-56^-60^-64^-68^-68^-68^-68^-68^-68^-64^-64^-60^-60^-60^-60^-60^-60^-64^-60^-60^-56^-56^-56^-60^-68^-76^-88^-96^-104^-104^-100^-76^-32^32^124^240^388^560^756^960^1172^1364^1532^1652^1716^1716^1652^1532^1372^1188^988^796^616^452^304^180^72^-16^-88^-148^-196^-236^-264^-288^-308^-320^-324^-328^-328^-324^-320^-316^-312^-304^-304^-296^-292^-284^-276^-272^-268^-260^-256^-252^-248^-244^-244^-240^-232^-228^-224^-224^-220^-212^-208^-200^-192^-188^-180^-172^-168^-164^-156^-156^-148^-144^-136^-132^-124^-116^-108^-104^-96^-92^-84^-80^-76^-68^-64^-56^-52^-44^-40^-36^-32^-24^-16^-8^0^4^16^20^28^32^36^44^48^52^60^68^76^80^84^88^88^92^100^104^112^116^124^132^136^144^148^152^156^160^164^164^168^168^172^172^172^172^172^168^164^156^152^144^136^124^112^100^84^64^48^28^12^-8^-24^-44^-56^-72^-88^-96^-112^-120^-132^-140^-148^-156^-160^-164^-168^-168^-168^-168^-168^-168^-168^-168^-168^-164^-164^-164^-160^-156^-152^-148^-144^-140^-136^-132^-128^-124^-124^-120^-120^-120^-120^-116^-116^-112^-108^-104^-100^-96^-92^-88^-84^-84^-80^-80^-80^-80^-80^-80^-84^-88^-84^-88^-84^-84^-84^-84^-84^-84^-88^-92^-92^-92^-88^-88^-88^-84^-84^-84^-80^-80^-80^-80^-76^-76^-76^-72^-72^-68^-64^-64^-60^-60^-60^-60^-60^-56^-60^-60^-60^-64^-68^-72^-72^-76^-76^-76^-76^-72^-72^-68^-64^-64^-64^-60^-56^-56^-56^-56^-52^-52^-52^-48^-44^-44^-44^-44^-44^-44^-44^-40^-40^-40^-36^-36^-32^-32^-28^-28^-28^-28^-32^-32^-32^-32^-28^-24^-24^-24^-24^-24^-24^-28^-28^-28^-28^-28^-28^-24^-24^-20^-16^-16^-12^-12^-12^-12^-8^-8^-4^0^4^8^12^16|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.6.131330.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.6.131330.2|0.001221|266418^mdc_dim_milli_volt^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.6.131330.3|32767";
string s12 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|49|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||49^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152405710|20231024152406710\r" +
"obx|1|na|131330^mdc_ecg_elec_potl_ii^mdc|1.7.6.131330|24^28^32^40^44^48^48^48^48^52^48^56^64^68^76^84^88^92^92^92^92^92^88^84^80^76^68^60^56^48^44^36^32^28^24^20^16^8^4^4^0^0^0^0^0^0^-4^-4^-4^-4^-4^0^0^0^0^0^0^0^0^-8^-16^-28^-40^-52^-60^-64^-52^-28^20^92^196^324^476^652^844^1048^1248^1428^1576^1676^1720^1700^1624^1496^1332^1148^956^768^596^444^304^188^84^0^-68^-124^-168^-204^-232^-252^-268^-280^-288^-296^-296^-296^-296^-292^-288^-284^-280^-276^-268^-264^-260^-256^-256^-256^-256^-256^-252^-248^-248^-244^-240^-232^-224^-220^-212^-204^-196^-188^-180^-172^-164^-156^-152^-148^-144^-140^-136^-136^-132^-128^-124^-120^-116^-108^-104^-100^-92^-84^-76^-68^-64^-60^-56^-52^-48^-40^-36^-32^-24^-20^-12^-8^0^4^8^16^24^32^40^52^60^68^76^84^88^96^104^112^120^128^132^140^144^148^152^156^156^160^164^168^172^176^180^184^184^188^188^192^192^192^192^188^184^176^168^160^148^136^120^104^84^64^44^24^0^-16^-36^-52^-72^-84^-100^-108^-120^-132^-144^-156^-164^-168^-176^-180^-184^-184^-184^-184^-188^-188^-188^-188^-188^-184^-180^-180^-176^-172^-172^-168^-164^-160^-156^-156^-152^-144^-144^-144^-140^-140^-140^-136^-136^-136^-132^-128^-124^-124^-120^-116^-116^-112^-108^-108^-108^-104^-104^-104^-108^-104^-104^-104^-100^-100^-96^-96^-96^-96^-96^-96^-96^-96^-92^-92^-92^-88^-88^-84^-84^-84^-80^-80^-80^-80^-80^-76^-76^-76^-72^-72^-72^-68^-64^-64^-56^-56^-52^-52^-48^-48^-48^-48^-44^-44^-44^-44^-48^-44^-48^-48^-48^-44^-48^-48^-48^-44^-44^-44^-44^-44^-44^-40^-44^-44^-44^-48^-48^-48^-52^-52^-48^-48^-44^-40^-36^-32^-28^-28^-28^-24^-24^-24^-24^-20^-20^-20^-20^-20^-20^-16^-16^-16^-16^-16^-12^-12^-16^-16^-16^-16^-20^-20^-24^-24^-24^-24^-24^-28^-28^-28^-28^-28^-24^-20^-16^-12^-8^-4^0^0^4^8^12^16^20^24^32^36^36^40^44^44^48^52^52^52^52^52^52^48^48^44^44^44^44^44^40^36^32^24^16^8^4^-4^-8^-16^-24^-28^-32^-32^-36^-40^-44^-48^-44^-48^-44^-44^-40^-36^-36^-32^-32^-28^-28^-24^-24^-20^-24^-24^-32^-40^-52^-64^-76^-88^-92^-88^-68^-32^24^112^220^360^520^704^904^1104^1296^1464^1592^1668^1680^1632^1528^1384^1208^1024^840^660^500^356^228^116^24^-52^-116^-168^-208^-240|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.6.131330.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.6.131330.2|0.001221|266418^mdc_dim_milli_volt^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.6.131330.3|32767";
string s2 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152350000||oru^r01^oru_r01|2|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||2^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152349710|20231024152350710\r" +
"obx|1|na|151780^mdc_imped_tthor^mdc|1.7.1.151780|39^39^39^39^38^38^38^38^38^38^38^38^38^38^37^37^37^37^37^37^37^37^37^37^36^36^36^36^36^36^36^36^35^35^35^35^35^35^35^35^34^34^34^34^34^34^33^33^33^33^33^33^33^33^32^32^32^32^32^32^32^31^31^31^31^31^31^31^31^30^30^30^30^30^30^30^29^29^29^29^29^29^28^28^28^28^28^28^28^27^27^27^27^27^26^26^26^26^26^26^25^25^25^25^25^25^24^24^24^24^24^24^24^23^23^23^23^23^22^22^22^22^22^22^22^21^21^21^21^21^20^20^20^20^20^20^20^19^19^19^19^19^18^18^18^18^18^18^18^17^17^17^17^17^17^16^16^16^16^16^16^15^15^15^15^15^14^14^14^14^14^14^14^13^13^13^13^13^12^12^12^12^12^12^12^11^11^11^11^11^11^10^10^10^10^10^10^9^9^9^9^9^8^8^8^8^8^8^7^7^7^7^7^6^6^6^6^6^6^6^5^5^5^5^5^4^4^4^4^4^3^3^3^3^3^3^2^2^2^2^2^1^1^1^1^1^1^0^0^0^0^0^0^0^-1^-1^-1^-1^-1^-2^-2^-2^-2^-2^-3^-3^-3^-3^-3^-4^-4^-4^-4^-4^-5^-5^-5^-5^-5^-6^-6^-6^-6^-6^-7^-7^-7^-7^-7^-7^-8^-8^-8^-8^-8^-9^-9^-9^-9^-9^-10^-10^-10^-10^-11^-11^-11^-11^-11^-12^-12^-12^-12^-12^-13^-13^-13^-13^-13^-14^-14^-14^-14^-15^-15^-15^-15^-15^-16^-16^-16^-17^-17^-17^-17^-18^-18^-18^-19^-19^-19^-19^-20^-20^-20^-20^-21^-21^-21^-22^-22^-22^-23^-23^-23^-24^-24^-24^-25^-25^-25^-26^-26^-26^-27^-27^-28^-28^-28^-29^-29^-30^-30^-30^-31^-31^-32^-32^-32^-33^-33^-34^-34^-35^-35^-36^-36^-36^-37^-37^-38^-38^-39^-39^-40^-40^-41^-41^-42^-42^-43^-43^-44^-44^-44^-45^-45^-46^-46^-47^-48^-48^-49^-49^-50^-50^-50^-51^-52^-52^-53^-53^-54^-54^-55^-55^-56^-56^-57^-57^-58^-58^-59^-59^-60^-60^-61^-62^-62^-62^-63^-64^-64^-65^-65^-66^-66^-67^-67^-68^-69^-69^-70^-70^-71^-71^-72^-72^-73^-73^-74^-74^-75^-75^-76^-76^-77^-77^-78^-78^-79^-79^-80^-81^-81^-81^-82^-82^-83^-83^-84^-84^-85^-85^-86^-86^-87^-87^-88^-88^-89^-89^-90^-90^-91^-91^-92^-92^-93^-93|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.1.151780.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.1.151780.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.1.151780.3|32767";
string s21 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152350000||oru^r01^oru_r01|2|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||2^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152349710|20231024152350710\r" +
"obx|1|na|151780^mdc_imped_tthor^mdc|1.7.1.151780|-93^-94^-94^-95^-95^-96^-96^-96^-97^-97^-98^-98^-99^-99^-99^-100^-100^-101^-101^-101^-102^-102^-103^-103^-103^-104^-104^-105^-105^-105^-106^-106^-106^-107^-107^-108^-108^-108^-109^-109^-109^-110^-110^-110^-111^-111^-112^-112^-112^-112^-113^-113^-113^-114^-114^-114^-115^-115^-115^-115^-116^-116^-116^-117^-117^-117^-117^-118^-118^-118^-118^-118^-119^-119^-119^-119^-120^-120^-120^-120^-120^-121^-121^-121^-121^-121^-122^-122^-122^-123^-123^-124^-124^-124^-124^-124^-124^-124^-124^-124^-125^-125^-125^-125^-125^-125^-125^-125^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-126^-125^-125^-125^-125^-125^-125^-124^-124^-124^-124^-124^-124^-123^-123^-123^-123^-123^-122^-122^-122^-122^-122^-121^-121^-121^-120^-120^-120^-119^-119^-119^-119^-118^-118^-118^-118^-117^-117^-117^-116^-116^-116^-115^-115^-115^-114^-114^-113^-113^-113^-112^-112^-112^-111^-111^-110^-110^-110^-109^-109^-108^-108^-107^-107^-106^-106^-106^-105^-105^-104^-104^-103^-103^-102^-102^-101^-101^-100^-100^-99^-98^-98^-97^-97^-96^-95^-95^-94^-94^-93^-92^-92^-91^-91^-90^-89^-89^-88^-87^-87^-86^-85^-85^-84^-83^-82^-82^-81^-80^-80^-79^-78^-78^-77^-76^-75^-75^-74^-73^-72^-72^-71^-70^-69^-69^-68^-67^-66^-65^-65^-64^-63^-62^-62^-61^-60^-59^-58^-57^-57^-56^-55^-54^-54^-53^-52^-51^-50^-50^-49^-48^-47^-46^-45^-44^-44^-43^-42^-41^-40^-39^-38^-38^-37^-36^-35^-34^-33^-32^-32^-31^-30^-29^-28^-27^-27^-26^-25^-24^-23^-22^-22^-21^-20^-19^-18^-17^-17^-16^-15^-14^-13^-13^-12^-11^-10^-9^-9^-8^-7^-6^-5^-5^-4^-3^-2^-1^-1^0^1^1^2^3^4^5^5^6^7^7^8^9^10^10^11^12^12^13^14^15^15^16^17^18^18^19^19^20^21^22^22^23^24^24^25^26^26^27^28^28^29^30^30^31^31^32^33^33^34^35^35^36^37^37^38^38^39^40^40^41^41^42^43^43^44^44^45^45^46^47^47^48^48^49^49^50^50^51^51^52^52^53^53^54^55^55^55^56^56^57^57^58^58^59^59^60^60^61^61^62^62^63^63^63^64^64^65^65^66^66^67^67^67^68^68^69^69^69^70^70^71^71^71^72^72^72^73^73^74^74^74^74^75^75^75^76^76^76^77^77^77^78^78^78^79^79|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.1.151780.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.1.151780.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.1.151780.3|32767";
string s22 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152350000||oru^r01^oru_r01|2|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||2^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152349710|20231024152350710\r" +
"obx|1|na|151780^mdc_imped_tthor^mdc|1.7.1.151780|79^80^80^80^80^80^81^81^81^81^82^82^82^82^83^83^83^83^83^84^84^84^84^84^84^85^85^85^85^85^85^86^86^86^86^86^86^86^86^86^86^87^87^87^87^87^87^87^87^87^87^87^87^87^87^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^88^87^87^87^87^87^87^87^87^87^87^87^87^86^86^86^86^86^86^86^86^86^86^86^86^86^85^85^85^85^85^85^85^85^85^84^84^84^84^84^84^84^84^83^83^83^83^83^83^83^83^82^82^82^82^82^82^82^81^81^81^81^81^81^81^80^80^80^80^80^80^80^80^80^79^79^79^79^79^79^79^78^78^78^78^78^78^77^77^77^77^77^77^77^76^76^76^76^76^76^76^75^75^75^75^75^75^74^74^74^74^74^74^74^74^73^73^73^73^73^73^73^73^72^72^72^72^72^72^72^72^71^71^71^71^71^71^71^71^71^71^70^70^70^70^70^70^70^70^70^70^69^69^69^69^69^69^69^69^69^69^68^68^68^68^68^68^68^68^68^68^68^68^67^67^67^67^67^67^67^67^67^67^67^67^66^66^66^66^66^66^66^66^66^66^66^66^65^65^65^65^65^65^65^65^65^65^65^65^64^64^64^64^64^64^64^64^64^64^64^64^64^64^63^63^63^63^63^63^63^63^63^63^63^63^62^62^62^62^62^62^62^62^62^62^62^62^62^62^61^61^61^61^61^61^61^61^61^61^60^60^60^60^60^60^60^60^60^60^59^59^59^59^59^59^59^59^59^58^58^58^58^58^58^58^58^58^57^57^57^57^57^57^57^57^56^56^56^56^56^56^56^56^55^55^55^55^55^55^55^55^55^55^54^54^54^54^54^54^54^54^53^53^53^53^53^53^53^53^52^52^52^52^52^52^52^52^51^51^51^51^51^51^51^51^50^50^50^50^50^50^49^49^49^49^49^49^49^49^49^49^48^48^48^48^48^48^48^48^47^47^47^47^47^47^47^47^46^46^46^46^46^46^46^46^45^45^45^45^45^45^45^45^44^44^44^44^44^44^44^44|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.7.1.151780.1|500|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.7.1.151780.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.7.1.151780.3|32767";
string s3 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|6|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||6^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152350710|20231024152351710\r" +
"obx|1|na|150452^mdc_puls_oxim_pleth^mdc|1.3.1.150452|67^66^64^61^58^55^51^48^44^41^38^36^33^31^29^22^19^15^12^10^10^12^17^24^33^43^53^61^68^72^75^75^73^72^71^69^69^68^68^68^68^68^68^67^66^65^62^59^56^52^48^45^42^39^37^35^34^32^30^27|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.3.1.150452.1|60|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.3.1.150452.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.3.1.150452.3|32767";
string s31 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|6|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||6^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152350710|20231024152351710\r" +
"obx|1|na|150452^mdc_puls_oxim_pleth^mdc|1.3.1.150452|27^24^21^17^14^15^19^25^33^43^54^63^69^73^75^74^71^68^65^62^60^59^59^59^61^62^64^66^70^70^70^69^68^66^61^58^55^55^51^47^43^39^35^31^27^23^19^14^10^6^4^4^13^22^34^47^60^70^78^84|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.3.1.150452.1|60|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.3.1.150452.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.3.1.150452.3|32767";
string s32 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231024152406000||oru^r01^oru_r01|6|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1||6^mindray_d-series^00a037009a00cb60^eui-64|continuous waveform|||20231024152350710|20231024152351710\r" +
"obx|1|na|150452^mdc_puls_oxim_pleth^mdc|1.3.1.150452|87^87^87^86^86^86^86^86^85^85^84^83^81^80^78^73^71^68^65^62^59^56^53^50^47^44^40^37^33^30^27^24^21^18^12^10^9^10^10^17^24^33^41^49^55^60^63^64^64^64^64^63^63^63^63^63^64^63^63^63|262656^mdc_dim_dimless^mdc\r" +
"obx|2|nm|0^mdc_attr_samp_rate^mdc|1.3.1.150452.1|60|264608^mdc_dim_per_sec^mdc\r" +
"obx|3|nm|2327^mdc_attr_nu_msmt_res^mdc|1.3.1.150452.2|1.000000|262656^mdc_dim_dimless^mdc\r" +
"obx|4|nm|262196^mdc_evt_inop^mdc|1.3.1.150452.3|32767";
string s4 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150059000||oru^r01^oru_r01|161|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|161^mindray_d-series^00a037009a00cb60^eui-64|161^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150059\r" +
"obx|1|nm|147842^mdc_ecg_heart_rate^mdc|1.7.4.147842|70|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059||||00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|151578^mdc_tthor_resp_rate^mdc|1.7.1.151578|15|264928^mdc_dim_resp_per_min^mdc|||||r|||20231125150059\r" +
"obx|3|nm|150456^mdc_puls_oxim_sat_o2^mdc|1.3.1.150456|97|262688^mdc_dim_percent^mdc|||||r|||20231125150059\r" +
"obx|4|nm|149530^mdc_puls_oxim_puls_rate^mdc|1.3.1.149530|69|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059";
string s41 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150059000||oru^r01^oru_r01|161|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|161^mindray_d-series^00a037009a00cb60^eui-64|161^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150059\r" +
"obx|1|nm|147842^mdc_ecg_heart_rate^mdc|1.7.4.147842|71|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059||||00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|151578^mdc_tthor_resp_rate^mdc|1.7.1.151578|14|264928^mdc_dim_resp_per_min^mdc|||||r|||20231125150059\r" +
"obx|3|nm|150456^mdc_puls_oxim_sat_o2^mdc|1.3.1.150456|98|262688^mdc_dim_percent^mdc|||||r|||20231125150059\r" +
"obx|4|nm|149530^mdc_puls_oxim_puls_rate^mdc|1.3.1.149530|69|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059";
string s42 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150059000||oru^r01^oru_r01|161|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|161^mindray_d-series^00a037009a00cb60^eui-64|161^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150059\r" +
"obx|1|nm|147842^mdc_ecg_heart_rate^mdc|1.7.4.147842|1|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059||||00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|151578^mdc_tthor_resp_rate^mdc|1.7.1.151578|1|264928^mdc_dim_resp_per_min^mdc|||||r|||20231125150059\r" +
"obx|3|nm|150456^mdc_puls_oxim_sat_o2^mdc|1.3.1.150456|1|262688^mdc_dim_percent^mdc|||||r|||20231125150059\r" +
"obx|4|nm|149530^mdc_puls_oxim_puls_rate^mdc|1.3.1.149530|1|264864^mdc_dim_beat_per_min^mdc|||||r|||20231125150059";
string s5 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150018000||oru^r01^oru_r01|120|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|120^mindray_d-series^00a037009a00cb60^eui-64|120^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150018\r" +
"obx|1|nm|150301^mdc_press_cuff_sys^mdc|1.1.9.150301|121|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic|00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|150303^mdc_press_cuff_mean^mdc|1.1.9.150303|86|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic\r" +
"obx|3|nm|150302^mdc_press_cuff_dia^mdc|1.1.9.150302|80|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic";
string s51 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150018000||oru^r01^oru_r01|120|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|120^mindray_d-series^00a037009a00cb60^eui-64|120^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150018\r" +
"obx|1|nm|150301^mdc_press_cuff_sys^mdc|1.1.9.150301|123|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic|00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|150303^mdc_press_cuff_mean^mdc|1.1.9.150303|85|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic\r" +
"obx|3|nm|150302^mdc_press_cuff_dia^mdc|1.1.9.150302|85|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic";
string s52 = "msh|^~\\&|mindray_d-series^00a037009a00cb60^eui-64||||20231125150018000||oru^r01^oru_r01|120|p|2.6|||al|ne||unicode utf-8|||ihe_pcd_001^ihe pcd^1.3.6.1.4.1.19376.1.6.1.1.1^iso\r" +
"pid|||^^^hospital^pi||^^^^^^l\r" +
"pv1||i\r" +
"obr|1|120^mindray_d-series^00a037009a00cb60^eui-64|120^mindray_d-series^00a037009a00cb60^eui-64|182777000^monitoring of patient^sct|||20231125150018\r" +
"obx|1|nm|150301^mdc_press_cuff_sys^mdc|1.1.9.150301|1|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic|00a037009a00cb60^^00a037009a00cb60^eui-64\r" +
"obx|2|nm|150303^mdc_press_cuff_mean^mdc|1.1.9.150303|1|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic\r" +
"obx|3|nm|150302^mdc_press_cuff_dia^mdc|1.1.9.150302|1|266016^mdc_dim_mmhg^mdc|||||r|||20231125150018|||^aperiodic";
hapicontext context = new defaulthapicontext();
//设置hl7不校验字段值
parserconfiguration tparserconfiguration = new parserconfiguration();
tparserconfiguration.setvalidating(false);
context.setparserconfiguration(tparserconfiguration);
parser p = context.getgenericparser();
message hapimsg = null;
int x = 1;
while (true) {
try {
if (param >= 1) {
hapimsg = p.parse(s1);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s2);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s3);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s4);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s5);
mhl7business.analysismodule_1(hapimsg);
thread.sleep(1000);
}
if (param > 1) {
hapimsg = p.parse(s11);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s21);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s31);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s41);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s51);
mhl7business.analysismodule_1(hapimsg);
thread.sleep(1000);
hapimsg = p.parse(s12);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s22);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s32);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s42);
mhl7business.analysismodule_1(hapimsg);
hapimsg = p.parse(s52);
mhl7business.analysismodule_1(hapimsg);
thread.sleep(1000);
}
if ((x++) == param) {
break;
}
} catch (exception e) {
e.printstacktrace();
}
}
return null;
}
}2、问题记录
笔者在开发中遇到的最坑的一个问题,也是耽误时间最长的:
从日志中抓取到hl7传输的数据,作为字符串复制到代码中开始调试,但是无论怎么运行都只能获取到第一行的部分数据,经过反反复复的调整环境仍然无果。
最后无意中看到了字符串末尾 \n 的字符,这才想到可能是换行导致了api识别有误,替换为 \r 后解析就正常啦。
以后也要注意粘贴进来的换行符可能会影响到解析逻辑。

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论