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(); } }
public DuplicateEntryDetails(StudyIntegrityQueue siqEntry) : base(siqEntry) { _duplicateSIQEntry = new DuplicateSopReceivedQueue(siqEntry); }
/// <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); }
public ReconcileDetails(StudyIntegrityQueue queueItem) { _item = queueItem; }