Пример #1
0
        protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext)
        {
            string                         seriesUid   = _file.DataSet[DicomTags.SeriesInstanceUid].GetString(0, String.Empty);
            string                         sopUid      = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String.Empty);
            ImageSetDescriptor             imageSet    = new ImageSetDescriptor(_file.DataSet);
            ReconcileStudyQueueDescription queueDesc   = GetQueueEntryDescription(_storageLocation, _file);
            ReconcileStudyWorkQueueData    detailsData = new ReconcileStudyWorkQueueData
            {
                StoragePath = _reconcileImageStorage.GetFolderPath(),
                Details     = new ImageSetDetails(_file.DataSet)
            };

            detailsData.Details.InsertFile(_file);

            IInsertStudyIntegrityQueue          broker     = updateContext.GetBroker <IInsertStudyIntegrityQueue>();
            InsertStudyIntegrityQueueParameters parameters = new InsertStudyIntegrityQueueParameters
            {
                Description              = queueDesc.ToString(),
                StudyInstanceUid         = _storageLocation.StudyInstanceUid,
                ServerPartitionKey       = _storageLocation.ServerPartition.Key,
                StudyStorageKey          = _storageLocation.Key,
                StudyIntegrityReasonEnum = _reason,
                SeriesInstanceUid        = seriesUid,
                SeriesDescription        = sopUid,
                SopInstanceUid           =
                    _file.DataSet[DicomTags.SopInstanceUid].GetString(0,
                                                                      String
                                                                      .
                                                                      Empty),
                StudyData       = XmlUtils.SerializeAsXmlDoc(imageSet),
                Details         = XmlUtils.SerializeAsXmlDoc(detailsData),
                GroupID         = _uidGroup,
                UidRelativePath =
                    _reconcileImageStorage.GetSopRelativePath(
                        _file.DataSet[DicomTags.SopInstanceUid].ToString())
            };

            StudyIntegrityQueue item = broker.FindOne(parameters);

            if (item == null)
            {
                throw new ApplicationException("Unable to update reconcile queue");
            }

            _siqItem = item;
            if (!parameters.Inserted)
            {
                // Need to re-use the path that's already assigned for this entry
                ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details);
                data.Details.InsertFile(_file);

                XmlDocument updatedQueueDataXml = XmlUtils.SerializeAsXmlDoc(data);
                IStudyIntegrityQueueEntityBroker updateBroker = updateContext.GetBroker <IStudyIntegrityQueueEntityBroker>();
                StudyIntegrityQueueUpdateColumns columns      = new StudyIntegrityQueueUpdateColumns
                {
                    Details = updatedQueueDataXml
                };
                updateBroker.Update(item.GetKey(), columns);
            }
        }
        protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext)
        {
            var broker = updateContext.GetBroker <IInsertDuplicateSopReceivedQueue>();
            var parms  = new InsertDuplicateSopReceivedQueueParameters
            {
                GroupID            = _groupId,
                ServerPartitionKey = _studyLocation.ServerPartitionKey,
                StudyStorageKey    = _studyLocation.Key,
                StudyInstanceUid   = _file.DataSet[DicomTags.StudyInstanceUid].ToString(),
                SeriesDescription  = _file.DataSet[DicomTags.SeriesDescription].ToString(),
                SeriesInstanceUid  = _file.DataSet[DicomTags.SeriesInstanceUid].ToString(),
                SopInstanceUid     = _file.MediaStorageSopInstanceUid
            };
            ReconcileStudyQueueDescription queueDesc = CreateQueueEntryDescription(_file);

            parms.Description = queueDesc != null?queueDesc.ToString() : String.Empty;

            var queueData = new DuplicateSIQQueueData
            {
                StoragePath = _duplicateStoragePath,
                Details     = new ImageSetDetails(_file.DataSet),
                TimeStamp   = Platform.Time
            };

            if (_reasons != null && _reasons.Count > 0)
            {
                queueData.ComparisonResults = _reasons;
            }

            var imageSet = new ImageSetDescriptor(_file.DataSet);

            parms.StudyData       = XmlUtils.SerializeAsXmlDoc(imageSet);
            parms.Details         = XmlUtils.SerializeAsXmlDoc(queueData);
            parms.UidRelativePath = _relativePath;
            IList <DuplicateSopReceivedQueue> entries = broker.Find(parms);

            Platform.CheckForNullReference(entries, "entries");
            Platform.CheckTrue(entries.Count == 1, "entries.Count==1");

            DuplicateSopReceivedQueue queueEntry = entries[0];

            var data = XmlUtils.Deserialize <DuplicateSIQQueueData>(queueEntry.Details);

            data.Details.InsertFile(_file);

            queueEntry.Details = XmlUtils.SerializeAsXmlDoc(data);

            var siqBroker = updateContext.GetBroker <IStudyIntegrityQueueEntityBroker>();

            if (!siqBroker.Update(queueEntry))
            {
                throw new ApplicationException("Unable to update duplicate queue entry");
            }
        }
