Flutter HL7 V2协议处理插件hl7_v2的使用

Flutter HL7 V2协议处理插件hl7_v2的使用

HL7 Version 2 (HL7v2) 是最广泛使用的医疗数据交换标准。此模块可以将HL7v2消息转换为JSON表示形式,并从JSON转换回HL7v2消息格式。

该软件包是Redox原始代码的Dart版本,可以在以下位置找到:这里

使用

解析器/生成器可以用于将各种HL7v2消息从分隔符格式转换为结构化的JSON版本。当消息不匹配模式时,模块支持自定义模式。有关更多信息,请参阅自定义模式部分。

解析器

import 'package:hl7_v2/hl7_v2.dart';

final rawData = `MSH|^~\&|||...`;
final parser = HL7v2Message();
final jsonData = parser.parse(rawData);

生成器

final ackJSON = {
  "MSH": {
    "0": "MSH",
    "1": "|",
    "2": "^~\\&",
    "3": {
      "1": "CHERDABEE"
    },
    "5": {
      "1": "REDOX"
    },
    "6": {
      "1": "RDX"
    },
    "7": {
      "1": "20150915004731"
    },
    "9": {
      "1": "ACK",
      "2": "S12"
    },
    "10": "20150915004731",
    "11": {
      "1": "T"
    },
    "12": {
      "1": "2.3"
    }
  },
  "MSA": {
    "0": "MSA",
    "1": "AA",
    "2": "1"
  }
};

final generator = new HL7v2Message();
final data = generator.write(ackJSON);
// `MSH|^~\\&|CHERDABEE||REDOX|RDX|20150915004731||ACK^S12|20150915004731|T|2.3|||||||||\rMSA|AA|1||||\r`

理解HL7v2模式

解析/生成HL7的方法是基于模式驱动的。模式基于HL7v2规范。

为了便于理解,最好通过模式文件夹来了解,这些文件是从原始JavaScript实现中复制过来的:

schema/
  index.js - 访问模式的入口点
  dataTypes/ - 包含HL7v2中每个“数据类型”的定义(见第2A章)
  fields/ - 包含每个字段的定义。每个文件命名为<Segment>.<Field Number>
  messages/ - 包含每个消息定义的实际结构,此文件还包含“组”
  segments/ - 包含段中哪些字段的定义
  structure/ - 包含从HL7消息/事件类型到结构定义的映射

为了避免管理外部JSON文件作为资产,原始JSON模式已转换为Dart。Dart模式可以在lib/src/schema中找到。要使用原始模式,请运行HL7v2Message.loadSchema()。此方法能够解析原始JSON模式文件,以便代码行为与原始实现完全相同。

否则,默认情况下将使用Dart模式。可以通过运行HL7v2Message.writeDartJsonSchema()来重新创建Dart文件。

基本知识

HL7中定义了许多事件,但有些事件具有相同的结构。例如,ADT^A01和ADT^A04都具有相同的ADT^A01结构。

一旦确定了结构,代码会查看schema/messages中的相应模式。每个消息定义都是一个对象,其中属性是“段组”。与消息类型同名的组是根。因此,在ORU_R01.json中,ORU_R01属性恰好有1个必需的MSH段,无限数量的SFT段,以及一个PATIENT_RESULT组。

{
  ...
  "ORU_R01": {
    "elements": [
      {
        "minOccurs": "1",
        "maxOccurs": "1",
        "segment": "MSH"
      },
      {
        "minOccurs": "0",
        "maxOccurs": "unbounded",
        "segment": "SFT"
      },
      {
        "minOccurs": "1",
        "maxOccurs": "unbounded",
        "group": "PATIENT_RESULT"
      },
      {
        "minOccurs": "0",
        "maxOccurs": "1",
        "segment": "DSC"
      }
    ]
  }
}

覆盖模式

现有的HL7v2实现通常不遵守关于段组和段顺序的规则,因此可以自由使用自定义模式。在解析器或生成器的构造函数中传递一个JSON对象以使用自定义模式。它将与现有模式合并。

自定义模式的示例可以在以下位置找到:

HL7商标和知识产权声明

HL7® 和 HEALTH LEVEL SEVEN® 是由Health Level Seven International拥有的商标。HL7® 和 HEALTH LEVEL SEVEN® 已在美国专利和商标局注册。


完整示例Demo

以下是完整的示例代码,演示如何使用hl7_v2插件解析和生成HL7v2消息。

import 'package:hl7_v2/hl7_v2.dart';

