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|^~&|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": "^~\\&",
"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
更多关于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;
}
}
注意:上面的代码示例中,HL7Message
和MSHSegment
类的实现是简化的,因为实际的hl7_v2
插件可能会有更复杂的解析逻辑。你需要参考插件的文档来了解如何正确使用这些类。如果插件提供了这些类的具体实现,你应该直接使用插件提供的API而不是自己实现。
此外,HL7消息通常包含多个段(如PID、PV1等),上面的示例只展示了如何解析MSH段。在实际应用中,你可能需要解析更多的段,并根据HL7消息的结构访问各个字段。