8

在此示例中,使用了来自 maven 中央存储库的以下依赖项:

<!-- provides HAPI library -->
<dependency>
  <groupId>ca.uhn.hapi</groupId>
  <artifactId>hapi-base</artifactId>
  <version>2.2</version>
</dependency>
<!-- provides HAPI library message version -->
<dependency>
  <groupId>ca.uhn.hapi</groupId>
  <artifactId>hapi-structures-v22</artifactId>
  <version>2.2</version>
</dependency>

<!-- provides ByteString -->
<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-actor_2.10</artifactId>
  <version>2.3.3</version>
</dependency>

这是我用 scala 编写的解析代码示例:

  import akka.util.ByteString
  import ca.uhn.hl7v2.model.Message
  import ca.uhn.hl7v2.model.v22.datatype.{CM_PAT_ID, ST, TN, TSComponentOne}
  import ca.uhn.hl7v2.model.v22.segment.{EVN, MRG, PID}
  import ca.uhn.hl7v2.parser.CanonicalModelClassFactory
  import ca.uhn.hl7v2.{DefaultHapiContext, ErrorCode, HL7Exception}

  lazy val parser = {
    val context = new DefaultHapiContext()
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2"))
    context.getGenericParser
  }

  def parseHL7Message(message: ByteString) = Try[Message] { 
    val msg: String = message.utf8String.trim
    parser.parse(msg) 
  }

此代码可以成功解析以下 HL7 消息。

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" +
"EVN|A31|201410280930\r" +
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890\r" +
"PV1\r"

但是,当消息中提供了带有扩展名的电话号码时,hapi 解析器无法解析该消息。这是我尝试使用电话号码中的扩展名解析的输入消息的示例:

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" +
"EVN|A31|201410280930\r" +
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890 1\r" +
"PV1\r"

尝试解析此消息失败,并显示以下错误消息:

ca.uhn.hl7v2.validation.ValidationException:验证失败:原始值“(123)456-7890 1”需要为空或PID-13的美国电话号码

我阅读了在http://hl7api.sourceforge.net/index.html上可以找到的所有内容,以查找有关如何修改验证规则的文档,但没有发现任何有用的信息。

一个例子会很受欢迎,但即使指向正确的文档,或者一个简单的工作示例项目就足够了。

如何将 HAPI 解析器使用的验证规则配置为允许电话号码扩展包含在 PID-13 字段中的有效美国电话号码中?

编辑

通过这个 hapi developer mailing list thread进行更多搜索,我想出了如何完全禁用验证。这是一个例子:

  lazy val parser = {
    val context = new DefaultHapiContext()
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2"))
    context.setValidationContext(new NoValidation)
    context.getGenericParser
  }

但如果可能的话,我想继续验证这些消息。如果我必须禁用验证,我想这将不得不工作,但我更愿意指定验证保持打开状态,但电话号码可以包含扩展名。

4

2 回答 2

5

我必须使用第 3 方服务,而该服务会向我发送无效电话。不幸的是,我不明白如何将其作为“最佳实践”。但我发现了一个 hack:

@PostConstruct
public void postConstruct() {  
    List<RuleBinding<PrimitiveTypeRule>> rules = ((ValidationContextImpl)applicationRouter.getParser().getHapiContext().getValidationContext()).getPrimitiveRuleBindings();
    //initially was published with this line, but think it was mistake
    //for(int i = rules.size() - 1; i > 0; i--) {
    for(int i = rules.size() - 1; i >= 0; i--) {
        RuleBinding<PrimitiveTypeRule> item = rules.get(i);
        if("TN".equals(item.getScope())){
            rules.remove(i);
        }
    }
}

如果有人会知道更多解决问题的好方法,请写信。

于 2016-03-28T15:22:41.083 回答
2

Phone numbers can include extensions. The problem is that you have the extension in the wrong format. See the HL7 Messaging Standard Version 2.2, section 2.8.10.9. Telephone numbers must be in the following format.

[NN] [(999)]999-9999[X99999][B99999][C any text]

Put the extension after the 'X'.

于 2014-11-08T19:37:11.207 回答