From fcc2a686181fdbdeb37991dbc43acb7559c76e8b Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 12 Sep 2025 16:14:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BB=B4=E6=8A=A4=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Helper/OSSService.cs | 4 +- .../Common/TrialImageDownloadService.cs | 155 ++++++++++++++++++ 2 files changed, 157 insertions(+), 2 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/OSSService.cs b/IRaCIS.Core.Application/Helper/OSSService.cs index 2d8ad841b..cad0084a6 100644 --- a/IRaCIS.Core.Application/Helper/OSSService.cs +++ b/IRaCIS.Core.Application/Helper/OSSService.cs @@ -294,7 +294,7 @@ public class OSSService : IOSSService GetObjectStoreTempToken(); } //token 过期了 - else if (AliyunOSSTempToken.Expiration.AddSeconds(10) <= DateTime.Now) + if (AliyunOSSTempToken?.Expiration.AddSeconds(10) <= DateTime.Now) { GetObjectStoreTempToken(); } @@ -308,7 +308,7 @@ public class OSSService : IOSSService GetObjectStoreTempToken(); } //token 过期了 - else if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now) + if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now) { GetObjectStoreTempToken(); } diff --git a/IRaCIS.Core.Application/Service/Common/TrialImageDownloadService.cs b/IRaCIS.Core.Application/Service/Common/TrialImageDownloadService.cs index 5b4d1ef88..109058694 100644 --- a/IRaCIS.Core.Application/Service/Common/TrialImageDownloadService.cs +++ b/IRaCIS.Core.Application/Service/Common/TrialImageDownloadService.cs @@ -1051,6 +1051,161 @@ namespace IRaCIS.Core.Application.Service public string Path { get; set; } } + + /// + /// 读取该项目的数据,进行维护 + /// + /// + /// + /// + [AllowAnonymous] + public async Task WriteTrialNeedDealData([FromServices] IRepository _instanceRepository, Guid trialId) + { + + #region 获取差集数据 + //var rows = await MiniExcel.QueryAsync(@"C:\Users\hang\Desktop\维护数据读取.xlsx"); + + //rows = rows.Where(t => !string.IsNullOrEmpty(t.InstanceId.ToString())).ToList(); + + //var allRows = await MiniExcel.QueryAsync(@"C:\Users\hang\Desktop\AllData.xlsx"); + + //allRows = allRows.Where(t => !string.IsNullOrEmpty(t.InstanceId.ToString())).ToList(); + + //var needDealRows = allRows.Where(t => !rows.Select(c => c.InstanceId).Contains(t.InstanceId)).ToList(); + + //var outputFile = Path.Combine(@"D:\dicomWrite", $"{Guid.NewGuid()}_dicom_info.txt"); + + //foreach (var item in needDealRows) + //{ + // var line = string.Join(",", item.InstanceId, item.Path); + + // await File.AppendAllTextAsync(outputFile, line + Environment.NewLine); + //} + + #endregion + + var folder = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); + + var needDealRows = _instanceRepository.Where(t => t.TrialId == trialId && t.TransferSytaxUID == "").Select(t => new NeedDealInstanceInfo() { InstanceId = t.Id, Path = t.Path }); + + + + var outputFile = Path.Combine(folder, $"{Guid.NewGuid()}_dicom_info.txt"); + + var outputErrorFile = Path.Combine(folder, $"{Guid.NewGuid()}_dicom_info_error.txt"); + + int total = needDealRows.Count(); + + Console.WriteLine($"需要处理数量{total}"); + + int processed = 0; + double lastPercent = 0; + + foreach (var item in needDealRows) + { + + try + { + await using var stream = await _oSSService.GetStreamFromOSSAsync(item.Path); + + var dicomFile = DicomFile.Open(stream); + + var dataset = dicomFile.Dataset; + var fileMeta = dicomFile.FileMetaInfo; + + var pixelData = DicomPixelData.Create(dicomFile.Dataset); + + //获取像素是否为封装形式 + var syntax = dicomFile.Dataset.InternalTransferSyntax; + + var stationName = dataset.GetSingleValueOrDefault(DicomTag.StationName, string.Empty); + + var institutionName = dataset.GetSingleValueOrDefault(DicomTag.InstitutionName, string.Empty); + + var manufacturer = dataset.GetSingleValueOrDefault(DicomTag.Manufacturer, string.Empty); + + //PatientID TrialCode_SubjectCode + //var patientID = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty); + + //SubjectCode + var clinicalTrialSubjectID = dataset.GetSingleValueOrDefault(DicomTag.ClinicalTrialSubjectID, string.Empty); + //访视visitNum + var clinicalTrialTimePointID = dataset.GetSingleValueOrDefault(DicomTag.ClinicalTrialTimePointID, string.Empty); + var studyInstanceUID = dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty); + var seriesInstanceUID = dataset.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, string.Empty); + var sOPInstanceUID = dataset.GetSingleValueOrDefault(DicomTag.SOPInstanceUID, string.Empty); + + var numberOfFrames = dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1); + + + // 传输语法 + var transferSyntaxUID = fileMeta.GetSingleValueOrDefault(DicomTag.TransferSyntaxUID, string.Empty); + var sOPClassUID = dataset.GetSingleValueOrDefault(DicomTag.SOPClassUID, string.Empty); + var mediaStorageSOPClassUID = fileMeta.GetSingleValueOrDefault(DicomTag.MediaStorageSOPClassUID, string.Empty); + + var mediaStorageSOPInstanceUID = fileMeta.GetSingleValueOrDefault(DicomTag.MediaStorageSOPInstanceUID, string.Empty); + + + var line = string.Join(",", + item.InstanceId, + stationName, + institutionName, + manufacturer, + clinicalTrialSubjectID, + clinicalTrialTimePointID, + studyInstanceUID, + seriesInstanceUID, + sOPInstanceUID, + numberOfFrames, + transferSyntaxUID, + sOPClassUID, + mediaStorageSOPClassUID, + mediaStorageSOPInstanceUID + + ); + + + await File.AppendAllTextAsync(outputFile, line + Environment.NewLine); + + //维护序列层级四个字段 后再用sql 维护study series 时间拆分 和 MediaStorageSOPInstanceUID + await _instanceRepository.BatchUpdateNoTrackingAsync( + t => t.Id == item.InstanceId, + t => new DicomInstance + { + IsEncapsulated = syntax.IsEncapsulated, + TransferSytaxUID = transferSyntaxUID, + MediaStorageSOPClassUID = mediaStorageSOPClassUID, + SOPClassUID = sOPClassUID, + MediaStorageSOPInstanceUID = mediaStorageSOPInstanceUID + }, false); + } + catch (Exception ex) + { + + var errorMsg = $"{DateTime.Now} ❌ 失败: {ex.Message} | InstanceId={item.InstanceId}, Path={item.Path}"; + + Console.WriteLine(errorMsg); + + await File.AppendAllTextAsync(outputErrorFile, errorMsg + Environment.NewLine); + } + finally + { + processed++; + double percent = processed * 100.0 / total; + + // 每提升 5% 或完成时输出 + if (percent - lastPercent >= 2.0 || processed == total) + { + lastPercent = percent; + Console.WriteLine($"{DateTime.Now} 进度: {processed}/{total} ({percent:F2}%)"); + } + } + + + } + + return ResponseOutput.Ok(); + } #endregion }