From 1f157bd1a2f1ae4b74f9c04296d76c74041bb432 Mon Sep 17 00:00:00 2001
From: hang <872297557@qq.com>
Date: Mon, 26 May 2025 16:37:41 +0800
Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=8B=E8=BD=BD=E5=BD=B1?=
=?UTF-8?q?=E5=83=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Helper/FileDocProcess/FileStoreHelper.cs | 9 +
IRaCIS.Core.Application/Helper/OSSService.cs | 6 +-
.../IRaCIS.Core.Application.xml | 14 ++
.../Service/Common/BackDownloadService.cs | 166 ++++++++++++++++++
.../_IRaCIS/_Config/_StaticData.cs | 1 +
5 files changed, 195 insertions(+), 1 deletion(-)
create mode 100644 IRaCIS.Core.Application/Service/Common/BackDownloadService.cs
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 0336942b6..fa6ae362b 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";