HL7

2025-12-07 0 897

重要的

  • 最低支持的PHP版本已更新为8.0
    最后支持版本:
    • PHP 7.0或7.1 => 1.5.4
    • PHP 7.2 => 2.0.2
    • PHP 7.4 => 2.1.7
  • 全局设置SEGMENT_ENDING_BAR被弃用,并将在以后的版本中删除。代替使用WITH_SEGMENT_ENDING_FIELD_SEPARATOR

介绍

基于PHP的HL7 V2.X解析,生成和发送库,灵感来自著名的Perl Net- HL7软件包。

安装

composer require aranyasen/ HL7 

用法

导入库

HL7 factory class
use Aranyasen\\ HL7 \\Message; // If Message is used
use Aranyasen\\ HL7 \\Segment; // If Segment is used
use Aranyasen\\ HL7 \\Segments\\MSH; // If MSH is used
// … and so on\”>

 // First, import classes from the library as needed...
use Aranyasen \\ HL7 ; // HL7 factory class
use Aranyasen \\ HL7 \\ Message ; // If Message is used
use Aranyasen \\ HL7 \\ Segment ; // If Segment is used
use Aranyasen \\ HL7 \\ Segments \\ MSH ; // If MSH is used
// ... and so on

解析

HL7 string
$message = HL7 ::from(\”MSH|^~\\\\&|1|\”)->createMessage(); // Returns Message object

// Or, using Message class…
$message = new Message(\”MSH|^~\\\\&|1|\\rPID|||abcd|\\r\”); // Either \\n or \\r can be used as segment endings

// Get string form of the message
echo $message->toString(true);

// Extracting segments and fields from a Message object…
$message->getSegmentByIndex(1); // Get the first segment
$message->getSegmentsByName(\’ABC\’); // Get an array of all \’ABC\’ segments
$message->getFirstSegmentInstance(\’ABC\’); // Returns the first ABC segment. Same as $message->getSegmentsByName(\’ABC\’)[0];

// Check if a segment is present in the message object
$message->hasSegment(\’ABC\’); // return true or false based on whether PID is present in the $message object

// Check if a message is empty
$message = new Message();
$message->isempty(); // Returns true\”>

 // Create a Message object from a HL7 string
