From 0af3c5ab8b9d0ae040008088a66b92b3d6be03d2 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 14 Nov 2024 16:41:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=B1=E5=93=8D=E4=B8=8B=E8=BD=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 9 - .../Allocation/DTO/VisitTaskViewModel.cs | 3 + .../Service/Visit/DTO/PatientViewModel.cs | 11 +- .../Service/Visit/PatientService.cs | 224 +----------------- .../Service/Visit/_MapConfig.cs | 7 +- IRaCIS.Core.Domain/Visit/SubjectVisit.cs | 12 - 6 files changed, 10 insertions(+), 256 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index c4ce4f6cc..696a146bd 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -18204,15 +18204,6 @@ - - - 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包 - - - - - - 获取下载的访视检查信息 diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 9a604e791..b253fb01c 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -108,6 +108,9 @@ namespace IRaCIS.Core.Application.ViewModel public class VisitTaskViewBasic { + + public Guid? SourceSubjectVisitId { get; set; } + public string SubjectShortName { get; set; } public Guid Id { get; set; } diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs index 72b1ee836..274448e1a 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs @@ -922,14 +922,13 @@ namespace IRaCIS.Application.Contracts public string IP { get; set; } - public long VisitImageZipSize { get; set; } + public bool IsSuccess { get; set; } - //文件大小 - public int VisitImageFileCount { get; set; } + public DateTime DownloadStartTime { get; set; } + public DateTime? DownloadEndTime { get; set; } - public string VisitImageZipPath { get; set; } = string.Empty; - - public int? StudyCount { get; set; } + public int ImageCount { get; set; } + public long ImageSize { get; set; } public UserTypeEnum UserTypeEnum { get; set; } diff --git a/IRaCIS.Core.Application/Service/Visit/PatientService.cs b/IRaCIS.Core.Application/Service/Visit/PatientService.cs index 7ec29050b..46a38dbd0 100644 --- a/IRaCIS.Core.Application/Service/Visit/PatientService.cs +++ b/IRaCIS.Core.Application/Service/Visit/PatientService.cs @@ -2215,9 +2215,7 @@ namespace IRaCIS.Application.Services VisitNum = t.VisitNum, VisitName = t.VisitName, VisitEarliestStudyTime = t.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime), - VisitLatestStudyTime = t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime), - VisitImageZipPath = t.VisitImageZipPath, - PackState = t.PackState, + VisitLatestStudyTime = t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime) }); var defalutSortArray = new string[] { nameof(PatientSubjectVisitView.SubjectId), nameof(PatientSubjectVisitView.VisitNum) }; @@ -2707,40 +2705,7 @@ namespace IRaCIS.Application.Services #endregion - /// - /// 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包 - /// - /// - /// - /// - /// - public async Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, [FromServices] IOSSService _oSSService, bool isAnonymize = true) - { - var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); - - if (subjectVisit.PackState == PackState.WaitPack) - { - HangfireJobHelper.NotImmediatelyOnceOnlyJob(t => t.RequestPackageAndAnonymizImage(trialId, subjectVisitId, isAnonymize), TimeSpan.FromSeconds(1)); - - subjectVisit.PackState = PackState.Packing; - - await _subjectVisitRepository.SaveChangesAsync(); - - } - - var zipPath = subjectVisit.VisitImageZipPath; - - if (!string.IsNullOrEmpty(zipPath)) - { - //记录下载的记录 - - await _subejctVisitDownloadRepository.AddAsync(new SubejctVisitDownload() { IP = _userInfo.IP, SubjectVisitId = subjectVisitId }, true); - } - - return ResponseOutput.Ok(zipPath); - - } /// /// 获取下载的访视检查信息 @@ -2869,191 +2834,4 @@ namespace IRaCIS.Application.Services } - public interface IDownloadAndUploadService - { - Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true); - } - [ApiExplorerSettings(GroupName = "Trial")] - public class DownloadAndUploadService : BaseService, IDownloadAndUploadService - { - - private readonly IRepository _systemAnonymizationRepository; - private readonly IRepository _subjectVisitRepository; - private readonly IOSSService _oSSService; - public DownloadAndUploadService(IRepository systemAnonymizationRepository, IRepository subjectVisitRepository, IOSSService oSSService) - { - _systemAnonymizationRepository = systemAnonymizationRepository; - - _subjectVisitRepository = subjectVisitRepository; - - _oSSService = oSSService; - } - - - public async Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true) - { - - var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); - - try - { - var addOrUpdateFixedFieldList = new List(); - - var ircFieldList = new List(); - - if (isAnonymize) - { - var systemAnonymizationList = _systemAnonymizationRepository.Where(t => t.IsEnable).ToList(); - - addOrUpdateFixedFieldList = systemAnonymizationList.Where(t => t.IsFixed).ToList(); - - ircFieldList = systemAnonymizationList.Where(t => t.IsFixed == false).ToList(); - } - - var subjectAndVisitInfo = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { SubjectCode = t.Subject.Code, t.Trial.TrialCode, t.VisitNum }).FirstOrDefault(); - - var query = from sv in _subjectVisitRepository.Where(t => t.Id == subjectVisitId) - - select new - { - SubjectCode = sv.Subject.Code, - VisitName = sv.VisitName, - StudyList = sv.StudyList.Select(u => new - { - u.PatientIdStr, - u.StudyTime, - u.StudyCode, - - SeriesList = u.SeriesList.Select(z => new - { - z.Modality, - - InstancePathList = z.DicomInstanceList.Select(k => new - { - k.Path - }) - }) - - }) - }; - - var info = query.FirstOrDefault(); - - if (info != null) - { - // 创建一个临时文件夹来存放文件 - string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}"); - Directory.CreateDirectory(tempFolderPath); - - // 遍历查询结果 - foreach (var studyInfo in info.StudyList) - { - // 遍历 Series - foreach (var seriesInfo in studyInfo.SeriesList) - { - 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) - { - // 复制文件到相应的文件夹 - string destinationPath = Path.Combine(studyFolderPath, Path.GetFileName(instanceInfo.Path)); - - //下载到当前目录 - await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath); - - #region 匿名化逻辑 - - - if (isAnonymize) - { - DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default); - - DicomDataset dataset = dicomFile.Dataset; - - foreach (var item in addOrUpdateFixedFieldList) - { - - var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - - dataset.AddOrUpdate(dicomTag, item.ReplaceValue); - } - - foreach (var item in ircFieldList) - { - - var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - - 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 - } - } - } - - var zipPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy.zip"); - - ZipFile.CreateFromDirectory(tempFolderPath, zipPath); - - //上传到Oss - var relativePath = await _oSSService.UploadToOSSAsync(zipPath, $"download_zip/{subjectVisitId}", false); - - - //subjectVisit.PackState = PackState.Packed; - //subjectVisit.VisitImageZipPath = relativePath; - //await _subjectVisitRepository.SaveChangesAsync(); - - var zipSize = File.OpenRead(zipPath).Length; - var fileCount = info.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstancePathList).Count(); - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativePath, VisitImageFileCount = fileCount, VisitImageZipSize = zipSize }); - - - //清理文件夹 - Directory.Delete(tempFolderPath, true); - File.Delete(zipPath); - - } - } - catch (Exception ex) - { - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.WaitPack }); - - } - - - - - - } - - } } diff --git a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs index 05a50ef5d..d35331b07 100644 --- a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs @@ -25,9 +25,6 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code)) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)) - .ForMember(d => d.VisitImageFileCount, u => u.MapFrom(s => s.SubjectVisit.VisitImageFileCount)) - .ForMember(d => d.VisitImageZipPath, u => u.MapFrom(s => s.SubjectVisit.VisitImageZipPath)) - .ForMember(d => d.VisitImageZipSize, u => u.MapFrom(s => s.SubjectVisit.VisitImageZipSize)) .ForMember(d => d.DownloadTime, u => u.MapFrom(s => s.CreateTime)) .ForMember(d => d.DownloadUserName, u => u.MapFrom(s => s.CreateUser.UserName)) .ForMember(d => d.StudyCount, u => u.MapFrom(s => s.SubjectVisit.StudyList.Count())) @@ -173,9 +170,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.SubjectShortName, u => u.MapFrom(s => s.Subject.ShortName)) .ForMember(d => d.TrialReadingCriterionName, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionName)) .ForMember(d => d.CriterionType, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionType)) - .ForMember(d => d.PatientList, u => u.MapFrom(s => s.Subject.SubjectPatientList)) - .ForMember(d => d.VisitImageZipPath, u => u.MapFrom(s => s.SourceSubjectVisit.VisitImageZipPath)) - .ForMember(d => d.PackState, u => u.MapFrom(s => s.SourceSubjectVisit.PackState)); + .ForMember(d => d.PatientList, u => u.MapFrom(s => s.Subject.SubjectPatientList)); CreateMap().ReverseMap(); diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs index ccb6d6aa5..e9d3faf70 100644 --- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs +++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs @@ -184,17 +184,5 @@ public class SubjectVisit : BaseFullDeleteAuditEntity public ReadingStatusEnum ReadingStatus { get; set; } - #region HIR 废弃 - //文件数 - public long VisitImageZipSize { get; set; } - - //文件大小 - public int VisitImageFileCount { get; set; } - - public string VisitImageZipPath { get; set; } = string.Empty; - - //路径 - public PackState PackState { get; set; } - #endregion }