修改ivus影像下载功能
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-07-15 15:46:31 +08:00
parent 814f1e576a
commit e0c6e9aabf
8 changed files with 174 additions and 88 deletions
@@ -23,7 +23,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
public interface IDownloadAndUploadService
{
Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true);
Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true);
}
[ApiExplorerSettings(GroupName = "Trial")]
public class DownloadAndUploadService : BaseService, IDownloadAndUploadService
@@ -107,8 +107,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
await SubejctRandomReadingTaskNameDeal(subjectId, trialReadingCriterionId);
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null
&& t.DoctorUserId == _userInfo.Id && t.TaskState==TaskState.Effect)
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null
&& t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
.Select(u => new SubjectImageUploadDTO()
{
VisitTaskId = u.Id,
@@ -129,7 +129,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
PackState = u.SourceSubjectVisit.PackState,
OrginalStudyList = u.SourceSubjectVisit.StudyList
.Where(t => u.TrialReadingCriterion.IsImageFilter ?("|"+u.TrialReadingCriterion.CriterionModalitys+"|").Contains("|"+t.ModalityForEdit+"|" ) : true)
.Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
.Select(t => new StudyBasicInfo()
{
Id = t.Id,
@@ -484,24 +484,38 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// </summary>
/// <param name="trialId"></param>
/// <param name="subjectVisitId"></param>
/// <param name="isDicom"></param>
/// <param name="isAnonymize"></param>
/// <returns></returns>
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true)
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
{
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
if (subjectVisit.PackState == PackState.WaitPack)
{
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, isAnonymize), TimeSpan.FromSeconds(1));
var packState = isDicom ? subjectVisit.PackState : subjectVisit.NoDicomPackState;
if (packState == PackState.WaitPack)
{
if (isDicom)
{
subjectVisit.PackState = PackState.Packing;
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId,true, isAnonymize), TimeSpan.FromSeconds(1));
}
else
{
subjectVisit.NoDicomPackState = PackState.Packing;
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, false, isAnonymize), TimeSpan.FromSeconds(1));
}
subjectVisit.PackState = PackState.Packing;
await _subjectVisitRepository.SaveChangesAsync();
}
return ResponseOutput.Ok(subjectVisit.VisitImageZipPath);
return ResponseOutput.Ok(isDicom ? subjectVisit.VisitImageZipPath : subjectVisit.VisitNoDicomImageZipPath);
}
@@ -544,9 +558,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
/// </summary>
/// <param name="trialId"></param>
/// <param name="subjectVisitId"></param>
/// <param name="isDicom"></param>
/// <param name="isAnonymize"></param>
/// <returns></returns>
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true)
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
{
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
@@ -590,6 +605,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
})
})
}),
NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
})
};
@@ -601,107 +630,138 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}");
Directory.CreateDirectory(tempFolderPath);
// 遍历查询结果
foreach (var studyInfo in info.StudyList)
//dicom 处理
if (isDicom)
{
// 遍历 Series
foreach (var seriesInfo in studyInfo.SeriesList)
// 遍历查询结果
foreach (var studyInfo in info.StudyList)
{
string studyFolderPath = Path.Combine(tempFolderPath, $"{info.SubjectCode}_{info.VisitName}", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}");
// 创建 影像 文件夹
Directory.CreateDirectory(studyFolderPath);
// 遍历 InstancePathList
foreach (var instanceInfo in seriesInfo.InstancePathList)
// 遍历 Series
foreach (var seriesInfo in studyInfo.SeriesList)
{
// 复制文件到相应的文件夹
string destinationPath = Path.Combine(studyFolderPath, Path.GetFileName(instanceInfo.Path));
string studyDicomFolderPath = Path.Combine(tempFolderPath, "Dicom", $"{info.SubjectCode}_{info.VisitName}", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}");
//下载到当前目录
await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
// 创建 影像 文件夹
Directory.CreateDirectory(studyDicomFolderPath);
#region
if (isAnonymize)
// 遍历 InstancePathList
foreach (var instanceInfo in seriesInfo.InstancePathList)
{
//受试者随机阅片,需要匿名化检查时间
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
DicomDataset dataset = dicomFile.Dataset;
dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
// 复制文件到相应的文件夹
string destinationPath = Path.Combine(studyDicomFolderPath, Path.GetFileName(instanceInfo.Path));
#region tag匿名化
//DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
//下载到当前目录
await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
//DicomDataset dataset = dicomFile.Dataset;
#region
//foreach (var item in addOrUpdateFixedFieldList)
//{
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
if (isAnonymize)
{
//受试者随机阅片,需要匿名化检查时间
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
DicomDataset dataset = dicomFile.Dataset;
dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
// dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
//}
#region tag匿名化
//DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
//foreach (var item in ircFieldList)
//{
//DicomDataset dataset = dicomFile.Dataset;
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
//foreach (var item in addOrUpdateFixedFieldList)
//{
// if (dicomTag == DicomTag.ClinicalTrialProtocolID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
// }
// if (dicomTag == DicomTag.ClinicalTrialSiteID)
// {
// //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
// dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
//}
// }
// if (dicomTag == DicomTag.ClinicalTrialSubjectID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
//foreach (var item in ircFieldList)
//{
// }
// if (dicomTag == DicomTag.ClinicalTrialTimePointID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
// }
// if (dicomTag == DicomTag.PatientID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
// if (dicomTag == DicomTag.ClinicalTrialProtocolID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
// }
// }
// if (dicomTag == DicomTag.ClinicalTrialSiteID)
// {
// //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
//}
// }
// if (dicomTag == DicomTag.ClinicalTrialSubjectID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
// }
// if (dicomTag == DicomTag.ClinicalTrialTimePointID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
// }
// if (dicomTag == DicomTag.PatientID)
// {
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
// }
//}
#endregion
}
#endregion
}
#endregion
}
}
var zipDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_Dicom.zip");
ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "Dicom"), zipDicomPath);
//上传到Oss
var relativeDicomPath = await _oSSService.UploadToOSSAsync(zipDicomPath, $"download_zip", false);
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativeDicomPath });
File.Delete(zipDicomPath);
}
else
{
//非dicom 处理
var zipPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy.zip");
foreach (var noneDicomStudy in info.NoneDicomStudyList)
{
string studyNoneDicomFolderPath = Path.Combine(tempFolderPath, "NoneDicom", $"{info.SubjectCode}_{info.VisitName}", $"{noneDicomStudy.StudyCode}_{noneDicomStudy.ImageDate.ToString("yyyy-MM-dd")}_{noneDicomStudy.Modality}");
ZipFile.CreateFromDirectory(tempFolderPath, zipPath);
Directory.CreateDirectory(studyNoneDicomFolderPath);
//上传到Oss
var relativePath = await _oSSService.UploadToOSSAsync(zipPath, $"download_zip", false);
foreach (var file in noneDicomStudy.FileList)
{
string destinationPath = Path.Combine(studyNoneDicomFolderPath, Path.GetFileName(file.FileName));
//下载到当前目录
await _oSSService.DownLoadFromOSSAsync(file.Path, destinationPath);
}
}
//subjectVisit.PackState = PackState.Packed;
//subjectVisit.VisitImageZipPath = relativePath;
//await _subjectVisitRepository.SaveChangesAsync();
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativePath });
var zipNoneDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_NoneDicom.zip");
ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "NoneDicom"), zipNoneDicomPath);
var relativeNoneDicomPath = await _oSSService.UploadToOSSAsync(zipNoneDicomPath, $"download_zip", false);
File.Delete(zipNoneDicomPath);
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitNoDicomImageZipPath = relativeNoneDicomPath });
}
//清理文件夹
Directory.Delete(tempFolderPath, true);
File.Delete(zipPath);
}
}