目录
一、前言介绍
最近研究对接医院设备,所需时间最多的还是研究协议/解析数据,对接的难度不大,各个厂家各个版本的参数标识都不一致,请对接时索要确定文档来确定参数标识的实际参数含义,如部分厂家会传递会有两个一样的标识,需要通过OBX段的Sub-ID来二次确认参数
--所需jar
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-base</artifactId>
<version>2.3</version>
</dependency>
<!-- HL7解析 版本具体看医院协议的版本 -->
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v26</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>2.3</version>
</dependency>
-- 解析的示例数据
MSH|^~\&|^GoldwayG||||20230727132606||ORU^R01^ORU_R01|09FB744EBB0000000127|P|2.6|||||||||2.16.840
PID|||PatientID||PatientName||19990807|F|
PV1||I|科室^房间^床号&网络床号^医院^^^^^4376B491^设备名称|&&0|||^主治医生姓名|^顾问医生姓名||||||||||A|VisitNumber||||||||||||||||||||||| | |20230725000000|
OBR||||MONITOR|||20230727132606
OBX|1|NM|0002-4182^HR^MDIL||60|0004-0aa0^bpm^MDIL|||||X
OBX|2|NM|0002-5000^RESP^MDIL||40|0004-0ae0^rpm^MDIL|||||X
OBX|3|NM|0002-4bb8^SpO2^MDIL||96|0004-0220^%^MDIL|||||F
二、协议格式
注:这里只会标注常用的字段说明
1.格式及类型说明
分隔符说明
| | 域分隔符 |
^ | 组件分隔符 |
~ | 重复分隔符 |
\ | 转义符 |
& | 子组件分隔符 |
说明:一般常用的是|和^,如示例中的PV1,PV1-3 指第三个|后的内容(患者位置信息),PV1-3.1指第一个^前的内容(患者科室)
数据类型说明
NM | 整数 |
ST | 字符串 |
SN | 比率 |
CNE | 枚举值 |
DTM | 日期 |
SI | 序列id |
IS | 用户定义表的编码 |
2.MSH--消息头
示例 MSH|^~\&||KC009910821G|||20230810095016+0800||ORU^R01|202308100950161337|P|2.4
序号 | 数据类型 | 字段说明 |
1 | ST | 域分隔符 |
3 | HD | 发送端软件 |
4 | HD | 发送端设备 |
7 | TS | 消 息 的 日 期 和 时 间 |
9 | MSG | 消息类型 |
12 | VID | 版本 |
3.PID--患者基本信息
示例 PID|||PatientID||PatientName||19990807|F|
序号 | 数据类型 | 字段说明 |
3 | CX | 病人标识列表 |
5 | XPN | 病人姓名 |
7 | DTM | 出生日期 |
8 | IS | 性别 |
19 | ST | SSN号码 |
4.PV1--患者入院信息
示例 PV1||I|科室^房间^床号&网络床号^医院^^^^^4376B491^设备名称|&&0|||^主治医生姓名|^顾问医生姓名
序号 | 数据类型 | 字段说明 |
2 | IS | 病人分类 |
3 | PL | 位置信息 |
3.1 | ST | 科室 |
3.2 | ST | 房间 |
3.3 | ST/PL | 床号/厂家不同 |
3.3.1 | ST | 床号 |
3.3.2 | ST | 网络床号/部分厂家 |
3.9 | ST | 设备 MAC 地址 |
3.10 | ST | 设备名称 |
7 | XCN | 主治医师 |
8 | XCN | 助理医师 |
19 | CX | 挂号号码 |
44 | DTM | 入院日期/时间 |
5.OBR--记录的请求信息
示例 OBR||||1^MON_PARAM^99COMEN|||20131213202904
序号 | 数据类型 | 字段说明 |
2 | EI | Placer 序号 |
3 | EI | Filler 序号 |
6 | DTM | 请求时间 |
7 | DTM | 监测时间 |
6.OBX--观测结果
示例 OBX||NM|150344^MDC_TEMP^MDC|1.2.1.150344|39.0||36.0^39.0||||F|||20230810095017
序号 | 数据类型 | 字段说明 |
2 | ID | 数值类型 |
3 | CWE | 监测参数标识 |
4 | ST | 监测参数 Sub-ID |
5 | 监测参数值 | |
6 | CWE | 单位 |
11 | ID | 观察结果状态 |
14 | DTM | 观察时间 |
三、简单解析示例
1.自定义消息
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractMessage;
import ca.uhn.hl7v2.model.v24.segment.*;
import ca.uhn.hl7v2.parser.DefaultModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import com.example.hl7.v24.message.datatype.PV1;
import java.util.List;
/**
* @author pw
*/
public class ORU_R01 extends AbstractMessage {
public ORU_R01() {
this(new DefaultModelClassFactory());
}
public ORU_R01(ModelClassFactory factory) {
super(factory);
this.init(factory);
}
private void init(ModelClassFactory factory) {
try {
this.add(MSH.class, true, false);
this.add(PV1.class,true, false);
this.add(OBR.class,true, false);
this.add(OBX.class,true, false);
} catch (HL7Exception var3) {
log.error("Unexpected error creating ADT_A01 - this is probably a bug in the source code generator.", var3);
}
}
@Override
public String getVersion() {
return "2.4";
}
public List<OBX> getOBX2All() throws HL7Exception {
return this.getAllAsList("OBX2", OBX.class);
}
public List<OBX> getOBXAll() throws HL7Exception {
return this.getAllAsList("OBX", OBX.class);
}
public PID getPID() {
return this.getTyped("PID", PID.class);
}
public PV1 getPV1() {
return this.getTyped("PV1", PV1.class);
}
public OBR getOBR() {
return this.getTyped("OBR", OBR.class);
}
public MSH getMSH() {
return this.getTyped("MSH", MSH.class);
}
}
2.HL7数据解析示例
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.Type;
import ca.uhn.hl7v2.model.Varies;
import ca.uhn.hl7v2.model.v24.datatype.NM;
import ca.uhn.hl7v2.model.v24.datatype.ST;
import ca.uhn.hl7v2.model.v24.segment.OBX;
import ca.uhn.hl7v2.parser.CustomModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import ca.uhn.hl7v2.parser.PipeParser;
import com.example.HL7.v24.message.ORU_R01;
import java.util.List;
public class App {
public static void main(String[] args) throws HL7Exception {
//要解析的自定义HL7消息,数据以\r换行
String hl7 = "MSH|^~\\&|^GoldwayG||||20230727132606||ORU^R01^ORU_R01|09FB744EBB0000000127|P|2.4|||||||||2.16.840\r" +
"PID|||1||4 5 6^^|||M\r" +
"PV1|||^^3|||||||||||||||A|2\r" +
"ORC|NW|||||||||||||||||09FB744EBB\r" +
"OBR||||MONITOR|||20230727132606\r" +
"OBX|1|NM|0002-4182^HR^MDIL||96|0004-0aa0^bpm^MDIL|||||X\r" +
"OBX|2|NM|0002-5000^RESP^MDIL|||0004-0ae0^rpm^MDIL|||||X\r" +
"OBX|3|NM|0002-4bb8^SpO2^MDIL||96|0004-0220^%^MDIL|||||F\r" +
"OBX|4|NM|0002-480a^SpO2_Pulse^MDIL|||0004-0aa0^bpm^MDIL|||||X||||||0002-4bb8^SpO2^MDIL";
//创建hapi上线文
HapiContext context = new DefaultHapiContext();
//获取解析器
PipeParser parser = context.getPipeParser();
//创建自定义类工厂
ModelClassFactory factory = new CustomModelClassFactory("com.example.HL7");
//将自定义工厂类设置到上下文中,以便hapi可以找到对应的自定义消息,并解析
context.setModelClassFactory(factory);
//解析
Message parse = parser.parse(hl7);
String version = parse.getVersion();
System.out.println("版本--"+version);
if(parse instanceof ORU_R01){
ORU_R01 zdyRes = (ORU_R01) parser.parse(hl7);
List<OBX> obxAll = zdyRes.getOBXAll();
for(OBX o:obxAll){
Varies roomNumber = o.getObservationValue(0);
Type data1 = roomNumber.getData();
String idCode = o.getObservationIdentifier().getIdentifier().getValue();
System.out.println("监测标识编码"+idCode);
if(data1 instanceof NM){
NM data = (NM)roomNumber.getData();
System.out.println(data.getValue());
}else if(data1 instanceof ST) {
ST data = (ST) roomNumber.getData();
System.out.println(data.getValue());
}
}
}
}
}
四、socket项目示例--已更新
已于2024-04-10更新,修复示例代码与实际项目中的出入
链接:百度网盘
提取码:zi71