From a6ccd959fc9e58ea7840ff87236a7ed5d7c71383 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Wed, 28 Aug 2024 14:40:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0oss=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Helper/OSSService.cs | 96 +++++++++- .../TrialSiteUser/Interface/ITrialService.cs | 1 - .../Service/TrialSiteUser/TrialService.cs | 173 +++++++++--------- IRaCIS.Core.Application/TestService.cs | 21 ++- 4 files changed, 200 insertions(+), 91 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/OSSService.cs b/IRaCIS.Core.Application/Helper/OSSService.cs index a9c96d1f3..5ed2eb864 100644 --- a/IRaCIS.Core.Application/Helper/OSSService.cs +++ b/IRaCIS.Core.Application/Helper/OSSService.cs @@ -15,6 +15,10 @@ using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Text.Json.Serialization; +using Minio.ApiEndpoints; +using System.Reactive.Linq; +using IRaCIS.Core.Domain.Share; +using static MassTransit.ValidationResultExtensions; namespace IRaCIS.Core.Application.Helper { @@ -113,6 +117,7 @@ namespace IRaCIS.Core.Application.Helper public Task GetSignedUrl(string ossRelativePath); + public Task DeleteFromPrefix(string prefix); } @@ -239,7 +244,7 @@ namespace IRaCIS.Core.Application.Helper { var aliConfig = ObjectStoreServiceOptions.AliyunOSS; - var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)? aliConfig.endPoint: aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret); + var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.endPoint : aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret); // 上传文件 var result = _ossClient.PutObject(aliConfig.bucketName, ossRelativePath, localFilePath); @@ -359,7 +364,7 @@ namespace IRaCIS.Core.Application.Helper } - public async Task GetSignedUrl(string ossRelativePath) + public async Task GetSignedUrl(string ossRelativePath) { ossRelativePath = ossRelativePath.TrimStart('/'); try @@ -442,6 +447,93 @@ namespace IRaCIS.Core.Application.Helper } } + + /// + /// 删除某个目录的文件 + /// + /// + /// + public async Task DeleteFromPrefix(string prefix) + { + if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS") + { + var aliConfig = ObjectStoreServiceOptions.AliyunOSS; + + var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.endPoint : aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret); + + + try + { + ObjectListing objectListing = null; + string nextMarker = null; + do + { + // 使用 prefix 模拟目录结构,设置 MaxKeys 和 NextMarker + objectListing = _ossClient.ListObjects(new ListObjectsRequest(aliConfig.bucketName) + { + Prefix = prefix, + MaxKeys = 1000, + Marker = nextMarker + }); + + List keys = objectListing.ObjectSummaries.Select(t => t.Key).ToList(); + + // 删除获取到的文件 + if (keys.Count > 0) + { + _ossClient.DeleteObjects(new DeleteObjectsRequest(aliConfig.bucketName, keys, false)); + } + + // 设置 NextMarker 以获取下一页的数据 + nextMarker = objectListing.NextMarker; + + } while (objectListing.IsTruncated); + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + } + + + } + else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO") + { + var minIOConfig = ObjectStoreServiceOptions.MinIO; + + + var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.endPoint}:{minIOConfig.port}") + .WithCredentials(minIOConfig.accessKey, minIOConfig.secretKey).WithSSL(minIOConfig.useSSL) + .Build(); + + + var listArgs = new ListObjectsArgs().WithBucket(minIOConfig.bucketName).WithPrefix(prefix).WithRecursive(true); + + + + var objects = minioClient.ListObjectsAsync(listArgs).ToListObservable().Select(t => t.Key).ToList(); + + if (objects.Count > 0) + { + var objArgs = new RemoveObjectsArgs() + .WithBucket(minIOConfig.bucketName) + .WithObjects(objects); + + // 删除对象 + await minioClient.RemoveObjectsAsync(objArgs); + } + + + + } + else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS") + { + throw new BusinessValidationFailedException("未定义的存储介质类型"); + } + else + { + throw new BusinessValidationFailedException("未定义的存储介质类型"); + } + } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs index ff2193eb0..e572c9eae 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs @@ -9,7 +9,6 @@ namespace IRaCIS.Application.Interfaces bool TrialExpeditedChange { get; set; } Task> AddOrUpdateTrial(TrialCommand trialAddModel); - Task DeleteTrial(Guid trialId); Task> GetReviewerTrialListByEnrollmentStatus(TrialByStatusQueryDTO param); Task> GetTrialEnrollmentReviewerIds(Guid trialId); Task GetTrialExpeditedState(Guid trialId); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs index 761cb5462..e5aa5e4b6 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs @@ -422,7 +422,7 @@ namespace IRaCIS.Application.Services /// 临床试验项目Id [AllowAnonymous] [HttpDelete, Route("{trialId:guid}")] - public async Task DeleteTrial(Guid trialId) + public async Task DeleteTrial(Guid trialId, [FromServices]IRepository _repository) { @@ -434,126 +434,125 @@ namespace IRaCIS.Application.Services #region 真项目删除 - //await _repository.BatchDeleteNoTrackingAsync(o => o.SubjectVisit.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialReadingCriterion.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.Enroll.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.NoneDicomStudy.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.Enroll.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.NoneDicomStudy.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectVisit.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.QCChallenge.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.QCChallenge.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingClinicalData.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingClinicalData.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TaskMedicalReview.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingPeriodSet.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.ReadingPeriodSet.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.Subject.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.Subject.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _subjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _taskConsistentRuleRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.InfluenceTask.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.InfluenceTask.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(o => o.Id == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _trialDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(o => o.Id == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _trialDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialDocument.TrialId == trialId); - //await _trialEmailNoticeUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - - ////await _repository.BatchDeleteAsync(t => t.TrialId == trialId) ; - //await _trialEmailNoticeUserRepository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialSiteSurvey.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.OriginalReReadingTask.TrialId == trialId); - //await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); - //await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.OriginalReReadingTask.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId); #endregion diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 56983e702..c5704afdc 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -1,4 +1,5 @@ using Aliyun.OSS; +using DocumentFormat.OpenXml.Drawing.Charts; using DocumentFormat.OpenXml.Wordprocessing; using IP2Region.Net.XDB; using IRaCIS.Application.Contracts; @@ -85,6 +86,24 @@ namespace IRaCIS.Application.Services await _readingConsistentClinicalDataRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } + public async Task DeleteOSSDate([FromServices] IOSSService _oSSService, [FromServices] IWebHostEnvironment _hostEnvironment) + { + + var deleteIdList = _trialRepository.Where(t => t.IsDeleted == true, false, true).Select(t => t.Id).ToList(); + + //foreach (var deleteId in deleteIdList) + //{ + // await _oSSService.DeleteFromPrefix($"{deleteId}"); + + //} + + await _oSSService.DeleteFromPrefix($"01000000-0a00-0242-0d73-08dcac46a4bf"); + + + + return ResponseOutput.Ok(); + } + public async Task TestEFcore8() @@ -491,7 +510,7 @@ namespace IRaCIS.Application.Services /// [AllowAnonymous] [UnitOfWork] - public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IWebHostEnvironment _hostEnvironment) + public async Task OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IWebHostEnvironment _hostEnvironment) { var aliConfig = oSSService.ObjectStoreServiceOptions.AliyunOSS;