$ message = HL7 :: from ( \" MSH|^~ \\\\ &|1| \" )-> createMessage (); // Returns Message object

// Or, using Message class...
$ message = new Message ( \" MSH|^~ \\\\ &|1| \\r PID|||abcd| \\r\" ); // Either \\n or \\r can be used as segment endings

// Get string form of the message
echo $ message -> toString ( true );

// Extracting segments and fields from a Message object...
$ message -> getSegmentByIndex ( 1 ); // Get the first segment
$ message -> getSegmentsByName ( \' ABC \' ); // Get an array of all \'ABC\' segments
$ message -> getFirstSegmentInstance ( \' ABC \' ); // Returns the first ABC segment. Same as $message->getSegmentsByName(\'ABC\')[0];

// Check if a segment is present in the message object
$ message -> hasSegment ( \' ABC \' ); // return true or false based on whether PID is present in the $message object

// Check if a message is empty
$ message = new Message ();
$ message -> isempty (); // Returns true

撰写新消息

HL7 object. It is a factory class with various helper methods to help build a HL7 .
$message = HL7 ::build()->createMessage(); // Creates an empty message

// The HL7 factory class provides methods that can be chained together in a fluent fashion
$message = HL7 ::build()
->withComponentSeparator(\’#\’)
->withFieldSeparator(\’-\’)
->createMessage();

// Or, using Message class…
$message = new Message();\”>

 // The class ` HL7 ` can be used to build HL7 object. It is a factory class with various helper methods to help build a HL7 .
$ message = HL7 :: build ()-> createMessage (); // Creates an empty message

// The HL7 factory class provides methods that can be chained together in a fluent fashion
$ message = HL7 :: build ()
    -> withComponentSeparator ( \' # \' )
    -> withFieldSeparator ( \' - \' )
    -> createMessage ();

// Or, using Message class...
$ message = new Message ();

消息构造函数参数

HL7.
// Note: All of these properties are available as fluent methods in HL7 factory class (shown above). So it\’s recommended to use that for readability

// Creating multiple message objects may have an unexpected side effect: segments start with wrong index values (Check tests/MessageTest for explanation)…
// Use 4th argument as true, or call resetSegmentIndices() on $message object to reset segment indices to 1
$message = new Message(\”MSH|^~\\&|||||||ORM^O01||P|2.3.1|\”, null, true, true);
// … any segments added here will now start index from 1, as expected.\”>

 // When a message is composed using Message class, there are multiple parameters available to define the properties of the HL7 .
// Note: All of these properties are available as fluent methods in HL7 factory class (shown above). So it\'s recommended to use that for readability

// Creating multiple message objects may have an unexpected side effect: segments start with wrong index values (Check tests/MessageTest for explanation)...
// Use 4th argument as true, or call resetSegmentIndices() on $message object to reset segment indices to 1
$ message = new Message ( \" MSH|^~\\&|||||||ORM^O01||P|2.3.1| \" , null , true , true );
// ... any segments added here will now start index from 1, as expected. 

HL7String = \”MSH|^~\\&|||||||ORU^R01|00001|P|2.3.1|\\n\” . \”OBX|1||11^AA|\\n\” . \”OBX|1||22^BB|\\n\”;
$message = new Message($ HL7 String, null, true, true, false); $// $message contains both OBXs with given indexes in the string\”>

 // Sometimes you may want to have exact index values, rather than auto-incrementing for each instance of a segment
// Use 5th argument as false...
$ HL7 String = \" MSH|^~\\&|||||||ORU^R01|00001|P|2.3.1| \\n\" . \" OBX|1||11^AA| \\n\" . \" OBX|1||22^BB| \\n\" ;
$ message = new Message ( $ HL7 String , null , true , true , false ); $ // $message contains both OBXs with given indexes in the string 

HL7 version etc.
$message = new Message(\”MSH|^~\\\\&|1|\\rPV1|1|O|^AAAA1^^^BB|\”, [\’SEGMENT_SEPARATOR\’ => \’\\r\\n\’, \’ HL7 _VERSION\’ => \’2.3\’]);

// Segment with separator character (~) creates sub-arrays containing each sub-segment
$message = new Message(\”MSH|^~\\&|||||||ADT^A01||P|2.3.1|\\nPID|||3^0~4^1\”); // Creates [[3,0], [4,1]]

// To create a single array instead, pass \’true\’ as 6th argument. This may be used to retain behavior from previous releases
// Notice: Since this leads to a non-standard behavior, it may be removed in future
$message = new Message(\”MSH|^~\\&|||||||ADT^A01||P|2.3.1|\\nPID|||3^0~4^1\”, null, false, false, true, true); // Creates [\’3\’, \’0~4\’, \’1\’]
// or
$message = new Message(\”MSH|^~\\&|||||||ADT^A01||P|2.3.1|\\nPID|||3^0~4^1\”, doNotSplitRepetition: true); // Creates [\’3\’, \’0~4\’, \’1\’]\”>

 // Create a segment with empty sub-fields retained
$ message = new Message ( \" MSH|^~ \\\\ &|1| \\r PV1|1|O|^AAAA1^^^BB| \" , null , true ); // Third argument \'true\' forces to keep all sub-fields
$ pv1 = $ message -> getSegmentByIndex ( 1 );
$ fields = $ pv1 -> getField ( 3 ); // $fields is [\'\', \'AAAA1\', \'\', \'\', \'BB\']

// Create/send message with segment-ending field-separator character (default \"|\") removed
$ message = new Message ( \" MSH|^~ \\\\ &|1| \\n ABC|||xxx \\n\" , [ \' WITH_SEGMENT_ENDING_FIELD_SEPARATOR \' => false ]);
$ message -> toString ( true ); // Returns \"MSH|^~\\&|1\\nABC|||xxx\\n\"
( new Connection ( $ ip , $ port ))-> send ( $ message ); // Sends the message without ending field-separator character (details on Connection below)

// Specify custom values for separators, HL7 version etc.
$ message = new Message ( \" MSH|^~ \\\\ &|1| \\r PV1|1|O|^AAAA1^^^BB| \" , [ \' SEGMENT_SEPARATOR \' => \' \\r\\n \' , \' HL7 _VERSION \' => \' 2.3 \' ]);

// Segment with separator character (~) creates sub-arrays containing each sub-segment
$ message = new Message ( \" MSH|^~\\&|||||||ADT^A01||P|2.3.1| \\n PID|||3^0~4^1 \" ); // Creates [[3,0], [4,1]]

// To create a single array instead, pass \'true\' as 6th argument. This may be used to retain behavior from previous releases
// Notice: Since this leads to a non-standard behavior, it may be removed in future
$ message = new Message ( \" MSH|^~\\&|||||||ADT^A01||P|2.3.1| \\n PID|||3^0~4^1 \" , null , false , false , true , true ); // Creates [\'3\', \'0~4\', \'1\']
// or
$ message = new Message ( \" MSH|^~\\&|||||||ADT^A01||P|2.3.1| \\n PID|||3^0~4^1 \" , doNotSplitRepetition: true ); // Creates [\'3\', \'0~4\', \'1\'] 

处理细分市场

 // Once a message object is created, we can now add, insert, set segments and fields.

// Create a MSH segment and add to message object
$ msh = new MSH ();
$ message -> addSegment ( $ msh ); // Message is: \"MSH|^~\\&|||||20171116140058|||2017111614005840157||2.3|\\n\"

// Create a custom segment
$ abc = new Segment ( \' ABC \' );
$ abc -> setField ( 1 , \' xyz \' );
$ abc -> setField ( 2 , 0 );
$ abc -> setField ( 4 , [ \'\' ]); // Set an empty field at 4th position. 2nd and 3rd positions will be automatically set to empty
$ abc -> clearField ( 2 ); // Clear the value from field 2
$ message -> setSegment ( $ abc , 1 ); // Message is now: \"MSH|^~\\&|||||20171116140058|||2017111614005840157||2.3|\\nABC|xyz|\\n\"

// Create a defined segment (To know which segments are defined in this package, look into Segments/ directory)
// Advantages of defined segments over custom ones (shown above) are 1) Helpful setter methods, 2) Auto-incrementing segment index
$ pid = new PID (); // Automatically creates PID segment, and adds segment index at PID.1
$ pid -> setPatientName ([ $ lastname , $ firstname , $ middlename , $ suffix ]); // Use a setter method to add patient\'s name at standard position (PID.5)
$ pid -> setField ( \' abcd \' , 5 ); // Apart from standard setter methods, you can manually set a value at any position too
unset( $ pid ); // Destroy the segment and decrement the id number. Useful when you want to discard a segment.

// It is possible that segments get added in a way that the Set IDs/Sequence IDs within the message are not in order or leave gaps. To reset all Set/Sequence IDs in the message:

$ message -> reindexSegments ();

将消息发送给远程侦听器

旁注:要运行连接,您需要安装php ext-sockets https://www.**ph*p.net/manual/enual/en/sockets.installation.php

HL7 listener is listening
$message = new Message($ HL7 String); // Create a Message object from your HL7 string

// Create a Socket and get ready to send message. Optionally add timeout in seconds as 3rd argument (default: 10 sec)
$connection = new Connection($ip, $port);
$response = $connection->send($message); // Send to the listener, and get a response back
echo $response->toString(true); // Prints ACK from the listener\”>

 $ ip = \' 127.0.0.1 \' ; // An IP
$ port = \' 12001 \' ; // And Port where a HL7 listener is listening
$ message = new Message ( $ HL7 String ); // Create a Message object from your HL7 string

// Create a Socket and get ready to send message. Optionally add timeout in seconds as 3rd argument (default: 10 sec)
$ connection = new Connection ( $ ip , $ port );
$ response = $ connection -> send ( $ message ); // Send to the listener, and get a response back
echo $ response -> toString ( true ); // Prints ACK from the listener

ACK

处理ACK消息从远程HL7侦听器返回…

HL7 to remote listener
$returnString = $ack->toString(true);
if (strpos($returnString, \’MSH\’) === false) {
echo \”Failed to send HL7 to \’IP\’ => $ip, \’Port\’ => $port\”;
}
$msa = $ack->getFirstSegmentInstance(\’MSA\’);
$ackCode = $msa->getAcknowledgementCode();
if ($ackCode[1] === \’A\’) {
echo \”Received ACK from remote\\n\”;
}
else {
echo \”Received NACK from remote\\n\”;
echo \”Error text: \” . $msa->getTextMessage();
}\”>

 $ ack = ( new Connection ( $ ip , $ port ))-> send ( $ message ); // Send a HL7 to remote listener
$ returnString = $ ack -> toString ( true );
if ( strpos ( $ returnString , \' MSH \' ) === false ) {
    echo \" Failed to send HL7 to \'IP\' => $ ip , \'Port\' => $ port \" ;
}
$ msa = $ ack -> getFirstSegmentInstance ( \' MSA \' );
$ ackCode = $ msa -> getAcknowledgementCode ();
if ( $ ackCode [ 1 ] === \' A \' ) {
    echo \" Received ACK from remote \\n\" ;
}
else {
    echo \" Received NACK from remote \\n\" ;
    echo \" Error text: \" . $ msa -> getTextMessage ();
}

从给定的HL7消息中创建ACK响应:

 $ msg = new Message ( \" MSH|^~ \\\\ &|1| \\r ABC|1||^AAAA1^^^BB| \" , null , true );
$ ackResponse = new ACK ( $ msg );

创建ACK对象时可以通过选项:

 $ msg = new Message ( \" MSH|^~ \\\\ &|1| \\r ABC|1||^AAAA1^^^BB| \" , null , true );
$ ackResponse = new ACK ( $ msg , null , [ \' SEGMENT_SEPARATOR \' => \' \\r\\n \' , \' HL7 _VERSION \' => \' 2.5 \' ]);

蜜蜂

该软件包公开了许多公共方法,以方便HL7处理。一些例子是:

  1. 考虑到您有一个消息对象(例如, $msg = new Message(file_get_contents(\'somefile. HL7 \')); );

HL7\’); // Write to a file
$msg->isOru(); // Check if it\’s an ORU
$msg->isOrm(); // Check if it\’s an ORM\”>

    $ msg -> toFile ( \' /path/to/some. HL7 \' ); // Write to a file
    $ msg -> isOru (); // Check if it\'s an ORU
    $ msg -> isOrm (); // Check if it\'s an ORM

有关可用API的详细信息,请访问Docs \\ Readme

所有段级别的Getter/Setter API都可以通过两种方式使用 –

  • 如果未提供位置索引作为参数(Getters的第一个参数,seters的第二个参数),则使用标准索引。 $pid->setPatientName(\'John Doe\') – >按照HL7 v2.3标准$pid->getPatientAddress() – >从标准的第11位获得患者地址

  • 要使用自定义位置索引,请在参数中提供: $pid->setPatientName(\'John Doe\', 6) – >在PID段中的第6个位置设置患者名称$pid->getPatientAddress(12) – >从12th位置获得患者地址

问题

错误报告和功能请求可以在GitHub Disears Tracker上提交。

贡献

有关信息,请参见贡献。

下载源码

通过命令行克隆项目:

git clone https://github.com/senaranya/HL7.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 HL7 https://www.zuozi.net/31876.html

sgi
上一篇: sgi
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务