public void Insert(Guid Guid, Guid ServerPartitionGUID, Guid StudyStorageGUID, DateTime InsertTime,
                           string Description, string StudyData, string Details, short StudyIntegrityReasonEnum,
                           string GroupID)
        {
            var item = new StudyIntegrityQueue();

            item.Guid = Guid;

            item.ServerPartitionGUID = ServerPartitionGUID;

            item.StudyStorageGUID = StudyStorageGUID;

            item.InsertTime = InsertTime;

            item.Description = Description;

            item.StudyData = StudyData;

            item.Details = Details;

            item.StudyIntegrityReasonEnum = StudyIntegrityReasonEnum;

            item.GroupID = GroupID;


            item.Save(UserName);
        }
 public bool DeleteStudyIntegrityQueueItem(StudyIntegrityQueue item)
 {
     return(_adaptor.Delete(item.Key));
 }
        public void MergeStudy(ServerEntityKey itemKey, Boolean useExistingStudy)
        {
            InconsistentDataSIQRecord record = new InconsistentDataSIQRecord(StudyIntegrityQueue.Load(itemKey));
            ReconcileMergeToExistingStudyDescriptor command = new ReconcileMergeToExistingStudyDescriptor
            {
                UserName      = ServerHelper.CurrentUserName,
                Automatic     = false,
                ExistingStudy = record.ExistingStudyInfo,
                ImageSetData  = record.ConflictingImageDescriptor
            };

            if (useExistingStudy)
            {
                command.Description = "Merge using existing study information.";
                String xml = XmlUtils.SerializeAsString(command);
                ReconcileStudy(xml, record.QueueItem);
            }
            else
            {
                command.Description = "Using study information from the conflicting images.";

                if (record.ConflictingImageDetails != null)
                {
                    // The conflicting study data is stored in Details column
                    string newPatientName = record.ConflictingImageDetails.StudyInfo.PatientInfo.Name;
                    if (!String.IsNullOrEmpty(newPatientName))
                    {
                        string acceptableName = PatientNameRules.GetAcceptableName(newPatientName);
                        if (!acceptableName.Equals(newPatientName))
                        {
                            //override the value
                            newPatientName = acceptableName;
                        }
                    }
                    command.Commands.Add(new SetTagCommand(DicomTags.PatientsName, record.ExistingStudyInfo.PatientInfo.Name, newPatientName));
                    command.Commands.Add(new SetTagCommand(DicomTags.PatientId, record.ExistingStudyInfo.PatientInfo.PatientId, record.ConflictingImageDetails.StudyInfo.PatientInfo.PatientId));
                    command.Commands.Add(new SetTagCommand(DicomTags.PatientsBirthDate, record.ExistingStudyInfo.PatientInfo.PatientsBirthdate, record.ConflictingImageDetails.StudyInfo.PatientInfo.PatientsBirthdate));
                    command.Commands.Add(new SetTagCommand(DicomTags.PatientsSex, record.ExistingStudyInfo.PatientInfo.Sex, record.ConflictingImageDetails.StudyInfo.PatientInfo.Sex));
                    command.Commands.Add(new SetTagCommand(DicomTags.IssuerOfPatientId, record.ExistingStudyInfo.PatientInfo.IssuerOfPatientId, record.ConflictingImageDetails.StudyInfo.PatientInfo.IssuerOfPatientId));
                    command.Commands.Add(new SetTagCommand(DicomTags.AccessionNumber, record.ExistingStudyInfo.AccessionNumber, record.ConflictingImageDetails.StudyInfo.AccessionNumber));
                }
                else
                {
                    // The conflicting study data is stored in StudyData column
                    String patientName = record.ConflictingImageDescriptor[DicomTags.PatientsName] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.PatientsName].Value
                                             : null;

                    if (!String.IsNullOrEmpty(patientName))
                    {
                        string acceptableName = PatientNameRules.GetAcceptableName(patientName);
                        if (!acceptableName.Equals(patientName))
                        {
                            //override the value
                            patientName = acceptableName;
                        }
                    }

                    if (patientName != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.PatientsName, record.ExistingStudyInfo.PatientInfo.Name, patientName));
                    }

                    String patientId = record.ConflictingImageDescriptor[DicomTags.PatientId] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.PatientId].Value
                                             : null;
                    if (patientId != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.PatientId, record.ExistingStudyInfo.PatientInfo.PatientId, patientId));
                    }

                    String patientsBirthDate = record.ConflictingImageDescriptor[DicomTags.PatientsBirthDate] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.PatientsBirthDate].Value
                                             : null;
                    if (patientsBirthDate != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.PatientsBirthDate, record.ExistingStudyInfo.PatientInfo.PatientsBirthdate, patientsBirthDate));
                    }

                    String patientsSex = record.ConflictingImageDescriptor[DicomTags.PatientsSex] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.PatientsSex].Value
                                             : null;
                    if (patientsSex != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.PatientsSex, record.ExistingStudyInfo.PatientInfo.Sex, patientsSex));
                    }

                    String issuerOfPatientId = record.ConflictingImageDescriptor[DicomTags.IssuerOfPatientId] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.IssuerOfPatientId].Value
                                             : null;
                    if (issuerOfPatientId != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.IssuerOfPatientId, record.ExistingStudyInfo.PatientInfo.IssuerOfPatientId, issuerOfPatientId));
                    }

                    String accessionNumber = record.ConflictingImageDescriptor[DicomTags.AccessionNumber] != null
                                             ? record.ConflictingImageDescriptor[DicomTags.AccessionNumber].Value
                                             : null;
                    if (accessionNumber != null)
                    {
                        command.Commands.Add(new SetTagCommand(DicomTags.AccessionNumber, record.ExistingStudyInfo.AccessionNumber, accessionNumber));
                    }
                }

                String xml = XmlUtils.SerializeAsString(command);
                ReconcileStudy(xml, record.QueueItem);
            }
        }
        private static void ReconcileStudy(string command, StudyIntegrityQueue item)
        {
            //Ignore the reconcile command if the item is null.
            if (item == null)
            {
                return;
            }

            // Preload the change description so its not done during the DB transaction
            XmlDocument changeDescription = new XmlDocument();

            changeDescription.LoadXml(command);

            // The Xml in the SIQ item was generated when the images were received and put into the SIQ.
            // We now add the user info to it so that it will be logged in the history
            ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details);

            queueData.TimeStamp = Platform.Time;
            queueData.UserId    = ServerHelper.CurrentUserName;

            using (IUpdateContext context = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                LockStudyParameters lockParms = new LockStudyParameters
                {
                    QueueStudyStateEnum = QueueStudyStateEnum.ReconcileScheduled,
                    StudyStorageKey     = item.StudyStorageKey
                };
                ILockStudy broker = context.GetBroker <ILockStudy>();
                broker.Execute(lockParms);
                if (!lockParms.Successful)
                {
                    throw new ApplicationException(lockParms.FailureReason);
                }


                //Add to Study History
                StudyHistoryeAdaptor      historyAdaptor = new StudyHistoryeAdaptor();
                StudyHistoryUpdateColumns parameters     = new StudyHistoryUpdateColumns
                {
                    StudyData            = item.StudyData,
                    ChangeDescription    = changeDescription,
                    StudyStorageKey      = item.StudyStorageKey,
                    StudyHistoryTypeEnum = StudyHistoryTypeEnum.StudyReconciled
                };

                StudyHistory history = historyAdaptor.Add(context, parameters);

                //Create WorkQueue Entry
                WorkQueueAdaptor       workQueueAdaptor = new WorkQueueAdaptor();
                WorkQueueUpdateColumns row = new WorkQueueUpdateColumns
                {
                    Data = XmlUtils.SerializeAsXmlDoc(queueData),
                    ServerPartitionKey  = item.ServerPartitionKey,
                    StudyStorageKey     = item.StudyStorageKey,
                    StudyHistoryKey     = history.GetKey(),
                    WorkQueueTypeEnum   = WorkQueueTypeEnum.ReconcileStudy,
                    WorkQueueStatusEnum = WorkQueueStatusEnum.Pending,
                    ScheduledTime       = Platform.Time,
                    ExpirationTime      = Platform.Time.AddHours(1),
                    GroupID             = item.GroupID
                };
                WorkQueue newWorkQueueItem = workQueueAdaptor.Add(context, row);

                StudyIntegrityQueueUidAdaptor        studyIntegrityQueueUidAdaptor = new StudyIntegrityQueueUidAdaptor();
                StudyIntegrityQueueUidSelectCriteria crit = new StudyIntegrityQueueUidSelectCriteria();
                crit.StudyIntegrityQueueKey.EqualTo(item.GetKey());
                IList <StudyIntegrityQueueUid> uidList = studyIntegrityQueueUidAdaptor.Get(context, crit);

                WorkQueueUidAdaptor       workQueueUidAdaptor = new WorkQueueUidAdaptor();
                WorkQueueUidUpdateColumns update = new WorkQueueUidUpdateColumns();
                foreach (StudyIntegrityQueueUid uid in uidList)
                {
                    update.WorkQueueKey      = newWorkQueueItem.GetKey();
                    update.SeriesInstanceUid = uid.SeriesInstanceUid;
                    update.SopInstanceUid    = uid.SopInstanceUid;
                    update.RelativePath      = uid.RelativePath;
                    workQueueUidAdaptor.Add(context, update);
                }

                //DeleteStudyIntegrityQueue Item
                StudyIntegrityQueueUidSelectCriteria criteria = new StudyIntegrityQueueUidSelectCriteria();
                criteria.StudyIntegrityQueueKey.EqualTo(item.GetKey());
                studyIntegrityQueueUidAdaptor.Delete(context, criteria);

                StudyIntegrityQueueAdaptor studyIntegrityQueueAdaptor = new StudyIntegrityQueueAdaptor();
                studyIntegrityQueueAdaptor.Delete(context, item.GetKey());

                context.Commit();
            }
        }
Пример #5
0
 public DuplicateEntryDetails(StudyIntegrityQueue siqEntry) : base(siqEntry)
 {
     _duplicateSIQEntry = new DuplicateSopReceivedQueue(siqEntry);
 }
Пример #6
0
        /// <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);
        }
Пример #7
0
 public ReconcileDetails(StudyIntegrityQueue queueItem)
 {
     _item = queueItem;
 }