From ef451d82ec3f966f98a5fbdac82db88ee1114d3f Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 15 Jul 2024 15:46:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ivus=E5=BD=B1=E5=83=8F?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Properties/launchSettings.json | 4 +- .../ImageAndDoc/DownloadAndUploadService.cs | 216 +++++++++++------- .../DTO/TrialSiteSurveyViewModel.cs | 2 +- .../SiteSurvey/TrialSiteSurveyService.cs | 4 +- .../TrialSiteUser/TrialConfigService.cs | 12 +- .../Trial/TrialExpedited.cs | 21 +- IRaCIS.Core.Domain/Trial/Trial.cs | 3 +- IRaCIS.Core.Domain/Visit/SubjectVisit.cs | 4 + 8 files changed, 176 insertions(+), 90 deletions(-) diff --git a/IRaCIS.Core.API/Properties/launchSettings.json b/IRaCIS.Core.API/Properties/launchSettings.json index 2456ff45f..dbe673470 100644 --- a/IRaCIS.Core.API/Properties/launchSettings.json +++ b/IRaCIS.Core.API/Properties/launchSettings.json @@ -54,11 +54,11 @@ }, "applicationUrl": "http://localhost:6100" }, - "IRaCIS.US_IRC": { + "IRaCIS.US_Uat_IRC": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "US_IRC" + "ASPNETCORE_ENVIRONMENT": "US_Uat_IRC" }, "applicationUrl": "http://localhost:6100" } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index b733298cb..23eb7c264 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { public interface IDownloadAndUploadService { - Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true); + Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true); } [ApiExplorerSettings(GroupName = "Trial")] public class DownloadAndUploadService : BaseService, IDownloadAndUploadService @@ -107,8 +107,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { await SubejctRandomReadingTaskNameDeal(subjectId, trialReadingCriterionId); - var query = _repository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null - && t.DoctorUserId == _userInfo.Id && t.TaskState==TaskState.Effect) + var query = _repository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null + && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect) .Select(u => new SubjectImageUploadDTO() { VisitTaskId = u.Id, @@ -129,7 +129,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc PackState = u.SourceSubjectVisit.PackState, OrginalStudyList = u.SourceSubjectVisit.StudyList - .Where(t => u.TrialReadingCriterion.IsImageFilter ?("|"+u.TrialReadingCriterion.CriterionModalitys+"|").Contains("|"+t.ModalityForEdit+"|" ) : true) + .Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true) .Select(t => new StudyBasicInfo() { Id = t.Id, @@ -484,24 +484,38 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// /// /// + /// /// /// - public async Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true) + public async Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true) { var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); - if (subjectVisit.PackState == PackState.WaitPack) - { - HangfireJobHelper.NotImmediatelyOnceOnlyJob(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, isAnonymize), TimeSpan.FromSeconds(1)); + var packState = isDicom ? subjectVisit.PackState : subjectVisit.NoDicomPackState; + + if (packState == PackState.WaitPack) + { + + if (isDicom) + { + subjectVisit.PackState = PackState.Packing; + HangfireJobHelper.NotImmediatelyOnceOnlyJob(t => t.PackageAndAnonymizImage(trialId, subjectVisitId,true, isAnonymize), TimeSpan.FromSeconds(1)); + + } + else + { + subjectVisit.NoDicomPackState = PackState.Packing; + + HangfireJobHelper.NotImmediatelyOnceOnlyJob(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, false, isAnonymize), TimeSpan.FromSeconds(1)); + } - subjectVisit.PackState = PackState.Packing; await _subjectVisitRepository.SaveChangesAsync(); } - return ResponseOutput.Ok(subjectVisit.VisitImageZipPath); + return ResponseOutput.Ok(isDicom ? subjectVisit.VisitImageZipPath : subjectVisit.VisitNoDicomImageZipPath); } @@ -511,9 +525,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// /// /// + /// /// /// - public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true) + public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true) { var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); @@ -557,6 +572,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }) }) + }), + + NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new + { + nd.Modality, + nd.StudyCode, + nd.ImageDate, + + FileList = nd.NoneDicomFileList.Select(file => new + { + file.FileName, + file.Path, + file.FileType + }) }) }; @@ -568,107 +597,138 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}"); Directory.CreateDirectory(tempFolderPath); - // 遍历查询结果 - foreach (var studyInfo in info.StudyList) + //dicom 处理 + + if (isDicom) { - // 遍历 Series - foreach (var seriesInfo in studyInfo.SeriesList) + // 遍历查询结果 + foreach (var studyInfo in info.StudyList) { - 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) + // 遍历 Series + foreach (var seriesInfo in studyInfo.SeriesList) { - // 复制文件到相应的文件夹 - string destinationPath = Path.Combine(studyFolderPath, Path.GetFileName(instanceInfo.Path)); + string studyDicomFolderPath = Path.Combine(tempFolderPath, "Dicom", $"{info.SubjectCode}_{info.VisitName}", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}"); - //下载到当前目录 - await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath); + // 创建 影像 文件夹 + Directory.CreateDirectory(studyDicomFolderPath); - #region 匿名化逻辑 - - - if (isAnonymize) + // 遍历 InstancePathList + foreach (var instanceInfo in seriesInfo.InstancePathList) { - //受试者随机阅片,需要匿名化检查时间 - DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default); - DicomDataset dataset = dicomFile.Dataset; - dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty); - dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty); + // 复制文件到相应的文件夹 + string destinationPath = Path.Combine(studyDicomFolderPath, Path.GetFileName(instanceInfo.Path)); - #region 前端已经匿名化,不需要做相关tag匿名化 - //DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default); + //下载到当前目录 + await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath); - //DicomDataset dataset = dicomFile.Dataset; + #region 匿名化逻辑 - //foreach (var item in addOrUpdateFixedFieldList) - //{ - // var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); + if (isAnonymize) + { + //受试者随机阅片,需要匿名化检查时间 + DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default); + DicomDataset dataset = dicomFile.Dataset; + dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty); + dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty); - // dataset.AddOrUpdate(dicomTag, item.ReplaceValue); - //} + #region 前端已经匿名化,不需要做相关tag匿名化 + //DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default); - //foreach (var item in ircFieldList) - //{ + //DicomDataset dataset = dicomFile.Dataset; - // var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); + //foreach (var item in addOrUpdateFixedFieldList) + //{ - // if (dicomTag == DicomTag.ClinicalTrialProtocolID) - // { - // dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode); + // var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - // } - // if (dicomTag == DicomTag.ClinicalTrialSiteID) - // { - // //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode); + // dataset.AddOrUpdate(dicomTag, item.ReplaceValue); + //} - // } - // if (dicomTag == DicomTag.ClinicalTrialSubjectID) - // { - // dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode); + //foreach (var item in ircFieldList) + //{ - // } - // if (dicomTag == DicomTag.ClinicalTrialTimePointID) - // { - // dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString()); + // var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16)); - // } - // if (dicomTag == DicomTag.PatientID) - // { - // dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode); + // 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 + + } #endregion - } - #endregion } } + + + var zipDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_Dicom.zip"); + ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "Dicom"), zipDicomPath); + //上传到Oss + var relativeDicomPath = await _oSSService.UploadToOSSAsync(zipDicomPath, $"download_zip", false); + + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativeDicomPath }); + + + File.Delete(zipDicomPath); } + else + { + //非dicom 处理 - var zipPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy.zip"); + foreach (var noneDicomStudy in info.NoneDicomStudyList) + { + string studyNoneDicomFolderPath = Path.Combine(tempFolderPath, "NoneDicom", $"{info.SubjectCode}_{info.VisitName}", $"{noneDicomStudy.StudyCode}_{noneDicomStudy.ImageDate.ToString("yyyy-MM-dd")}_{noneDicomStudy.Modality}"); - ZipFile.CreateFromDirectory(tempFolderPath, zipPath); + Directory.CreateDirectory(studyNoneDicomFolderPath); - //上传到Oss - var relativePath = await _oSSService.UploadToOSSAsync(zipPath, $"download_zip", false); + foreach (var file in noneDicomStudy.FileList) + { + string destinationPath = Path.Combine(studyNoneDicomFolderPath, Path.GetFileName(file.FileName)); + + //下载到当前目录 + await _oSSService.DownLoadFromOSSAsync(file.Path, destinationPath); + } + } - //subjectVisit.PackState = PackState.Packed; - //subjectVisit.VisitImageZipPath = relativePath; - //await _subjectVisitRepository.SaveChangesAsync(); - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativePath }); + var zipNoneDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_NoneDicom.zip"); + ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "NoneDicom"), zipNoneDicomPath); + var relativeNoneDicomPath = await _oSSService.UploadToOSSAsync(zipNoneDicomPath, $"download_zip", false); + File.Delete(zipNoneDicomPath); + + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitNoDicomImageZipPath = relativeNoneDicomPath }); + + + } //清理文件夹 Directory.Delete(tempFolderPath, true); - File.Delete(zipPath); } } diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs b/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs index e74d6726c..6dd3f284d 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs @@ -72,7 +72,7 @@ namespace IRaCIS.Core.Application.Contracts public List TrialSiteUserSurveyList { get; set; } = new List(); - public SiteSurveyFiledConfig SiteSurveyFiledConfig { get; set; } + public TrialExtraConfig SiteSurveyFiledConfig { get; set; } } public class TrialSiteUserSurveyAllDTO : TrialSiteUserSurveyView diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 27779454a..957bdba54 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -391,9 +391,9 @@ namespace IRaCIS.Core.Application.Contracts var result = await _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId && t.TrialId == trialId).IgnoreQueryFilters() .ProjectTo(_mapper.ConfigurationProvider, new { isEn_Us = _userInfo.IsEn_Us }).FirstOrDefaultAsync().IfNullThrowException(); - var siteSurveryConfig = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).Select(t => t.Trial.SiteSurveyConfigJsonStr).FirstOrDefault()??string.Empty; + var siteSurveryConfig = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).Select(t => t.Trial.TrialExtraConfigJsonStr).FirstOrDefault()??string.Empty; - result.SiteSurveyFiledConfig = JsonConvert.DeserializeObject(siteSurveryConfig) ?? new SiteSurveyFiledConfig(); + result.SiteSurveyFiledConfig = JsonConvert.DeserializeObject(siteSurveryConfig) ?? new TrialExtraConfig(); return result; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index ef9c33a6d..72a592ca9 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -21,6 +21,7 @@ using DocumentFormat.OpenXml.Office.CustomUI; using IRaCIS.Core.Domain.Models; using IRaCIS.Application.Contracts; using SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors; +using Newtonsoft.Json; namespace IRaCIS.Core.Application { @@ -604,7 +605,7 @@ namespace IRaCIS.Core.Application await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { - IsImageFilter=inDto.IsImageFilter, + IsImageFilter = inDto.IsImageFilter, ImageDownloadEnum = inDto.ImageDownloadEnum, ImageUploadEnum = inDto.ImageUploadEnum, CriterionModalitys = inDto.CriterionModalitys, @@ -954,7 +955,7 @@ namespace IRaCIS.Core.Application trialInfo.UpdateTime = DateTime.Now; - //await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys }); + //await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys }); return ResponseOutput.Ok(await _repository.SaveChangesAsync()); } @@ -1354,5 +1355,12 @@ namespace IRaCIS.Core.Application return ResponseOutput.Ok(cro.Id.ToString(), ApiResponseCodeEnum.NeedTips); } + + public async Task GetTrialExtralConfig(Guid trialId) + { + var extralConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialExtraConfigJsonStr).FirstOrDefault() ?? string.Empty; + + return JsonConvert.DeserializeObject(extralConfig) ?? new TrialExtraConfig(); + } } } diff --git a/IRaCIS.Core.Domain.Share/Trial/TrialExpedited.cs b/IRaCIS.Core.Domain.Share/Trial/TrialExpedited.cs index 04d5da70a..506830ba6 100644 --- a/IRaCIS.Core.Domain.Share/Trial/TrialExpedited.cs +++ b/IRaCIS.Core.Domain.Share/Trial/TrialExpedited.cs @@ -41,11 +41,26 @@ namespace IRaCIS.Core.Domain.Share } - public class SiteSurveyFiledConfig + public class TrialExtraConfig { - public List NotShowFieldList { get; set; }=new List(); + #region MyRegion + + //QC质控 + public bool IsSupportQCDownloadImage { get; set; } = false; + + #endregion + + + + #region 中心调研 + + public List NotShowFieldList { get; set; } = new List(); + + public List ModifyFiledList { get; set; } = new List(); + + #endregion + - public List ModifyFiledList { get; set; }=new List(); } diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index e63ca4315..ba3279e52 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -182,9 +182,8 @@ namespace IRaCIS.Core.Domain.Models - //public List - public string SiteSurveyConfigJsonStr { get; set; } = string.Empty; + public string TrialExtraConfigJsonStr { get; set; } = string.Empty; public bool VisitPlanConfirmed { get; set; } diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs index e847167a0..0d7364316 100644 --- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs +++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs @@ -248,6 +248,10 @@ namespace IRaCIS.Core.Domain.Models public string VisitImageZipPath { get; set; } = string.Empty; public PackState PackState { get; set; } + + public PackState NoDicomPackState { get; set; } + + public string VisitNoDicomImageZipPath { get; set;} = string.Empty; } /// /// 影像下载打包状态