diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 757274298..2102a3739 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -19,7 +19,9 @@ namespace IRaCIS.Core.Application.Contracts public bool? IsUrgent { get; set; } public string SubjectInfo { get; set; } = string.Empty; - public string VisitPlanInfo { get; set; } = string.Empty; + //public string VisitPlanInfo { get; set; } = string.Empty; + + public string[] VisitPlanArray { get; set; } } @@ -36,7 +38,9 @@ namespace IRaCIS.Core.Application.Contracts public Guid? SubjectId { get; set; } public string SubjectInfo { get; set; } = String.Empty; - public string VisitPlanInfo { get; set; } = String.Empty; + + public string[] VisitPlanArray { get; set; } + //public string VisitPlanInfo { get; set; } = String.Empty; public Guid? HandleUserId { get; set; } } @@ -147,7 +151,9 @@ namespace IRaCIS.Core.Application.Contracts [NotDefault] public Guid TrialId { get; set; } - public string VisitPlanInfo { get; set; } = String.Empty; + public string[] VisitPlanArray { get; set; } + + //public string VisitPlanInfo { get; set; } = String.Empty; public string SubjectCode { get; set; } = String.Empty; public QCChanllengeReuploadEnum? ReuploadEnum { get; set; } public bool? IsUrgent { get; set; } @@ -244,7 +250,9 @@ namespace IRaCIS.Core.Application.Contracts public class CheckQuery : PageInput { public string SubjectInfo { get; set; } = String.Empty; - public string VisitPlanInfo { get; set; } = String.Empty; + + //public string VisitPlanInfo { get; set; } = String.Empty; + public string[] VisitPlanArray { get; set; } //核查状态 public CheckStateEnum? CheckState { get; set; } @@ -263,7 +271,10 @@ namespace IRaCIS.Core.Application.Contracts public Guid? SiteId { get; set; } public string SubjectInfo { get; set; } = String.Empty; - public string VisitPlanInfo { get; set; } = String.Empty; + + public string[] VisitPlanArray { get; set; } + + //public string VisitPlanInfo { get; set; } = String.Empty; public ForwardStateEnum? ForwardState { get; set; } } diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 1debe0690..178173a75 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -4,6 +4,7 @@ using IRaCIS.Core.Infrastructure.ExpressionExtend; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Infra.EFCore; +using System.Linq.Expressions; namespace IRaCIS.Core.Application.Image.QA { @@ -18,6 +19,60 @@ namespace IRaCIS.Core.Application.Image.QA _subjectVisitRepository = subjectVisitRepository; } + + private Expression> GetSubjectVisitFilter(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 (isSelectOutPlan) + { + svExpression = svExpression.And(t => t.InPlan == false); + + } + + if (inPlanArray.Length > 0) + { + svExpression.Or(t => inPlanArray.Contains(t.VisitNum)); + } + } + + return svExpression; + } + + + private Expression> GetQCChallengeFilter(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 (isSelectOutPlan) + { + svExpression = svExpression.And(t => t.SubjectVisit.InPlan == false); + + } + + if (inPlanArray.Length > 0) + { + svExpression.Or(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); + } + } + + return svExpression; + } + #region CRC上传、质疑页面 /// /// CRC 访视上传列表 @@ -27,12 +82,15 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost] public async Task, TrialSubjectAndSVConfig>> GetCRCVisitList(CRCVisitSearchDTO visitSearchDTO) { + var svExpression= GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) + var query = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.SubjectInfo), t => t.Subject.Code.Contains(visitSearchDTO.SubjectInfo)) - .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) + + .WhereIf(visitSearchDTO.VisitPlanArray != null && visitSearchDTO.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) .WhereIf(visitSearchDTO.SubmitState != null, t => t.SubmitState == visitSearchDTO.SubmitState) .WhereIf(visitSearchDTO.ChallengeState != null, t => t.ChallengeState == visitSearchDTO.ChallengeState) @@ -94,6 +152,7 @@ namespace IRaCIS.Core.Application.Image.QA // }; #endregion + var svExpression = GetQCChallengeFilter(challengeQuery.VisitPlanArray); var query2 = _repository.Where(x => x.TrialId == challengeQuery.TrialId) .WhereIf(challengeQuery.ReuploadEnum != null, t => t.ReuploadEnum == challengeQuery.ReuploadEnum) @@ -102,13 +161,14 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(challengeQuery.SubjectId != null, t => t.SubjectVisit.SubjectId == challengeQuery.SubjectId) .WhereIf(challengeQuery.CreateUserId != null, t => t.CreateUserId == challengeQuery.CreateUserId) .WhereIf(challengeQuery.SubjectCode != null, t => t.SubjectVisit.Subject.Code.Contains(challengeQuery.SubjectCode!)) - .WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo)) + .WhereIf(challengeQuery.VisitPlanArray != null && challengeQuery.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo)) .WhereIf(challengeQuery.IsOverTime != null, t => DateTime.Now > t.DeadlineTime) .WhereIf(challengeQuery.IsUrgent != null, t => t.SubjectVisit.IsUrgent == challengeQuery.IsUrgent) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.SubjectVisit.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .ProjectTo(_mapper.ConfigurationProvider); - var pageList = await query2.ToPagedListAsync(challengeQuery.PageIndex, challengeQuery.PageSize, challengeQuery.SortField, challengeQuery.Asc,string.IsNullOrWhiteSpace(challengeQuery.SortField), new string[] { "IsUrgent desc", "IsClosed asc" }); + var pageList = await query2.ToPagedListAsync(challengeQuery.PageIndex, challengeQuery.PageSize, challengeQuery.SortField, challengeQuery.Asc, string.IsNullOrWhiteSpace(challengeQuery.SortField), new string[] { "IsUrgent desc", "IsClosed asc" }); var config = await _repository.Where(t => t.Id == challengeQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return ResponseOutput.Ok(pageList, config); @@ -181,6 +241,8 @@ namespace IRaCIS.Core.Application.Image.QA // }; #endregion + var svExpression = GetQCChallengeFilter(challengeQuery.VisitPlanArray); + var query = _repository.Where(x => x.TrialId == challengeQuery.TrialId) .WhereIf(challengeQuery.ReuploadEnum != null, t => t.ReuploadEnum == challengeQuery.ReuploadEnum) .WhereIf(challengeQuery.IsClosed != null, t => t.IsClosed == challengeQuery.IsClosed) @@ -188,7 +250,8 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(challengeQuery.SubjectId != null, t => t.SubjectVisit.SubjectId == challengeQuery.SubjectId) .WhereIf(challengeQuery.CreateUserId != null, t => t.CreateUserId == challengeQuery.CreateUserId) .WhereIf(!string.IsNullOrEmpty(challengeQuery.SubjectCode), t => t.SubjectVisit.Subject.Code.Contains(challengeQuery.SubjectCode)) - .WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.InPlan == false : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo)) + .WhereIf(challengeQuery.VisitPlanArray != null && challengeQuery.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.InPlan == false : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo)) .WhereIf(challengeQuery.IsUrgent != null, t => t.SubjectVisit.IsUrgent == challengeQuery.IsUrgent) .WhereIf(challengeQuery.IsOverTime != null, t => DateTime.Now > t.DeadlineTime) .ProjectTo(_mapper.ConfigurationProvider); @@ -366,14 +429,16 @@ namespace IRaCIS.Core.Application.Image.QA #endregion + var svExpression = GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); var query = _subjectVisitRepository.Where(x => x.TrialId == visitSearchDTO.TrialId) .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.SubjectInfo), t => /*t.Subject.FirstName.Contains(subjectInfo) || t.Subject.LastName.Contains(subjectInfo) ||*/ t.Subject.Code.Contains(visitSearchDTO.SubjectInfo)) - .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.VisitNum.ToString().Contains(".") : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) + .WhereIf(visitSearchDTO.VisitPlanArray != null && visitSearchDTO.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.VisitNum.ToString().Contains(".") : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) //.WhereIf(visitSearchDTO.AuditState != null, t => t.AuditState == visitSearchDTO.AuditState) - .WhereIf(visitSearchDTO.AuditStateArray != null&& visitSearchDTO.AuditStateArray?.Length>0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) - + .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) + .WhereIf(visitSearchDTO.HandleUserId != null, t => t.PreliminaryAuditUserId == visitSearchDTO.HandleUserId || t.ReviewAuditUserId == visitSearchDTO.HandleUserId || t.QCChallengeList.Any(t => t.CreateUserId == visitSearchDTO.HandleUserId) @@ -450,13 +515,15 @@ namespace IRaCIS.Core.Application.Image.QA // }; #endregion + var svExpression = GetSubjectVisitFilter(checkQuery.VisitPlanArray); var query = _subjectVisitRepository.Where(x => x.TrialId == checkQuery.TrialId) .Where(x => x.AuditState == AuditStateEnum.QCPassed) //一致性核查中的,或者还没一致性核查的 .WhereIf(checkQuery.CheckState != null, t => t.CheckState == checkQuery.CheckState) .WhereIf(checkQuery.SiteId != null, t => t.SiteId == checkQuery.SiteId) .WhereIf(!string.IsNullOrEmpty(checkQuery.SubjectInfo), t => t.Subject.Code.Contains(checkQuery.SubjectInfo)) - .WhereIf(!string.IsNullOrEmpty(checkQuery.VisitPlanInfo), checkQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(checkQuery.VisitPlanInfo)) + .WhereIf(checkQuery.VisitPlanArray != null && checkQuery.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(checkQuery.VisitPlanInfo), checkQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(checkQuery.VisitPlanInfo)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//CRC 过滤负责的site .ProjectTo(_mapper.ConfigurationProvider); @@ -464,7 +531,7 @@ namespace IRaCIS.Core.Application.Image.QA var config = await _repository.Where(t => t.Id == checkQuery.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); return ResponseOutput.Ok(pageList, config); } - + /// /// 一致性核查 聊天记录列表 /// @@ -494,12 +561,15 @@ namespace IRaCIS.Core.Application.Image.QA { //var trialConfig = _trialReposioty.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefault(t => t.TrialId == forwardQuery.TrialId); + var svExpression = GetSubjectVisitFilter(forwardQuery.VisitPlanArray); + var query = _subjectVisitRepository.Where(x => x.TrialId == forwardQuery.TrialId) .Where(t => t.CheckState == CheckStateEnum.CVPassed) .WhereIf(forwardQuery.ForwardState != null, t => t.ForwardState == forwardQuery.ForwardState) .WhereIf(forwardQuery.SiteId != null, t => t.SiteId == forwardQuery.SiteId) .WhereIf(!string.IsNullOrEmpty(forwardQuery.SubjectInfo), t => t.Subject.Code.Contains(forwardQuery.SubjectInfo)) - .WhereIf(!string.IsNullOrEmpty(forwardQuery.VisitPlanInfo), forwardQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(forwardQuery.VisitPlanInfo)) + .WhereIf(forwardQuery.VisitPlanArray != null && forwardQuery.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(forwardQuery.VisitPlanInfo), forwardQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(forwardQuery.VisitPlanInfo)) //.WhereIf(_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//CRC 过滤负责的site .ProjectTo(_mapper.ConfigurationProvider); @@ -632,7 +702,7 @@ namespace IRaCIS.Core.Application.Image.QA var studyIds = studyList.Select(t => t.StudyId).ToList(); var seriesList = await _repository.Where(t => studyIds.Contains(t.StudyId)).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider) - .OrderBy(t=>t.StudyCode).ThenBy(t=>t.SeriesNumber).ToListAsync(); + .OrderBy(t => t.StudyCode).ThenBy(t => t.SeriesNumber).ToListAsync(); return new QAStudySeriesInfo { StudyList = studyList, SeriesList = seriesList };