上一篇文章博主笼统的讲了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段解读
- ZDS是个自定义段,段名为ZDS
- ZDS有三个字段:
- 999:NM(数字类型)
- 九九九:ST(字符串类型)
- 2021···:DTM(日期类型)
2.Java中创建自定义段
- 重点:创建的位置
com.example.HL7.v24.segment;
- 上面需要解析的HL7消息的版本是2.4对应这里的v24;
- 这里自定义的是段Segment,对应这里的segment;
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;
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);
}
}
4.正式解析
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里面的自定义段,相信看到这里大家也就明白了Hapi解析自定义消息的过程;
包的目录结构
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee)
创作不宜,请勿抄袭!