using DocumentFormat.OpenXml; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.MassTransit.Consumer; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; using MassTransit; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MimeKit; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reactive.Joins; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace IRaCIS.Core.Application.MassTransit.Recurring { /// /// 定时过期提醒 /// public class TrialDocumentErverDayEventConsumer( IRepository _trialReadingCriterionRepository, IRepository _visitTaskRepository, IRepository _systemDocumentRepository, IRepository _identityUserRepository, IRepository _systemDocConfirmedUserRepository, IRepository _dictionaryRepository, IRepository _trialUserRoleRepository, IRepository _trialDocumentRepository, IRepository _trialRepository, ISystemDocumentService _systemDocumentService, IRepository _systemDocNeedConfirmedUserTypeRepository, IRepository _trialDocNeedConfirmedUserTypeRepository, IServiceScopeFactory serviceScopeFactory, IRepository _trialIdentityUserRepository, IRepository _trialDocConfirmedUserRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _emailNoticeConfigrepository, IOptionsMonitor systemEmailConfig) : IConsumer { private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { DateTime now = DateTime.Now; Console.WriteLine("发送定时项目过期提醒"); var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var trialDocQuery = from trialDoc in _trialDocumentRepository.AsQueryable(true) join trialUser in _trialIdentityUserRepository.AsQueryable() on trialDoc.TrialId equals trialUser.TrialId join confirm in _trialDocConfirmedUserRepository.Where() on new { trialUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new TrialSignDocView() { TrialCode = trialDoc.Trial.TrialCode, ResearchProgramNo = trialDoc.Trial.ResearchProgramNo, ExperimentName = trialDoc.Trial.ExperimentName, CurrentStaffTrainDays = trialDoc.CurrentStaffTrainDays, NewStaffTrainDays = trialDoc.NewStaffTrainDays, Id = trialDoc.Id, IsSystemDoc = false, CreateTime = trialDoc.CreateTime, FullFilePath = trialDoc.Path, IsDeleted = trialDoc.IsDeleted, Name = trialDoc.Name, Path = trialDoc.Path, FileTypeId = trialDoc.FileTypeId, UpdateTime = trialDoc.UpdateTime, SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes, //IsConfirmed = confirm.ConfirmTime != null, ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, RealName = trialUser.IdentityUser.FullName, UserName = trialUser.IdentityUser.UserName, UserCreateTime= trialUser.CreateTime, IdentityUserTypeList = trialUser.TrialUserRoleList.Select(t => t.UserRole.UserTypeRole.UserTypeShortName).ToList(), DocNeedSignUserTypeList = trialDoc.NeedConfirmedUserTypeList.Select(t => t.UserTypeRole.UserTypeShortName).ToList(), }; var datalist = await trialDocQuery.IgnoreQueryFilters().Where(t => t.IsDeleted == false && t.ConfirmTime == null) .ToListAsync(); datalist = datalist.Where(x => x.SuggestFinishTime != null && x.SuggestFinishTime.Value.Date == DateTime.Now.Date) .ToList(); var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList(); var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync(); Console.WriteLine("发送定时项目过期提醒:人员数量" + userinfoList.Count); int index = 1; foreach (var userinfo in userinfoList) { try { Console.WriteLine($"{index}发送定时过期提醒,邮箱:{userinfo.EMail},姓名{userinfo.UserName}"); index++; var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail)); var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { var topicStr = string.Format(input.topicStr, companyName); var htmlBodyStr = string.Format( CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr), userinfo.UserName, // 用户名 {0} _systemEmailConfig.SiteUrl ); return (topicStr, htmlBodyStr); }; var scenario = EmailBusinessScenario.TrialTraining_ExpirationNotification; var emailConfig = _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault(); if (emailConfig != null) { await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); } } catch (Exception) { } } } } /// /// 生效通知 /// public class TrialDocumentPublishEventConsumer( IRepository _trialReadingCriterionRepository, IRepository _visitTaskRepository, IRepository _trialDocumentRepository, IRepository _identityUserRepository, IRepository _trialIdentityUserRepository, IRepository _dictionaryRepository, IRepository _trialUserRoleRepository, IRepository _emailNoticeConfigrepository, IOptionsMonitor systemEmailConfig) : IConsumer { private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; // 记录是否只发送给新增角色的日志 if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) { Console.WriteLine($"只发送给新增项目的角色,角色数量: {context.Message.NewUserTypeIds.Count}"); } // 构建查询 IQueryable systemDocQuery; if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) { // 只查询新增角色的用户 systemDocQuery = from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) join trialIdentityUser in _trialIdentityUserRepository.AsQueryable() on trialDoc.TrialId equals trialIdentityUser.TrialId from identityUser in _identityUserRepository.AsQueryable(false) .Where(t => t.Status == UserStateEnum.Enable && t.Id == trialIdentityUser.IdentityUserId && t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) .Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) && trialDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = true, Id = trialDoc.Id, CreateTime = trialDoc.CreateTime, IsDeleted = trialDoc.IsDeleted, SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes, Name = trialDoc.Name, Path = trialDoc.Path, FileTypeId = trialDoc.FileTypeId, UpdateTime = trialDoc.UpdateTime, ConfirmUserId = identityUser.Id, RealName = identityUser.FullName, UserName = identityUser.UserName, IsNeedSendEmial = identityUser.IsZhiZhun, FullFilePath = trialDoc.Path }; } else { // 查询所有相关角色的用户 systemDocQuery = from trialDoc in _trialDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) join trialIdentityUser in _trialIdentityUserRepository.AsQueryable() on trialDoc.TrialId equals trialIdentityUser.TrialId from identityUser in _identityUserRepository.AsQueryable(false) .Where(t => t.Status == UserStateEnum.Enable && t.Id== trialIdentityUser.IdentityUserId&& t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) .Any(t => trialDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = false, Id = trialDoc.Id, CreateTime = trialDoc.CreateTime, IsDeleted = trialDoc.IsDeleted, SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes, Name = trialDoc.Name, Path = trialDoc.Path, FileTypeId = trialDoc.FileTypeId, UpdateTime = trialDoc.UpdateTime, ConfirmUserId = identityUser.Id, RealName = identityUser.FullName, UserName = identityUser.UserName, IsNeedSendEmial = identityUser.IsZhiZhun , FullFilePath = trialDoc.Path }; } var datalist = await systemDocQuery.IgnoreQueryFilters().ToListAsync(); var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList(); var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync(); int index = 1; foreach (var userinfo in userinfoList) { string msg = $"{index}项目生效通知,邮箱:{userinfo.EMail},姓名{userinfo.UserName},"; index++; try { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail)); var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { var topicStr = string.Format(input.topicStr, companyName); var htmlBodyStr = string.Format( CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr), userinfo.UserName, // 用户名 {0} _systemEmailConfig.SiteUrl ); return (topicStr, htmlBodyStr); }; var scenario = EmailBusinessScenario.TrialTraining_EffectiveNotification; var emailConfig = _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault(); if (emailConfig != null) { await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); msg += "发送成功"; } } catch (Exception) { msg += "发送失败"; } Console.WriteLine(msg); } } } }