diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 3b3505910..480f59973 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -196,9 +196,6 @@ namespace IRaCIS.Core.Application.Image.QA - - - /// /// 删除QC质疑记录 /// @@ -311,11 +308,14 @@ namespace IRaCIS.Core.Application.Image.QA var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == input.subjectVisitId)).IfNullThrowException(); - if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack) + if ( sv.RequestBackState == RequestBackStateEnum.CRC_RequestBack) { - ResponseOutput.NotOk("执行一致性核查的访视 不允许关闭质疑!"); + ResponseOutput.NotOk("CRC申请回退状态时, 不允许关闭质疑!"); } + + sv.CloseTheReason = input.CloseCheckChallenge; + sv.CheckChallengeState = CheckChanllengeTypeEnum.Closed; await _checkChallengeDialogrepository.AddAsync(new CheckChallengeDialog() { @@ -353,7 +353,7 @@ namespace IRaCIS.Core.Application.Image.QA if (sv.CheckChallengeState != CheckChanllengeTypeEnum.Closed && sv.AuditState == AuditStateEnum.QCPassed) { - ResponseOutput.NotOk("一致性核查质疑未关闭/审核状态不是通过,不允许设置一致性核查通过"); + ResponseOutput.NotOk("一致性核查质疑未关闭|审核状态不是通过,不允许设置一致性核查通过"); } sv.CheckState = CheckStateEnum.CVPassed; @@ -378,7 +378,7 @@ namespace IRaCIS.Core.Application.Image.QA [TypeFilter(typeof(TrialResourceFilter))] public async Task CRCRequstCheckBack(Guid subjectVisitId) { - var sv = (await _subjectVisitRepository.FirstOrDefaultNoTrackingAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); if (sv.CheckState == CheckStateEnum.CVPassed) @@ -386,7 +386,7 @@ namespace IRaCIS.Core.Application.Image.QA return ResponseOutput.NotOk("核查通过的数据不允许申请回退"); } - var QCChallengeId = await _qcChallengeRepository.Where(x => x.SubjectVisitId == subjectVisitId).Select(x => x.Id).FirstOrDefaultAsync(); + var QCChallengeId = await _qcChallengeRepository.Where(x => x.SubjectVisitId == subjectVisitId).Select(x => x.Id).FirstOrDefaultAsync(); await _checkChallengeDialogrepository.AddAsync(new CheckChallengeDialog() { @@ -394,14 +394,51 @@ namespace IRaCIS.Core.Application.Image.QA UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, TalkContent = "CRC 请求回退" }); - - await _subjectVisitRepository.UpdatePartialFromQueryAsync(subjectVisitId, u => new SubjectVisit() { RequestBackState = RequestBackStateEnum.CRC_RequestBack }, true); + + if (sv.RequestBackState == RequestBackStateEnum.NotRequest || sv.RequestBackState == RequestBackStateEnum.PM_NotAgree) + { + sv.RequestBackState = RequestBackStateEnum.CRC_RequestBack; + + await _subjectVisitRepository.SaveChangesAsync(); + } + else + { + return ResponseOutput.NotOk("其他CRC已申请处理,请刷新页面"); + } + + return ResponseOutput.Ok(); } + [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] + public async Task RejectCheckBack(Guid subjectVisitId) + { + if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ProjectManager) + { + return ResponseOutput.NotOk(" 只允许PM 操作!"); + } + + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); + + if (sv.RequestBackState == RequestBackStateEnum.CRC_RequestBack) + { + sv.RequestBackState = RequestBackStateEnum.PM_NotAgree; + + await _repository.AddAsync(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, TalkContent = "PM拒绝一致性核查回退", UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); + + await _subjectVisitRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + else + { + return ResponseOutput.NotOk(" 只允许PM 操作!"); + } + } + /// /// 一致性核查 回退 对话记录不清除 只允许PM回退 [签名 不需要对] /// @@ -949,9 +986,9 @@ namespace IRaCIS.Core.Application.Image.QA #endregion [HttpGet] - public async Task IsQCCanOpt([FromQuery,Required]Guid subjectVisitId) + public async Task IsQCCanOpt([FromQuery, Required] Guid subjectVisitId) { - await VerifyIsCanQCAsync(null, subjectVisitId); + await VerifyIsCanQCAsync(null, subjectVisitId); return ResponseOutput.Ok(); } @@ -979,7 +1016,7 @@ namespace IRaCIS.Core.Application.Image.QA { var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); - if (dbSubjectVisit.CurrentActionUserId == null && dbSubjectVisit.IsTake==false) + if (dbSubjectVisit.CurrentActionUserId == null && dbSubjectVisit.IsTake == false) { return ResponseOutput.NotOk("当前访视的影像质控任务已被原领取人释放。您可以通过“领取”获得", ApiResponseCodeEnum.NeedTips); @@ -1022,7 +1059,7 @@ namespace IRaCIS.Core.Application.Image.QA if (obtaionOrCancel) { - if (dbSubjectVisit.CurrentActionUserId != null && dbSubjectVisit.IsTake ) + if (dbSubjectVisit.CurrentActionUserId != null && dbSubjectVisit.IsTake) { //throw new BusinessValidationFailedException("当前访视已被领取,不允许领取"); @@ -1115,7 +1152,7 @@ namespace IRaCIS.Core.Application.Image.QA { if (dbSubjectVisit!.CurrentActionUserId != _userInfo.Id) { - return ResponseOutput.NotOk("您不是该质控任务当前领取人,没有操作权限!", ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk("您不是该质控任务当前领取人,没有操作权限!", ApiResponseCodeEnum.NeedTips); } @@ -1179,7 +1216,7 @@ namespace IRaCIS.Core.Application.Image.QA { var sv = dbSubjectVisitList[0]; - var nameList = await _subjectVisitRepository.Where(t => t.SubjectId == sv.SubjectId && t.SubmitState != SubmitStateEnum.Submitted && t.VisitNum < sv.VisitNum && t.IsLostVisit ==false).Select(t => t.VisitName).ToListAsync() ?? new List(); + var nameList = await _subjectVisitRepository.Where(t => t.SubjectId == sv.SubjectId && t.SubmitState != SubmitStateEnum.Submitted && t.VisitNum < sv.VisitNum && t.IsLostVisit == false).Select(t => t.VisitName).ToListAsync() ?? new List(); if (sv.PDState == PDStateEnum.PDProgress) { @@ -1225,7 +1262,7 @@ namespace IRaCIS.Core.Application.Image.QA return ResponseOutput.NotOk("有访视未上传任何Dicom/非Dicom数据 不允许提交"); } - + foreach (var dbSubjectVisit in dbSubjectVisitList) { @@ -1287,7 +1324,7 @@ namespace IRaCIS.Core.Application.Image.QA } - if (dbSubjectVisit.SubmitState == SubmitStateEnum.ToSubmit ) + if (dbSubjectVisit.SubmitState == SubmitStateEnum.ToSubmit) { dbSubjectVisit.SubmitState = SubmitStateEnum.Submitted; dbSubjectVisit.SubmitTime = DateTime.Now; diff --git a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs index 4c0766c01..33eea113a 100644 --- a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs +++ b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs @@ -126,6 +126,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers dbSV.CheckPassedTime = DateTime.Now; dbSV.CheckResult = "核对EDC数据,完全一致"; dbSV.ManualPassReason = "自动核查通过"; + dbSV.RequestBackState = dbSV.RequestBackState== RequestBackStateEnum.CRC_RequestBack? RequestBackStateEnum.PM_NotAgree: RequestBackStateEnum.NotRequest; dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, TalkContent = dbSV.CheckResult, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt }); } else diff --git a/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs b/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs index 5f8d797b0..9ed468f75 100644 --- a/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs +++ b/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs @@ -14,7 +14,9 @@ namespace IRaCIS.Core.Domain.Share CRC_RequestBack = 1, //PM 已同意 CRC - PM_AgressBack = 2 + PM_AgressBack = 2, + + PM_NotAgree=3, } }