diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QARecordViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QARecordViewModel.cs index ba286ab56..f6ed2de44 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QARecordViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QARecordViewModel.cs @@ -466,6 +466,9 @@ namespace IRaCIS.Core.Application.Contracts.DTO public UserTypeEnum UserTypeEnum { get; set; } } + + + public class QCChanllengeDialogDTO : CheckChanllengeDialogDTO { public Guid QCChallengeId { get; set; } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 8a8acac6b..36034d511 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -1,4 +1,5 @@ -using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.Domain.Share; using System.ComponentModel.DataAnnotations; namespace IRaCIS.Core.Application.Contracts @@ -318,6 +319,14 @@ namespace IRaCIS.Core.Application.Contracts } + + public class CheckDialogDTO + { + public QCCheckViewModel SubjectVisitCheck { get; set; } + + public List DialogList { get; set; } + } + public class QCCheckViewModel { public string? TalkContent { get; set; } = String.Empty; diff --git a/IRaCIS.Core.Application/Service/QC/Interface/IQCListService.cs b/IRaCIS.Core.Application/Service/QC/Interface/IQCListService.cs index 7c74e9884..411abbe0e 100644 --- a/IRaCIS.Core.Application/Service/QC/Interface/IQCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/Interface/IQCListService.cs @@ -7,7 +7,7 @@ namespace IRaCIS.Core.Application.Image.QA { public interface IQCListService { - Task> GetCheckChallengeDialogList(Guid subjectVisitId); + Task GetCheckChallengeDialogList(Guid subjectVisitId); Task, TrialSubjectAndSVConfig>> GetConsistencyVerificationList(CheckQuery checkQuery); Task, TrialSubjectAndSVConfig>> GetCRCChallengeList(ChallengeQuery challengeQuery); Task> GetCRCVisitChallengeAndDialog(Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess); diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 6b1b5369b..60eddcb34 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -42,10 +42,10 @@ namespace IRaCIS.Core.Application.Image.QA if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.InPlan == false); - + } - + } return svExpression; @@ -75,7 +75,7 @@ namespace IRaCIS.Core.Application.Image.QA } - + } return svExpression; @@ -93,21 +93,21 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost] public async Task, TrialSubjectAndSVConfig>> GetCRCVisitList(CRCVisitSearchDTO visitSearchDTO) { - var svExpression= GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); + var svExpression = GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) - .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) - .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) - .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.SubjectInfo), t => t.Subject.Code.Contains(visitSearchDTO.SubjectInfo)) + var query = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) + .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) + .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) + .WhereIf(!string.IsNullOrEmpty(visitSearchDTO.SubjectInfo), t => t.Subject.Code.Contains(visitSearchDTO.SubjectInfo)) - .WhereIf(visitSearchDTO.VisitPlanArray != null && visitSearchDTO.VisitPlanArray?.Length > 0, svExpression) - //.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) - .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) - .WhereIf(visitSearchDTO.SubmitState != null, t => t.SubmitState == visitSearchDTO.SubmitState) - .WhereIf(visitSearchDTO.ChallengeState != null, t => t.ChallengeState == visitSearchDTO.ChallengeState) - .WhereIf(visitSearchDTO.IsUrgent != null, t => t.IsUrgent == visitSearchDTO.IsUrgent) - .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) - .ProjectTo(_mapper.ConfigurationProvider); + .WhereIf(visitSearchDTO.VisitPlanArray != null && visitSearchDTO.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) + .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) + .WhereIf(visitSearchDTO.SubmitState != null, t => t.SubmitState == visitSearchDTO.SubmitState) + .WhereIf(visitSearchDTO.ChallengeState != null, t => t.ChallengeState == visitSearchDTO.ChallengeState) + .WhereIf(visitSearchDTO.IsUrgent != null, t => t.IsUrgent == visitSearchDTO.IsUrgent) + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) + .ProjectTo(_mapper.ConfigurationProvider); var pageList = await query.ToPagedListAsync(visitSearchDTO.PageIndex, visitSearchDTO.PageSize, visitSearchDTO.SortField, visitSearchDTO.Asc); @@ -166,7 +166,7 @@ namespace IRaCIS.Core.Application.Image.QA var svExpression = GetQCChallengeFilter(challengeQuery.VisitPlanArray); var query2 = _repository.Where(x => x.TrialId == challengeQuery.TrialId) - //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) + //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) .WhereIf(challengeQuery.ReuploadEnum != null, t => t.ReuploadEnum == challengeQuery.ReuploadEnum) .WhereIf(challengeQuery.IsClosed != null, t => t.IsClosed == challengeQuery.IsClosed) .WhereIf(challengeQuery.SiteId != null, t => t.SubjectVisit.SiteId == challengeQuery.SiteId) @@ -255,7 +255,7 @@ namespace IRaCIS.Core.Application.Image.QA var svExpression = GetQCChallengeFilter(challengeQuery.VisitPlanArray); var query = _repository.Where(x => x.TrialId == challengeQuery.TrialId) - //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) + //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) .WhereIf(challengeQuery.ReuploadEnum != null, t => t.ReuploadEnum == challengeQuery.ReuploadEnum) .WhereIf(challengeQuery.IsClosed != null, t => t.IsClosed == challengeQuery.IsClosed) .WhereIf(challengeQuery.SiteId != null, t => t.SubjectVisit.SiteId == challengeQuery.SiteId) @@ -452,12 +452,12 @@ namespace IRaCIS.Core.Application.Image.QA //.WhereIf(visitSearchDTO.AuditState != null, t => t.AuditState == visitSearchDTO.AuditState) .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) - .WhereIf(visitSearchDTO.HandleUserId != null, t => t.PreliminaryAuditUserId == visitSearchDTO.HandleUserId || t.CurrentActionUserId== visitSearchDTO.HandleUserId + .WhereIf(visitSearchDTO.HandleUserId != null, t => t.PreliminaryAuditUserId == visitSearchDTO.HandleUserId || t.CurrentActionUserId == visitSearchDTO.HandleUserId || t.ReviewAuditUserId == visitSearchDTO.HandleUserId || t.QCChallengeList.Any(t => t.CreateUserId == visitSearchDTO.HandleUserId) || t.QCChallengeDialogList.Any(t => t.CreateUserId == visitSearchDTO.HandleUserId)) .WhereIf(visitSearchDTO.IsUrgent != null, t => t.IsUrgent == visitSearchDTO.IsUrgent) - .Where(t=>t.SubmitState!=SubmitStateEnum.None) + .Where(t => t.SubmitState != SubmitStateEnum.None) //.WhereIf(visitSearchDTO.SubmitState != null, t => t.SubmitState == visitSearchDTO.SubmitState) //.WhereIf(visitSearchDTO.ChallengeState != null, t => t.ChallengeState == visitSearchDTO.ChallengeState) .ProjectTo(_mapper.ConfigurationProvider); @@ -554,15 +554,15 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpGet("{subjectVisitId:guid}")] - public async Task> GetCheckChallengeDialogList(Guid subjectVisitId) + public async Task GetCheckChallengeDialogList(Guid subjectVisitId) { - var list = await _repository.Where(t => t.SubjectVisitId == subjectVisitId).OrderBy(t => t.CreateTime) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var sv = (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) + .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - list.ForEach(t => t.IsCurrentUser = _userInfo.Id == t.CreateUserId); + sv.DialogList.ForEach(t => t.IsCurrentUser = _userInfo.Id == t.CreateUserId); - return list; + return sv; } /// @@ -608,7 +608,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task GetVisitQCInfo(Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) { var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); - + var temp = await GetVisitQCStudyAndSeriesList(subjectVisitId); var qacheckList = await GetQCQuestionAnswerList(subjectVisitId, sv.TrialId, trialQCProcess, currentQCType); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 85ebb563e..3b3505910 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -949,9 +949,11 @@ 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); + + return ResponseOutput.Ok(); } diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 033eb86f9..1ebbd5026 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -148,6 +148,15 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)); + //一致性核查 质疑对话 + CreateMap() + .ForMember(d => d.CreateUserName, u => u.MapFrom(t => t.CreateUser.UserName)) + .ForMember(d => d.CreateUserFullName, u => u.MapFrom(t => t.CreateUser.FullName)); + + CreateMap() + .ForMember(d => d.SubjectVisitCheck, u => u.MapFrom(t => t)) + .ForMember(d => d.DialogList, u => u.MapFrom(t => t.CheckChallengeDialogList.OrderBy(t => t.CreateTime))); + CreateMap() .ForMember(d => d.ForwardUserName, u => u.MapFrom(s => s.ForwardUser.UserName)) @@ -179,10 +188,8 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path + "?access_token=" + token)); - //一致性核查 质疑对话 - CreateMap() - .ForMember(d => d.CreateUserName, u => u.MapFrom(t => t.CreateUser.UserName)) - .ForMember(d => d.CreateUserFullName, u => u.MapFrom(t => t.CreateUser.FullName)); + + //QC 质疑对话