diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index df456f18e..9f218078f 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1241,19 +1241,60 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost] public async Task CollectNextIQCQuality(GetNextIQCQualityInDto inDto) { - var nextIQCQuality = await this.GetNextIQCQuality(inDto); - if (nextIQCQuality.VisitId != null && nextIQCQuality.IsReceived == false) + var trialConfig = await _trialRepository + .Select(t => new { TrialId = t.Id, t.IsIQCAutoNextTask, t.IsIQCAutoTaskDistinguishType }) + .FirstOrDefaultAsync(t => t.TrialId == inDto.TrialId) + .IfNullThrowException(); + + var isDistinguishType = trialConfig.IsIQCAutoNextTask && trialConfig.IsIQCAutoTaskDistinguishType; + + + if (isDistinguishType == false) { - var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstNotNullAsync(); - if (!visit.IsTake) + //不区分任务类型,也要按照当前任务类型给,没找到,按照默认规则给任务 无质疑 普通质控任务 + + var nextIQCQuality = await this.GetNextIQCQuality(inDto, true); + + //没找到 + if (nextIQCQuality.VisitId == null) { - await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true); + nextIQCQuality = await this.GetNextIQCQuality(inDto, false); + + if (nextIQCQuality.VisitId != null && nextIQCQuality.IsReceived == false) + { + var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstNotNullAsync(); + if (!visit.IsTake) + { + await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true); + } + + } } + return nextIQCQuality; + + } + else + { + //区分任务类型,那么按照当前任务类型给,没找到就结束 + var nextIQCQuality = await this.GetNextIQCQuality(inDto, true); + + if (nextIQCQuality.VisitId != null && nextIQCQuality.IsReceived == false) + { + var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstNotNullAsync(); + if (!visit.IsTake) + { + await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true); + } + + } + + return nextIQCQuality; } - return nextIQCQuality; + + } @@ -1264,7 +1305,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// [HttpPost] - public async Task GetNextIQCQuality(GetNextIQCQualityInDto inDto) + public async Task GetNextIQCQuality(GetNextIQCQualityInDto inDto, bool isDistinguishType) { var trialConfig = await _trialRepository .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsIQCAutoNextTask, t.IsIQCAutoTaskDistinguishType }) @@ -1273,16 +1314,18 @@ namespace IRaCIS.Core.Application.Image.QA //当前任务类型 是复核还是普通任务 - var isDistinguishType = trialConfig.IsIQCAutoNextTask && trialConfig.IsIQCAutoTaskDistinguishType; - //当前是否是复核任务,复核任务,那么下一个任务也是复核的任务 var isSecondReview = _subjectVisitRepository.Any(t => t.Id == inDto.SubjectVisitId && t.SecondReviewState == SecondReviewState.AuditPassed); + var ishaveQCChallenge = _subjectVisitRepository.Any(t => t.Id == inDto.SubjectVisitId && t.QCChallengeList.Any()); + var currentActionList = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.CurrentActionUserId == _userInfo.UserRoleId) .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) - .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) - .OrderByDescending(x => x.IsUrgent) - .ThenBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).ToListAsync(); + .WhereIf(isDistinguishType, t => isSecondReview == true ? t.SecondReviewState == SecondReviewState.WaitAudit : t.SecondReviewState == SecondReviewState.None) + .WhereIf(isDistinguishType, t => ishaveQCChallenge == true ? t.QCChallengeList.Any() : !t.QCChallengeList.Any()) + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); + if (currentActionList.Count() > 0) { @@ -1295,27 +1338,26 @@ namespace IRaCIS.Core.Application.Image.QA }; } - SubjectVisit? subjectVisit = null; - List? visitList = null; + switch (trialConfig.QCProcessEnum) { case TrialQCProcess.NotAudit: return new GetNextIQCQualityOutDto() { }; break; case TrialQCProcess.SingleAudit: - visitList = await _subjectVisitRepository - .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) - .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) - .Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None)) - .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.SecondReviewState == SecondReviewState.None - && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.UserRoleId && (x.CurrentActionUserId == _userInfo.UserRoleId || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))) - .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId) - .Include(x => x.Subject).ToListAsync(); + var visitList = await _subjectVisitRepository + .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) + .WhereIf(isDistinguishType, t => isSecondReview == true ? t.SecondReviewState == SecondReviewState.WaitAudit : t.SecondReviewState == SecondReviewState.None) + .WhereIf(isDistinguishType, t => ishaveQCChallenge == true ? t.QCChallengeList.Any() : !t.QCChallengeList.Any()) + .Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None)) + .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.SecondReviewState == SecondReviewState.None + && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.UserRoleId && (x.CurrentActionUserId == _userInfo.UserRoleId || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))) + .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId) + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); - subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId) + var subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x => x.VisitNum).FirstOrDefault(); - - .OrderBy(x => x.VisitNum).FirstOrDefault(); if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -1325,7 +1367,7 @@ namespace IRaCIS.Core.Application.Image.QA }; } - subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault(); + subjectVisit = visitList.OrderBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).FirstOrDefault(); if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -1343,13 +1385,18 @@ namespace IRaCIS.Core.Application.Image.QA visitList = await _subjectVisitRepository .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) - .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) + .WhereIf(isDistinguishType, t => isSecondReview == true ? t.SecondReviewState == SecondReviewState.WaitAudit : t.SecondReviewState == SecondReviewState.None) + .WhereIf(isDistinguishType, t => ishaveQCChallenge == true ? t.QCChallengeList.Any() : !t.QCChallengeList.Any()) .Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None)) .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId && ((x.CurrentActionUserId == _userInfo.UserRoleId) || (!x.IsTake && x.AuditState != AuditStateEnum.QCPassed && (x.PreliminaryAuditUserId != _userInfo.UserRoleId))) ) .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId) - .Include(x => x.Subject).ToListAsync(); + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); + + subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x => x.VisitNum).FirstOrDefault(); + if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -1359,7 +1406,7 @@ namespace IRaCIS.Core.Application.Image.QA }; } - subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault(); + subjectVisit = visitList.OrderBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).FirstOrDefault(); if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -2320,7 +2367,7 @@ namespace IRaCIS.Core.Application.Image.QA sv.AuditState = AuditStateEnum.ToAudit; - sv.CurrentActionUserExpireTime =null; + sv.CurrentActionUserExpireTime = null; sv.CurrentActionUserId = null; sv.IsTake = false;