Java解析HL7消息进阶(解析自定义HL7消息)

上一篇文章博主笼统的讲了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段解读
    1. 这个自定义消息的名称是ZDY^RESZDY_RES
    2. 使用版本 2.4
  • ZDS段解读
    1. ZDS是个自定义段,段名为ZDS
    2. ZDS有三个字段:
      1. 999:NM(数字类型)
      2. 九九九:ST(字符串类型)
      3. 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解析自定义消息的过程;
image.png
包的目录结构
image.png
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee
创作不宜,请勿抄袭!

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白给卢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值