diff --git a/IRaCIS.Core.API/Controllers/ExtraController.cs b/IRaCIS.Core.API/Controllers/ExtraController.cs index 46daf138f..de3d78b2c 100644 --- a/IRaCIS.Core.API/Controllers/ExtraController.cs +++ b/IRaCIS.Core.API/Controllers/ExtraController.cs @@ -226,7 +226,7 @@ namespace IRaCIS.Api.Controllers if (!await _userRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd)) { - decodeUrl = errorUrl+ $"?ErrorMessage={System.Web.HttpUtility.UrlEncode(lang=="zh"? "您的初始化链接已过期": "Error!The initialization link has expired. Return")} "; + decodeUrl = errorUrl+ $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang=="zh"? "您的初始化链接已过期": "Error!The initialization link has expired. Return")} "; } return Redirect(decodeUrl); diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html index da4236584..f9ed9d945 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html @@ -8,7 +8,7 @@
- Dear {0}, + 亲爱的用户 {0},
感谢您使用展影云平台。 diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon_US.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon_US.html index b9fe3583e..0ec66aabd 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon_US.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon_US.html @@ -8,7 +8,7 @@
- Dear {0}, + Dear Sir or Madam {0},
Thank you for using our IRC imaging system. diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 7a9addc24..dcda22ad5 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -9922,6 +9922,7 @@ + @@ -9929,6 +9930,8 @@ 重阅申请待审核 + + @@ -9936,6 +9939,8 @@ 阅片人筛选 + + vvv @@ -9943,6 +9948,8 @@ 重阅审批 + + @@ -9959,6 +9966,7 @@ + @@ -10003,7 +10011,7 @@ - IR 影像阅片 待阅量 复杂 --未完成 + IR 影像阅片 待阅量 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 5c292742b..cd1501d3f 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -1416,7 +1416,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //添加申请记录 var visitTaskReReading = await _visitTaskReReadingRepository.AddAsync(new VisitTaskReReading() { - + TrialId=applyReReadingCommand.TrialId, RootReReadingTaskId = rootReReadingTaskId == Guid.Empty ? task.Id : rootReReadingTaskId, OriginalReReadingTaskId = task.Id, RequestReReadingTime = DateTime.Now, diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs index f017afe8d..d3604a473 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs @@ -175,7 +175,7 @@ namespace IRaCIS.Core.Application.Contracts public string CriterionName { get; set; } public int? UrgentCount { get; set; } - public int? ToBeDealedCount { get; set; } + public int? ToBeReplyedCount { get; set; } } public class ImageCheckQuestionToBeDoneQuery : PageInput @@ -187,7 +187,7 @@ namespace IRaCIS.Core.Application.Contracts { public int? UrgentCount { get; set; } - public int? ToBeDealedCount { get; set; } + public int? ToBeReplyedCount { get; set; } } public class ImageSubmittedToBeDoneQuery : PageInput @@ -228,7 +228,7 @@ namespace IRaCIS.Core.Application.Contracts { public int? UrgentCount { get; set; } - public int? ToBeDealedCount { get; set; } + public int? ToBeReUploadCount { get; set; } } public class ImageClinicalDataToBeDoneQuery : PageInput @@ -243,7 +243,37 @@ namespace IRaCIS.Core.Application.Contracts public int? ToBeDealedCount { get; set; } } + public class TrialToBeDoneQuery : PageInput + { + public string ExperimentName { get; set; } = string.Empty; + public string Code { get; set; } = string.Empty; + + public string ResearchProgramNo { get; set; } = string.Empty; + + public Guid? SponsorId { get; set; } + + + } + + public class TrialToBeDoneDto : TrialBaseInfoDto + { + + public Guid Id => TrialId; + + public DateTime? CreateTime { get; set; } + + public string Sponsor { get; set; } + + public string TrialStatusStr { get; set; } + + + + public int? ExpetiedTaskCount { get; set; } + + public int? ReReadingApprovalCount { get; set; } + + } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index e38888ceb..49710b2be 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -1,4 +1,6 @@ -using IRaCIS.Core.Application.Contracts; +using IRaCIS.Application.Contracts; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.AspNetCore.Mvc; @@ -164,19 +166,22 @@ namespace IRaCIS.Core.Application #region PM APM 待办 + /// /// 一致性核查待处理 /// /// /// + /// /// [HttpPost] - public async Task> GetCheckToBeDoneList(CheckToBeDoneQuery inQuery, + public async Task>> GetCheckToBeDoneList(CheckToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new CheckToBeDoneDto() { TrialId = t.Id, @@ -184,14 +189,25 @@ namespace IRaCIS.Core.Application ExperimentName = t.ExperimentName, TrialCode = t.TrialCode, UrgentCount = t.SubjectVisitList.Where(u => (u.CheckState == CheckStateEnum.ToCheck || u.CheckState == CheckStateEnum.CVIng) && u.IsUrgent).Count(), + ToBeCheckedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.ToCheck).Count(), + ToBeRepliedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.ToCheck && u.CheckChallengeDialogList.Any(t => t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)).Count(), }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var totalToBeCheckedCount = await _subjectVisitRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.CheckState == CheckStateEnum.ToCheck).CountAsync(); + + var totalToBeRepliedCount = await _subjectVisitRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.CheckState == CheckStateEnum.ToCheck && + u.CheckChallengeDialogList.Any(t => t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)).CountAsync(); + + return ResponseOutput.Ok(result, new { TotalToBeCheckedCount = totalToBeCheckedCount, TotalToBeRepliedCount = totalToBeRepliedCount }); } @@ -199,14 +215,18 @@ namespace IRaCIS.Core.Application /// 重阅申请待审核 /// /// + /// + /// /// [HttpPost] - public async Task> GetReReadingApplyToBeDoneList(ReReadingApplyToBeDoneQuery inQuery, + public async Task>> GetReReadingApplyToBeDoneList(ReReadingApplyToBeDoneQuery inQuery, [FromServices] IRepository _visitTaskReReadingRepository, [FromServices] IRepository _trialRepository) { - var query = _visitTaskReReadingRepository.Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed) + var query = _visitTaskReReadingRepository + .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed) .GroupBy(t => new { t.OriginalReReadingTask.Trial.ExperimentName, t.OriginalReReadingTask.Trial.ResearchProgramNo, t.OriginalReReadingTask.Trial.TrialCode, t.OriginalReReadingTask.TrialId }) .Select(g => new ReReadingApplyToBeDoneDto() { @@ -222,11 +242,17 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + + var toBeApprovalCount = _visitTaskReReadingRepository + .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeApprovalCount = toBeApprovalCount }); } + #endregion @@ -236,13 +262,16 @@ namespace IRaCIS.Core.Application /// 阅片人筛选 /// /// + /// + /// /// vvv [HttpPost] - public async Task> GetReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery + public async Task>> GetReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery , [FromServices] IRepository _enrollRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ReviewerSelectToBeDoneDto() { TrialId = t.Id, @@ -256,7 +285,10 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeApprovalCount = await _enrollRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.EnrollStatus == EnrollStatus.HasCommittedToCRO).CountAsync(); + + return ResponseOutput.Ok(result, new { ToBeApprovalCount = toBeApprovalCount }); ; } @@ -264,14 +296,18 @@ namespace IRaCIS.Core.Application /// 重阅审批 /// /// + /// + /// /// [HttpPost] - public async Task> GetReReadingApprovalToBeDoneToBeDoneList(ReReadingApprovalToBeDoneQuery inQuery, + public async Task>> GetReReadingApprovalToBeDoneToBeDoneList(ReReadingApprovalToBeDoneQuery inQuery, [FromServices] IRepository _visitTaskReReadingRepository, [FromServices] IRepository _trialRepository) { - var query = _visitTaskReReadingRepository.Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed) + var query = _visitTaskReReadingRepository + .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed) .GroupBy(t => new { t.OriginalReReadingTask.Trial.ExperimentName, t.OriginalReReadingTask.Trial.ResearchProgramNo, t.OriginalReReadingTask.Trial.TrialCode, t.OriginalReReadingTask.TrialId }) .Select(g => new ReReadingApprovalToBeDoneDto() { @@ -287,7 +323,11 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeApprovalCount = _visitTaskReReadingRepository + .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeApprovalCount = toBeApprovalCount }); } @@ -304,12 +344,13 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetImageClinicalDataToBeDoneList(ImageClinicalDataToBeDoneQuery inQuery, + public async Task>> GetImageClinicalDataToBeDoneList(ImageClinicalDataToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Where(t => t.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm)) .Select(t => new ImageClinicalDataToBeDoneDto() { @@ -324,7 +365,11 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id) && t.Trial.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm)) + .Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeDealedCount = toBeDealedCount }); } @@ -337,14 +382,16 @@ namespace IRaCIS.Core.Application /// /// /// + /// /// [HttpPost] - public async Task> GetCRCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, + public async Task>> GetCRCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ImageQuestionToBeDoneDto() { TrialId = t.Id, @@ -353,6 +400,7 @@ namespace IRaCIS.Core.Application TrialCode = t.TrialCode, UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC && u.SubjectVisit.IsUrgent).Count(), + ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(), @@ -361,7 +409,12 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .SelectMany(c => c.QCChallengeList) + .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeDealedCount = toBeDealedCount }); } @@ -372,12 +425,13 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetImageCheckQuestionToBeDoneList(ImageCheckQuestionToBeDoneQuery inQuery, + public async Task>> GetImageCheckQuestionToBeDoneList(ImageCheckQuestionToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ImageCheckQuestionToBeDoneDto() { TrialId = t.Id, @@ -385,13 +439,21 @@ namespace IRaCIS.Core.Application ExperimentName = t.ExperimentName, TrialCode = t.TrialCode, UrgentCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply && u.IsUrgent).Count(), - ToBeDealedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count() + ToBeReplyedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count() }); + + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReplyedCount = toBeDealedCount }); + } @@ -403,12 +465,13 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetImageReUploadToBeDoneList(ImageReUploadToBeDoneQuery inQuery, + public async Task>> GetImageReUploadToBeDoneList(ImageReUploadToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ImageReUploadToBeDoneDto() { TrialId = t.Id, @@ -416,13 +479,17 @@ namespace IRaCIS.Core.Application ExperimentName = t.ExperimentName, TrialCode = t.TrialCode, UrgentCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsUrgent && u.IsPMBackOrReReading).Count(), - ToBeDealedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count(), + ToBeReUploadCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count(), }); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); } @@ -436,12 +503,13 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetImageSubmittedToBeDoneList(ImageSubmittedToBeDoneQuery inQuery, + public async Task>> GetImageSubmittedToBeDoneList(ImageSubmittedToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ImageSubmittedToBeDoneDto() { TrialId = t.Id, @@ -455,7 +523,11 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); } @@ -474,12 +546,14 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetImageQualityToBeDoneList(ImageQualityToBeDoneQuery inQuery, + public async Task>> GetImageQualityToBeDoneList(ImageQualityToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { - var query = _trialRepository.Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit) + var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit) .Select(t => new ImageQualityToBeDoneDto() { TrialId = t.Id, @@ -501,7 +575,12 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); } @@ -513,12 +592,13 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetQCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, + public async Task>> GetQCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, [FromServices] IRepository _subjectVisitRepository, [FromServices] IRepository _trialRepository) { var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Select(t => new ImageQuestionToBeDoneDto() { TrialId = t.Id, @@ -534,7 +614,12 @@ namespace IRaCIS.Core.Application var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _subjectVisitRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .SelectMany(c => c.QCChallengeList) + .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); } @@ -544,7 +629,7 @@ namespace IRaCIS.Core.Application #region IR待办 /// - /// IR 影像阅片 待阅量 复杂 --未完成 + /// IR 影像阅片 待阅量 /// /// /// @@ -552,12 +637,52 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task> GetIRImageReadingToBeDoneList(IRImageReadingToBeDoneQuery inQuery, + public async Task>> GetIRImageReadingToBeDoneList(IRImageReadingToBeDoneQuery inQuery, [FromServices] IRepository _visitTaskRepository, [FromServices] IRepository _trialReadingCriterionRepository, [FromServices] IRepository _trialRepository) { + + var newQuery = _trialReadingCriterionRepository.Where(t => t.IsConfirm == true && t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Select(c => new IRImageReadingToBeDoneDto() + { + TrialId = c.TrialId, + ResearchProgramNo = c.Trial.ResearchProgramNo, + ExperimentName = c.Trial.ExperimentName, + TrialCode = c.Trial.TrialCode, + CriterionName = c.CriterionName, + TrialReadingCriterionId = c.Id, + + UrgentCount = c.VisitTaskList.AsQueryable().Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect) + // 前序 不存在 未一致性核查未通过的 + .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) + //前序 不存在 未生成任务的访视 + //.Where(t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true) + + .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) + .Count(t => t.IsUrgent), + + + UnReadCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect) + // 前序 不存在 未一致性核查未通过的 + .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) + //前序 不存在 未生成任务的访视 + //.WhereIf(g.Key.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum)) + //.Where(t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true) + + .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) + .Count(), + + + + HaveSignedCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) + && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), + }) + + ; + + #region 废弃 //var query = _trialRepository // .Select(t => new IRImageReadingToBeDoneDto() // { @@ -585,48 +710,7 @@ namespace IRaCIS.Core.Application // }); - - var newQuery= _trialReadingCriterionRepository.Where(t=>t.IsConfirm==true && t.Trial.TrialUserList.Any(t=>t.UserId==_userInfo.Id)) - .Select(c => new IRImageReadingToBeDoneDto() - { - TrialId = c.TrialId, - ResearchProgramNo = c.Trial.ResearchProgramNo, - ExperimentName = c.Trial.ExperimentName, - TrialCode = c.Trial.TrialCode, - CriterionName = c.CriterionName, - TrialReadingCriterionId = c.Id, - - UrgentCount = c.VisitTaskList.AsQueryable().Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect) - // 前序 不存在 未一致性核查未通过的 - .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) - //前序 不存在 未生成任务的访视 - //.Where(t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true) - - .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) - .Count(t => t.IsUrgent), - - - UnReadCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect) - // 前序 不存在 未一致性核查未通过的 - .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) - //前序 不存在 未生成任务的访视 - //.WhereIf(g.Key.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum)) - //.Where(t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true) - - .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) - .Count(), - - - - HaveSignedCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) - && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), - }) - - ; - - - - + // 不能对包含聚合或子查询的表达式执行聚合函数 //var query = _visitTaskRepository.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)) // .GroupBy(t => new { t.TrialId, t.Trial.ResearchProgramNo, t.Trial.TrialCode, t.Trial.ExperimentName, t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionName, t.TrialReadingCriterion.IsAutoCreate }) @@ -662,10 +746,25 @@ namespace IRaCIS.Core.Application // && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), // }); + #endregion - var result = await newQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ?nameof(IRImageReadingToBeDoneDto.TrialId): inQuery.SortField, inQuery.Asc); - return result; + + var result = await newQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(IRImageReadingToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); + + var toBeDealedCount = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .SelectMany(t => t.VisitTaskList) + .Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect) + // 前序 不存在 未一致性核查未通过的 + .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) + //前序 不存在 未生成任务的访视 + .Where(t => t.TrialReadingCriterion.IsAutoCreate == false ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true) + + .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) + .Count(); + + return ResponseOutput.Ok(result, new { TotalUnReadCount = toBeDealedCount }); } @@ -677,11 +776,12 @@ namespace IRaCIS.Core.Application /// [HttpPost] - public async Task> GetIRMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, + public async Task>> GetIRMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, [FromServices] IRepository _taskMedicalReviewRepository) { var query = _taskMedicalReviewRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Where(t => t.IsClosedDialog == false) .GroupBy(t => new { @@ -703,14 +803,19 @@ namespace IRaCIS.Core.Application UrgentCount = g.Where(u => u.VisitTask.IsUrgent && u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(), - ToBeDealedCount = g.Where(u => + ToBeReplyedCount = g.Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(), }); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _taskMedicalReviewRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.IsClosedDialog == false) + .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); } @@ -728,11 +833,12 @@ namespace IRaCIS.Core.Application /// [HttpPost] - public async Task> GetMIMMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, + public async Task>> GetMIMMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, [FromServices] IRepository _taskMedicalReviewRepository) { var query = _taskMedicalReviewRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Where(t => t.IsClosedDialog == false) .GroupBy(t => new { @@ -754,15 +860,63 @@ namespace IRaCIS.Core.Application UrgentCount = g.Where(u => u.VisitTask.IsUrgent && u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(), - ToBeDealedCount = g.Where(u => + ToBeReplyedCount = g.Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(), }); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - return result; + var toBeDealedCount = _taskMedicalReviewRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.IsClosedDialog == false) + .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(); + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); + + } + + #endregion + + + #region 项目列表查询 + + + [HttpPost] + public async Task>> GetTrialToBeDoneList(TrialToBeDoneQuery inQuery, + [FromServices] IRepository _taskMedicalReviewRepository) + { + + + + var query = _trialRepository.AsQueryable().IgnoreQueryFilters() + + .WhereIf(inQuery.SponsorId != null, o => o.SponsorId == inQuery.SponsorId) + .WhereIf(!string.IsNullOrEmpty(inQuery.Code), o => o.TrialCode.Contains(inQuery.Code)) + .WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo)) + .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName)) + .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false) + .Select(t => new TrialToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + CreateTime=t.CreateTime, + Sponsor= _userInfo.IsEn_Us? t.Sponsor.SponsorName:t.Sponsor.SponsorNameCN, + TrialStatusStr=t.TrialStatusStr, + + + + }); + + + + //.ProjectTo(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id }); + + var result= await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "CreateTime" : inQuery.SortField, inQuery.Asc); + + return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = 0 }); } #endregion diff --git a/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs b/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs index f33650584..55e949d0c 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs @@ -17,7 +17,7 @@ namespace IRaCIS.Core.Domain.Models [Table("VisitTaskReReading")] public class VisitTaskReReading : Entity, IAuditUpdate, IAuditAdd { - + public Guid TrialId { get; set; } //重阅原始任务Id 重阅会产生新的任务 public Guid OriginalReReadingTaskId { get; set; }