223 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Core.Application.MassTransit.Command;
 | ||
| using IRaCIS.Core.Domain.BaseModel;
 | ||
| using IRaCIS.Core.Domain.Models;
 | ||
| using IRaCIS.Core.Domain.Share;
 | ||
| using MassTransit;
 | ||
| using MassTransit.Scheduling;
 | ||
| using Microsoft.Extensions.Options;
 | ||
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.Linq;
 | ||
| using System.Text;
 | ||
| using System.Threading.Tasks;
 | ||
| 
 | ||
| namespace IRaCIS.Core.Application.MassTransit.Consumer;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// QC 影像质疑
 | ||
| /// </summary>
 | ||
| 
 | ||
| public class QCImageQuestionRecurringEventConsumer(IRepository<Trial> _trialRepository,
 | ||
|     IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
 | ||
|       IRepository<TrialUserRole> _trialUserRoleRepository,
 | ||
|       IRepository<VisitTask> _visitTaskRepository,
 | ||
|       IRepository<TrialSiteUserRole> _trialSiteUserRoleRepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> _SystemEmailSendConfig) : IConsumer<QCImageQuestionRecurringEvent>
 | ||
| {
 | ||
|     public async Task Consume(ConsumeContext<QCImageQuestionRecurringEvent> context)
 | ||
|     {
 | ||
|         var trialId = context.Message.TrialId;
 | ||
| 
 | ||
|         var isEn_us = false;
 | ||
| 
 | ||
|         var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
 | ||
| 
 | ||
|         //找到 该项目的CRC 用户Id
 | ||
|         var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
 | ||
| 
 | ||
|         //判断是否任务可以领取 ,可以的话 发送邮件
 | ||
| 
 | ||
|         foreach (var user in userList)
 | ||
|         {
 | ||
|             var userId = user.UserId;
 | ||
|             //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
 | ||
|             var query = _trialRepository.Where(t => t.Id == trialId)
 | ||
| 
 | ||
|              .Select(t => new
 | ||
|              {
 | ||
|                  //质疑待处理
 | ||
|                  ToBeDealedCount = t.SubjectVisitList.Where(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)).SelectMany(c => c.QCChallengeList)
 | ||
|                  .Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId == null)).Count(),
 | ||
| 
 | ||
|              });
 | ||
| 
 | ||
|             var sendStat = await query.FirstOrDefaultAsync();
 | ||
| 
 | ||
|             //当前人 
 | ||
|             if (sendStat != null && (sendStat.ToBeDealedCount > 0))
 | ||
