305 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C#
		
	
	
| 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 NPOI.SS.Formula.Functions;
 | |
| 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
 | |
| {
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 定时过期提醒
 | |
|     /// </summary>
 | |
|     public class TrialDocumentErverDayEventConsumer(
 | |
|         IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
 | |
|         IRepository<VisitTask> _visitTaskRepository,
 | |
|            IRepository<SystemDocument> _systemDocumentRepository,
 | |
|              IRepository<IdentityUser> _identityUserRepository,
 | |
|                    IRepository<SystemDocConfirmedIdentityUser> _systemDocConfirmedUserRepository,
 | |
|          IRepository<Dictionary> _dictionaryRepository,
 | |
|         IRepository<TrialUserRole> _trialUserRoleRepository, IRepository<TrialDocument> _trialDocumentRepository,
 | |
|         IRepository<Trial> _trialRepository,
 | |
|         ISystemDocumentService _systemDocumentService,
 | |
|         IRepository<SystemDocNeedConfirmedUserType> _systemDocNeedConfirmedUserTypeRepository,
 | |
|          IRepository<TrialDocNeedConfirmedUserType> _trialDocNeedConfirmedUserTypeRepository,
 | |
|            IServiceScopeFactory serviceScopeFactory,
 | |
|         IRepository<TrialIdentityUser> _trialIdentityUserRepository,
 | |
|         IRepository<TrialDocConfirmedIdentityUser> _trialDocConfirmedUserRepository,
 | |
|         IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
 | |
|         IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
 | |
| 
 | |
|         IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<TrialDocumentErverDayEvent>
 | |
|     {
 | |
|         private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | |
| 
 | |
|         public async Task Consume(ConsumeContext<TrialDocumentErverDayEvent> 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 trialIdentityUser in _trialIdentityUserRepository.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
 | |
|              join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
 | |
|              join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
 | |
|                on trialIdentityUser.IdentityUserId equals identityUser.Id
 | |
|           
 | |
| 
 | |
|              join confirm in _trialDocConfirmedUserRepository.Where() on
 | |
|              new { trialIdentityUser.IdentityUserId, TrialDocumentId = trialDoc.Id } equals new { IdentityUserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc
 | |
| 
 | |
|              from confirm in cc.DefaultIfEmpty()
 | |
|              where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.UserTypeId))
 | |
|              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 = identityUser.Id,
 | |
|                 ConfirmTime = confirm.ConfirmTime,
 | |
|                 RealName = trialIdentityUser.IdentityUser.FullName,
 | |
|                 UserName = trialIdentityUser.IdentityUser.UserName,
 | |
|                 UserCreateTime= trialIdentityUser.CreateTime,
 | |
|                 IdentityUserTypeList = trialIdentityUser.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&&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)
 | |
|                 {
 | |
| 
 | |
|                 }
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 生效通知
 | |
|     /// </summary>
 | |
|     public class TrialDocumentPublishEventConsumer(
 | |
|      IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
 | |
|      IRepository<VisitTask> _visitTaskRepository,
 | |
|         IRepository<TrialDocument> _trialDocumentRepository,
 | |
|           IRepository<IdentityUser> _identityUserRepository,
 | |
|               IRepository<TrialIdentityUser> _trialIdentityUserRepository,
 | |
|       IRepository<Dictionary> _dictionaryRepository,
 | |
|      IRepository<TrialUserRole> _trialUserRoleRepository,
 | |
|      IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
 | |
| 
 | |
|      IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<TrialDocumentPublishEvent>
 | |
|     {
 | |
|         private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | |
| 
 | |
|         public async Task Consume(ConsumeContext<TrialDocumentPublishEvent> 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<UnionDocumentWithConfirmInfoView> 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.Where(x=>x.IsDeleted==false) on trialDoc.TrialId equals trialIdentityUser.TrialId
 | |
|                 join trialUserRole in _trialUserRoleRepository.Where(x => x.IsDeleted == false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
 | |
|                 join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)
 | |
|               on trialIdentityUser.IdentityUserId equals identityUser.Id
 | |
|                 where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted && context.Message.NewUserTypeIds.Contains(ur.UserRole.UserTypeId) && trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.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.Where(x => x.IsDeleted == false) on trialDoc.TrialId equals trialIdentityUser.TrialId
 | |
|                 join trialUserRole in _trialUserRoleRepository.Where(x=>x.IsDeleted==false) on trialIdentityUser.Id equals trialUserRole.TrialUserId
 | |
|                 join identityUser in _identityUserRepository.AsQueryable(false).Where(u => u.Status == UserStateEnum.Enable)   
 | |
|                  on trialIdentityUser.IdentityUserId equals identityUser.Id
 | |
|                 where trialIdentityUser.TrialUserRoleList.Any(ur => !ur.IsDeleted &&trialDoc.NeedConfirmedUserTypeList.Any(c => c.NeedConfirmUserTypeId == ur.UserRole.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.IsEnable).FirstOrDefault();
 | |
| 
 | |
|                     if (emailConfig != null)
 | |
|                     {
 | |
|                         await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc);
 | |
| 
 | |
|                         await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | |
|                         msg += "发送成功";
 | |
|                     }
 | |
| 
 | |
| 
 | |
|                 }
 | |
|                 catch (Exception)
 | |
|                 {
 | |
|                     msg += "发送失败";
 | |
| 
 | |
|                 }
 | |
| 
 | |
| 
 | |
|                 Console.WriteLine(msg);
 | |
|             }
 | |
| 
 | |
|         }
 | |
|     }
 | |
| }
 |