297 lines
14 KiB
C#
297 lines
14 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 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 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)
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
/// <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.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);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|