自动领取下一个质控
							parent
							
								
									dc63f1c735
								
							
						
					
					
						commit
						3cd37c2be6
					
				| 
						 | 
				
			
			@ -10759,6 +10759,20 @@
 | 
			
		|||
        <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.ReplaceQCTaskActionUser(System.Guid,System.Guid)">
 | 
			
		||||
            <summary>替换当前领取人 </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.CollectNextIQCQuality(IRaCIS.Core.Application.Contracts.GetNextIQCQualityInDto)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            领取下一个质控任务
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="inDto"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.GetNextIQCQuality(IRaCIS.Core.Application.Contracts.GetNextIQCQualityInDto)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            获取下一个质控任务
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="inDto"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.ObtainOrCancelQCTask(System.Guid,System.Guid,System.Boolean)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            手动领取 或者取消 QC任务
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,20 @@ namespace IRaCIS.Core.Application.Contracts
 | 
			
		|||
        public Guid? HandleUserId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class GetNextIQCQualityInDto
 | 
			
		||||
    {
 | 
			
		||||
        [NotDefault]
 | 
			
		||||
        public Guid TrialId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public Guid SubjectId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class GetNextIQCQualityOutDto
 | 
			
		||||
    {
 | 
			
		||||
        public Guid? SubjectId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public Guid? VisitId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class CRCRequestToQCCommand
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -278,7 +278,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
            //Expression<Func<DicomStudy, bool>> studyLambda = x => x.TrialId == visitSearchDTO.TrialId;
 | 
			
		||||
            ////Expression<Func<VisitStage, bool>> visitPlanLambda = x => x.TrialId == subjectVisitSearch.TrialId;
 | 
			
		||||
 | 
			
		||||
            //if (visitSearchDTO.SiteId != null && visitSearchDTO.SiteId != Guid.Empty)
 | 
			
		||||
            //if (visitSearchDTO.SiteId != null && visitSearchDTO.SiteId != Guid.Empty)shiwu
 | 
			
		||||
            //{
 | 
			
		||||
            //    subjectVisitLambda = subjectVisitLambda.And(t => t.SiteId == visitSearchDTO.SiteId.Value);
 | 
			
		||||
            //    studyLambda = studyLambda.And(t => t.SiteId == visitSearchDTO.SiteId.Value);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
            {
 | 
			
		||||
                if (await _qcChallengeRepository.AnyAsync(t => t.IsClosed == false && t.SubjectVisitId == qaQuestionCommand.SubjectVisitId && t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))
 | 
			
		||||
                {
 | 
			
		||||
                //---当前访视未关闭的质疑已设置了同意CRC重传影像。请在CRC完成影像重传后,先关闭原质疑,再添加新的质疑。
 | 
			
		||||
                    //---当前访视未关闭的质疑已设置了同意CRC重传影像。请在CRC完成影像重传后,先关闭原质疑,再添加新的质疑。
 | 
			
		||||
                    throw new BusinessValidationFailedException(_localizer["QCOperation_QuestionExist"]);
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
        /// <returns></returns>
 | 
			
		||||
        [HttpPost("{trialId:guid}")]
 | 
			
		||||
        [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
 | 
			
		||||
       // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        public async Task<IResponseOutput> AddQCChallengeReply(QADialogCommand qaDialogCommand)
 | 
			
		||||
        {
 | 
			
		||||
            var qaReply = _mapper.Map<QCChallengeDialog>(qaDialogCommand);
 | 
			
		||||
| 
						 | 
				
			
			@ -525,7 +525,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
            //_qcChallengeRepository.Delete(t => t.SubjectVisitId == subjectVisitId);
 | 
			
		||||
            //_qcChallengeDialogRepository.Delete(t => t.SubjectVisitId == subjectVisitId);
 | 
			
		||||
            //_checkChallengeDialogRepository.Delete(t => t.SubjectVisitId == subjectVisitId);
 | 
			
		||||
                //---PM/APM同意一致性核查回退。
 | 
			
		||||
            //---PM/APM同意一致性核查回退。
 | 
			
		||||
            await _repository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = _localizer["QCOperation_PMAPMConsistency"], UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt });
 | 
			
		||||
 | 
			
		||||
            await _repository.BatchDeleteAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId);
 | 
			
		||||
| 
						 | 
				
			
			@ -689,7 +689,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
        /// <returns></returns>
 | 
			
		||||
        [HttpPost("{trialId:guid}")]
 | 
			
		||||
        [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
 | 
			
		||||
       // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        public async Task<IResponseOutput> UpdateModality(UpdateModalityCommand updateModalityCommand)
 | 
			
		||||
        {
 | 
			
		||||
            if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
 | 
			
		||||
| 
						 | 
				
			
			@ -701,7 +701,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
            {
 | 
			
		||||
                if (await _subjectVisitRepository.AnyAsync(t => t.Id == updateModalityCommand.SubjectVisitId && t.SubmitState == SubmitStateEnum.Submitted))
 | 
			
		||||
                {
 | 
			
		||||
                //---提交之后,不允许修改!
 | 
			
		||||
                    //---提交之后,不允许修改!
 | 
			
		||||
                    throw new BusinessValidationFailedException(_localizer["QCOperation_NoModifyAfterSubmit"]);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -716,7 +716,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
                study.BodyPartForEdit = updateModalityCommand.BodyPart;
 | 
			
		||||
              
 | 
			
		||||
 | 
			
		||||
                study.ModalityForEdit = updateModalityCommand.Modality;
 | 
			
		||||
 | 
			
		||||
                await _repository.BatchUpdateAsync<DicomSeries>(t => t.StudyId == studyId, r => new DicomSeries() { BodyPartForEdit = updateModalityCommand.BodyPart });
 | 
			
		||||
| 
						 | 
				
			
			@ -770,7 +770,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
        [HttpPost, Route("{trialId:guid}/{subjectVisitId:guid}")]
 | 
			
		||||
        [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
 | 
			
		||||
        [UnitOfWork]
 | 
			
		||||
       // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        // [Authorize(Policy = IRaCISPolicy.CRC_IQC)]
 | 
			
		||||
        public async Task<IResponseOutput> DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -791,7 +791,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
 | 
			
		||||
                await _dicomStudyRepository.DeleteAsync(study);
 | 
			
		||||
 | 
			
		||||
             
 | 
			
		||||
 | 
			
		||||
                var succeess2 = await _repository.BatchDeleteAsync<DicomInstance>(t => t.StudyId == id);
 | 
			
		||||
                var success3 = await _dicomSeriesrepository.BatchDeleteNoTrackingAsync(t => t.StudyId == id);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -814,7 +814,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
              
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await _subjectVisitRepository.SaveChangesAsync();
 | 
			
		||||
| 
						 | 
				
			
			@ -878,6 +878,108 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
            return ResponseOutput.Result(success);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 领取下一个质控任务
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="inDto"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        public async Task<GetNextIQCQualityOutDto> CollectNextIQCQuality(GetNextIQCQualityInDto inDto)
 | 
			
		||||
        {
 | 
			
		||||
            var nextIQCQuality = await this.GetNextIQCQuality(inDto);
 | 
			
		||||
          
 | 
			
		||||
            if (nextIQCQuality.VisitId != null)
 | 
			
		||||
            {
 | 
			
		||||
                var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstOrDefaultAsync();
 | 
			
		||||
                if (!visit.IsTake)
 | 
			
		||||
                {
 | 
			
		||||
                    await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true);
 | 
			
		||||
                }
 | 
			
		||||
               
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return nextIQCQuality;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 获取下一个质控任务
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="inDto"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        [HttpPost]
 | 
			
		||||
        public async Task<GetNextIQCQualityOutDto> GetNextIQCQuality(GetNextIQCQualityInDto inDto)
 | 
			
		||||
        {
 | 
			
		||||
            var trialConfig = await _trialRepository
 | 
			
		||||
                 .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })
 | 
			
		||||
                 .FirstOrDefaultAsync(t => t.TrialId == inDto.TrialId)
 | 
			
		||||
                 .IfNullThrowException();
 | 
			
		||||
 | 
			
		||||
            SubjectVisit? subjectVisit = null;
 | 
			
		||||
            List<SubjectVisit>? visitList = null;
 | 
			
		||||
            switch (trialConfig.QCProcessEnum)
 | 
			
		||||
            {
 | 
			
		||||
                case TrialQCProcess.NotAudit:
 | 
			
		||||
                    return new GetNextIQCQualityOutDto() { };
 | 
			
		||||
                    break;
 | 
			
		||||
                case TrialQCProcess.SingleAudit:
 | 
			
		||||
                     visitList = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed &&!x.IsTake))).Include(x=>x.Subject).ToListAsync();
 | 
			
		||||
 | 
			
		||||
                     subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x=>x.VisitNum).FirstOrDefault();
 | 
			
		||||
                    if(subjectVisit!=null)
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto() { 
 | 
			
		||||
                        SubjectId= subjectVisit.SubjectId,
 | 
			
		||||
                        VisitId= subjectVisit.Id
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    subjectVisit= visitList.OrderBy(x => x.Subject.Code).ThenBy(x=>x.VisitNum).FirstOrDefault();
 | 
			
		||||
                    if (subjectVisit != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto()
 | 
			
		||||
                        {
 | 
			
		||||
                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                            VisitId = subjectVisit.Id
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto() { };
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case TrialQCProcess.DoubleAudit:
 | 
			
		||||
 | 
			
		||||
                    visitList = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.QCPassed))).Include(x => x.Subject).ToListAsync();
 | 
			
		||||
                    if (subjectVisit != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto()
 | 
			
		||||
                        {
 | 
			
		||||
                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                            VisitId = subjectVisit.Id
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault();
 | 
			
		||||
                    if (subjectVisit != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto()
 | 
			
		||||
                        {
 | 
			
		||||
                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                            VisitId = subjectVisit.Id
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        return new GetNextIQCQualityOutDto() { };
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    return new GetNextIQCQualityOutDto() { };
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 手动领取 或者取消 QC任务
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue