/// <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(HttpContextData.Current.ReadContext, 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(HttpContextData.Current.ReadContext);
                summary.StudySummary = StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, 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;
		}
Ejemplo n.º 2
0
        public static ReconcileDetails CreateReconcileDetails(StudyIntegrityQueueSummary item)
        {
            ReconcileDetails details = item.TheStudyIntegrityQueueItem.StudyIntegrityReasonEnum.Equals(
                                           StudyIntegrityReasonEnum.InconsistentData)
                                           ? new ReconcileDetails(item.TheStudyIntegrityQueueItem)
                                           : new DuplicateEntryDetails(item.TheStudyIntegrityQueueItem);

            Study study = item.StudySummary.TheStudy;
            details.StudyInstanceUid = study.StudyInstanceUid;

            //Set the demographic details of the Existing Patient
            details.ExistingStudy = new ReconcileDetails.StudyInfo();
            details.ExistingStudy.StudyInstanceUid = item.StudySummary.StudyInstanceUid;
            details.ExistingStudy.AccessionNumber = item.StudySummary.AccessionNumber;
            details.ExistingStudy.StudyDate = item.StudySummary.StudyDate;
            details.ExistingStudy.Patient.PatientID = item.StudySummary.PatientId;
            details.ExistingStudy.Patient.Name = item.StudySummary.PatientsName;
            details.ExistingStudy.Patient.Sex = study.PatientsSex;
            details.ExistingStudy.Patient.IssuerOfPatientID = study.IssuerOfPatientId;
            details.ExistingStudy.Patient.BirthDate = study.PatientsBirthDate;
            details.ExistingStudy.Series = CollectionUtils.Map(
                study.Series.Values,
                delegate(Series theSeries)
                    {
                        var seriesDetails = new ReconcileDetails.SeriesDetails
                                                {
                                                    Description = theSeries.SeriesDescription,
                                                    SeriesInstanceUid = theSeries.SeriesInstanceUid,
                                                    Modality = theSeries.Modality,
                                                    NumberOfInstances = theSeries.NumberOfSeriesRelatedInstances,
                                                    SeriesNumber = theSeries.SeriesNumber
                                                };
                        return seriesDetails;
                    });


            details.ConflictingImageSet = item.QueueData.Details;


            details.ConflictingStudyInfo = new ReconcileDetails.StudyInfo();

            if (item.QueueData.Details != null)
            {
                // extract the conflicting study info from Details
                details.ConflictingStudyInfo.AccessionNumber = item.QueueData.Details.StudyInfo.AccessionNumber;
                details.ConflictingStudyInfo.StudyDate = item.QueueData.Details.StudyInfo.StudyDate;
                details.ConflictingStudyInfo.StudyInstanceUid = item.QueueData.Details.StudyInfo.StudyInstanceUid;
                details.ConflictingStudyInfo.StudyDate = item.QueueData.Details.StudyInfo.StudyDate;

                details.ConflictingStudyInfo.Patient = new ReconcileDetails.PatientInfo
                                                           {
                                                               BirthDate =
                                                                   item.QueueData.Details.StudyInfo.PatientInfo.
                                                                   PatientsBirthdate,
                                                               IssuerOfPatientID =
                                                                   item.QueueData.Details.StudyInfo.PatientInfo.
                                                                   IssuerOfPatientId,
                                                               Name = item.QueueData.Details.StudyInfo.PatientInfo.Name,
                                                               PatientID =
                                                                   item.QueueData.Details.StudyInfo.PatientInfo.
                                                                   PatientId,
                                                               Sex = item.QueueData.Details.StudyInfo.PatientInfo.Sex
                                                           };

                details.ConflictingStudyInfo.Series =
                    CollectionUtils.Map(
                        item.QueueData.Details.StudyInfo.Series,
                        delegate(SeriesInformation input)
                            {
                                var seriesDetails = new ReconcileDetails.SeriesDetails
                                                        {
                                                            Description = input.SeriesDescription,
                                                            Modality = input.Modality,
                                                            SeriesInstanceUid = input.SeriesInstanceUid,
                                                            NumberOfInstances = input.NumberOfInstances
                                                        };
                                return seriesDetails;
                            });
            }
            else
            {
                // Extract the conflicting study info from StudyData
                // Note: Not all fields are available.
                ImageSetDescriptor desc =
                    ImageSetDescriptor.Parse(item.TheStudyIntegrityQueueItem.StudyData.DocumentElement);
                string value;

                if (desc.TryGetValue(DicomTags.AccessionNumber, out value))
                    details.ConflictingStudyInfo.AccessionNumber = value;

                if (desc.TryGetValue(DicomTags.StudyDate, out value))
                    details.ConflictingStudyInfo.StudyDate = value;

                if (desc.TryGetValue(DicomTags.StudyInstanceUid, out value))
                    details.ConflictingStudyInfo.StudyInstanceUid = value;

                details.ConflictingStudyInfo.Patient = new ReconcileDetails.PatientInfo();

                if (desc.TryGetValue(DicomTags.PatientsBirthDate, out value))
                    details.ConflictingStudyInfo.Patient.BirthDate = value;

                if (desc.TryGetValue(DicomTags.IssuerOfPatientId, out value))
                    details.ConflictingStudyInfo.Patient.IssuerOfPatientID = value;

                if (desc.TryGetValue(DicomTags.PatientsName, out value))
                    details.ConflictingStudyInfo.Patient.Name = value;

                if (desc.TryGetValue(DicomTags.PatientId, out value))
                    details.ConflictingStudyInfo.Patient.PatientID = value;

                if (desc.TryGetValue(DicomTags.PatientsSex, out value))
                    details.ConflictingStudyInfo.Patient.Sex = value;


                var series = new List<ReconcileDetails.SeriesDetails>();
                details.ConflictingStudyInfo.Series = series;

                var uidBroker =
                    HttpContextData.Current.ReadContext.GetBroker<IStudyIntegrityQueueUidEntityBroker>();
                var criteria = new StudyIntegrityQueueUidSelectCriteria();
                criteria.StudyIntegrityQueueKey.EqualTo(item.TheStudyIntegrityQueueItem.GetKey());

                IList<StudyIntegrityQueueUid> uids = uidBroker.Find(criteria);

                Dictionary<string, List<StudyIntegrityQueueUid>> seriesGroups = CollectionUtils.GroupBy(uids,
                                                                                                        uid =>
                                                                                                        uid.
                                                                                                            SeriesInstanceUid);

                foreach (string seriesUid in seriesGroups.Keys)
                {
                    var seriesDetails = new ReconcileDetails.SeriesDetails
                                            {
                                                SeriesInstanceUid = seriesUid,
                                                Description = seriesGroups[seriesUid][0].SeriesDescription,
                                                NumberOfInstances = seriesGroups[seriesUid].Count
                                            };
                    //seriesDetails.Modality = "N/A";
                    series.Add(seriesDetails);
                }
            }


            return details;
        }
        /// <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(HttpContextData.Current.ReadContext, 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(HttpContextData.Current.ReadContext);
                summary.StudySummary = StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, 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);
        }