上一篇文章博主笼统的讲了HL7解析,以及解析完成的Message结构,详情移步👉(Java通过HAPI解析HL7消息),下面博主就来讲讲通过HL7如何解析自定义消息
HL7(详情)
Health Level Seven组织成立於1987年,由SamSchultz博士在宾夕法尼亚州大学医院主持的一次会议促成了HL7组织和通信标准的诞生。随着许多用户、厂商、顾问组织的加入,HL7队伍在逐渐壮大,于是成立了HL7工作组。(官网)
使用的HAPI(maven)
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-base</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>${hapi.version}</version>
</dependency>
要解析的自定义消息
MSH|^~\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL
ZDS|999|九九九|20210315184009.925+0800
解析过程
1.解读HL7消息(我只给大家解读下解析消息需要注意的重点,我会将重点标红)
- MSH段解读
- 这个自定义消息的名称是ZDY^RES(ZDY_RES)
- 使用版本 2.4
ZDS段解读
重点:创建的位置
com.example.HL7.v24.segment;
- 上面需要解析的HL7消息的版本是2.4对应这里的v24;
- 这里自定义的是段Segment,对应这里的segment; ```java package com.example.HL7.v24.segment;
import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.model.AbstractSegment; import ca.uhn.hl7v2.model.Group; import ca.uhn.hl7v2.model.Type; import ca.uhn.hl7v2.model.v24.datatype.NM; import ca.uhn.hl7v2.model.v24.datatype.ST; import ca.uhn.hl7v2.model.v25.datatype.DTM; import ca.uhn.hl7v2.parser.ModelClassFactory;
/**
- @author luzihao
- @date 2021/3/17 11:11 上午
@Description 自定义段,需继承 AbstractSegment */ public class ZDS extends AbstractSegment {
public ZDS(Group parent, ModelClassFactory factory) {
super(parent, factory);
//自定义初始化
init();
}
private void init() {
try {
//1.数字,可以为空,不限制最大重复次数(0为不限制),长度50,名字是 room_number
add(NM.class, false, 0, 50, new Object[]{getMessage()}, "room_number");
//2.字符串,不可为空,最大重复次数为2,长度200,名字是 dept_name
add(ST.class, true, 2, 200, new Object[]{getMessage()}, "dept_name");
//3.日期,名字是 into_time
add(DTM.class, true, 1, 200, new Object[]{getMessage()}, "into_time");
} catch (HL7Exception e) {
e.printStackTrace();
}
}
/**
- 此方法必须被覆盖。最简单的方法就是返回null。(网上资料看到的)
- @param field
@return */ @Override protected Type createNewTypeWithoutReflection(int field) { return null; }
/**
- 获取病房号,第一个字段
@return */ public NM getRoomNumber() { //取第一个字段,和初始化的顺序一样,下面的就省略了 return getTypedField(1, 0); }
/**
- 获取科室名称,第二个字段
@return */ public ST getDeptName() { return getTypedField(2, 0); }
/**
- 获取住院时间,第三个字段
- @return
*/
public DTM getIntoTime() {
return getTypedField(3, 0);
}
}
```
3.Java中创建自定义消息
- 重点:创建的位置
com.example.HL7.v24.message;
- 上面需要解析的HL7消息的版本是2.4对应这里的v24;
- 这里自定义的是消息Message,对应这里的message; ```java package com.example.HL7.v24.message;
import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.model.AbstractMessage; import ca.uhn.hl7v2.model.v24.segment.MSH; import ca.uhn.hl7v2.parser.DefaultModelClassFactory; import ca.uhn.hl7v2.parser.ModelClassFactory; import com.example.HL7.v24.segment.ZDS;
/**
- @author luzihao
- @date 2021/3/17 11:05 上午
@Description 自定义HL7消息,自定义消息需继承 AbstractMessage */ public class ZDY_RES extends AbstractMessage {
public ZDY_RES() {
this(new DefaultModelClassFactory());
}
public ZDY_RES(ModelClassFactory theFactory) {
super(theFactory);
//已定义初始化
this.init();
}
private void init() {
try {
//1.MSH段,不可为空,不可重复,在第一位,下标0开始
this.add(MSH.class, true, false, 0);
//2.ZDS段,不可为空,不可重复,在第二位(这里设置的我们的自定义段)
this.add(ZDS.class, true, false, 1);
} catch (HL7Exception e) {
e.printStackTrace();
}
}
/**
- 需要覆盖此方法,返回自定义HL7消息中的版本号
@return */ @Override public String getVersion() { return “2.4”; }
public MSH getMSH() { return getTyped(“MSH”, MSH.class); }
/**
- 获取ZDS段
- @return
/
public ZDS getZDS() {
/*
- 俩参数
- 1.自定义段名 ZDS
- 2.自定义段类 ZDS.class */ return getTyped(“ZDS”, ZDS.class); }
}
<a name="ISiXC"></a>
## 4.正式解析
```java
package com.example;
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.v24.datatype.NM;
import ca.uhn.hl7v2.model.v24.datatype.ST;
import ca.uhn.hl7v2.model.v25.datatype.DTM;
import ca.uhn.hl7v2.parser.CustomModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import ca.uhn.hl7v2.parser.PipeParser;
import com.example.HL7.v24.message.ZDY_RES;
import com.example.HL7.v24.segment.ZDS;
import java.text.SimpleDateFormat;
public class App {
public static void main(String[] args) throws HL7Exception {
//要解析的自定义HL7消息
String hl7 = "MSH|^~\\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL\r" +
"ZDS|999|九九九|20210315184009.925+0800";
//创建hapi上线文
HapiContext context = new DefaultHapiContext();
//获取解析器
PipeParser parser = context.getPipeParser();
//创建自定义类工厂,此处是重点,指向我们自定义消息的文件位置的外层(也就是版本号的上一层)
ModelClassFactory factory = new CustomModelClassFactory("com.example.HL7");
//将自定义工厂类设置到上下文中,以便hapi可以找到对应的自定义消息,并解析
context.setModelClassFactory(factory);
//解析
ZDY_RES zdy_res = (ZDY_RES) parser.parse(hl7);
ZDS zds = zdy_res.getZDS();
NM roomNumber = zds.getRoomNumber();
ST deptName = zds.getDeptName();
DTM intoTime = zds.getIntoTime();
System.out.println("病房号:" + roomNumber.getValue());
System.out.println("科室:" + deptName.getValue());
System.out.println("住院日期:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(intoTime.getValueAsDate()));
}
}
- 重点解析:
我们可以打断点看一下自定义类工厂factory,其中customModelClasses是一个键值对的集合,key是版本,value是包名(也就是自定义消息的目录地址),而我们要解析的HL7消息的版本是2.4,所以根据我们上面创建的自定义类工厂所设置的包地址com.example.HL7
后天加上[v24],而要解析自定义消息就会去找这个包下的message里面的自定义消息,要解析自定义段就会找这个包下的segment里面的自定义段
包的目录结构
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee)
创作不宜,请勿抄袭!