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<TrialUser> _trialUserRepository,
 | 
						||
      IRepository<VisitTask> _visitTaskRepository,
 | 
						||
      IRepository<TrialSiteUser> _trialSiteUserRepository,
 | 
						||
      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 _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.User.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,
 | 
						||
                          _trialUserRepository,
 | 
						||
                          _visitTaskRepository,
 | 
						||
                     _trialSiteUserRepository,
 | 
						||
                    trialId, EmailBusinessScenario.QCToCRCImageQuestion, topicAndHtmlFunc);
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/// <summary>
 | 
						||
/// CRC 影像质疑
 | 
						||
/// </summary>
 | 
						||
public class CRCImageQuestionRecurringEventConsumer(IRepository<Trial> _trialRepository,
 | 
						||
    IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
 | 
						||
      IRepository<TrialUser> _trialUserRepository,
 | 
						||
      IRepository<VisitTask> _visitTaskRepository,
 | 
						||
      IRepository<TrialSiteUser> _trialSiteUserRepository,
 | 
						||
      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 _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.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,
 | 
						||
                          _trialUserRepository,
 | 
						||
                          _visitTaskRepository,
 | 
						||
                     _trialSiteUserRepository,
 | 
						||
                    trialId, EmailBusinessScenario.CRCToQCQuestion, topicAndHtmlFunc);
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
/// <summary>
 | 
						||
/// 影像质控  发送给QC的
 | 
						||
/// </summary>
 | 
						||
public class ImageQCRecurringEventConsumer(IRepository<Trial> _trialRepository,
 | 
						||
    IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
 | 
						||
      IRepository<TrialUser> _trialUserRepository,
 | 
						||
      IRepository<VisitTask> _visitTaskRepository,
 | 
						||
      IRepository<TrialSiteUser> _trialSiteUserRepository,
 | 
						||
      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 _trialUserRepository.Where(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.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,
 | 
						||
                          _trialUserRepository,
 | 
						||
                          _visitTaskRepository,
 | 
						||
                     _trialSiteUserRepository,
 | 
						||
                    trialId, EmailBusinessScenario.QCTask, topicAndHtmlFunc);
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 |