新增维护项目数据接口
parent
49a36b8214
commit
fcc2a68618
|
@ -294,7 +294,7 @@ public class OSSService : IOSSService
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
//token 过期了
|
//token 过期了
|
||||||
else if (AliyunOSSTempToken.Expiration.AddSeconds(10) <= DateTime.Now)
|
if (AliyunOSSTempToken?.Expiration.AddSeconds(10) <= DateTime.Now)
|
||||||
{
|
{
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
|
@ -308,7 +308,7 @@ public class OSSService : IOSSService
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
//token 过期了
|
//token 过期了
|
||||||
else if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now)
|
if (AWSTempToken.Expiration?.AddSeconds(10) <= DateTime.Now)
|
||||||
{
|
{
|
||||||
GetObjectStoreTempToken();
|
GetObjectStoreTempToken();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1051,6 +1051,161 @@ 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