From 50fdea409506d622a56db8de85bfd3020317e7b5 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 12 Jun 2023 11:07:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=A7=92=E8=89=B2=E8=BF=87=E6=BB=A4=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E9=82=AE=E4=BB=B6url=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/IRaCIS.Core.API.csproj | 6 - IRaCIS.Core.API/wwwroot/EmailTemplate.rar | Bin 15309 -> 0 bytes IRaCIS.Core.API/wwwroot/EmailTemplate.zip | Bin 17339 -> 0 bytes .../EmailTemplate/EmailConfigTest.html | 27 - .../EmailTemplate/EmailConfigTest_US.html | 27 - .../IRaCIS.Core.Application.xml | 112 +++- .../Service/Common/MailService.cs | 8 +- .../Service/Management/UserTypeService.cs | 2 +- .../DTO/PersonalWorkstationViewModel.cs | 183 +++++- .../TrialSiteUser/PersonalWorkstation.cs | 582 ++++++++++++++++-- .../Service/TrialSiteUser/_MapConfig2.cs | 51 ++ .../Allocation/TaskMedicalReview.cs | 2 + IRaCIS.Core.Domain/Trial/Trial.cs | 6 + 13 files changed, 898 insertions(+), 108 deletions(-) delete mode 100644 IRaCIS.Core.API/wwwroot/EmailTemplate.rar delete mode 100644 IRaCIS.Core.API/wwwroot/EmailTemplate.zip delete mode 100644 IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html delete mode 100644 IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest_US.html create mode 100644 IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs 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 947adef16ead2685e71c49f191becd8a21228937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15309 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 G0sj|+4U+l* diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate.zip b/IRaCIS.Core.API/wwwroot/EmailTemplate.zip deleted file mode 100644 index 39ac004c00e5912f6d4c67a376d56279a2f2a94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17339 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

)A$2ZcAWBeQ@ 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 h^bk?*xAoSKYb9C8`y~bl2 - - - - 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();