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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|