2014-10-28 88 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 
}