コード例 #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);
            }
        }
コード例 #2
0
        protected override void ProcessItem(Model.WorkQueue item)
        {
            Platform.CheckForNullReference(item, "item");
            Platform.CheckForNullReference(item.Data, "item.Data");

            _reconcileQueueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(WorkQueueItem.Data);

            LoadUids(item);


            if (WorkQueueUidList.Count == 0)
            {
                DirectoryUtility.DeleteIfEmpty(_reconcileQueueData.StoragePath);

                Platform.Log(LogLevel.Info, "Reconcile Cleanup is completed. GUID={0}.", WorkQueueItem.GetKey());
                PostProcessing(WorkQueueItem,
                               WorkQueueProcessorStatus.Complete,
                               WorkQueueProcessorDatabaseUpdate.ResetQueueState);
            }
            else
            {
                Platform.Log(LogLevel.Info,
                             "Starting Cleanup of Reconcile Queue item for study {0} for Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects",
                             Study.StudyInstanceUid, Study.PatientsName, Study.PatientId,
                             Study.AccessionNumber, ServerPartition.Description,
                             WorkQueueUidList.Count);

                ProcessUidList();

                Platform.Log(LogLevel.Info, "Successfully complete Reconcile Cleanup. GUID={0}. {0} uids processed.", WorkQueueItem.GetKey(), WorkQueueUidList.Count);
                PostProcessing(WorkQueueItem,
                               WorkQueueProcessorStatus.Pending,
                               WorkQueueProcessorDatabaseUpdate.None);
            }
        }
コード例 #3
0
        protected override void ProcessItem(Model.WorkQueue item)
        {
            Platform.CheckForNullReference(item, "item");
            Platform.CheckForNullReference(item.Data, "item.Data");

            _reconcileQueueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(WorkQueueItem.Data);

            LoadUids(item);

            InitializeContext();

            SetupProcessor();

            if (WorkQueueUidList.Count == 0)
            {
                Platform.Log(LogLevel.Info,
                             "Completing study reconciliation for Study {0}, Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects",
                             Study.StudyInstanceUid, Study.PatientsName, Study.PatientId,
                             Study.AccessionNumber, ServerPartition.Description, WorkQueueUidList.Count);
                ExecuteCommands(true);
            }
            else
            {
                Platform.Log(LogLevel.Info,
                             "Reconciling study {0} for Patient {1} (PatientId:{2} A#:{3}) on Partition {4}, {5} objects",
                             Study.StudyInstanceUid, Study.PatientsName, Study.PatientId,
                             Study.AccessionNumber, ServerPartition.Description, WorkQueueUidList.Count);

                ExecuteCommands(false);
            }
        }
コード例 #4
0
        private string GetWorkQueueSecondaryFolder(Model.WorkQueue item)
        {
            if (WorkQueueHasSecondaryPath(item))
            {
                if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ProcessDuplicate))
                {
                    ProcessDuplicateQueueEntryQueueData queueData = XmlUtils.Deserialize <ProcessDuplicateQueueEntryQueueData>(item.Data);
                    DirectoryInfo dir = new DirectoryInfo(queueData.DuplicateSopFolder);
                    return(dir.Parent.FullName);
                }

                if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.CleanupDuplicate))
                {
                    ProcessDuplicateQueueEntryQueueData queueData = XmlUtils.Deserialize <ProcessDuplicateQueueEntryQueueData>(item.Data);
                    DirectoryInfo dir = new DirectoryInfo(queueData.DuplicateSopFolder);
                    return(dir.Parent.FullName);
                }

                if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ReconcileCleanup))
                {
                    ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Data);
                    DirectoryInfo dir = new DirectoryInfo(queueData.StoragePath);
                    return(dir.Parent.FullName);
                }
                if (item.WorkQueueTypeEnum.Equals(WorkQueueTypeEnum.ReconcileStudy))
                {
                    ReconcileStudyWorkQueueData queueData = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Data);
                    DirectoryInfo dir = new DirectoryInfo(queueData.StoragePath);
                    return(dir.Parent.FullName);
                }
            }

            return(null);
        }
コード例 #5
0
        public InconsistentDataSIQRecord(StudyIntegrityQueue queue)
        {
            _queueItem = queue;
            ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(queue.Details);

            _conflictingImageDetails    = data.Details;
            _conflictingImageDescriptor = XmlUtils.Deserialize <ImageSetDescriptor>(queue.StudyData);
            StudyStorage storage = StudyStorage.Load(HttpContextData.Current.ReadContext, queue.StudyStorageKey);
            Study        study   = storage.LoadStudy(HttpContextData.Current.ReadContext);

            _existingStudyInfo = new StudyInformation(new ServerEntityAttributeProvider(study));
        }
コード例 #6
0
        private string GetSIQItemStorageFolder(StudyIntegrityQueue queue)
        {
            if (queue.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.InconsistentData))
            {
                ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(queue.Details);
                DirectoryInfo dir = new DirectoryInfo(data.StoragePath);
                return(dir.Parent.FullName);
            }

            if (queue.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.Duplicate))
            {
                DuplicateSIQQueueData data = XmlUtils.Deserialize <DuplicateSIQQueueData>(queue.Details);
                DirectoryInfo         dir  = new DirectoryInfo(data.StoragePath);
                return(dir.Parent.FullName);
            }

            return(null);
        }
コード例 #7
0
        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();
            }
        }