上一篇文章博主笼统的讲了HL7解析,以及解析完成的Message结构,详情移步👉(Java通过HAPI解析HL7消息),下面博主就来讲讲通过HL7如何解析自定义消息

HL7(详情

Health Level Seven组织成立於1987年,由SamSchultz博士在宾夕法尼亚州大学医院主持的一次会议促成了HL7组织和通信标准的诞生。随着许多用户、厂商、顾问组织的加入,HL7队伍在逐渐壮大,于是成立了HL7工作组。(官网

使用的HAPI(maven

  1. <dependency>
  2. <groupId>ca.uhn.hapi</groupId>
  3. <artifactId>hapi-base</artifactId>
  4. <version>${hapi.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>ca.uhn.hapi</groupId>
  8. <artifactId>hapi-structures-v24</artifactId>
  9. <version>${hapi.version}</version>
  10. </dependency>

要解析的自定义消息

  1. MSH|^~\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL
  2. ZDS|999|九九九|20210315184009.925+0800

解析过程

1.解读HL7消息(我只给大家解读下解析消息需要注意的重点,我会将重点标红)

  • MSH段解读
    1. 这个自定义消息的名称是ZDY^RES(ZDY_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; ```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) {

    1. super(parent, factory);
    2. //自定义初始化
    3. init();

    }

    private void init() {

    1. try {
    2. //1.数字,可以为空,不限制最大重复次数(0为不限制),长度50,名字是 room_number
    3. add(NM.class, false, 0, 50, new Object[]{getMessage()}, "room_number");
    4. //2.字符串,不可为空,最大重复次数为2,长度200,名字是 dept_name
    5. add(ST.class, true, 2, 200, new Object[]{getMessage()}, "dept_name");
    6. //3.日期,名字是 into_time
    7. add(DTM.class, true, 1, 200, new Object[]{getMessage()}, "into_time");
    8. } catch (HL7Exception e) {
    9. e.printStackTrace();
    10. }

    }

    /**

    • 此方法必须被覆盖。最简单的方法就是返回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() {

    1. this(new DefaultModelClassFactory());

    }

    public ZDY_RES(ModelClassFactory theFactory) {

    1. super(theFactory);
    2. //已定义初始化
    3. this.init();

    }

    private void init() {

    1. try {
    2. //1.MSH段,不可为空,不可重复,在第一位,下标0开始
    3. this.add(MSH.class, true, false, 0);
    4. //2.ZDS段,不可为空,不可重复,在第二位(这里设置的我们的自定义段)
    5. this.add(ZDS.class, true, false, 1);
    6. } catch (HL7Exception e) {
    7. e.printStackTrace();
    8. }

    }

    /**

    • 需要覆盖此方法,返回自定义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); }

}

  1. <a name="ISiXC"></a>
  2. ## 4.正式解析
  3. ```java
  4. package com.example;
  5. import ca.uhn.hl7v2.DefaultHapiContext;
  6. import ca.uhn.hl7v2.HL7Exception;
  7. import ca.uhn.hl7v2.HapiContext;
  8. import ca.uhn.hl7v2.model.v24.datatype.NM;
  9. import ca.uhn.hl7v2.model.v24.datatype.ST;
  10. import ca.uhn.hl7v2.model.v25.datatype.DTM;
  11. import ca.uhn.hl7v2.parser.CustomModelClassFactory;
  12. import ca.uhn.hl7v2.parser.ModelClassFactory;
  13. import ca.uhn.hl7v2.parser.PipeParser;
  14. import com.example.HL7.v24.message.ZDY_RES;
  15. import com.example.HL7.v24.segment.ZDS;
  16. import java.text.SimpleDateFormat;
  17. public class App {
  18. public static void main(String[] args) throws HL7Exception {
  19. //要解析的自定义HL7消息
  20. String hl7 = "MSH|^~\\&|T1|||T2^101|20210315184009.925+0800||ZDY^RES|ZDY_RES-20210315184009925|P|2.4|||NE|AL\r" +
  21. "ZDS|999|九九九|20210315184009.925+0800";
  22. //创建hapi上线文
  23. HapiContext context = new DefaultHapiContext();
  24. //获取解析器
  25. PipeParser parser = context.getPipeParser();
  26. //创建自定义类工厂,此处是重点,指向我们自定义消息的文件位置的外层(也就是版本号的上一层)
  27. ModelClassFactory factory = new CustomModelClassFactory("com.example.HL7");
  28. //将自定义工厂类设置到上下文中,以便hapi可以找到对应的自定义消息,并解析
  29. context.setModelClassFactory(factory);
  30. //解析
  31. ZDY_RES zdy_res = (ZDY_RES) parser.parse(hl7);
  32. ZDS zds = zdy_res.getZDS();
  33. NM roomNumber = zds.getRoomNumber();
  34. ST deptName = zds.getDeptName();
  35. DTM intoTime = zds.getIntoTime();
  36. System.out.println("病房号:" + roomNumber.getValue());
  37. System.out.println("科室:" + deptName.getValue());
  38. System.out.println("住院日期:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(intoTime.getValueAsDate()));
  39. }
  40. }
  • 重点解析:

我们可以打断点看一下自定义类工厂factory,其中customModelClasses是一个键值对的集合,key是版本,value是包名(也就是自定义消息的目录地址),而我们要解析的HL7消息的版本是2.4,所以根据我们上面创建的自定义类工厂所设置的包地址com.example.HL7后天加上[v24],而要解析自定义消息就会去找这个包下的message里面的自定义消息,要解析自定义段就会找这个包下的segment里面的自定义段
image.png
包的目录结构
image.png
以上内容就是我总结的Java通过Hapi解析自定义消息全过程,源码欢迎访问👉(我的Gitee
创作不宜,请勿抄袭!