From 46b728e9a8706f1215ec76d2935964d5b7b49123 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 12 May 2022 16:47:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A3=80=E6=9F=A5=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=8A=E4=BC=A0=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImageAndDoc/DTO/UnionStudyViewDodel.cs | 3 +- .../Service/ImageAndDoc/StudyListService.cs | 119 ++++++++++++++++-- .../Service/QC/QCOperationService.cs | 6 + .../Repository/IRepository.cs | 2 +- 4 files changed, 118 insertions(+), 12 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index d36cbd9a7..504026bed 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -139,7 +139,8 @@ namespace IRaCIS.Core.Application.Contracts public string SubjectInfo { get; set; } = String.Empty; - public string VisitPlanInfo { get; set; } = String.Empty; + + public string[]? VisitPlanArray { get; set; } } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyListService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyListService.cs index e65aa000f..a7f8ed840 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyListService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyListService.cs @@ -5,6 +5,7 @@ using IRaCIS.Core.Application.Dicom; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Services; using EasyCaching.Core; +using System.Linq.Expressions; namespace IRaCIS.Core.Application.Service.ImageAndDoc { @@ -22,13 +23,109 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } + private Expression> GetDicomStudySubjectVisitFilter(string[]? VisitPlanArray) + { + Expression> svExpression = x => true; + + bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; + + if (isNeedVisitSearch) + { + var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); + var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); + + + if (inPlanArray.Length > 0) + { + svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); + } + + + if (isSelectOutPlan) + { + svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); + + } + + + } + + return svExpression; + } + + + private Expression> GetNoneDicomStudySubjectVisitFilter(string[]? VisitPlanArray) + { + Expression> svExpression = x => true; + + bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; + + if (isNeedVisitSearch) + { + var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); + var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); + + + if (inPlanArray.Length > 0) + { + svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); + } + + + if (isSelectOutPlan) + { + svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); + + } + + + } + + return svExpression; + } + + private Expression> GetStudyMonitorSubjectVisitFilter(string[]? VisitPlanArray) + { + Expression> svExpression = x => true; + + bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; + + if (isNeedVisitSearch) + { + var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); + var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); + + + if (inPlanArray.Length > 0) + { + svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); + } + + + if (isSelectOutPlan) + { + svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); + + } + + + } + + return svExpression; + } + + + [HttpPost] public async Task> GetDicomAndNoneDicomStudyList(StudyQuery studyQuery) { + var svExpression = GetDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray); + var dicomStudyQuery = _repository.Where(t => t.TrialId == studyQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) - .WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) + //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) + .WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, t=>t.SubjectVisit.) .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) .Select(t => new UnionStudyViewModel() { @@ -62,7 +159,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc TrialSiteCode = t.TrialSite.TrialSiteCode, - Uploader = t.Uploader.FullName, + Uploader = t.Uploader.UserName, UploadTime = t.CreateTime @@ -70,13 +167,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //.ProjectTo(_mapper.ConfigurationProvider); - - + var svExpression2 = GetNoneDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray); + var nodeDicomStudyQuery = _repository.Where(t => t.TrialId == studyQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) - .WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) - .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) + //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) + .WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression2) + .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) .Select(t => new UnionStudyViewModel() { @@ -110,7 +208,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc TrialSiteCode = t.TrialSite.TrialSiteCode, - Uploader = t.CreateUser.FullName, + Uploader = t.CreateUser.UserName, UploadTime = t.CreateTime @@ -131,10 +229,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc [HttpPost] public async Task> GetDicomAndNoneDicomStudyMonitorList(StudyQuery studyQuery) { - + var svExpression = GetStudyMonitorSubjectVisitFilter(studyQuery.VisitPlanArray); var StudyMonitorQuery = _repository.Where(t => t.TrialId == studyQuery.TrialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) - .WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) + //.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo)) + .WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression) .WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo)) .WhereIf(studyQuery.SubjectId != null, t => t.SubjectId == studyQuery.SubjectId) .WhereIf(studyQuery.SubjectVisitId != null, t => t.SubjectId == studyQuery.SubjectVisitId) @@ -157,7 +256,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc TrialSiteCode = t.TrialSite.TrialSiteCode, - Uploader = t.Uploader.FullName, + Uploader = t.Uploader.UserName, UploadTime = t.CreateTime, diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 6e9c7ba48..cfd6148f4 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -406,6 +406,7 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] + [UnitOfWork] public async Task CheckBack(Guid subjectVisitId) { if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ProjectManager) @@ -459,6 +460,9 @@ namespace IRaCIS.Core.Application.Image.QA await _repository.BatchDeleteAsync(t => t.SubjectVisitId == subjectVisitId); + await _repository.BatchDeleteAsync(t => t.DicomSerie.IsDeleted); + await _repository.BatchDeleteAsync(t => t.IsDeleted); + var success = await _subjectVisitRepository.SaveChangesAsync(); @@ -1616,6 +1620,8 @@ namespace IRaCIS.Core.Application.Image.QA await _repository.BatchUpdateAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new QCChallenge() { CurrentQCEnum = CurrentQC.First }); await _repository.BatchUpdateAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId && t.CurrentQCEnum == CurrentQC.Second, k => new TrialQCQuestionAnswer() { CurrentQCEnum = CurrentQC.First }); + + } diff --git a/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs b/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs index 4d1e81cc6..e89fe7329 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/IRepository.cs @@ -467,7 +467,7 @@ namespace IRaCIS.Core.Infra.EFCore { if (deleteFilter == null) throw new ArgumentNullException(nameof(deleteFilter)); - return await _dbContext.Set().AsNoTracking().Where(deleteFilter).BatchDeleteAsync().ConfigureAwait(false) > 0; + return await _dbContext.Set().AsNoTracking().IgnoreQueryFilters().Where(deleteFilter).BatchDeleteAsync().ConfigureAwait(false) > 0; } public async Task BatchUpdateAsync(Expression> whereFilter, Expression> updateFactory) where T : Entity