|             {
 | ||
| 
 | ||
|                 Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
 | ||
|                 {
 | ||
|                     var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
 | ||
|                     var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
 | ||
|                         user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
 | ||
| 
 | ||
|                     return (topicStr, htmlBodyStr, isEn_us, userId);
 | ||
|                 };
 | ||
| 
 | ||
|                 await OldRecurringEmailHelper.SendTrialEmailAsync(
 | ||
|                       _trialEmailNoticeConfigRepository,
 | ||
|                          _trialRepository,
 | ||
|                           _trialUserRoleRepository,
 | ||
|                           _visitTaskRepository,
 | ||
|                      _trialSiteUserRoleRepository,
 | ||
|                     trialId, EmailBusinessScenario.QCToCRCImageQuestion, topicAndHtmlFunc);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// CRC 影像质疑
 | ||
| /// </summary>
 | ||
| public class CRCImageQuestionRecurringEventConsumer(IRepository<Trial> _trialRepository,
 | ||
|     IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
 | ||
|       IRepository<TrialUserRole> _trialUserRoleRepository,
 | ||
|       IRepository<VisitTask> _visitTaskRepository,
 | ||
|       IRepository<TrialSiteUserRole> _trialSiteUserRoleRepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> _SystemEmailSendConfig) : IConsumer<CRCImageQuestionRecurringEvent>
 | ||
| {
 | ||
|     public async Task Consume(ConsumeContext<CRCImageQuestionRecurringEvent> context)
 | ||
|     {
 | ||
|         var trialId = context.Message.TrialId;
 | ||
| 
 | ||
|         var isEn_us = false;
 | ||
|         var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync();
 | ||
| 
 | ||
|         //找到 该项目的IQC 用户Id
 | ||
|         var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
 | ||
| 
 | ||
|         //判断是否任务可以领取 ,可以的话 发送邮件
 | ||
| 
 | ||
|         foreach (var user in userList)
 | ||
|         {
 | ||
|             var userId = user.UserId;
 | ||
| 
 | ||
|             //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
 | ||
|             var query = _trialRepository
 | ||
|                 .Where(t => t.Id == trialId)
 | ||
|              .Select(t => new
 | ||
|              {
 | ||
|                  ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | ||
|                  .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload).Count(),
 | ||
| 
 | ||
|                  //质疑待处理  发送邮件的时候 需要减去ReUploadTobeDealedCount  
 | ||
|                  ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | ||
|                  .Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(),
 | ||
|              });
 | ||
| 
 | ||
|             var sendStat = await query.FirstOrDefaultAsync();
 | ||
| 
 | ||
|             //当前人 
 | ||
|             if (sendStat != null && (sendStat.ToBeDealedCount > 0 || sendStat.ReUploadTobeDealedCount > 0))
 | ||
|             {
 | ||
| 
 | ||
|                 Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
 | ||
|                 {
 | ||
|                     var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
 | ||
|                     var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
 | ||
| 
 | ||
|                         user.FullName, DateTime.Now, sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
 | ||
| 
 | ||
| 
 | ||
|                     return (topicStr, htmlBodyStr, false, userId);
 | ||
|                 };
 | ||
| 
 | ||
|                 await OldRecurringEmailHelper.SendTrialEmailAsync(_trialEmailNoticeConfigRepository,
 | ||
|                          _trialRepository,
 | ||
|                           _trialUserRoleRepository,
 | ||
|                           _visitTaskRepository,
 | ||
|                      _trialSiteUserRoleRepository,
 | ||
|                     trialId, EmailBusinessScenario.CRCToQCQuestion, topicAndHtmlFunc);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// 影像质控  发送给QC的
 | ||
| /// </summary>
 | ||
| public class ImageQCRecurringEventConsumer(IRepository<Trial> _trialRepository,
 | ||
|     IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
 | ||
|       IRepository<TrialUserRole> _trialUserRoleRepository,
 | ||
|       IRepository<VisitTask> _visitTaskRepository,
 | ||
|       IRepository<TrialSiteUserRole> _trialSiteUserRoleRepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> _SystemEmailSendConfig) : IConsumer<ImageQCRecurringEvent>
 | ||
| {
 | ||
|     public async Task Consume(ConsumeContext<ImageQCRecurringEvent> context)
 | ||
|     {
 | ||
|         var trialId=context.Message.TrialId;
 | ||
| 
 | ||
|         var isEn_us = false;
 | ||
| 
 | ||
|         var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
 | ||
| 
 | ||
|         //找到 该项目的IQC 用户Id
 | ||
|         var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync();
 | ||
| 
 | ||
|         //判断是否任务可以领取 ,可以的话 发送邮件
 | ||
|         var userIdList = userList.Select(t => t.UserId).ToList();
 | ||
| 
 | ||
|         foreach (var user in userList)
 | ||
|         {
 | ||
|             var userId = user.UserId;
 | ||
| 
 | ||
|             //过滤项目  并且 将 _userInfo.Id 换位 当前发送邮件的Id
 | ||
|             var query = _trialRepository.Where(t => t.Id == trialId)
 | ||
|             .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit)
 | ||
|             .Select(t => new
 | ||
|             {
 | ||
|                 //待领取量
 | ||
|                 ToBeClaimedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.Submitted && u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != userId && u.ReviewAuditUserId == null))).Count(),
 | ||
| 
 | ||
|                 //待审核通过,统计从已领取到QC提交之间的      已领取 待审核 审核中   (审核完成  领取人就会清理 所以只用查询当前领取人是自己的就好了)
 | ||
|                 ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count()
 | ||
| 
 | ||
|             });
 | ||
| 
 | ||
|             var sendStat = await query.FirstOrDefaultAsync();
 | ||
| 
 | ||
|             //当前人 有待领取的或者有待审核的才发邮件
 | ||
|             if (sendStat != null && (sendStat.ToBeClaimedCount > 0 || sendStat.ToBeReviewedCount > 0))
 | ||
|             {
 | ||
| 
 | ||
|                 Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
 | ||
|                 {
 | ||
|                     var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
 | ||
|                     var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
 | ||
|                         user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
 | ||
| 
 | ||
|                     return (topicStr, htmlBodyStr, false, userId);
 | ||
|                 };
 | ||
| 
 | ||
|                 await OldRecurringEmailHelper.SendTrialEmailAsync(
 | ||
|                      _trialEmailNoticeConfigRepository,
 | ||
|                          _trialRepository,
 | ||
|                           _trialUserRoleRepository,
 | ||
|                           _visitTaskRepository,
 | ||
|                      _trialSiteUserRoleRepository,
 | ||
|                     trialId, EmailBusinessScenario.QCTask, topicAndHtmlFunc);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 |