using DocumentFormat.OpenXml.EMMA; using FellowOakDicom; using IRaCIS.Core.Application.Helper; using MassTransit; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web; using static IRaCIS.Core.Domain.Share.StaticData; namespace IRaCIS.Core.Application.Service { /// /// 项目影像后台下载,不打包 /// /// /// [ApiExplorerSettings(GroupName = "Common")] public class TrialImageDownloadService(IRepository _trialRepository, IOSSService _oSSService, IWebHostEnvironment _hostEnvironment) : BaseService { /// /// 后端api swagger 下载项目影像 /// /// /// [HttpPost] [AllowAnonymous] public async Task DownloadTrialImage(Guid trialId) { var subjectCodeList = new List() { "05002", "07006", "07026" }; var downloadInfo = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, VisitList = t.SubjectVisitList.Where(t=>subjectCodeList.Contains(t.Subject.Code)).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 }).ToList() }) }).ToList(), 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() }).ToList() }).ToList() }).FirstOrDefault(); var count = downloadInfo.VisitList.SelectMany(t => t.NoneDicomStudyList).SelectMany(t => t.FileList).Count(); var count2 = downloadInfo.VisitList.SelectMany(t => t.StudyList).SelectMany(t => t.SeriesList).SelectMany(t=>t.InstancePathList).Count(); if (downloadInfo != null) { var rootFolder = FileStoreHelper.GetDonwnloadImageFolder(_hostEnvironment); // 获取无效字符(系统定义的) string invalidChars = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); // 用正则表达式替换所有非法字符为下划线或空字符 string pattern = $"[{Regex.Escape(invalidChars)}]"; var regexNo = Regex.Replace(downloadInfo.ResearchProgramNo, pattern, "_"); // 创建一个临时文件夹来存放文件 string trialFolderPath = Path.Combine(rootFolder, $"{regexNo}_{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); } #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(); } } }