diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index cf2216ac2..066a595e0 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -201,10 +201,10 @@ namespace IRaCIS.Core.API.Controllers public async Task AddOrUpdateQCChallenge(DataInspectionDto opt) { var fun = await _qCOperationService.AddOrUpdateQCChallenge(opt.OptCommand.qaQuestionCommand, opt.OptCommand.trialId, opt.OptCommand.trialQCProcess, opt.OptCommand.currentQCType); - opt.AuditInfo.GeneralId = fun.Id; - Dictionary keyValuePairs = new Dictionary(); - keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5")); - opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs); + //opt.AuditInfo.GeneralId = fun.Id; + //Dictionary keyValuePairs = new Dictionary(); + //keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5")); + //opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, ResponseOutput.Ok()); } diff --git a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs index c7784f5e8..058243121 100644 --- a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs +++ b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs @@ -246,7 +246,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO { public string ManualPassReason { get; set; } = string.Empty; - public Guid Id { get; set; } + public Guid SubjectVisitId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs index 789270fee..f017f1786 100644 --- a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs @@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Core.Application.Image.QA { public interface IQCOperationService - { + { Task CheckBack(Guid subjectVisitId); Task SetNeedReupload(Guid trialId, Guid qcChallengeId); Task QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState); @@ -19,8 +19,8 @@ namespace IRaCIS.Core.Application.Image.QA - Task> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand); - Task AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType); + Task AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand); + Task AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType); Task AddOrUpdateQCQuestionAnswerList(QCQuestionAnswerCommand[] qcQuestionAnswerCommands, Guid trialId, Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType); Task AddQCChallengeReply(QADialogCommand qaDialogCommand); Task CloseCheckChallenge(CloseCheckChallengeDto input); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 24c380f9d..44ed6bcd5 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -17,12 +17,9 @@ using Microsoft.AspNetCore.Authorization; using WinSCP; using Magicodes.ExporterAndImporter.Excel; using Newtonsoft.Json; -using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Application.Service.Inspection.DTO; using Nito.AsyncEx; -using IRaCIS.Application.Interfaces; -using IRaCIS.Core.Domain.Common; namespace IRaCIS.Core.Application.Image.QA { @@ -34,13 +31,9 @@ namespace IRaCIS.Core.Application.Image.QA private readonly IRepository _subjectVisitRepository; private readonly IRepository _qcChallengeRepository; private readonly IRepository _dicomStudyRepository; - private readonly IRepository _dictionaryrepository; private readonly IRepository _subjectRepository; private readonly IRepository _trialRepository; private readonly IMediator _mediator; - private readonly IInspectionService _inspectionService; - private readonly IDictionaryService _dictionaryService; - private object _locker = new object(); private readonly AsyncLock _mutex = new AsyncLock(); @@ -48,10 +41,7 @@ namespace IRaCIS.Core.Application.Image.QA IRepository qcChallengeRepository, IRepository trialRepository, IMediator mediator, - IInspectionService inspectionService, - IDictionaryService dictionaryService, IRepository dicomStudyRepository, - IRepository dictionaryrepository, IRepository subjectRepository ) { @@ -59,17 +49,14 @@ namespace IRaCIS.Core.Application.Image.QA _subjectVisitRepository = subjectVisitRepository; _qcChallengeRepository = qcChallengeRepository; _dicomStudyRepository = dicomStudyRepository; - this._dictionaryrepository = dictionaryrepository; this._subjectRepository = subjectRepository; _mediator = mediator; _trialRepository = trialRepository; - _inspectionService = inspectionService; - this._dictionaryService = dictionaryService; } #region QC质疑 以及回复 关闭 - [HttpPost("{trialId:guid}/{subjectVisitId:guid}/{currentQCType:int}")] + [HttpGet("{trialId:guid}/{subjectVisitId:guid}/{currentQCType:int}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task VerifyQCCanAddChallenge(Guid subjectVisitId, [FromRoute] CurrentQC currentQCType) { @@ -93,7 +80,7 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost("{trialId:guid}/{trialQCProcess:int}/{currentQCType:int}")] [TypeFilter(typeof(TrialResourceFilter))] [Authorize(Policy = "ImageQCPolicy")] - public async Task AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) + public async Task AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) { await VerifyIsCanQCAsync(null, qaQuestionCommand.SubjectVisitId); @@ -124,18 +111,21 @@ namespace IRaCIS.Core.Application.Image.QA qcChallenge = await _qcChallengeRepository.AddAsync(qcChallenge, true); - return qcChallenge; + return ResponseOutput.Ok(qcChallenge.Id); + } } else { - return await _repository.UpdateFromDTOAsync(qaQuestionCommand, true); + await _repository.UpdateFromDTOAsync(qaQuestionCommand, true); + return ResponseOutput.Ok(); } + } @@ -147,7 +137,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// /// - [HttpPost("{trialId:guid}/{qcChallengeId:guid}/{subjectVisitId:guid}/{closeEnum}/{closeReason}")] + [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}/{closeEnum}/{closeReason}")] [TypeFilter(typeof(TrialResourceFilter))] [UnitOfWork] //[Authorize(Policy = "ImageQCPolicy")] @@ -168,8 +158,6 @@ namespace IRaCIS.Core.Application.Image.QA } - - #region 之前 dbQCChallenge.CloseResonEnum = closeEnum; @@ -194,29 +182,6 @@ namespace IRaCIS.Core.Application.Image.QA 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 } @@ -228,7 +193,7 @@ namespace IRaCIS.Core.Application.Image.QA /// 删除QC质疑记录 /// /// - [HttpDelete("{qcChallengeId:guid}/{trialId:guid}")] + [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] [Authorize(Policy = "ImageQCPolicy")] public async Task DeleteQCChallenge(Guid qcChallengeId) @@ -239,9 +204,8 @@ namespace IRaCIS.Core.Application.Image.QA ResponseOutput.NotOk("this QC Challenge Has been replied "); } - var qaRecord = await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId); + var qaRecord = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); - if (qaRecord == null) return Null404NotFound(qaRecord); await _qcChallengeRepository.DeleteAsync(qaRecord); @@ -257,7 +221,6 @@ namespace IRaCIS.Core.Application.Image.QA /// /// [HttpPost("{trialId:guid}")] - [TypeFilter(typeof(TrialResourceFilter))] [Authorize(Policy = "ImageQCPolicy")] public async Task AddQCChallengeReply(QADialogCommand qaDialogCommand) @@ -295,7 +258,7 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] [Authorize(Policy = "ImageCheckPolicy")] - public async Task> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand) + public async Task AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand) { @@ -324,14 +287,14 @@ namespace IRaCIS.Core.Application.Image.QA var success = await _repository.SaveChangesAsync(); - return ResponseOutput.Result(success, qaReply); + return ResponseOutput.Result(success, qaReply.Id); } /// /// 关闭 一致性核查质疑 /// /// - [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] + [HttpPut("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task CloseCheckChallenge(CloseCheckChallengeDto input) { @@ -355,7 +318,7 @@ namespace IRaCIS.Core.Application.Image.QA /// 手动设置一致性核查通过 /// /// - [HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")] + [HttpPut("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task SetCheckPass(SetCheckPassDt data) { @@ -364,9 +327,8 @@ namespace IRaCIS.Core.Application.Image.QA ResponseOutput.NotOk("只允许PM 手动设置一致性核查通过"); } - var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == data.Id); + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == data.SubjectVisitId)).IfNullThrowException(); - if (sv == null) return Null404NotFound(sv); if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack) { @@ -384,9 +346,8 @@ namespace IRaCIS.Core.Application.Image.QA sv.ManualPassReason = data.ManualPassReason; sv.CheckPassedTime = DateTime.Now; - await _repository.SaveChangesAsync(); + await _subjectVisitRepository.SaveChangesAsync(); - //var signSuccess = await _repository.UpdateFromQueryAsync(t => t.Id == signId, u => new TrialSign() { IsCompleted = true }); return ResponseOutput.Result(true); @@ -401,16 +362,15 @@ namespace IRaCIS.Core.Application.Image.QA [TypeFilter(typeof(TrialResourceFilter))] public async Task CRCRequstCheckBack(Guid subjectVisitId) { - var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); - if (sv == null) return Null404NotFound(sv); - if (sv.CheckState == CheckStateEnum.CVPassed) { return ResponseOutput.NotOk("核查通过的数据不允许申请回退"); } - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { RequestBackState = RequestBackStateEnum.CRC_RequestBack }); + + await _subjectVisitRepository.UpdatePartialFromQueryAsync( subjectVisitId, u => new SubjectVisit() { RequestBackState = RequestBackStateEnum.CRC_RequestBack },true); return ResponseOutput.Ok(); @@ -420,7 +380,7 @@ namespace IRaCIS.Core.Application.Image.QA /// 一致性核查 回退 对话记录不清除 只允许PM回退 /// /// - [HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")] + [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task CheckBack(Guid subjectVisitId) { @@ -429,9 +389,8 @@ namespace IRaCIS.Core.Application.Image.QA return ResponseOutput.NotOk(" 只允许PM 回退!"); } - var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); - if (sv == null) return Null404NotFound(sv); if (sv.CheckState == CheckStateEnum.CVPassed || sv.CheckState == CheckStateEnum.ToCheck) { @@ -476,9 +435,8 @@ namespace IRaCIS.Core.Application.Image.QA await _repository.BatchDeleteAsync(t => t.SubjectVisitId == subjectVisitId); - var success = await _repository.SaveChangesAsync(); + var success = await _subjectVisitRepository.SaveChangesAsync(); - // var signSuccess = await _repository.UpdateFromQueryAsync(t => t.Id == signId, u => new TrialSign() { IsCompleted = true }); return ResponseOutput.Result(success); @@ -874,7 +832,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// /// - [HttpGet("{subjectVisitId:guid}")] + [HttpGet("{trialId:guid}/{subjectVisitId:guid}")] public async Task VerifyCanQCPassedOrFailed(Guid subjectVisitId) { await VerifyIsCanQCAsync(null, subjectVisitId); @@ -896,7 +854,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// /// SeriesCount - [HttpPost, Route("{trialId:guid}/{subjectVisitId:guid}")] + [HttpDelete, Route("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] [UnitOfWork] public async Task DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId) @@ -911,13 +869,6 @@ namespace IRaCIS.Core.Application.Image.QA } var waitDeleteStudyList = await _dicomStudyRepository.Where(x => ids.Contains(x.Id)).ToListAsync(); - - - - - - - foreach (var study in waitDeleteStudyList) { @@ -975,7 +926,7 @@ namespace IRaCIS.Core.Application.Image.QA #endregion - public async Task VerifyIsCanQCAsync(SubjectVisit? subjectVisit, Guid? sujectVisitId = null) + private async Task VerifyIsCanQCAsync(SubjectVisit? subjectVisit, Guid? sujectVisitId = null) { if (sujectVisitId != null) { @@ -1016,7 +967,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// true 获取 false是取消领取 /// - [HttpPost("{trialId:guid}/{subjectVisitId:guid}/{obtaionOrCancel:bool}")] + [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{obtaionOrCancel:bool}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel) { @@ -1326,7 +1277,6 @@ namespace IRaCIS.Core.Application.Image.QA /// /// [HttpPost("{trialId:guid}/{subjectVisitId:guid}/{auditState:int}")] - [TypeFilter(typeof(TrialResourceFilter))] public async Task QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState) { @@ -1512,8 +1462,7 @@ namespace IRaCIS.Core.Application.Image.QA [TypeFilter(typeof(TrialResourceFilter))] public async Task SetVisitUrgent(Guid trialId, Guid subjectVisitId, bool setOrCancel) { - var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId); - if (sv == null) return Null404NotFound(sv); + var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); sv.IsUrgent = setOrCancel; var success = await _repository.SaveChangesAsync(); @@ -1545,7 +1494,7 @@ namespace IRaCIS.Core.Application.Image.QA /// /// /// - [HttpPut("{trialId:guid}/{qcChallengeId:guid}")] + [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task SetNeedReupload(Guid trialId, Guid qcChallengeId) { @@ -1718,7 +1667,7 @@ namespace IRaCIS.Core.Application.Image.QA - [HttpPut("{trialId:guid}/{qcChallengeId:guid}")] + [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter))] public async Task CRCRequestReUpload(Guid qcChallengeId) { @@ -1786,11 +1735,6 @@ namespace IRaCIS.Core.Application.Image.QA } dbSubjectVisit.IsEnrollmentConfirm = command.IsEnrollmentConfirm.Value; - - - - - } if (command.SubjectFirstGiveMedicineTime != null)