2014-10-28 61 views
0

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

hl7Map填充上类的实例化,与像值: DEF hl7Map = [ “HL7MessageFields”:[ 'PID-3-1': “内部订单地图键”, 'PID-3-4':”内部订单地图键”,等]]下面

代码:

DEF buildHL7Message(顺序){

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 

}

方法R的端没有输出的结果和记录有关编码的错误,MSH-1是必填字段,管道分离器但是是空的。如果上面的代码使用message.initQuickstart(“ORU”,“R01”,“T”),则只会填充默认的initQuickstart字段。

如果hl7Map [“HL7MessageFields”]包含不是有效的Group/Segment字段的'it.key',terser会记录一条错误,以至于无法找到该值,上面的代码使用格式正确的映射不会导致错误。

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

回答

1

找到了解决方案,经过几个小时的搜索后为我工作。

消息对象的内部表示具有树状结构,其中MSH段是父级,而位于MSH段后面的段是子段。由于这种结构,必须将MSH字段设置为我的原始代码,但子字段字段必须设置为“/”。 (即“PID-3-1”必须在terser.set()行中变为“/.PID-3-1”)

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

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

下面

完整代码:

DEF buildHL7Message(顺序){

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 
}