From 87b5a2b3e1bac1a19915fba70e99e655336564d7 Mon Sep 17 00:00:00 2001 From: vrindanayak Date: Thu, 12 Jan 2017 17:39:53 +0100 Subject: [PATCH] Fix #509 dcm4che/dcm4chee-arc-light : Receiving HL7 order message containing multiple MWL items referenced in it fails --- .../arc/hl7/ProcedureUpdateService.java | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/dcm4chee-arc-hl7/src/main/java/org/dcm4chee/arc/hl7/ProcedureUpdateService.java b/dcm4chee-arc-hl7/src/main/java/org/dcm4chee/arc/hl7/ProcedureUpdateService.java index 35c1d1d19c..fd099776a7 100644 --- a/dcm4chee-arc-hl7/src/main/java/org/dcm4chee/arc/hl7/ProcedureUpdateService.java +++ b/dcm4chee-arc-hl7/src/main/java/org/dcm4chee/arc/hl7/ProcedureUpdateService.java @@ -41,6 +41,7 @@ package org.dcm4chee.arc.hl7; import org.dcm4che3.data.Attributes; +import org.dcm4che3.data.Sequence; import org.dcm4che3.data.Tag; import org.dcm4che3.data.VR; import org.dcm4che3.hl7.HL7Segment; @@ -116,28 +117,37 @@ private void updateProcedure(HL7Application hl7App, Socket s, UnparsedHL7Message private boolean adjust(Attributes attrs, ArchiveHL7ApplicationExtension arcHL7App, HL7Segment msh, Socket socket) { if (!attrs.containsValue(Tag.StudyInstanceUID)) attrs.setString(Tag.StudyInstanceUID, VR.UI, UIDUtils.createUID()); - Attributes sps = attrs.getNestedDataset(Tag.ScheduledProcedureStepSequence); - if ("SCHEDULED".equals(sps.getString(Tag.ScheduledProcedureStepStatus)) - && !sps.containsValue(Tag.ScheduledProcedureStepStartDate)) - sps.setDate(Tag.ScheduledProcedureStepStartDateAndTime, new Date()); - List ssAETs = new ArrayList<>(); - List ssNames = new ArrayList<>(); - Collection devices = arcHL7App.hl7OrderScheduledStation(socket.getLocalAddress().getHostName(), msh, attrs); - for (Device device : devices) { - ssNames.add(device.getDeviceName()); - for (String ae : device.getApplicationAETitles()) - ssAETs.add(ae); - } - if (!ssAETs.isEmpty()) { - sps.setString(Tag.ScheduledStationName, VR.SH, ssNames.toArray(new String[ssNames.size()])); - sps.setString(Tag.ScheduledStationAETitle, VR.AE, ssAETs.toArray(new String[ssAETs.size()])); - } - String orderControlStatus = sps.getString(Tag.ScheduledProcedureStepStatus); - for (HL7OrderSPSStatus hl7OrderSPSStatus : arcHL7App.hl7OrderSPSStatuses()) - if (Arrays.asList(hl7OrderSPSStatus.getOrderControlStatusCodes()).contains(orderControlStatus)) { - sps.setString(Tag.ScheduledProcedureStepStatus, VR.CS, hl7OrderSPSStatus.getSPSStatus().toString()); - return true; + Sequence spsItems = attrs.getSequence(Tag.ScheduledProcedureStepSequence); + boolean result = false; + for (Attributes sps : spsItems) { + if ("SCHEDULED".equals(sps.getString(Tag.ScheduledProcedureStepStatus)) + && !sps.containsValue(Tag.ScheduledProcedureStepStartDate)) + sps.setDate(Tag.ScheduledProcedureStepStartDateAndTime, new Date()); + List ssAETs = new ArrayList<>(); + List ssNames = new ArrayList<>(); + Collection devices = arcHL7App.hl7OrderScheduledStation(socket.getLocalAddress().getHostName(), msh, attrs); + for (Device device : devices) { + ssNames.add(device.getDeviceName()); + for (String ae : device.getApplicationAETitles()) + ssAETs.add(ae); + } + if (!ssAETs.isEmpty()) { + sps.setString(Tag.ScheduledStationName, VR.SH, ssNames.toArray(new String[ssNames.size()])); + sps.setString(Tag.ScheduledStationAETitle, VR.AE, ssAETs.toArray(new String[ssAETs.size()])); } - return false; + String orderControlStatus = sps.getString(Tag.ScheduledProcedureStepStatus); + List ordercontrolStatusCodes = new ArrayList<>(); + for (HL7OrderSPSStatus hl7OrderSPSStatus : arcHL7App.hl7OrderSPSStatuses()) { + result = false; + ordercontrolStatusCodes.addAll(Arrays.asList(hl7OrderSPSStatus.getOrderControlStatusCodes())); + if (ordercontrolStatusCodes.contains(orderControlStatus)) { + sps.setString(Tag.ScheduledProcedureStepStatus, VR.CS, hl7OrderSPSStatus.getSPSStatus().toString()); + result = true; + } + if (result) + break; + } + } + return result; } }