Compare commits
No commits in common. "a8800b01f3e180c6c9008732f7774851b4363489" and "a353c90bf7dde4babdf8885a41b821a7988dc3b0" have entirely different histories.
a8800b01f3
...
a353c90bf7
|
|
@ -294,7 +294,7 @@ public class OSSService : IOSSService
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
//token 过期了
|
//token 过期了
|
||||||
if (AliyunOSSTempToken?.Expiration.AddSeconds(10) <= DateTime.Now)
|
else if (AliyunOSSTempToken.Expiration.AddSeconds(10) <= DateTime.Now)
|
||||||
{
|
{
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
|
|
@ -308,7 +308,7 @@ public class OSSService : IOSSService
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
//token 过期了
|
//token 过期了
|
||||||
if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now)
|
else if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now)
|
||||||
{
|
{
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1051,161 +1051,6 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读取该项目的数据,进行维护
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="_instanceRepository"></param>
|
|
||||||
/// <param name="trialId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[AllowAnonymous]
|
|
||||||
public async Task<IResponseOutput> WriteTrialNeedDealData([FromServices] IRepository<DicomInstance> _instanceRepository, Guid trialId)
|
|
||||||
{
|
|
||||||
|
|
||||||
#region 获取差集数据
|
|
||||||
//var rows = await MiniExcel.QueryAsync<DicomSOPInfo>(@"C:\Users\hang\Desktop\维护数据读取.xlsx");
|
|
||||||
|
|
||||||
//rows = rows.Where(t => !string.IsNullOrEmpty(t.InstanceId.ToString())).ToList();
|
|
||||||
|
|
||||||
//var allRows = await MiniExcel.QueryAsync<NeedDealInstanceInfo>(@"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
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue