访视查询条件修改提交

Uat_Study
hang 2022-04-21 10:18:26 +08:00
parent bbba502fdd
commit 5a29212580
2 changed files with 98 additions and 17 deletions

View File

@ -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; }
}

View File

@ -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<Func<SubjectVisit, bool>> GetSubjectVisitFilter(string[]? VisitPlanArray)
{
Expression<Func<SubjectVisit, bool>> 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<Func<QCChallenge, bool>> GetQCChallengeFilter(string[]? VisitPlanArray)
{
Expression<Func<QCChallenge, bool>> 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上传、质疑页面
/// <summary>
/// CRC 访视上传列表
@ -27,12 +82,15 @@ namespace IRaCIS.Core.Application.Image.QA
[HttpPost]
public async Task<IResponseOutput<PageOutput<QCCRCVisitViewModel>, TrialSubjectAndSVConfig>> GetCRCVisitList(CRCVisitSearchDTO visitSearchDTO)
{
var svExpression= GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray);
var query = _repository.Where<SubjectVisit>(x => x.TrialId == visitSearchDTO.TrialId)
var query = _repository.Where<SubjectVisit>(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<QCChallenge>(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<QCCRCChallengeViewModel>(_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<Trial>(t => t.Id == challengeQuery.TrialId).ProjectTo<TrialSubjectAndSVConfig>(_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<QCChallenge>(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<QCCRCChallengeViewModel>(_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<QCCheckViewModel>(_mapper.ConfigurationProvider);
@ -464,7 +531,7 @@ namespace IRaCIS.Core.Application.Image.QA
var config = await _repository.Where<Trial>(t => t.Id == checkQuery.TrialId).ProjectTo<TrialSubjectAndSVConfig>(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException();
return ResponseOutput.Ok(pageList, config);
}
/// <summary>
/// 一致性核查 聊天记录列表
/// </summary>
@ -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<ForWardViewModel>(_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<DicomSeries>(t => studyIds.Contains(t.StudyId)).IgnoreQueryFilters().ProjectTo<QASeriesInfoDto>(_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 };