diff --git a/IRC.Core.SCP/Program.cs b/IRC.Core.SCP/Program.cs index 4eea0413e..65ca34788 100644 --- a/IRC.Core.SCP/Program.cs +++ b/IRC.Core.SCP/Program.cs @@ -203,6 +203,7 @@ app.MapControllers(); Log.Logger = new LoggerConfiguration() //.MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("ZiggyCreatures.Caching.Fusion", LogEventLevel.Warning) .WriteTo.Console() .WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day) .CreateLogger(); diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index ccc491996..879e0a223 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -30,6 +30,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using ZiggyCreatures.Caching.Fusion; namespace IRaCIS.Core.SCP.Service { @@ -449,7 +450,8 @@ namespace IRaCIS.Core.SCP.Service var dicomArchiveService = _serviceProvider.GetService(); var _seriesRepository = _serviceProvider.GetService>(); var _studyGroupRepository = _serviceProvider.GetService>(); - + var _fusionCache = _serviceProvider.GetService(); + var _systemAnonymizationRepository = _serviceProvider.GetService>(); var _distributedLockProvider = _serviceProvider.GetService(); @@ -462,374 +464,420 @@ namespace IRaCIS.Core.SCP.Service try { + // 直接拿 Dataset(已经完整) + var dataset = request.Dataset; - using (MemoryStream ms = new MemoryStream()) + #region 匿名化 + + + var anonymizeList = await _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7)); + + + var fixedFiledList = anonymizeList.Where(t => t.IsFixed).ToList(); + + var ircFiledList = anonymizeList.Where(t => t.IsFixed == false).ToList(); + + foreach (var item in fixedFiledList) { - await request.File.SaveAsync(ms); - #region 1帧拆成多个固定大小的,方便移动端浏览 + var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - // 回到开头,读取 dicom - ms.Position = 0; - var dicomFile = DicomFile.Open(ms); + dataset.AddOrUpdate(dicomTag, item.ReplaceValue); + } - var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1); + foreach (var item in ircFiledList) + { - //多帧处理逻辑 - if(numberOfFrames > 1) + var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); + + if (dicomTag == DicomTag.ClinicalTrialProtocolID) { - //一定要有像素数据才处理 - var pixelData = DicomPixelData.Create(dicomFile.Dataset); + dataset.AddOrUpdate(DicomTag.ClinicalTrialProtocolID, ""); - if (pixelData != null) - { - try - { + } + if (dicomTag == DicomTag.ClinicalTrialSiteID) + { + dataset.AddOrUpdate(DicomTag.ClinicalTrialSiteID, ""); - Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 开始处理多帧instanceId:{instanceId}"); - - var syntax = pixelData.Syntax; - - // 每个 fragment 固定大小 (64KB 示例,可以自己调整) - int fragmentSize = 20 * 1024; - - - - var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); - - int fragmentCount = frag?.Fragments?.Count() ?? 0; - - var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建 - - var bot = new List(); - - uint botOffset = 0; - - //需要拆成固定片段的 - if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames && numberOfFrames > 1) - { - - - - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - - #region test - //var newDicomFile = dicomFile.Clone(); - - //var newDataset = newDicomFile.Dataset; - - //var dstPd = DicomPixelData.Create(newDataset, true); - - //for (int i = 0; i < pixelData.NumberOfFrames; i++) - //{ - // var frame = pixelData.GetFrame(i); - - // dstPd.AddFrame(frame); - - // var data = frame.Data; - // int offset = 0; - - // while (offset < data.Length) - // { - // int size = Math.Min(fragmentSize, data.Length - offset); - // var buffer = new byte[size]; - // Buffer.BlockCopy(data, offset, buffer, 0, size); - - // newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); - - // offset += size; - - // } - - - //} - //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; - - //newFragments.OffsetTable.AddRange(newOffsetTable.ToArray()); - #endregion - - #region test fo-dicom auto bot - //var newDicomFile = dicomFile.Clone(); - - //var newDataset = newDicomFile.Dataset; - - //var dstPd = DicomPixelData.Create(newDataset, true); - - //for (int i = 0; i < pixelData.NumberOfFrames; i++) - //{ - // var frame = pixelData.GetFrame(i); - - // dstPd.AddFrame(frame); - //} - //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; - - //Console.WriteLine(newOffsetTable.ToJsonStr()); - #endregion - - #region 最终使用 - - for (int n = 0; n < pixelData.NumberOfFrames; n++) - { - var frameData = pixelData.GetFrame(n); // 获取完整一帧 - var data = frameData.Data; - int offset = 0; - - bot.Add(botOffset); - - botOffset += (uint)data.Length; - - - while (offset < data.Length) - { - botOffset += 8; - - - int size = Math.Min(fragmentSize, data.Length - offset); - var buffer = new byte[size]; - Buffer.BlockCopy(data, offset, buffer, 0, size); - - newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); - - offset += size; - - } - } - - //保留原始偏移表 - - if (originOffsetTable.Count == pixelData.NumberOfFrames) - { - newFragments.OffsetTable.AddRange(originOffsetTable.ToArray()); - - } - else - { - newFragments.OffsetTable.AddRange(bot.ToArray()); - - //Console.WriteLine(bot.ToJsonStr()); - } - - #endregion - - - dicomFile.Dataset.AddOrUpdate(newFragments); - - - // 重新保存 dicom 到流 - ms.SetLength(0); - - dicomFile.Save(ms); - } - //传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败 - else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0) - { - - - - uint offset = 0; - - bot.Add(offset); - - var fistSize = frag.Fragments.FirstOrDefault()?.Size ?? 0; - - //和上一个大小不一样 - var isDiffrentBefore = false; - - uint count = 0; - - // 假设你知道每帧对应的 fragment 数量 - foreach (var frameFragments in frag.Fragments) - { - count++; - - if (frameFragments.Size == fistSize) - { - isDiffrentBefore = false; - // 累加这一帧所有 fragment 的大小 - offset += (uint)frameFragments.Size; - continue; - } - else - { - offset += (uint)frameFragments.Size; - isDiffrentBefore = true; - - } - - if (isDiffrentBefore) - { - //每个Fragment 也占用字节 - offset += 8 * count; - bot.Add(offset); - count = 0; - - } - - } - - bot.RemoveAt(bot.Count - 1); - // 设置到新的 PixelData - frag.OffsetTable.AddRange(bot.ToArray()); - - - // 重新保存 DICOM 到流 - ms.SetLength(0); - - dicomFile.Save(ms); - - } - - } - catch (Exception mutiEx) - { - Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 处理多帧失败,上传原始文件:{mutiEx.ToString()}"); - } - } } + if (dicomTag == DicomTag.ClinicalTrialSubjectID) + { + dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, ""); + } + if (dicomTag == DicomTag.ClinicalTrialTimePointID) + { + dataset.AddOrUpdate(DicomTag.ClinicalTrialTimePointID, ""); + } - - - - - - - #endregion - - - #region 本地测试 - //// --- 保存到本地文件测试 --- - //var localPath = @"D:\TestDicom-5.dcm"; - //using (var fs = new FileStream(localPath, FileMode.Create, FileAccess.Write)) + //if (dicomTag == DicomTag.PatientID) //{ - // ms.CopyTo(fs); + // var pid = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty); + + // dataset.AddOrUpdate(DicomTag.PatientID, trialSiteInfo.TrialCode + "_" + pid); + //} - //return new DicomCStoreResponse(request, DicomStatus.Success); - #endregion - - ms.Position = 0; - //irc 从路径最后一截取Guid - storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false); - - fileSize = ms.Length; + } + #endregion - var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}"); + // 构造 DicomFile(不用 Open) + var dicomFile = new DicomFile(dataset); - using (await @lock.AcquireAsync()) + + #region 1帧拆成多个固定大小的,方便移动端浏览 + + + + var numberOfFrames = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1); + + //多帧处理逻辑 + if (numberOfFrames > 1) + { + //一定要有像素数据才处理 + var pixelData = DicomPixelData.Create(dicomFile.Dataset); + + if (pixelData != null) { try { - var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(dicomFile, storeRelativePath, Association.CallingAE, Association.CalledAE, fileSize); - var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); + Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 开始处理多帧instanceId:{instanceId}"); - //没有缩略图 - if (series != null && string.IsNullOrEmpty(series.ImageResizePath)) + var syntax = pixelData.Syntax; + + // 每个 fragment 固定大小 (64KB 示例,可以自己调整) + int fragmentSize = 20 * 1024; + + + + var frag = dicomFile.Dataset.GetDicomItem(DicomTag.PixelData); + + int fragmentCount = frag?.Fragments?.Count() ?? 0; + + var originOffsetTable = frag?.OffsetTable; //有可能没有表,需要自己重建 + + var bot = new List(); + + uint botOffset = 0; + + //需要拆成固定片段的 + if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames && numberOfFrames > 1) { - // 生成缩略图 - using (var memoryStream = new MemoryStream()) + + + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + + #region test + //var newDicomFile = dicomFile.Clone(); + + //var newDataset = newDicomFile.Dataset; + + //var dstPd = DicomPixelData.Create(newDataset, true); + + //for (int i = 0; i < pixelData.NumberOfFrames; i++) + //{ + // var frame = pixelData.GetFrame(i); + + // dstPd.AddFrame(frame); + + // var data = frame.Data; + // int offset = 0; + + // while (offset < data.Length) + // { + // int size = Math.Min(fragmentSize, data.Length - offset); + // var buffer = new byte[size]; + // Buffer.BlockCopy(data, offset, buffer, 0, size); + + // newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); + + // offset += size; + + // } + + + //} + //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; + + //newFragments.OffsetTable.AddRange(newOffsetTable.ToArray()); + #endregion + + #region test fo-dicom auto bot + //var newDicomFile = dicomFile.Clone(); + + //var newDataset = newDicomFile.Dataset; + + //var dstPd = DicomPixelData.Create(newDataset, true); + + //for (int i = 0; i < pixelData.NumberOfFrames; i++) + //{ + // var frame = pixelData.GetFrame(i); + + // dstPd.AddFrame(frame); + //} + //var newOffsetTable = newDataset.GetDicomItem(DicomTag.PixelData).OffsetTable; + + //Console.WriteLine(newOffsetTable.ToJsonStr()); + #endregion + + #region 最终使用 + + for (int n = 0; n < pixelData.NumberOfFrames; n++) { - DicomImage image = new DicomImage(dicomFile.Dataset); + var frameData = pixelData.GetFrame(n); // 获取完整一帧 + var data = frameData.Data; + int offset = 0; - var sharpimage = image.RenderImage().AsSharpImage(); - sharpimage.Save(memoryStream, new JpegEncoder()); + bot.Add(botOffset); - // 上传缩略图到 OSS - - var seriesPath = await ossService.UploadToOSSAsync(memoryStream, ossFolderPath, $"{seriesId.ToString()}_{instanceId.ToString()}.preview.jpg", false); + botOffset += (uint)data.Length; - series.ImageResizePath = seriesPath; + while (offset < data.Length) + { + botOffset += 8; + int size = Math.Min(fragmentSize, data.Length - offset); + var buffer = new byte[size]; + Buffer.BlockCopy(data, offset, buffer, 0, size); - //await _seriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, u => new SCPSeries() { ImageResizePath = seriesPath }); + newFragments.Fragments.Add(new MemoryByteBuffer(buffer)); + offset += size; + + } + } + + //保留原始偏移表 + + if (originOffsetTable.Count == pixelData.NumberOfFrames) + { + newFragments.OffsetTable.AddRange(originOffsetTable.ToArray()); } + else + { + newFragments.OffsetTable.AddRange(bot.ToArray()); + + //Console.WriteLine(bot.ToJsonStr()); + } + + #endregion + + + dicomFile.Dataset.AddOrUpdate(newFragments); + + + } + //传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败 + else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count == 0) + { + + + + uint offset = 0; + + bot.Add(offset); + + var fistSize = frag.Fragments.FirstOrDefault()?.Size ?? 0; + + //和上一个大小不一样 + var isDiffrentBefore = false; + + uint count = 0; + + // 假设你知道每帧对应的 fragment 数量 + foreach (var frameFragments in frag.Fragments) + { + count++; + + if (frameFragments.Size == fistSize) + { + isDiffrentBefore = false; + // 累加这一帧所有 fragment 的大小 + offset += (uint)frameFragments.Size; + continue; + } + else + { + offset += (uint)frameFragments.Size; + isDiffrentBefore = true; + + } + + if (isDiffrentBefore) + { + //每个Fragment 也占用字节 + offset += 8 * count; + bot.Add(offset); + count = 0; + + } + + } + + bot.RemoveAt(bot.Count - 1); + // 设置到新的 PixelData + frag.OffsetTable.AddRange(bot.ToArray()); + + + + } - await _seriesRepository.SaveChangesAsync(); + } + catch (Exception mutiEx) + { + Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 处理多帧失败,上传原始文件:{mutiEx.ToString()}"); + } + } - if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid)) + + } + + #endregion + + #region 本地测试 + //// --- 保存到本地文件测试 --- + //var localPath = @"D:\TestDicom.dcm"; + //using (var fs = new FileStream(localPath, FileMode.Create, FileAccess.Write)) + //{ + // ms.CopyTo(fs); + //} + //return new DicomCStoreResponse(request, DicomStatus.Success); + + #endregion + + // 直接写入内存 + await using var ms = new MemoryStream(); + await dicomFile.SaveAsync(ms); + ms.Position = 0; + + //irc 从路径最后一截取Guid + storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false); + + fileSize = ms.Length; + + + var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}"); + + using (await @lock.AcquireAsync()) + { + try + { + var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(dicomFile, storeRelativePath, Association.CallingAE, Association.CalledAE, fileSize); + + var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); + + //没有缩略图 + if (series != null && string.IsNullOrEmpty(series.ImageResizePath)) + { + + // 生成缩略图 + using (var memoryStream = new MemoryStream()) { - var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid)); + DicomImage image = new DicomImage(dicomFile.Dataset); + + var sharpimage = image.RenderImage().AsSharpImage(); + sharpimage.Save(memoryStream, new JpegEncoder()); + + // 上传缩略图到 OSS + + var seriesPath = await ossService.UploadToOSSAsync(memoryStream, ossFolderPath, $"{seriesId.ToString()}_{instanceId.ToString()}.preview.jpg", false); - find.SuccessImageCount++; + series.ImageResizePath = seriesPath; - if (!find.PatientNameList.Any(t => t == patientIdStr) && patientIdStr.IsNotNullOrEmpty()) + + + //await _seriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, u => new SCPSeries() { ImageResizePath = seriesPath }); + + + } + } + + await _seriesRepository.SaveChangesAsync(); + + if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid)) + { + var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid)); + + + find.SuccessImageCount++; + + if (!find.PatientNameList.Any(t => t == patientIdStr) && patientIdStr.IsNotNullOrEmpty()) + { + find.PatientNameList.Add(patientIdStr); + } + + //首次 (默认是Guid 空,数据库归档出了Id) + if (find.SCPStudyId != scpStudyId) + { + find.SCPStudyId = scpStudyId; + + #region 给检查打课题组标签 + + //添加课题组标签 + if (CurrentHospitalGroup != null) { - find.PatientNameList.Add(patientIdStr); - } - - //首次 (默认是Guid 空,数据库归档出了Id) - if (find.SCPStudyId != scpStudyId) - { - find.SCPStudyId = scpStudyId; - - #region 给检查打课题组标签 - - //添加课题组标签 - if (CurrentHospitalGroup != null) + if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == CurrentHospitalGroup.Id)) { - if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == CurrentHospitalGroup.Id)) + await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = CurrentHospitalGroup.Id }); + } + } + else + { + var findCmoveInfo = _cmoveStudyRepository.Where(t => t.StudyInstanceUIDList.Any(c => c == studyInstanceUid)).OrderByDescending(t => t.CreateTime).FirstOrDefault(); + + if (findCmoveInfo != null) + { + foreach (var item in findCmoveInfo.HopitalGroupIdList) { - await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = CurrentHospitalGroup.Id }); + if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == item)) + { + await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = item }); + + } } } else { - var findCmoveInfo = _cmoveStudyRepository.Where(t => t.StudyInstanceUIDList.Any(c => c == studyInstanceUid)).OrderByDescending(t => t.CreateTime).FirstOrDefault(); - - if (findCmoveInfo != null) - { - foreach (var item in findCmoveInfo.HopitalGroupIdList) - { - if (!_studyGroupRepository.Any(t => t.SCPStudyId == scpStudyId && t.HospitalGroupId == item)) - { - await _studyGroupRepository.AddAsync(new SCPStudyHospitalGroup() { SCPStudyId = scpStudyId, HospitalGroupId = item }); - - } - } - } - else - { - Log.Logger.Warning($"未找到{studyInstanceUid}的Cmove记录"); - } + Log.Logger.Warning($"未找到{studyInstanceUid}的Cmove记录"); } - #endregion - } - } - } - catch (Exception ex) - { - - Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}"); - - if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid)) - { - var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid)); - - find.FailedImageCount++; + #endregion } - } - - - - //监控信息设置 - _upload.FileCount++; - _upload.FileSize = _upload.FileSize + fileSize; } + catch (Exception ex) + { + + Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}"); + + if (_ImageUploadList.Any(t => t.StudyInstanceUid == studyInstanceUid)) + { + var find = _ImageUploadList.FirstOrDefault(t => t.StudyInstanceUid.Equals(studyInstanceUid)); + + find.FailedImageCount++; + + } + + } + + + + //监控信息设置 + _upload.FileCount++; + _upload.FileSize = _upload.FileSize + fileSize; } + Log.Logger.Information($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} {request.SOPInstanceUID} 上传完成 "); } diff --git a/IRC.Core.SCP/Service/DicomArchiveService.cs b/IRC.Core.SCP/Service/DicomArchiveService.cs index 109a11624..fba5ec0d1 100644 --- a/IRC.Core.SCP/Service/DicomArchiveService.cs +++ b/IRC.Core.SCP/Service/DicomArchiveService.cs @@ -20,11 +20,7 @@ namespace IRaCIS.Core.SCP.Service public class DicomArchiveService(IRepository _patientRepository, IRepository _studyRepository, IRepository _seriesRepository, - IRepository _instanceRepository, - IDistributedLockProvider _distributedLockProvider, - IRepository _systemAnonymizationRepository, - IRepository _trialSiteRepository, - IFusionCache _fusionCache + IRepository _instanceRepository ) : BaseService, IDicomArchiveService { @@ -42,55 +38,6 @@ namespace IRaCIS.Core.SCP.Service { var dataset = dicomFile.Dataset; - #region 匿名化 - - var anonymizeList = await _fusionCache.GetOrSetAsync(CacheKeys.SystemAnonymization, _ => CacheHelper.GetSystemAnonymizationListAsync(_systemAnonymizationRepository), TimeSpan.FromDays(7)); - - - var fixedFiledList = anonymizeList.Where(t => t.IsFixed).ToList(); - - var ircFiledList = anonymizeList.Where(t => t.IsFixed == false).ToList(); - - foreach (var item in fixedFiledList) - { - - var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - - dataset.AddOrUpdate(dicomTag, item.ReplaceValue); - } - - foreach (var item in ircFiledList) - { - - var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - - if (dicomTag == DicomTag.ClinicalTrialProtocolID) - { - dataset.AddOrUpdate(dicomTag, ""); - - } - if (dicomTag == DicomTag.ClinicalTrialSiteID) - { - dataset.AddOrUpdate(dicomTag, ""); - } - - if (dicomTag == DicomTag.ClinicalTrialSubjectID) - { - dataset.AddOrUpdate(dicomTag, ""); - - } - if (dicomTag == DicomTag.ClinicalTrialTimePointID) - { - dataset.AddOrUpdate(dicomTag, ""); - - } - - - - } - #endregion - - string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID); string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID); @@ -257,6 +204,7 @@ namespace IRaCIS.Core.SCP.Service findStudy.DicomStudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty); findStudy.CalledAE = calledAE; findStudy.CallingAE = callingAE; + findStudy.PatientIdStr = patientIdStr; findStudy.PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty); findStudy.PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty); findStudy.PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty);