设置包含在Terser中的新HL7消息的字段

时间:2014-10-28 15:18:25

标签: groovy hl7 hapi

尝试使用ca.uhn.hl7v2.util.Terser在ca.uhn.hl7v2.model.Message的给定特定子类上设置空字段(在本例中为ca.uhn.hl7v2.model.v251.message .ORU_R01),在.each {}闭包期间没有收到任何错误消息,之后消息对象没有填充任何字段。

hl7Map在类实例化时填充,其值如下: def hl7Map = [" HL7MessageFields":[' PID-3-1':"内部订单地图键",                 ' PID-3-4':"内部订单地图键"等等]]

以下代码:

def buildHL7Message(order){

    def date = new Date()
    def format = new SimpleDateFormat(hl7Map["dateFormat"]).format(date)

    //Set date on the Message Header Object
    hl7Map["MSH"]["-7"]= format

    def message = (context.getModelClassFactory().getMessageClass(hl7Map["MessageInstantiationMap"]["messageType"],
                                                                    hl7Map["MessageInstantiationMap"]["version"],
                                                                    true) as Class).newInstance()
    Terser terser = new Terser(message)

    hl7Map["HL7MessageFields"].each{
        terser.set(it.key, order[it.value])
    }

    println message

    return message

}

方法结束导致没有关于编码的输出和错误记录,MSH-1是必需字段,管道分隔但是为空。如果上面的代码使用message.initQuickstart(" ORU"," R01"," T"),则只填充默认的initQuickstart字段。

如果hl7Map [" HL7MessageFields"]包含' it.key'这不是一个有效的Group / Segment字段,terser记录的错误是它找不到该值,上面的代码格式正确,不会导致错误。

任何人都可以帮助解释为什么我没有收到错误但我的消息是空的,并帮助我使用适当的terser.set(params)填充消息?

1 个答案:

答案 0 :(得分:1)

找到解决方案,经过几个小时的搜索后,对我有用。

消息对象的内部表示具有树状结构,其中MSH段是父节点,位于MSH段之后的段是子段。由于这种结构,MSH字段必须设置为我的原始代码,但子段字段必须设置为" /."在设计的地图密钥之前(即" PID-3-1"必须变为" /。PID-3-1"在terser.set()行中。

hl7Map格式已更新,以更好地支持此terser.set()语法要求。

从terser文档中,/表示搜索应该从邮件的根目录开始,并且从HAPI邮件列表链接上的答案开始,我现在已经丢失了,。表示搜索应包括MSH的子元素。

以下完整代码:

def buildHL7Message(order){

    def date = new Date()
    def format = new SimpleDateFormat(hl7Map["dateFormat"]).format(date)

    //Set date on the Message Header Object
    hl7Map["MSH"]["-7"]= format

    //See http://stackoverflow.com/questions/576955/groovy-way-to-dynamically-invoke-a-static-method
    //And
    //http://stackoverflow.com/questions/7758398/groovy-way-to-dynamically-instantiate-a-class-from-string

    def message = (context.getModelClassFactory().getMessageClass(hl7Map["MessageInstantiationMap"]["messageType"],
                                                                    hl7Map["MessageInstantiationMap"]["version"],
                                                                    true) as Class).newInstance()
    Terser terser = new Terser(message)

    hl7Map["MSH"].each{
        terser.set("MSH"+it.key, it.value)
    }
    hl7Map["HL7MSHChildSegmentMap"].each{
        terser.set(("/."+it.key) as String, order[it.value] as String)
    }

    println message

    return message
}