diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index f748685ee..d5b02da56 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -2517,6 +2517,13 @@ + + + 获取项目标准其他问题 + + + + 获取系统临床问题 @@ -2545,6 +2552,13 @@ + + + 获取系统其他问题 + + + + 获取系统表格问题 @@ -2587,6 +2601,18 @@ + + + 同步系统问题 + + + + + + + 是否应用 + + 名称 @@ -2637,6 +2663,11 @@ 文件路径 + + + 是否应用 + + 枚举 @@ -2817,7 +2848,7 @@ 问题英文名称 - + 临床问题类型(分组,单选。) @@ -2877,6 +2908,21 @@ 显示类型 + + + 是否是检查日期 + + + + + 小数点位数 + + + + + 单位 + + 查询临床数据基类 @@ -2947,7 +2993,7 @@ 问题英文名称 - + 临床问题类型(分组,单选。) @@ -3002,6 +3048,16 @@ 外层问题Id + + + 小数点位数 + + + + + 单位 + + 项目临床数据问题 @@ -3057,6 +3113,21 @@ 获取系统临床数据 + + + 系统临床数据Id + + + + + 项目临床数据Id + + + + + 项目临床数据Id + + 项目中心Code @@ -8684,6 +8755,11 @@ ISubjectCriteriaEvaluationService + + + IClinicalQuestionService + + IOrganInfoService @@ -10314,14 +10390,23 @@ - - - 阅片人筛选 - - - - - vvv + + + PM 阅片人筛选 + + + + + vvv + + + + SPM 阅片人筛选 + + + + + vvv @@ -10411,8 +10496,18 @@ MIM医学反馈 + + + + 获取某项目 某标准 第一条未读的医学审核 + + + + + + 阅片信息签名验证接口 @@ -11350,6 +11445,22 @@ 临床数据配置 + + + 应用系统临床数据 + + + + + + + + 应用项目临床数据 + + + + + 新增或者修改(系统) diff --git a/IRaCIS.Core.Application/Service/Allocation/Interface/ITaskMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Allocation/Interface/ITaskMedicalReviewService.cs index 81a77a470..6e458fbef 100644 --- a/IRaCIS.Core.Application/Service/Allocation/Interface/ITaskMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/Interface/ITaskMedicalReviewService.cs @@ -17,7 +17,7 @@ namespace IRaCIS.Core.Application.Interfaces //Task> GetTaskMedicalReviewList(TaskMedicalReviewQuery queryTaskMedicalReview); - - + Task GetNextMedicalReviewTask(GetNextMedicalReviewTaskInDto inDto); + Task>> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery); } } diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewService.cs index 0d36cb89a..770d89a9e 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskMedicalReviewService.cs @@ -138,7 +138,7 @@ namespace IRaCIS.Core.Application.Service { var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.MedicalReviewId).Include(x=>x.VisitTask).FirstNotNullAsync(); - var subjectReview = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery() + var subjectReview = (await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery() { TrialId = medicalReview.TrialId, @@ -148,14 +148,14 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId, PageIndex=1, PageSize=1, - }); + })).Data; - if (subjectReview.Item1.CurrentPageData.Count == 1) + if (subjectReview.CurrentPageData.Count == 1) { - return subjectReview.Item1.CurrentPageData[0]; + return subjectReview.CurrentPageData[0]; } - var data = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery() + var data = (await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery() { TrialId = medicalReview.TrialId, @@ -164,11 +164,11 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId, PageIndex = 1, PageSize = 1, - }); + })).Data; - if (data.Item1.CurrentPageData.Count == 1) + if (data.CurrentPageData.Count == 1) { - return data.Item1.CurrentPageData[0]; + return data.CurrentPageData[0]; } else { @@ -186,7 +186,7 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task<(PageOutput, object)> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery) + public async Task>> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery) { var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId && t.MedicalManagerUserId == _userInfo.Id&&t.VisitTask.TrialReadingCriterionId==inQuery.TrialReadingCriterionId) @@ -206,7 +206,7 @@ namespace IRaCIS.Core.Application.Service var pageList = await taskMedicalReviewQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TaskMedicalReviewView.Id) : inQuery.SortField, inQuery.Asc); - return (pageList, new + return ResponseOutput.Ok(pageList, new { IsConfirmMedicineQuestion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inQuery.TrialReadingCriterionId).Select(x => x.IsConfirmMedicineQuestion).FirstOrDefaultAsync() diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs index 3d6424620..5f446672e 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs @@ -170,6 +170,15 @@ namespace IRaCIS.Core.Application.Contracts } + public class MedicalCommentsFirstToBeDoneQuery + { + [NotDefault] + public Guid TrialId { get; set; } + + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + } + public class MedicalCommentsToBeDoneDto : TrialBaseInfoDto { public Guid TrialReadingCriterionId { get; set; } @@ -177,6 +186,8 @@ namespace IRaCIS.Core.Application.Contracts public int? UrgentCount { get; set; } public int? ToBeReplyedCount { get; set; } + + public int? ToBeReviewedCount { get; set; } } public class ImageCheckQuestionToBeDoneQuery : PageInput @@ -291,7 +302,7 @@ namespace IRaCIS.Core.Application.Contracts } - public class TrialUserToBeDoneQuery + public class TrialUserToBeDoneQuery { [NotDefault] public Guid TrialId { get; set; } @@ -337,6 +348,8 @@ namespace IRaCIS.Core.Application.Contracts public int? Medical_MIM_ToBeDealedCount { get; set; } + public int? Medical_MIM_ToBeReviewedCount { get; set; } + public int? Medical_IR_ToBeDealedCount { get; set; } public int UserTotalToBeDoneCount => new[] @@ -356,7 +369,8 @@ namespace IRaCIS.Core.Application.Contracts Reading_SPM_ToBeApprovalCount ?? 0, Reading_PM_ToBeApprovalCount ?? 0, Medical_MIM_ToBeDealedCount ?? 0, - Medical_IR_ToBeDealedCount ?? 0 + Medical_IR_ToBeDealedCount ?? 0, + Medical_MIM_ToBeReviewedCount??0 }.Sum(); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index 9717d09dc..e15c0c766 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -1,7 +1,10 @@ using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Application.Interfaces; +using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure.Extention; using MathNet.Numerics; using Microsoft.AspNetCore.Mvc; @@ -255,6 +258,40 @@ namespace IRaCIS.Core.Application } + /// + ///PM 阅片人筛选 + /// + /// + /// + /// + /// vvv + [HttpPost] + public async Task>> GetPM_ReviewerSelectToBeDoneList(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, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + + IsUrgent = t.IsUrgent || t.IsSubjectExpeditedView, + ToBeApprovalCount = t.EnrollList.Where(u => u.EnrollStatus == EnrollStatus.InviteIntoGroup).Count() + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + 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 }); ; + + } + #endregion @@ -262,14 +299,14 @@ namespace IRaCIS.Core.Application #region SPM CPM 待办 /// - /// 阅片人筛选 + ///SPM 阅片人筛选 /// /// /// /// /// vvv [HttpPost] - public async Task>> GetReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery + public async Task>> GetSPM_ReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery , [FromServices] IRepository _enrollRepository, [FromServices] IRepository _trialRepository) { @@ -653,6 +690,10 @@ namespace IRaCIS.Core.Application } + + + + #endregion @@ -845,7 +886,7 @@ namespace IRaCIS.Core.Application .Where(t => t.IsClosedDialog == false && t.VisitTask.DoctorUserId == _userInfo.Id) .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(); - return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); + return ResponseOutput.Ok(result, new { TotalToBeReplyedCount = toBeDealedCount }); } @@ -860,6 +901,7 @@ namespace IRaCIS.Core.Application /// MIM医学反馈 /// /// + /// /// [HttpPost] @@ -893,19 +935,63 @@ namespace IRaCIS.Core.Application ToBeReplyedCount = g.Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(), + ToBeReviewedCount=g.Where(u => !u.IsInvalid && u.AuditState != MedicalReviewAuditState.HaveSigned).Count() + }); var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); - var toBeDealedCount = _taskMedicalReviewRepository + var toBeReplyedQuery = _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(); + .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer); - return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount }); + var toBeReplyedCount = toBeReplyedQuery.Count(); + + var tobeReviewedCount = _taskMedicalReviewRepository + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.IsClosedDialog == false) + .Where(u => !u.IsInvalid && u.AuditState != MedicalReviewAuditState.HaveSigned).Count(); + + //var firstToBeDone = toBeDealedQuery.ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); + + return ResponseOutput.Ok(result, new { TotalToBeReplyedCount = toBeReplyedCount, TotalTobeReviewedCount = tobeReviewedCount }); } + + /// + /// 获取某项目 某标准 第一条未读的医学审核 + /// + /// + /// + /// + /// + public async Task GetMedicalCommentsFirstToBeDone(MedicalCommentsFirstToBeDoneQuery inQuery, + [FromServices] ITaskMedicalReviewService _taskMedicalReviewService) + { + var result = await _taskMedicalReviewService.GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery() + { + TrialId = inQuery.TrialId, + IsGetBeRead = true, + PageIndex = 1, + PageSize = 1, + TrialReadingCriterionId = inQuery.TrialReadingCriterionId + }); + + if (result.Data.CurrentPageData.Count == 1) + { + return result.Data.CurrentPageData[0]; + } + else + { + throw new BusinessValidationFailedException(_localizer["MedicalReview_Finish"]); + } + } + + + + #endregion @@ -1086,13 +1172,18 @@ namespace IRaCIS.Core.Application .Where(t => t.IsClosedDialog == false) .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count() : 0, + Medical_MIM_ToBeReviewedCount= + (t.User.UserTypeEnum == UserTypeEnum.MIM) ? + t.Trial.TaskMedicalReviewList + .Where(t => t.IsClosedDialog == false) + .Where(u => !u.IsInvalid && u.AuditState != MedicalReviewAuditState.HaveSigned).Count():0 }); var list = await query.ToListAsync(); - var result = list.Where(t => t.UserTotalToBeDoneCount > 0).OrderBy(t=>t.UserType).ToList(); + var result = list.Where(t => t.UserTotalToBeDoneCount > 0).OrderBy(t => t.UserType).ToList(); //var result= list.GroupBy(t => t.UserType).ToDictionary(g => g.Key, g => g.ToList());