diff --git a/IRaCIS.Core.Application/Helper/FileDocProcess/FileStoreHelper.cs b/IRaCIS.Core.Application/Helper/FileDocProcess/FileStoreHelper.cs index 709631876..beeb6b6c8 100644 --- a/IRaCIS.Core.Application/Helper/FileDocProcess/FileStoreHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileDocProcess/FileStoreHelper.cs @@ -69,6 +69,15 @@ public static class FileStoreHelper return rootFolder; } + public static string GetDonwnloadImageFolder(IWebHostEnvironment _hostEnvironment) + { + var rootPath = GetIRaCISRootPath(_hostEnvironment); + + var rootFolder = Path.Combine(rootPath, StaticData.Folder.DownloadIamgeFolder); + + return rootFolder; + } + //根据相对路径 获取具体文件物理地址 public static string GetPhysicalFilePath(IWebHostEnvironment _hostEnvironment, string relativePath) { diff --git a/IRaCIS.Core.Application/Helper/OSSService.cs b/IRaCIS.Core.Application/Helper/OSSService.cs index b2cc7fdd1..2145b8ef9 100644 --- a/IRaCIS.Core.Application/Helper/OSSService.cs +++ b/IRaCIS.Core.Application/Helper/OSSService.cs @@ -360,7 +360,11 @@ public class OSSService : IOSSService public async Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath) { - GetObjectStoreTempToken(); + if (isFirstCall) + { + GetObjectStoreTempToken(); + isFirstCall = false; + } ossRelativePath = ossRelativePath.TrimStart('/'); try diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index bf0a4c5c5..bfa8b4b00 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -549,6 +549,20 @@ + + + 项目影像后台下载,不打包 + + + + + + + 项目影像后台下载,不打包 + + + + 系统模板文档配置表 diff --git a/IRaCIS.Core.Application/Service/Common/BackDownloadService.cs b/IRaCIS.Core.Application/Service/Common/BackDownloadService.cs new file mode 100644 index 000000000..603b88601 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Common/BackDownloadService.cs @@ -0,0 +1,166 @@ +using DocumentFormat.OpenXml.EMMA; +using FellowOakDicom; +using IRaCIS.Core.Application.Helper; +using MassTransit; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using static IRaCIS.Core.Domain.Share.StaticData; + +namespace IRaCIS.Core.Application.Service +{ + + /// + /// 项目影像后台下载,不打包 + /// + /// + /// + [ApiExplorerSettings(GroupName = "Common")] + public class BackDownloadService(IRepository _trialRepository, IOSSService _oSSService, IWebHostEnvironment _hostEnvironment) : BaseService + { + + + public async Task DownloadTrialImage(Guid trialId) + { + + var downloadInfo = _trialRepository.Where(t => t.Id == trialId).Select(t => new + { + t.ResearchProgramNo, + + VisitList = t.SubjectVisitList.Select(sv => new + { + TrialSiteCode = sv.TrialSite.TrialSiteCode, + SubjectCode = sv.Subject.Code, + VisitName = sv.VisitName, + StudyList = sv.StudyList.Select(u => new + { + u.PatientId, + u.StudyTime, + u.StudyCode, + + SeriesList = u.SeriesList.Select(z => new + { + z.Modality, + + InstancePathList = z.DicomInstanceList.Select(k => new + { + k.Path + }) + }) + + }), + + NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new + { + nd.Modality, + nd.StudyCode, + nd.ImageDate, + + FileList = nd.NoneDicomFileList.Select(file => new + { + file.FileName, + file.Path, + file.FileType + }) + }) + }).ToList() + + }).FirstOrDefault(); + + + if (downloadInfo != null) + { + + var rootFolder = FileStoreHelper.GetDonwnloadImageFolder(_hostEnvironment); + + // 创建一个临时文件夹来存放文件 + string trialFolderPath = Path.Combine(rootFolder, $"{downloadInfo.ResearchProgramNo}_{NewId.NextGuid()}"); + Directory.CreateDirectory(trialFolderPath); + + foreach (var visitItem in downloadInfo.VisitList) + { + if (visitItem.StudyList.Count() == 0 && visitItem.NoneDicomStudyList.Count() == 0) + { + continue; + } + + #region 处理 中心,受试者dicom non-dicom 文件夹层级 + + var siteFolderPath = Path.Combine(trialFolderPath, visitItem.TrialSiteCode); + if (!Directory.Exists(siteFolderPath)) + { + Directory.CreateDirectory(siteFolderPath); + } + + //var subjectDicomFolderPath = Path.Combine(siteFolderPath, $"{visitItem.SubjectCode}_{visitItem.VisitName}_DICOM"); + //var subjectNoneDicomFolderPath = Path.Combine(siteFolderPath, $"{visitItem.SubjectCode}_{visitItem.VisitName}_Non-DICOM"); + + //if (visitItem.NoneDicomStudyList.Count() > 0) + //{ + // Directory.CreateDirectory(subjectNoneDicomFolderPath); + //} + //if (visitItem.StudyList.Count() > 0) + //{ + // Directory.CreateDirectory(subjectDicomFolderPath); + //} + + #endregion + + + foreach (var studyInfo in visitItem.StudyList) + { + // 遍历 Series + foreach (var seriesInfo in studyInfo.SeriesList) + { + string studyDicomFolderPath = Path.Combine(siteFolderPath, $"{visitItem.SubjectCode}_{visitItem.VisitName}_DICOM", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}"); + + // 创建 影像 文件夹 + Directory.CreateDirectory(studyDicomFolderPath); + + // 遍历 InstancePathList + foreach (var instanceInfo in seriesInfo.InstancePathList) + { + // 复制文件到相应的文件夹 + string destinationPath = Path.Combine(studyDicomFolderPath, Path.GetFileName(instanceInfo.Path)); + + //下载到当前目录 + await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath); + } + } + + foreach (var noneDicomStudy in visitItem.NoneDicomStudyList) + { + string studyNoneDicomFolderPath = Path.Combine(siteFolderPath, $"{visitItem.SubjectCode}_{visitItem.VisitName}_Non-DICOM", $"{noneDicomStudy.StudyCode}_{noneDicomStudy.ImageDate.ToString("yyyy-MM-dd")}_{noneDicomStudy.Modality}"); + + Directory.CreateDirectory(studyNoneDicomFolderPath); + + foreach (var file in noneDicomStudy.FileList) + { + string destinationPath = Path.Combine(studyNoneDicomFolderPath, Path.GetFileName(file.FileName)); + + //下载到当前目录 + await _oSSService.DownLoadFromOSSAsync(HttpUtility.UrlDecode(file.Path), destinationPath); + } + } + } + + + } + + + + } + + return ResponseOutput.Ok(); + + + } + + } + +} \ No newline at end of file diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs index cdade200c..0495a2375 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs @@ -74,6 +74,7 @@ public static class StaticData public static readonly string Resources = "Resources"; public static readonly string IRaCISDataFolder = "IRaCISData"; + public static readonly string DownloadIamgeFolder = "DownloadImage"; public static readonly string OtherDataFolder = "OtherData"; public static readonly string TrialDataFolder = "TrialData";