Пример #3
0
        private static ReconcileStudyQueueDescription GetQueueEntryDescription(StudyStorageLocation existingStorage, DicomMessageBase file)
        {
            ReconcileStudyQueueDescription desc = new ReconcileStudyQueueDescription
            {
                ExistingPatientId       = existingStorage.Study.PatientId,
                ExistingPatientName     = existingStorage.Study.PatientsName,
                ExistingAccessionNumber = existingStorage.Study.AccessionNumber,
                ConflictingPatientName  =
                    file.DataSet[DicomTags.PatientsName].GetString(0, String.Empty),
                ConflictingPatientId =
                    file.DataSet[DicomTags.PatientId].GetString(0, String.Empty),
                ConflictingAccessionNumber =
                    file.DataSet[DicomTags.AccessionNumber].GetString(0, String.Empty)
            };

            return(desc);
        }
        private ReconcileStudyQueueDescription CreateQueueEntryDescription(DicomFile file)
        {
            using (var context = new ServerExecutionContext())
            {
                Study study = _studyLocation.LoadStudy(context.PersistenceContext);
                if (study != null)
                {
                    var desc = new ReconcileStudyQueueDescription
                    {
                        ExistingPatientId          = study.PatientId,
                        ExistingPatientName        = study.PatientsName,
                        ExistingAccessionNumber    = study.AccessionNumber,
                        ConflictingPatientName     = file.DataSet[DicomTags.PatientsName].ToString(),
                        ConflictingPatientId       = file.DataSet[DicomTags.PatientId].ToString(),
                        ConflictingAccessionNumber = file.DataSet[DicomTags.AccessionNumber].ToString()
                    };


                    return(desc);
                }

                return(null);
            }
        }
        /// <summary>
        /// Constructs an instance of <see cref="WorkQueue"/> based on a <see cref="WorkQueueSummary"/> object.
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        /// <remark>
        ///
        /// </remark>
        private StudyIntegrityQueueSummary CreateStudyIntegrityQueueSummary(StudyIntegrityQueue item)
        {
            var summary = new StudyIntegrityQueueSummary();

            var ssAdaptor = new StudyStorageAdaptor();
            var storages  = ssAdaptor.Get(HttpContext.Current.GetSharedPersistentContext(), item.StudyStorageKey);

            try
            {
                summary.Reason = item.StudyIntegrityReasonEnum;
                summary.TheStudyIntegrityQueueItem = item;
                summary.ThePartition = Partition;

                var queueDescription = new ReconcileStudyQueueDescription();
                queueDescription.Parse(item.Description);

                summary.QueueData = item.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.InconsistentData) ? XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details) : XmlUtils.Deserialize <DuplicateSIQQueueData>(item.Details);

                ImageSetDescriptor studyData = ImageSetDescriptor.Parse(item.StudyData.DocumentElement);


                // These fields only exists in Enterprise version
                if (summary.QueueData.Details != null && summary.QueueData.Details.StudyInfo != null)
                {
                    summary.ReceivedTime                = item.InsertTime;
                    summary.ConflictingPatientId        = summary.QueueData.Details.StudyInfo.PatientInfo.PatientId;
                    summary.ConflictingPatientName      = summary.QueueData.Details.StudyInfo.PatientInfo.Name;
                    summary.ConflictingAccessionNumber  = summary.QueueData.Details.StudyInfo.AccessionNumber;
                    summary.ConflictingStudyDate        = summary.QueueData.Details.StudyInfo.StudyDate;
                    summary.ConflictingStudyDescription = summary.QueueData.Details.StudyInfo.StudyDescription;

                    var modalities = new List <string>();
                    List <SeriesInformation> seriesList = summary.QueueData.Details.StudyInfo.Series;
                    foreach (SeriesInformation series in seriesList)
                    {
                        if (!modalities.Contains(series.Modality))
                        {
                            modalities.Add(series.Modality);
                        }
                    }
                    summary.ConflictingModalities = modalities.ToArray();
                }
                else
                {
                    string value;
                    if (studyData.TryGetValue(DicomTags.PatientId, out value))
                    {
                        summary.ConflictingPatientId = value;
                    }

                    if (studyData.TryGetValue(DicomTags.PatientsName, out value))
                    {
                        summary.ConflictingPatientName = value;
                    }

                    if (studyData.TryGetValue(DicomTags.AccessionNumber, out value))
                    {
                        summary.ConflictingAccessionNumber = value;
                    }

                    if (studyData.TryGetValue(DicomTags.StudyDate, out value))
                    {
                        summary.ConflictingStudyDate = value;
                    }

                    if (studyData.TryGetValue(DicomTags.StudyDescription, out value))
                    {
                        summary.ConflictingStudyDescription = value;
                    }

                    // no modality info
                }


                // Fetch existing study info. Note: this is done last because the study may not exist.
                Study study = storages.LoadStudy(HttpContext.Current.GetSharedPersistentContext());
                summary.StudySummary = StudySummaryAssembler.CreateStudySummary(HttpContext.Current.GetSharedPersistentContext(), study);
                if (summary.StudySummary != null)
                {
                    summary.StudyInstanceUid        = summary.StudySummary.StudyInstanceUid;
                    summary.ExistingPatientName     = summary.StudySummary.PatientsName;
                    summary.ExistingPatientId       = summary.StudySummary.PatientId;
                    summary.ExistingAccessionNumber = summary.StudySummary.AccessionNumber;
                }
            }
            catch (StudyNotFoundException)
            {
                // Study record may not exist. For eg, duplicate arrives but the existing study hasn't been processed.
            }


            return(summary);
        }