From 7d81cb72eeeb92df674f3d65b05960cc89f641af Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 28 May 2026 15:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=8E=8B=E7=BC=A9=E5=8C=85?= =?UTF-8?q?=20=E5=8A=A0=E5=85=A5=E6=A0=87=E5=87=86=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 71 ++++++----- .../Reading/Dto/ReadingCalculateViewModel.cs | 6 + .../Interface/IReadingImageTaskService.cs | 2 +- .../ReadingImageTaskService.cs | 120 +++++++++++------- 4 files changed, 120 insertions(+), 79 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 12c44211d..a83f26f3b 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -1350,50 +1350,57 @@ namespace IRaCIS.Core.API.Controllers using var zip = new ZipArchive(responseStream, ZipArchiveMode.Create, leaveOpen: true); var existingEntryPaths = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var item in data) + foreach (var criterion in data) { abortToken.ThrowIfCancellationRequested(); - var folderName = - $"{SanitizePathSegment(item.SubjectCode, "UnknownSubject")}_{SanitizePathSegment(item.VisitName, "UnknownVisit")}"; + var criterionFolderName = SanitizePathSegment(criterion.CriterionName, "UnknownCriterion"); - foreach (var reportUrl in item.ReportUrlList.Where(x => !string.IsNullOrWhiteSpace(x))) + foreach (var item in criterion.ReadingReportAndImageList) { abortToken.ThrowIfCancellationRequested(); - try - { - var fileName = GetEntryFileName(reportUrl, "Report", existingEntryPaths.Count + 1); - var entryPath = BuildUniqueEntryPath(existingEntryPaths, folderName, fileName); - var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + var folderName = + $"{criterionFolderName}/{SanitizePathSegment(item.SubjectCode, "UnknownSubject")}_{SanitizePathSegment(item.VisitName, "UnknownVisit")}"; - await using var entryStream = entry.Open(); - await using var source = await _oSSService.GetStreamFromOSSAsync(reportUrl); - await source.CopyToAsync(entryStream, 32 * 1024, abortToken); + foreach (var reportUrl in item.ReportUrlList.Where(x => !string.IsNullOrWhiteSpace(x))) + { + abortToken.ThrowIfCancellationRequested(); + + try + { + var fileName = GetEntryFileName(reportUrl, "Report", existingEntryPaths.Count + 1); + var entryPath = BuildUniqueEntryPath(existingEntryPaths, folderName, fileName); + var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + + await using var entryStream = entry.Open(); + await using var source = await _oSSService.GetStreamFromOSSAsync(reportUrl); + await source.CopyToAsync(entryStream, 32 * 1024, abortToken); + } + catch (Exception ex) + { + Log.Logger.Warning($"处理阅片报告文件{reportUrl}失败: {ex.Message}"); + } } - catch (Exception ex) - { - Log.Logger.Warning($"处理阅片报告文件{reportUrl}失败: {ex.Message}"); - } - } - foreach (var imageUrl in item.ImageUrlList.Where(x => !string.IsNullOrWhiteSpace(x))) - { - abortToken.ThrowIfCancellationRequested(); - - try + foreach (var imageUrl in item.ImageUrlList.Where(x => !string.IsNullOrWhiteSpace(x))) { - var fileName = GetEntryFileName(imageUrl, "Image", existingEntryPaths.Count + 1); - var entryPath = BuildUniqueEntryPath(existingEntryPaths, folderName, fileName); - var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + abortToken.ThrowIfCancellationRequested(); - await using var entryStream = entry.Open(); - await using var source = await _oSSService.GetStreamFromOSSAsync(imageUrl); - await source.CopyToAsync(entryStream, 32 * 1024, abortToken); - } - catch (Exception ex) - { - Log.Logger.Warning($"处理阅片图片文件{imageUrl}失败: {ex.Message}"); + try + { + var fileName = GetEntryFileName(imageUrl, "Image", existingEntryPaths.Count + 1); + var entryPath = BuildUniqueEntryPath(existingEntryPaths, folderName, fileName); + var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + + await using var entryStream = entry.Open(); + await using var source = await _oSSService.GetStreamFromOSSAsync(imageUrl); + await source.CopyToAsync(entryStream, 32 * 1024, abortToken); + } + catch (Exception ex) + { + Log.Logger.Warning($"处理阅片图片文件{imageUrl}失败: {ex.Message}"); + } } } } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 0916a4647..27f72343b 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -298,6 +298,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List VisitTaskIdList { get; set; } = new List() { }; } + public class ReadingReportAndImageCriterion + { + public string CriterionName { get; set; } + + public List ReadingReportAndImageList { get; set; } = new List(); + } public class ReadingReportAndImage { /// diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs index ec0e57256..c691c1667 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs @@ -12,7 +12,7 @@ namespace IRaCIS.Core.Application.Contracts { public interface IReadingImageTaskService { - Task> GetReadingReportAndImage(GetReadingReportAndImageInDto inDto); + Task> GetReadingReportAndImage(GetReadingReportAndImageInDto inDto); Task SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto); Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 02897f0e9..b307dfa25 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -77,7 +77,7 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task> GetReadingReportAndImage(GetReadingReportAndImageInDto inDto) + public async Task> GetReadingReportAndImage(GetReadingReportAndImageInDto inDto) { var taskList=new List { }; @@ -88,7 +88,12 @@ namespace IRaCIS.Core.Application.Service throw new BusinessValidationFailedException(_localizer["ReadingImage_ReportDataInvalid"]); } - taskList=await _visitTaskRepository.Where(x => inDto.VisitTaskIdList.Contains(x.Id)&&x.ReadingCategory==ReadingCategory.Visit).Include(x=>x.LesionList).Include(x=>x.Subject).Include(x=>x.SourceSubjectVisit).ToListAsync(); + taskList=await _visitTaskRepository.Where(x => inDto.VisitTaskIdList.Contains(x.Id)&&x.ReadingCategory==ReadingCategory.Visit) + .Include(x=>x.LesionList) + .Include(x=>x.Subject) + .Include(x=>x.SourceSubjectVisit) + .Include(x => x.TrialReadingCriterion) + .ToListAsync(); } else { @@ -96,68 +101,91 @@ namespace IRaCIS.Core.Application.Service .Include(x => x.LesionList) .Include(x => x.Subject) .Include(x => x.SourceSubjectVisit) + .Include(x=>x.TrialReadingCriterion) .ToListAsync(); } - - List< ReadingReportAndImage > result = new List() { }; - foreach (var item in taskList) + + List imageCriteriaList = new List(); + + + var trialReadingCriterionList = taskList.Select(x => x.TrialReadingCriterion).Distinct().ToList(); + + foreach (var criterion in trialReadingCriterionList) { - ReadingReportAndImage data = new ReadingReportAndImage() + ReadingReportAndImageCriterion imageCriterion = new ReadingReportAndImageCriterion() { - SubjectCode = item.Subject != null ? item.Subject.Code : string.Empty, - VisitName = item.SourceSubjectVisit != null ? item.SourceSubjectVisit.VisitName : string.Empty, - ImageUrlList = item.LesionList != null ? item.LesionList.Where(x => x.PicturePath != string.Empty).Select(x => x.PicturePath).ToList() : new List() { }, - ReportUrlList = new List() - { - }, + CriterionName = criterion.CriterionName, + ReadingReportAndImageList = new List() { } }; - if (item.ReportExportUrl != string.Empty) + + + var criterionTaskList = taskList.Where(x => x.TrialReadingCriterionId == criterion.Id).ToList(); + + + foreach (var item in criterionTaskList) { - data.ReportUrlList.Add(item.ReportExportUrl); - } - else - { - try + ReadingReportAndImage data = new ReadingReportAndImage() { - data.ReportUrlList.Add(await _readingCalculateService.GetVisitReadReportUrl(new CaGetVisitReadReportUrl() + SubjectCode = item.Subject != null ? item.Subject.Code : string.Empty, + VisitName = item.SourceSubjectVisit != null ? item.SourceSubjectVisit.VisitName : string.Empty, + ImageUrlList = item.LesionList != null ? item.LesionList.Where(x => x.PicturePath != string.Empty).Select(x => x.PicturePath).ToList() : new List() { }, + ReportUrlList = new List() { - VisitTaskId = item.Id, - })); - } - catch (Exception) - { + }, + }; - - } - - } - - if (item.TumorEvaluationUrl != string.Empty) - { - data.ReportUrlList.Add(item.TumorEvaluationUrl); - } - else - { - try + if (item.ReportExportUrl != string.Empty) { - data.ReportUrlList.Add(await _readingCalculateService.GetTumorEvaluationReportUrl(new CaGetVisitReadReportUrl() + data.ReportUrlList.Add(item.ReportExportUrl); + } + else + { + try + { + data.ReportUrlList.Add(await _readingCalculateService.GetVisitReadReportUrl(new CaGetVisitReadReportUrl() + { + VisitTaskId = item.Id, + })); + } + catch (Exception) { - VisitTaskId = item.Id, - })); - } - catch (Exception) - { - + + } + } - + + if (item.TumorEvaluationUrl != string.Empty) + { + data.ReportUrlList.Add(item.TumorEvaluationUrl); + } + else + { + try + { + data.ReportUrlList.Add(await _readingCalculateService.GetTumorEvaluationReportUrl(new CaGetVisitReadReportUrl() + { + VisitTaskId = item.Id, + })); + } + catch (Exception) + { + + + } + + } + + imageCriterion.ReadingReportAndImageList.Add(data); } - result.Add(data); + imageCriteriaList.Add(imageCriterion); } - return result; + + + return imageCriteriaList; } ///