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
}