Future<void> main() async {
  final hl7Message = HL7v2Message();

  // 解析HL7v2消息
  final parsedData = hl7Message.parse('''
MSH|^~&amp;|ADT1|GOOD HEALTH HOSPITAL|GHH LAB, INC.|GOOD HEALTHHOSPITAL|201808181126|SECURITY|ADT^A01^ADT_A01|MSG00001|P|2.7|
EVN|A01|201808181123||
PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTHHOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOMESTREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||PATID12345001^2^M10^ADT1^AN^A|444333333|987654^NC|
NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE||||NK^NEXT OF KIN
PV1|1|I|2000^2012^01||||004777^ATTEND^AARON^A|||SUR||||ADM|A0|
  ''');

  // 打印解析后的数据
  print(parsedData);

  // 生成HL7v2消息
  final generatedData = hl7Message.write({
    "MSH": {
      "0": "MSH",
      "1": "|",
      "2": "^~\\&amp;",
      "3": {
        "1": "CHERDABEE"
      },
      "5": {
        "1": "REDOX"
      },
      "6": {
        "1": "RDX"
      },
      "7": {
        "1": "20150915004731"
      },
      "9": {
        "1": "ACK",
        "2": "S12"
      },
      "10": "20150915004731",
      "11": {
        "1": "T"
      },
      "12": {
        "1": "2.3"
      }
    },
    "MSA": {
      "0": "MSA",
      "1": "AA",
      "2": "1"
    }
  });

  // 打印生成的数据
  print(generatedData);
}

更多关于Flutter HL7 V2协议处理插件hl7_v2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter HL7 V2协议处理插件hl7_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter中使用hl7_v2插件来处理HL7 V2协议的代码示例。hl7_v2插件(假设它存在并且功能完备)通常用于解析和构建HL7消息。下面是一个基本的示例,展示了如何解析一个HL7消息并访问其中的字段。

首先,确保你已经在pubspec.yaml文件中添加了hl7_v2依赖:

dependencies:
  flutter:
    sdk: flutter
  hl7_v2: ^x.y.z  # 请替换为实际的版本号

然后,运行flutter pub get来安装依赖。

接下来,编写Flutter代码来处理HL7消息。以下是一个示例,展示如何解析一个简单的HL7消息:

import 'package:flutter/material.dart';
import 'package:hl7_v2/hl7_v2.dart';  // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter HL7 V2 Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter HL7 V2 Demo'),
        ),
        body: Center(
          child: HL7ParserDemo(),
        ),
      ),
    );
  }
}

class HL7ParserDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例HL7消息(MSH段)
    String hl7Message = """MSH|^~\\&|SENDING|RECEIVING|HL7V2|HL7APP|202301011200||ADT^A01|123456|P|2.3\r""";

    // 解析HL7消息
    HL7Message message = HL7Message.parse(hl7Message);

    // 访问MSH段的内容
    MSHSegment msh = message.segments.first as MSHSegment;
    String sendingApplication = msh.sendingApplication;
    String receivingApplication = msh.receivingApplication;
    String messageType = msh.messageType;
    String messageControlId = msh.messageControlId;

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Sending Application: $sendingApplication'),
        Text('Receiving Application: $receivingApplication'),
        Text('Message Type: $messageType'),
        Text('Message Control ID: $messageControlId'),
      ],
    );
  }
}

// 假设HL7Message和MSHSegment是插件提供的类
// 这些类通常会有parse方法以及访问各个字段的属性
class HL7Message {
  List<HL7Segment> segments;

  // 静态方法用于解析HL7字符串
  static HL7Message parse(String hl7String) {
    // 这里应该是解析逻辑,但因为是示例,所以直接返回一个模拟对象
    HL7Message message = HL7Message();
    message.segments = [MSHSegment.parse(hl7String)];  // 简化处理,只解析MSH段
    return message;
  }
}

class MSHSegment {
  String sendingApplication;
  String receivingApplication;
  String messageType;
  String messageControlId;

  // 静态方法用于解析MSH段字符串
  static MSHSegment parse(String hl7String) {
    // 这里应该是MSH段的解析逻辑,但因为是示例,所以直接返回一个模拟对象
    MSHSegment segment = MSHSegment();
    // 假设字符串格式正确,并且只提取前几个字段作为示例
    List<String> fields = hl7String.split('|');
    segment.sendingApplication = fields[3];
    segment.receivingApplication = fields[4];
    segment.messageType = fields[9];
    segment.messageControlId = fields[10];
    return segment;
  }
}

注意:上面的代码示例中,HL7MessageMSHSegment类的实现是简化的,因为实际的hl7_v2插件可能会有更复杂的解析逻辑。你需要参考插件的文档来了解如何正确使用这些类。如果插件提供了这些类的具体实现,你应该直接使用插件提供的API而不是自己实现。

此外,HL7消息通常包含多个段(如PID、PV1等),上面的示例只展示了如何解析MSH段。在实际应用中,你可能需要解析更多的段,并根据HL7消息的结构访问各个字段。

回到顶部