diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index 96ded117f..6f94ee5b8 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -115,12 +115,6 @@ Always - - Always - - - Always - Always diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate.rar b/IRaCIS.Core.API/wwwroot/EmailTemplate.rar deleted file mode 100644 index 947adef16..000000000 Binary files a/IRaCIS.Core.API/wwwroot/EmailTemplate.rar and /dev/null differ diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate.zip b/IRaCIS.Core.API/wwwroot/EmailTemplate.zip deleted file mode 100644 index 39ac004c0..000000000 Binary files a/IRaCIS.Core.API/wwwroot/EmailTemplate.zip and /dev/null differ diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html deleted file mode 100644 index 0d184d0a3..000000000 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Title - - -
-
-
- 您好: -
-
- 感谢您使用展影云平台。 -
-
- {0}。 -
- -
-
祝您顺利!/Best Regards
-
上海展影医疗科技有限公司
-
-
-
- - diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest_US.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest_US.html deleted file mode 100644 index 183b8a835..000000000 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest_US.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Title - - -
-
-
- Dear: -
-
- Thank you for using Extensive Imaging Cloud System. -
-
- {0}。 -
- -
-
Best Regards
-
Shanghai Extensive Imaging Medical Technology Co., LTD
-
-
-
- - diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index ab840c866..ecee6e76d 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -9904,18 +9904,126 @@ - Site 调研 每个项目 需要处理的审批统计 + 中心调研 每个项目 需要处理的审批统计 - 需要签署文件数量 系统级别的在第一行 + 待签署的项目文件 需要签署文件数量 系统级别的在第一行 + + + 一致性核查待处理 + + + + + + + + 重阅申请待审核 + + + + + + + 阅片人筛选 + + + vvv + + + + 重阅审批 + + + + + + + 临床数据 + + + + + + + + CRC影像质疑待处理 + + + + + + + + 核查质疑待处理 + + + + + + + + 影像重传 + + + + + + + + 加急影像提交 + + + + + + + + 影像质控 待领取 跟项目配置有关系 --未完成 + + + + + + + + QC 质疑 + + + + + + + + IR 影像阅片 待阅量 复杂 --未完成 + + + + + + + + + IR医学反馈 + + + + + + + MIM医学反馈 + + + + 阅片信息签名验证接口 diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index f6cf2a275..f784e4c89 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -398,7 +398,7 @@ namespace IRaCIS.Application.Services await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); - routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; + routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us?"en":"zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); @@ -512,7 +512,7 @@ namespace IRaCIS.Application.Services { var templateInfo = SourceReader.ReadToEnd(); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); @@ -576,7 +576,7 @@ namespace IRaCIS.Application.Services var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; @@ -694,7 +694,7 @@ namespace IRaCIS.Application.Services { var templateInfo = SourceReader.ReadToEnd(); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&access_token=" + token; + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); diff --git a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs index 8cf99be11..009323dfc 100644 --- a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs @@ -157,7 +157,7 @@ namespace IRaCIS.Core.Application.Contracts public async Task> GetTrialUserTypeList() { var query = userTypeServiceRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin) - //.Where(t => t.Type == UserTypeGroup.TrialUser) + .Where(t => !t.UserTypeGroupList.Any(t=> t.Group.Code=="3")) .OrderBy(t => t.Order).ProjectTo(_mapper.ConfigurationProvider); return await query.ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs index ad6e0cb8b..863b85a5b 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs @@ -42,7 +42,7 @@ namespace IRaCIS.Core.Application.Contracts public int? TotalNeedSignDocCount => TotalNeedSignTrialDocCount + TotalNeedSignSystemDocCount; - public int? TotalApprovalRequiredCount { get; set; } + public int? TotalApprovalRequiredCount { get; set; } public int? TotalSystemNoticeCount { get; set; } @@ -56,9 +56,9 @@ namespace IRaCIS.Core.Application.Contracts } - public class TrialSiteSurveyStat:TrialSelectDTO + public class TrialSiteSurveyStat : TrialSelectDTO { - public int? ApprovalRequiredCount { get; set; } + public int? ApprovalRequiredCount { get; set; } @@ -75,4 +75,181 @@ namespace IRaCIS.Core.Application.Contracts } + public class CheckToBeDoneQuery : PageInput + { + + } + + public class CheckToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeCheckedCount { get; set; } + + public int? ToBeRepliedCount { get; set; } + } + + + public class ReReadingApplyToBeDoneQuery : PageInput + { + + } + + public class ReReadingApplyToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + + + public int? ToBeApprovalCount { get; set; } + } + + + public class ReviewerSelectToBeDoneQuery : PageInput + { + + } + + public class ReviewerSelectToBeDoneDto : TrialBaseInfoDto + { + public bool IsUrgent { get; set; } + + public int? ToBeApprovalCount { get; set; } + } + + + public class ReReadingApprovalToBeDoneQuery : PageInput + { + + } + + public class ReReadingApprovalToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeApprovalCount { get; set; } + } + + public class ImageQuestionToBeDoneQuery : PageInput + { + + } + + public class ImageQuestionToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + public class IRImageReadingToBeDoneQuery : PageInput + { + + } + + public class IRImageReadingToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? UnReadCount { get; set; } + + public int? HaveSignedCount { get; set; } + } + + + + + + public class MedicalCommentsToBeDoneQuery : PageInput + { + + } + + public class MedicalCommentsToBeDoneDto : TrialBaseInfoDto + { + + public string CriterionName { get; set; } + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + public class ImageCheckQuestionToBeDoneQuery : PageInput + { + + } + + public class ImageCheckQuestionToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + public class ImageSubmittedToBeDoneQuery : PageInput + { + + } + + public class ImageSubmittedToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + public class ImageQualityToBeDoneQuery : PageInput + { + + } + + public class ImageQualityToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeReviewedCount { get; set; } + + public int? ToBeClaimedCount { get; set; } + } + + + + + public class ImageReUploadToBeDoneQuery : PageInput + { + + } + + public class ImageReUploadToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + public class ImageClinicalDataToBeDoneQuery : PageInput + { + + } + + public class ImageClinicalDataToBeDoneDto : TrialBaseInfoDto + { + public int? UrgentCount { get; set; } + + public int? ToBeDealedCount { get; set; } + } + + + + + + public class TrialBaseInfoDto + { + public Guid TrialId { get; set; } + public string ExperimentName { get; set; } = string.Empty; + + public string TrialCode { get; set; } = string.Empty; + + public string ResearchProgramNo { get; set; } = string.Empty; + } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index d841dd3c8..7a77d8697 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -13,8 +13,8 @@ namespace IRaCIS.Core.Application private readonly IRepository _systemDocumentRepository; private readonly IRepository _systemNoticeRepository; - public PersonalWorkstation(IRepository trialRepository, IRepository trialUserRepository, IRepository trialDocumentRepository, - IRepository systemDocumentRepository,IRepository systemNoticeRepository) + public PersonalWorkstation(IRepository trialRepository, IRepository trialUserRepository, IRepository trialDocumentRepository, + IRepository systemDocumentRepository, IRepository systemNoticeRepository) { _trialRepository = trialRepository; _trialUserRepository = trialUserRepository; @@ -44,7 +44,7 @@ namespace IRaCIS.Core.Application TotalNeedSignTrialDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin - ? 0 + ? 0 : await _trialDocumentRepository.AsQueryable(true).Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialStopped) .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Where(t => t.IsDeleted == false || (t.IsDeleted == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null))) @@ -56,15 +56,15 @@ namespace IRaCIS.Core.Application ? 0 //废除了 已经签署了也要算进去 : await _trialDocumentRepository.AsQueryable(true).Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialStopped) - .Where( t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)) .Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) .SelectMany(t => t.TrialDocConfirmedUserList) - .CountAsync(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime !=null), + .CountAsync(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null), TotalNeedSignSystemDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin ? 0 : await _systemDocumentRepository - .Where(t => t.IsDeleted == false || (t.IsDeleted == true && t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime !=null))) + .Where(t => t.IsDeleted == false || (t.IsDeleted == true && t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null))) .SelectMany(t => t.NeedConfirmedUserTypeList) .CountAsync(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId), @@ -76,22 +76,22 @@ namespace IRaCIS.Core.Application .SelectMany(t => t.SystemDocConfirmedUserList) .CountAsync(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null), - TotalApprovalRequiredCount= + TotalApprovalRequiredCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM ? - _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t=>t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Count() - : _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM|| _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM - ? _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t => t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Count() - :0, + _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t => t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Count() + : _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM + ? _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t => t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Count() + : 0, - TotalSystemNoticeCount= _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin - ? 0:await _systemNoticeRepository.Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum== Domain.Share.Management.SystemNotice_NoticeStateEnum.HavePublished) - + TotalSystemNoticeCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin + ? 0 : await _systemNoticeRepository.Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.Management.SystemNotice_NoticeStateEnum.HavePublished) + .CountAsync(), - NeedReadSystemNoticeCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin + NeedReadSystemNoticeCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin ? 0 : await _systemNoticeRepository.Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.Management.SystemNotice_NoticeStateEnum.HavePublished - && !t.NoticeUserReadList.Any(t=>t.CreateUserId==_userInfo.Id)) + && !t.NoticeUserReadList.Any(t => t.CreateUserId == _userInfo.Id)) .Where(t => t.EndDate == null || t.EndDate != null && t.EndDate > DateTime.Now) .CountAsync(), @@ -102,7 +102,7 @@ namespace IRaCIS.Core.Application /// - /// Site 调研 每个项目 需要处理的审批统计 + /// 中心调研 每个项目 需要处理的审批统计 /// /// /// @@ -134,7 +134,7 @@ namespace IRaCIS.Core.Application /// - /// 需要签署文件数量 系统级别的在第一行 + /// 待签署的项目文件 需要签署文件数量 系统级别的在第一行 /// /// /// @@ -147,35 +147,183 @@ namespace IRaCIS.Core.Application } else { - var trialDocStat = await _trialRepository/*.AsQueryable(true)*/.Where(t=>t.TrialStatusStr != StaticData.TrialState.TrialStopped) + var trialDocStat = await _trialRepository/*.AsQueryable(true)*/.Where(t => t.TrialStatusStr != StaticData.TrialState.TrialStopped) .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) - .WhereIf(!_userInfo.IsAdmin, c => c.TrialDocumentList.Where(t => t.IsDeleted == false && t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) && !t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime!=null)) + .WhereIf(!_userInfo.IsAdmin, c => c.TrialDocumentList.Where(t => t.IsDeleted == false && t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) && !t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null)) .Count() > 0) .ProjectTo(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id, userTypeId = _userInfo.UserTypeId }) .OrderByDescending(t => t.WaitSignCount) - .ToPagedListAsync(query.PageIndex, query.PageSize , query.SortField, query.Asc); - - //var sysDocStat = new DocSignStat() - //{ - // IsSystemDoc = true, - // WaitSignCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin - // ? 0 - // : await _systemDocumentRepository - // .Where(t => - // t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) && - // !t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id)) - // .CountAsync() - //}; - //var list = trialDocStat.CurrentPageData.ToList(); - //list.Insert(0, sysDocStat); - //trialDocStat.CurrentPageData = list; - //trialDocStat.TotalCount++; + .ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField, query.Asc); return trialDocStat; } - + } + + + #region PM APM 待办 + /// + /// 一致性核查待处理 + /// + /// + /// + /// + [HttpPost] + public async Task> GetCheckToBeDoneList(CheckToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new CheckToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + 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; + + } + + /// + /// 重阅申请待审核 + /// + /// + /// + [HttpPost] + public async Task> GetReReadingApplyToBeDoneList(ReReadingApplyToBeDoneQuery inQuery, + [FromServices] IRepository _visitTaskReReadingRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _visitTaskReReadingRepository.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() + { + TrialId = g.Key.TrialId, + ResearchProgramNo = g.Key.ResearchProgramNo, + ExperimentName = g.Key.ExperimentName, + TrialCode = g.Key.TrialCode, + UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(), + ToBeApprovalCount = g.Count(), + + }); + + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + #endregion + + + #region SPM CPM 待办 + + /// + /// 阅片人筛选 + /// + /// + /// vvv + [HttpPost] + public async Task> GetReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery + , [FromServices] IRepository _enrollRepository, + [FromServices] IRepository _trialRepository) + { + var query = _trialRepository + .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.HasCommittedToCRO).Count() + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + /// + /// 重阅审批 + /// + /// + /// + [HttpPost] + public async Task> GetReReadingApprovalToBeDoneToBeDoneList(ReReadingApprovalToBeDoneQuery inQuery, + [FromServices] IRepository _visitTaskReReadingRepository, + [FromServices] IRepository _trialRepository) + + { + var query = _visitTaskReReadingRepository.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() + { + TrialId = g.Key.TrialId, + ResearchProgramNo = g.Key.ResearchProgramNo, + ExperimentName = g.Key.ExperimentName, + TrialCode = g.Key.TrialCode, + UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(), + ToBeApprovalCount = g.Count(), + + }); + + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + #endregion + + + #region CRC 待办 + + + /// + /// 临床数据 + /// + /// + /// + /// + [HttpPost] + public async Task> GetImageClinicalDataToBeDoneList(ImageClinicalDataToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Where(t=>t.clinicalDataTrialSets.Any(t=>t.ClinicalDataLevel==ClinicalLevel.Subject && t.IsConfirm)) + .Select(t => new ImageClinicalDataToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + UrgentCount = t.SubjectVisitList.Where(u => u.IsBaseLine&& u.SubmitState != SubmitStateEnum.Submitted && u.IsUrgent ).Count(), + ToBeDealedCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count(), + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; } @@ -183,6 +331,364 @@ namespace IRaCIS.Core.Application + /// + /// CRC影像质疑待处理 + /// + /// + /// + /// + [HttpPost] + public async Task> GetCRCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + var query = _trialRepository + .Select(t => new ImageQuestionToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + 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(), + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + /// + /// 核查质疑待处理 + /// + /// + /// + /// + [HttpPost] + public async Task> GetImageCheckQuestionToBeDoneList(ImageCheckQuestionToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new ImageCheckQuestionToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + 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() + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + /// + /// 影像重传 + /// + /// + /// + /// + [HttpPost] + public async Task> GetImageReUploadToBeDoneList(ImageReUploadToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new ImageReUploadToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + 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(), + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + + + /// + /// 加急影像提交 + /// + /// + /// + /// + [HttpPost] + public async Task> GetImageSubmittedToBeDoneList(ImageSubmittedToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new ImageSubmittedToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + UrgentCount = t.SubjectVisitList.Where(u => u.SubmitState ==SubmitStateEnum.ToSubmit && u.IsUrgent).Count(), + ToBeDealedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit ).Count(), + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + + #endregion + + #region IQC待办 + + + + /// + /// 影像质控 待领取 跟项目配置有关系 --未完成 + /// + /// + /// + /// + [HttpPost] + public async Task> GetImageQualityToBeDoneList(ImageQualityToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository.Where(t=>t.QCProcessEnum != TrialQCProcess.NotAudit) + .Select(t => new ImageQualityToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + + // 待审核 加急的(待领取 已领取)-- 领取了 还没做 就是待审核 + UrgentCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId==_userInfo.Id && u.IsUrgent).Count(), + + + //待领取量 + ToBeClaimedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count(), + + //已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了) + ToBeReviewedCount= t.SubjectVisitList.Where(u => u.CurrentActionUserId==_userInfo.Id ).Count() + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + /// + /// QC 质疑 + /// + /// + /// + /// + [HttpPost] + public async Task> GetQCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery, + [FromServices] IRepository _subjectVisitRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new ImageQuestionToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.SubjectVisit.IsUrgent).Count(), + ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(), + + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + #endregion + + + #region IR待办 + + /// + /// IR 影像阅片 待阅量 复杂 --未完成 + /// + /// + /// + /// + /// + [HttpPost] + public async Task> GetIRImageReadingToBeDoneList(IRImageReadingToBeDoneQuery inQuery, + [FromServices] IRepository _visitTaskRepository, + [FromServices] IRepository _trialRepository) + { + + var query = _trialRepository + .Select(t => new IRImageReadingToBeDoneDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + + + UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.SubjectVisit.IsUrgent).Count(), + + UnReadCount=t.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)) + .Where(y=>y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)) + + + .Count(), + + HaveSignedCount = t.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.SubjectId,t.TrialId,t.Subject.Code,t.Trial.ResearchProgramNo,t.Trial.ExperimentName, t.BlindSubjectCode}) + // .Select(t => new IRImageReadingToBeDoneDto() + // { + // TrialId = t.Id, + // ResearchProgramNo = t.ResearchProgramNo, + // ExperimentName = t.ExperimentName, + // TrialCode = t.TrialCode, + // UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + // .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.SubjectVisit.IsUrgent).Count(), + // ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList) + // .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(), + + // }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc); + + return result; + + } + + + /// + /// IR医学反馈 + /// + /// + + /// + [HttpPost] + public async Task> GetIRMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, + [FromServices] IRepository _taskMedicalReviewRepository) + { + + var query = _taskMedicalReviewRepository + .Where(t=>t.IsClosedDialog==false) + .GroupBy(t=>new {t.TrialId, t.Trial.ResearchProgramNo, t.Trial.ExperimentName, t.Trial.TrialCode , + t.VisitTask.TrialReadingCriterionId,t.VisitTask.TrialReadingCriterion.CriterionName}) + .Select(g => new MedicalCommentsToBeDoneDto() + { + TrialId = g.Key.TrialId, + ResearchProgramNo = g.Key.ResearchProgramNo, + ExperimentName = g.Key.ExperimentName, + TrialCode = g.Key.TrialCode, + CriterionName=g.Key.CriterionName, + + UrgentCount = g.Where(u => u.VisitTask.IsUrgent + && u.ReadingMedicalReviewDialogList.OrderByDescending(l=>l.CreateTime).First().UserTypeEnumInt==(int) UserTypeEnum.MIM).Count(), + + ToBeDealedCount = 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; + + } + + + + + #endregion + + #region MIM待办 + + /// + /// MIM医学反馈 + /// + /// + + /// + [HttpPost] + public async Task> GetMIMMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery, + [FromServices] IRepository _taskMedicalReviewRepository) + { + + var query = _taskMedicalReviewRepository + .Where(t => t.IsClosedDialog == false) + .GroupBy(t => new { + t.TrialId, + t.Trial.ResearchProgramNo, + t.Trial.ExperimentName, + t.Trial.TrialCode, + t.VisitTask.TrialReadingCriterionId, + t.VisitTask.TrialReadingCriterion.CriterionName + }) + .Select(g => new MedicalCommentsToBeDoneDto() + { + TrialId = g.Key.TrialId, + ResearchProgramNo = g.Key.ResearchProgramNo, + ExperimentName = g.Key.ExperimentName, + TrialCode = g.Key.TrialCode, + CriterionName = g.Key.CriterionName, + + UrgentCount = g.Where(u => u.VisitTask.IsUrgent + && u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(), + + ToBeDealedCount = 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; + + } + + #endregion } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs new file mode 100644 index 000000000..912f5b093 --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs @@ -0,0 +1,51 @@ +using AutoMapper; +using AutoMapper.EquivalencyExpression; +using IRaCIS.Application.Contracts; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.Application.ViewModel; +using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; + +namespace IRaCIS.Core.Application.Service +{ + public class PersonalWorkstation : Profile + { + public PersonalWorkstation() + { + var userTypeEnumInt = 0; + + var userTypeId = Guid.Empty; + + + CreateMap() + .ForMember(t => t.ExperimentName, u => u.MapFrom(c => c.ExperimentName)) + .ForMember(t => t.TrialCode, u => u.MapFrom(c => c.TrialCode)) + .ForMember(t => t.ResearchProgramNo, u => u.MapFrom(c => c.ResearchProgramNo)) + + .ForMember(t => t.UrgentCount, u => u.MapFrom(c => c + .SubjectVisitList.Where(t=>(t.CheckState==CheckStateEnum.ToCheck ||t.CheckState==CheckStateEnum.CVIng) && t.IsUrgent).Count())) + .ForMember(t => t.ToBeCheckedCount, u => u.MapFrom(c => c + .SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.ToCheck ).Count())) + .ForMember(t => t.ToBeRepliedCount, u => u.MapFrom(c => c + .SubjectVisitList.Where(t => (t.CheckState == CheckStateEnum.ToCheck || t.CheckState == CheckStateEnum.CVIng) && t.IsUrgent).Count())); + + + + + CreateMap(); + + + + CreateMap(); + + + CreateMap(); + + + + + } + } + +} diff --git a/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs b/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs index 4ee122c21..7c77ea807 100644 --- a/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs +++ b/IRaCIS.Core.Domain/Allocation/TaskMedicalReview.cs @@ -82,6 +82,8 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } + public Trial Trial { get; set; } + /// /// 冗余 废弃 /// diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index dec43ae0e..ad71a19eb 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -17,6 +17,10 @@ namespace IRaCIS.Core.Domain.Models TrialDicList = new List(); } + [JsonIgnore] + public List TaskMedicalReviewList { get; set; } + + [JsonIgnore] public List TaskConsistentRuleList { get; set; } [JsonIgnore] @@ -39,6 +43,8 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List SubjectList { get; set; } = new List(); [JsonIgnore] + public List SubjectVisitList { get; set; } = new List(); + [JsonIgnore] public List StudyList { get; set; } = new List(); [JsonIgnore] public List TrialSiteList { get; set; } = new List();