diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index d11a9402c..11050de27 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -32,6 +32,7 @@ namespace IRaCIS.Core.Application.Image.QA private readonly DicomFileStoreHelper _dicomFileStoreHelper; private readonly IRepository _subjectVisitRepository; + private readonly IRepository _qcChallengeRepository; private readonly IRepository _dicomStudyRepository; private readonly IRepository _dictionaryrepository; private readonly IRepository _trialRepository; @@ -43,16 +44,18 @@ namespace IRaCIS.Core.Application.Image.QA private readonly AsyncLock _mutex = new AsyncLock(); public QCOperationService(DicomFileStoreHelper dicomFileStoreHelper, IRepository subjectVisitRepository, + IRepository qcChallengeRepository, IRepository trialRepository, IMediator mediator, IInspectionService inspectionService, IDictionaryService dictionaryService, IRepository dicomStudyRepository, - IRepository dictionaryrepository + IRepository dictionaryrepository ) { _dicomFileStoreHelper = dicomFileStoreHelper; _subjectVisitRepository = subjectVisitRepository; + _qcChallengeRepository = qcChallengeRepository; _dicomStudyRepository = dicomStudyRepository; this._dictionaryrepository = dictionaryrepository; _mediator = mediator; @@ -69,7 +72,7 @@ namespace IRaCIS.Core.Application.Image.QA { if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == currentQCType)) { - return ResponseOutput.NotOk("必须填写审核问题,并保存,否则不允许添加质疑"); + return ResponseOutput.NotOk("请先核查图像,保存审核问题后,再发质疑。"); } return ResponseOutput.Ok(); @@ -91,23 +94,21 @@ namespace IRaCIS.Core.Application.Image.QA if (qaQuestionCommand.Id == null) { - if (await _repository.AnyAsync(t => t.IsClosed == false && t.SubjectVisitId == qaQuestionCommand.SubjectVisitId && t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)) + if (await _qcChallengeRepository.AnyAsync(t => t.IsClosed == false && t.SubjectVisitId == qaQuestionCommand.SubjectVisitId && t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)) { throw new BusinessValidationFailedException("当前访视有未关闭的 同意CRC上传的质疑,不允许再次添加质疑"); } - var trialConfig = _repository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefault(); + + var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefaultAsync()).IfNullThrowException(); - //获取编号 - var code = _repository.Where(t => t.TrialId == trialId).Select(t => t.ChallengeCode).DefaultIfEmpty().Max(); - if (trialConfig == null) - { - throw new BusinessValidationFailedException("项目不存在"); - } using (await _mutex.LockAsync()) { + //获取编号 + var code = _qcChallengeRepository.Where(t => t.TrialId == trialId).Select(t => t.ChallengeCode).DefaultIfEmpty().Max(); + var qcChallenge = _mapper.Map(qaQuestionCommand); qcChallenge.QCProcessEnum = trialConfig.QCProcessEnum; @@ -117,7 +118,7 @@ namespace IRaCIS.Core.Application.Image.QA qcChallenge.ChallengeCode = code + 1; qcChallenge.UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt; - qcChallenge = await _repository.AddAsync(qcChallenge, true); + qcChallenge = await _qcChallengeRepository.AddAsync(qcChallenge, true); return qcChallenge; } @@ -144,19 +145,22 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPost("{trialId:guid}/{qcChallengeId:guid}/{subjectVisitId:guid}/{closeEnum}/{closeReason}")] [TypeFilter(typeof(TrialResourceFilter))] + [UnitOfWork] //[Authorize(Policy = "ImageQCPolicy")] public async Task CloseQCChallenge(Guid qcChallengeId, Guid subjectVisitId, [FromRoute] QCChallengeCloseEnum closeEnum, [FromRoute] string closeReason) { - var dbQCChallenge = await _repository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); + var dbQCChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); - if (dbQCChallenge == null) return Null404NotFound(dbQCChallenge); if (dbQCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload || dbQCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload) { - return ResponseOutput.NotOk("CRC申请重传的/QC同意重传的质疑,在CRC设置重传完成前不允许关闭质疑"); + throw new BusinessValidationFailedException("CRC申请重传的/QC同意重传的质疑,在CRC设置重传完成前不允许关闭质疑"); } + + #region 之前 + dbQCChallenge.CloseResonEnum = closeEnum; dbQCChallenge.IsClosed = true; @@ -172,10 +176,36 @@ namespace IRaCIS.Core.Application.Image.QA TalkContent = "关闭原因: " + closeReason }); - var success = await _repository.SaveChangesAsync(); + var success = await _qcChallengeRepository.SaveChangesAsync(); + + #endregion return ResponseOutput.Result(success); + + #region 对话实体不会加入 + + //dbQCChallenge.DialogList.Add(new QCChallengeDialog() + //{ + // SubjectVisitId = dbQCChallenge.SubjectVisitId, + // UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, + // QCChallengeId = dbQCChallenge.Id, + // TalkContent = "关闭原因: " + closeReason + //}); + + + + //var success = await _qcChallengeRepository.PartialUpdateAsync(dbQCChallenge, u => new QCChallenge() + //{ + // CloseResonEnum = closeEnum, + + // IsClosed = true, + + // ClosedTime = DateTime.Now, + + //}, true); + + #endregion } @@ -198,11 +228,11 @@ namespace IRaCIS.Core.Application.Image.QA ResponseOutput.NotOk("this QC Challenge Has been replied "); } - var qaRecord = await _repository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); + var qaRecord = await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); if (qaRecord == null) return Null404NotFound(qaRecord); - await _repository.DeleteAsync(qaRecord); + await _qcChallengeRepository.DeleteAsync(qaRecord); var success1 = await _repository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs index b2f2b90d5..82deb07e1 100644 --- a/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs +++ b/IRaCIS.Core.Infra.EFCore/Repository/Repository.cs @@ -275,7 +275,7 @@ namespace IRaCIS.Core.Infra.EFCore ModifyPartialFiled(searchEntity, updateFactory); - + await SaveChangesAsync(autoSave); return searchEntity; @@ -312,15 +312,8 @@ namespace IRaCIS.Core.Infra.EFCore _dbSet.Remove(entity); + return await SaveChangesAsync(autoSave); - if (autoSave) - { - return await SaveChangesAsync(cancellationToken); - } - else - { - return false; - } } @@ -751,8 +744,8 @@ namespace IRaCIS.Core.Infra.EFCore { TrialId = data.Id, SubjectId = data.Id, - TrialName=data.ExperimentName, - ResearchProgramNo=data.ResearchProgramNo, + TrialName = data.ExperimentName, + ResearchProgramNo = data.ResearchProgramNo, IsSign = false, CreateTime = createtime, Identification = "Init|Trial|Status|Trial Setting-Infomation", // 初始化项目 @@ -770,7 +763,7 @@ namespace IRaCIS.Core.Infra.EFCore SiteId = data.SiteId, SubjectId = data.Id, SubjectCode = data.Code, - + IsSign = false, CreateTime = createtime, Identification = "Init|Subject|Status|Subject", // 初始化受试者信息 @@ -815,7 +808,7 @@ namespace IRaCIS.Core.Infra.EFCore else if (typeof(TEntity) == typeof(NoneDicomStudyFile)) { NoneDicomStudyFile data = entity as NoneDicomStudyFile; - var subjectVisitId =await _dbContext.NoneDicomStudy.Where(x => x.Id == data.NoneDicomStudyId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); + var subjectVisitId = await _dbContext.NoneDicomStudy.Where(x => x.Id == data.NoneDicomStudyId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); await UpdateSubjectVisit(subjectVisitId, SubmitStateEnum.ToSubmit, "上传非Dicom影像"); } @@ -837,7 +830,7 @@ namespace IRaCIS.Core.Infra.EFCore SubjectId = subjectvisit.SubjectId, SubjectVisitId = subjectvisit.Id, Reason = reason, - CreateTime= createtime.AddMilliseconds(100), + CreateTime = createtime.AddMilliseconds(100), JsonDetail = subjectvisit.ToJcJson(), });