diff --git a/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs b/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs index 0a599c8f7..05836f59c 100644 --- a/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/ProjectExceptionFilter.cs @@ -27,7 +27,7 @@ namespace IRaCIS.Core.Application.Filter if (context.Exception.GetType() == typeof(BusinessValidationFailedException)) { - context.Result = new JsonResult(ResponseOutput.NotOk("Verify error: " + context.Exception.Message)); + context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message)); } else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException)) { diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 79034df95..ce63ae54a 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1514,8 +1514,6 @@ 手动设置一致性核查通过 - - @@ -1579,6 +1577,9 @@ SeriesCount + + 替换当前领取人 + 手动领取 或者取消 QC任务 @@ -1612,12 +1613,14 @@ + + 验证质疑对话页面 是否可以 跳转到重传页面 进行重传 + - QA设置 需要重传 + QA设置 同意重传 - diff --git a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs index 3611fc917..dea977412 100644 --- a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs @@ -58,12 +58,12 @@ namespace IRaCIS.Core.Application.Contracts if (addOrEditUserTypeRole.MenuIds.Count > 0) { - entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).Include(t => t.UserTypeMenuList).Include(t=>t.UserTypeGroupList).FirstOrDefault(); + entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).Include(t => t.UserTypeMenuList).Include(t=>t.UserTypeGroupList).FirstOrDefault().IfNullThrowException(); } else { - entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).FirstOrDefault(); + entity = userTypeServiceRepository.Where(t => t.Id == addOrEditUserTypeRole.Id, true).FirstOrDefault().IfNullThrowException(); } _mapper.Map(addOrEditUserTypeRole, entity); } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 9cfb9ddff..2b2db37d7 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -68,7 +68,6 @@ namespace IRaCIS.Core.Application.Contracts public bool SetOrCancel { get; set; } - public Guid? SignId { get; set; } } public class UploadSubjectAndVisitCommand @@ -147,8 +146,6 @@ namespace IRaCIS.Core.Application.Contracts public int? Age { get; set; } public string Sex { get; set; } = string.Empty; - - } diff --git a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs index 4fb56ce88..024ac9d03 100644 --- a/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs +++ b/IRaCIS.Core.Application/Service/QC/NoneDicomStudyService.cs @@ -70,11 +70,6 @@ namespace IRaCIS.Core.Application.Contracts subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == sujectVisitId).Result.IfNullThrowException(); } - if (subjectVisit.PreliminaryAuditUserId != null) - { - throw new BusinessValidationFailedException("当前访视已审核通过,不允许操作"); - } - if (subjectVisit.CurrentActionUserId != _userInfo.Id) { throw new BusinessValidationFailedException("您不是该质控任务当前领取人,没有操作权限!"); @@ -115,7 +110,6 @@ namespace IRaCIS.Core.Application.Contracts } - NoneDicomStudyAddReturnDto noneDicom = new NoneDicomStudyAddReturnDto() { StudyCode = optEntity.StudyCode, @@ -129,20 +123,14 @@ namespace IRaCIS.Core.Application.Contracts [HttpDelete("{noneDicomStudyId:guid}/{trialId:guid}")] public async Task DeleteNoneDicomStudy(Guid noneDicomStudyId) { - if (_noneDicomStudyRepository.Where(t => t.Id == noneDicomStudyId).SelectMany(t => t.NoneDicomFileList).Count() > 0) - { - return ResponseOutput.NotOk("先移除文件,才允许删除非Dicom"); - } - var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId); - - if (noneDicomStudy == null) return Null404NotFound(noneDicomStudy); + var noneDicomStudy = (await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId)).IfNullThrowException(); await _noneDicomStudyRepository.DeleteAsync(noneDicomStudy); await _noneDicomStudyFileRepository.BatchDeleteNoTrackingAsync(t => t.NoneDicomStudyId == noneDicomStudyId); - await _repository.BatchDeleteAsync(t => t.StudyId == noneDicomStudyId); + await _studyMonitorRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == noneDicomStudyId); return ResponseOutput.Ok(); } @@ -156,10 +144,6 @@ namespace IRaCIS.Core.Application.Contracts var success = await _noneDicomStudyFileRepository.BatchDeleteNoTrackingAsync(t => t.Id == noneDicomStudyFileId); - var subvisit = await _repository.GetQueryable().FirstOrDefaultAsync(x => x.Id == subjectVisitId); - - - return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index ae6382bd8..e7bfecb4f 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -269,7 +269,7 @@ namespace IRaCIS.Core.Application.Image.QA qaReply.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt; var dbQCChallenge = (await _repository.FirstOrDefaultAsync(t => t.Id == qaDialogCommand.QCChallengeId)).IfNullThrowException(); - + dbQCChallenge.LatestMsgTime = DateTime.Now; @@ -359,8 +359,6 @@ namespace IRaCIS.Core.Application.Image.QA /// /// 手动设置一致性核查通过 /// - /// - /// /// [HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] @@ -1100,6 +1098,24 @@ namespace IRaCIS.Core.Application.Image.QA #region 临床数据签名 领取、 设置紧急、RequestToQC QC通过、不通过 + /// 替换当前领取人 + [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] + public async Task ReplaceQCTaskActionUser(Guid trialId, Guid subjectVisitId) + { + var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); + + dbSubjectVisit.IsTake = true; + + dbSubjectVisit.CurrentActionUserId = _userInfo.Id; + + dbSubjectVisit.CurrentActionUserExpireTime = DateTime.Now.AddHours(1); + + var success = await _subjectVisitRepository.SaveChangesAsync(); + + return ResponseOutput.Result(success); + } + + /// /// 手动领取 或者取消 QC任务 /// @@ -1112,6 +1128,11 @@ namespace IRaCIS.Core.Application.Image.QA public async Task ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel) { + if (await _subjectVisitRepository.AnyAsync(t => t.CurrentActionUserId != null && t.IsTake && t.Id == subjectVisitId)) + { + throw new BusinessValidationFailedException("当前访视已被领取,不允许领取"); + } + var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); @@ -1241,7 +1262,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - return ResponseOutput.NotOk("项目配置为复审,不满足提交状态:已提交 或者 审核状态:InPrimaryQC/InSecondaryQC, 不允许领取"); + return ResponseOutput.NotOk("项目配置为复审,不满足提交状态:已提交 或者 审核状态:InPrimaryQC/InSecondaryQC, 不允许释放"); } } @@ -1268,14 +1289,14 @@ 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).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).Select(t => t.VisitName).ToListAsync() ?? new List(); if (sv.PDState == PDStateEnum.PDProgress) { - if (nameList.Count()>0) + if (nameList.Count() > 0) { - return ResponseOutput.NotOk($"系统检测发现该受试者当前访视之前的访视:{string.Join('、',nameList)},未提交,疾病进展确认对阅片时限要求很高,请将上述访视提交或标记失访后,再提交当前访视!", 1,ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk($"系统检测发现该受试者当前访视之前的访视:{string.Join('、', nameList)},未提交,疾病进展确认对阅片时限要求很高,请将上述访视提交或标记失访后,再提交当前访视!", 1, ApiResponseCodeEnum.NeedTips); } } else @@ -1693,14 +1714,27 @@ namespace IRaCIS.Core.Application.Image.QA #region 重传、重传完设置 + /// 验证质疑对话页面 是否可以 跳转到重传页面 进行重传 + [HttpGet("{trialId:guid}/{qcChallengeId:guid}")] + public async Task VerifyReuploadIsCanJump(Guid trialId, Guid qcChallengeId) + { + var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); + + if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.QCAgreeUpload) + { + throw new BusinessValidationFailedException("当前重传状态不为QC同意重传,不允许重传"); + } + return ResponseOutput.Ok(); + } + + /// - /// QA设置 需要重传 + /// QA设置 同意重传 /// /// - /// /// /// - [HttpPut("{trialId:guid}/{qcChallengeId:guid}/{signId:guid}")] + [HttpPut("{trialId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task SetNeedReupload(Guid trialId, Guid qcChallengeId) { @@ -1718,14 +1752,21 @@ namespace IRaCIS.Core.Application.Image.QA return ResponseOutput.NotOk("不审操作,不会有需要重传的操作!"); } - var qcChallenge = await _repository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); - if (qcChallenge == null) return Null404NotFound(qcChallenge); + var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); - if (await _repository.CountAsync(t => t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload && t.SubjectVisitId == qcChallenge.SubjectVisitId && t.IsClosed == false) >= 1) + if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCRequestReupload) { - return ResponseOutput.NotOk("当前访视,有一个未关闭的质疑 QC设置了需要重传,CRC还未完成上传,当前不允许再次设置"); + throw new BusinessValidationFailedException("当前重传状态不为CRC申请重传,不允许设置同意重传"); } + + if (await _qcChallengeRepository.CountAsync(t => t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload && t.SubjectVisitId == qcChallenge.SubjectVisitId && t.IsClosed == false) >= 1) + { + return ResponseOutput.NotOk("当前访视,有一个未关闭的质疑 QC设置了同意重传,CRC还未完成上传,当前不允许再次设置"); + } + + + qcChallenge.ReuploadEnum = QCChanllengeReuploadEnum.QCAgreeUpload; qcChallenge.LatestMsgTime = DateTime.Now; qcChallenge.LatestReplyUserId = _userInfo.Id; @@ -1777,15 +1818,11 @@ namespace IRaCIS.Core.Application.Image.QA var success = await _repository.SaveChangesAsync(); - //var signSuccess = await _repository.UpdateFromQueryAsync(t => t.Id == signId, u => new TrialSign() { IsCompleted = true }); return ResponseOutput.Result(success); } - - - /// /// CRC 设置已经重传完成 /// @@ -1797,20 +1834,22 @@ namespace IRaCIS.Core.Application.Image.QA { if (_userInfo.UserTypeEnumInt != (int)UserTypeEnum.ClinicalResearchCoordinator) { - return ResponseOutput.NotOk("重传完成 只允许CRC 设置!"); + throw new BusinessValidationFailedException("重传完成 只允许CRC 设置!"); } - var qcChallenge = await _repository.FirstOrDefaultAsync(t => t.Id == cRCReuploadFinishedCommand.QCChallengeId); + var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == cRCReuploadFinishedCommand.QCChallengeId)).IfNullThrowException(); + + if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.QCAgreeUpload) + { + throw new BusinessValidationFailedException("当前重传状态不为QC同意重传,不允许设置重传完成"); + } - if (qcChallenge == null) return Null404NotFound(qcChallenge); var subjectVisitId = qcChallenge.SubjectVisitId; - if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList) - .CountAsync() == 0 && - await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) - .SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) + if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 && + await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) { throw new BusinessValidationFailedException("当前没有影像,不允许设置重传完成"); } @@ -1821,11 +1860,12 @@ namespace IRaCIS.Core.Application.Image.QA - qcChallenge.ReuploadEnum = QCChanllengeReuploadEnum.CRCReuploaded; qcChallenge.ReUploadedTime = DateTime.Now; + qcChallenge.ReUploadUserId = _userInfo.Id; + qcChallenge.ReUploader = _userInfo.RealName; qcChallenge.LatestMsgTime = DateTime.Now; @@ -1855,13 +1895,13 @@ namespace IRaCIS.Core.Application.Image.QA //已确认临床数据完整性 dbSubjectVisit.IsConfirmedClinicalData = true; - var signSuccess = await _repository.BatchUpdateAsync(t => t.Id == cRCReuploadFinishedCommand.SignId, u => new TrialSign() { IsCompleted = true }); + //var signSuccess = await _repository.BatchUpdateAsync(t => t.Id == cRCReuploadFinishedCommand.SignId, u => new TrialSign() { IsCompleted = true }); } - var success = await _repository.SaveChangesAsync(); + var success = await _subjectVisitRepository.SaveChangesAsync(); - return ResponseOutput.Ok(success); + return ResponseOutput.Result(success); } @@ -1871,9 +1911,14 @@ namespace IRaCIS.Core.Application.Image.QA [TypeFilter(typeof(TrialResourceFilter))] public async Task CRCRequestReUpload(Guid qcChallengeId) { - var qcChallenge = await _repository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); + var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); + + + if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.None || qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCReuploaded) + { + throw new BusinessValidationFailedException("当前质疑重传状态不为初始状态|CRC重传完成状态状态,不允许申请重传"); + } - if (qcChallenge == null) return Null404NotFound(qcChallenge); if (qcChallenge.ReuploadEnum == QCChanllengeReuploadEnum.CRCReuploaded) { @@ -1892,7 +1937,7 @@ namespace IRaCIS.Core.Application.Image.QA TalkContent = "CRC申请重传/上传影像" }); - await _repository.SaveChangesAsync(); + await _qcChallengeRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -1911,7 +1956,7 @@ namespace IRaCIS.Core.Application.Image.QA [TypeFilter(typeof(TrialResourceFilter))] public async Task UpdateSubjectAndSVInfo(UploadSubjectAndVisitCommand command) { - var dbSubjectVisit = ( await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId)).IfNullThrowException(); + var dbSubjectVisit = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == command.SubjectVisitId)).IfNullThrowException(); dbSubjectVisit.PDState = command.PDState; @@ -1931,7 +1976,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.IsEnrollmentConfirm = command.IsEnrollmentConfirm.Value; - + @@ -1964,7 +2009,7 @@ namespace IRaCIS.Core.Application.Image.QA await _inspectionService.AddListInspectionRecordAsync(datas); } - await _subjectVisitRepository.SaveChangesAsync(); + await _subjectVisitRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } @@ -2073,7 +2118,7 @@ namespace IRaCIS.Core.Application.Image.QA u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); keyValuePairs["ForwardState"] = ForwardStateEnum.ForwardFailed; - return ResponseOutput.NotOk("转发失败 "+e.Message); + return ResponseOutput.NotOk("转发失败 " + e.Message); } @@ -2087,7 +2132,7 @@ namespace IRaCIS.Core.Application.Image.QA await _subjectVisitRepository.SaveChangesAsync(); - return isSuccess?ResponseOutput.Ok():ResponseOutput.NotOk("转发失败"); + return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk("转发失败"); } diff --git a/IRaCIS.Core.Domain/QC/QCChallenge.cs b/IRaCIS.Core.Domain/QC/QCChallenge.cs index 5db073a84..4337919ab 100644 --- a/IRaCIS.Core.Domain/QC/QCChallenge.cs +++ b/IRaCIS.Core.Domain/QC/QCChallenge.cs @@ -32,6 +32,8 @@ namespace IRaCIS.Core.Domain.Models public string ReUploader { get; set; } = string.Empty; + public Guid? ReUploadUserId { get; set; } + public TrialQCProcess QCProcessEnum { get; set; } public CurrentQC CurrentQCEnum { get; set; }