From e1bd659dc5862f520434c2474fbd30982354fae5 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 13 May 2026 17:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=87=E6=9C=9F=E9=82=AE=E4=BB=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Recurring/SystemDocumentConsumer.cs | 313 +++++++++--------- 1 file changed, 162 insertions(+), 151 deletions(-) diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/SystemDocumentConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/SystemDocumentConsumer.cs index 4497bf8f6..ddf05061d 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/SystemDocumentConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/SystemDocumentConsumer.cs @@ -5,6 +5,7 @@ using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.MassTransit.Consumer; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; using MassTransit; using Microsoft.Extensions.Options; using MimeKit; @@ -84,203 +85,213 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync(); Console.WriteLine("发送定时过期提醒:人员数量" + userinfoList.Count); - int index = 1; - foreach (var userinfo in userinfoList) + + var scenario = EmailBusinessScenario.GeneralTraining_ExpirationNotification; + var emailConfig = _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault(); + if (emailConfig == null) + { + return; + } + + var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList(); + foreach (var workLanguage in userWorkLanguageList) { try { - Console.WriteLine($"{index}发送定时过期提醒,邮箱:{userinfo.EMail},姓名{userinfo.UserName}"); - index++; + var langUserInfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList(); + if (!langUserInfoList.Any()) + { + continue; + } + + var userIsEn_US = workLanguage == UserWorkLanguage.US; + var messageToSend = new MimeMessage(); - //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + foreach (var userinfo in langUserInfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var userNames = langUserInfoList.Select(x => x.UserName).ToList(); - 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} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + string.Join(',', userNames), _systemEmailConfig.SiteUrl ); return (topicStr, htmlBodyStr); }; - var scenario = EmailBusinessScenario.GeneralTraining_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); - } - - + await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage); + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); } catch (Exception) { - } - } - } - } - /// - /// 生效通知 - /// - public class SystemDocumentPublishEventConsumer( - IRepository _trialReadingCriterionRepository, - IRepository _visitTaskRepository, - IRepository _systemDocumentRepository, - IRepository _identityUserRepository, - IRepository _systemDocConfirmedUserRepository, - IRepository _dictionaryRepository, - IRepository _trialUserRoleRepository, - IRepository _emailNoticeConfigrepository, + /// + /// 生效通知 + /// + public class SystemDocumentPublishEventConsumer( + IRepository _trialReadingCriterionRepository, + IRepository _visitTaskRepository, + IRepository _systemDocumentRepository, + IRepository _identityUserRepository, + IRepository _systemDocConfirmedUserRepository, + IRepository _dictionaryRepository, + IRepository _trialUserRoleRepository, + IRepository _emailNoticeConfigrepository, - IOptionsMonitor systemEmailConfig) : IConsumer - { - private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; - - public async Task Consume(ConsumeContext context) + IOptionsMonitor systemEmailConfig) : IConsumer { - var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US; + private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; - //设置当前事件传递过来的语言 - var culture = context.Message.CultureInfoName; - CultureInfo.CurrentCulture = new CultureInfo(culture); - - // 记录是否只发送给新增角色的日志 - if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) + public async Task Consume(ConsumeContext context) { - Console.WriteLine($"只发送给新增的角色,角色数量: {context.Message.NewUserTypeIds.Count}"); - } - // 构建查询 - IQueryable systemDocQuery; + var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US; - if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) - { - // 只查询新增角色的用户 - systemDocQuery = - from sysDoc in _systemDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) - from identityUser in _identityUserRepository.AsQueryable(false) - .Where(t => t.Status == UserStateEnum.Enable && - t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) - .Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) && - sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) - select new UnionDocumentWithConfirmInfoView() + //设置当前事件传递过来的语言 + var culture = context.Message.CultureInfoName; + CultureInfo.CurrentCulture = new CultureInfo(culture); + + // 记录是否只发送给新增角色的日志 + if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) { - IsSystemDoc = true, - Id = sysDoc.Id, - CreateTime = sysDoc.CreateTime, - IsDeleted = sysDoc.IsDeleted, - SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes, - Name = sysDoc.Name, - Path = sysDoc.Path, - FileTypeId = sysDoc.FileTypeId, - UpdateTime = sysDoc.UpdateTime, - ConfirmUserId = identityUser.Id, - RealName = identityUser.FullName, - UserName = identityUser.UserName, - IsNeedSendEmial = identityUser.IsZhiZhun || (!identityUser.IsZhiZhun && sysDoc.DocUserSignType == DocUserSignType.InnerAndOuter), - FullFilePath = sysDoc.Path - }; - } - else - { - // 查询所有相关角色的用户 - systemDocQuery = - from sysDoc in _systemDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) - from identityUser in _identityUserRepository.AsQueryable(false) - .Where(t => t.Status == UserStateEnum.Enable && - t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) - .Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) - select new UnionDocumentWithConfirmInfoView() + Console.WriteLine($"只发送给新增的角色,角色数量: {context.Message.NewUserTypeIds.Count}"); + } + // 构建查询 + IQueryable systemDocQuery; + + if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) { - IsSystemDoc = true, - Id = sysDoc.Id, - CreateTime = sysDoc.CreateTime, - IsDeleted = sysDoc.IsDeleted, - SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes, - Name = sysDoc.Name, - Path = sysDoc.Path, - FileTypeId = sysDoc.FileTypeId, - UpdateTime = sysDoc.UpdateTime, - ConfirmUserId = identityUser.Id, - RealName = identityUser.FullName, - UserName = identityUser.UserName, - IsNeedSendEmial = identityUser.IsZhiZhun || (!identityUser.IsZhiZhun && sysDoc.DocUserSignType == DocUserSignType.InnerAndOuter), - FullFilePath = sysDoc.Path - }; - } - var datalist = await systemDocQuery.IgnoreQueryFilters().Where(x => x.IsNeedSendEmial).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(userinfo.FullName, userinfo.EMail)); - - - - var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => + // 只查询新增角色的用户 + systemDocQuery = + from sysDoc in _systemDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) + from identityUser in _identityUserRepository.AsQueryable(false) + .Where(t => t.Status == UserStateEnum.Enable && + t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) + .Any(t => context.Message.NewUserTypeIds.Contains(t.UserTypeId) && + sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) + select new UnionDocumentWithConfirmInfoView() { - var topicStr = string.Format(input.topicStr, companyName); - - var htmlBodyStr = string.Format( - CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr), - userinfo.UserName, // 用户名 {0} - _systemEmailConfig.SiteUrl - ); - - return (topicStr, htmlBodyStr); + IsSystemDoc = true, + Id = sysDoc.Id, + CreateTime = sysDoc.CreateTime, + IsDeleted = sysDoc.IsDeleted, + SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes, + Name = sysDoc.Name, + Path = sysDoc.Path, + FileTypeId = sysDoc.FileTypeId, + UpdateTime = sysDoc.UpdateTime, + ConfirmUserId = identityUser.Id, + RealName = identityUser.FullName, + UserName = identityUser.UserName, + IsNeedSendEmial = identityUser.IsZhiZhun || (!identityUser.IsZhiZhun && sysDoc.DocUserSignType == DocUserSignType.InnerAndOuter), + FullFilePath = sysDoc.Path }; - - var scenario = EmailBusinessScenario.GeneralTraining_EffectiveNotification; - - var emailConfig = _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault(); - - if (emailConfig != null) + } + else + { + // 查询所有相关角色的用户 + systemDocQuery = + from sysDoc in _systemDocumentRepository.AsQueryable(false).Where(x => context.Message.Ids.Contains(x.Id)) + from identityUser in _identityUserRepository.AsQueryable(false) + .Where(t => t.Status == UserStateEnum.Enable && + t.UserRoleList.Where(t => t.IsUserRoleDisabled == false) + .Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) + select new UnionDocumentWithConfirmInfoView() { - await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc); + IsSystemDoc = true, + Id = sysDoc.Id, + CreateTime = sysDoc.CreateTime, + IsDeleted = sysDoc.IsDeleted, + SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes, + Name = sysDoc.Name, + Path = sysDoc.Path, + FileTypeId = sysDoc.FileTypeId, + UpdateTime = sysDoc.UpdateTime, + ConfirmUserId = identityUser.Id, + RealName = identityUser.FullName, + UserName = identityUser.UserName, + IsNeedSendEmial = identityUser.IsZhiZhun || (!identityUser.IsZhiZhun && sysDoc.DocUserSignType == DocUserSignType.InnerAndOuter), + FullFilePath = sysDoc.Path + }; + } + var datalist = await systemDocQuery.IgnoreQueryFilters().Where(x => x.IsNeedSendEmial).ToListAsync(); + var confirmUserIdList = datalist.Select(t => t.ConfirmUserId).Distinct().ToList(); + var userinfoList = await _identityUserRepository.Where(x => confirmUserIdList.Contains(x.Id)).ToListAsync(); + + var scenario = EmailBusinessScenario.GeneralTraining_EffectiveNotification; + var emailConfig = _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault(); + if (emailConfig == null) + { + return; + } + + var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList(); + foreach (var workLanguage in userWorkLanguageList) + { + var langUserInfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList(); + if (!langUserInfoList.Any()) + { + continue; + } + + string msg = $"{langUserInfoList.Count}生效通知,"; + try + { + var messageToSend = new MimeMessage(); + messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); + + foreach (var userinfo in langUserInfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } + + var userIsEn_US = workLanguage == UserWorkLanguage.US; + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var userNames = langUserInfoList.Select(x => x.UserName).ToList(); + + 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, workLanguage), + string.Join(',', userNames), + _systemEmailConfig.SiteUrl + ); + + return (topicStr, htmlBodyStr); + }; + await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); msg += "发送成功"; + + } + catch (Exception) + { + msg += "发送失败"; + } - } - catch (Exception) - { - msg += "发送失败"; - + Console.WriteLine(msg); } - - Console.WriteLine(msg); } - } } }