From aaed933eb9d53097994055a94175778ad1a90cff Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 22 Aug 2023 10:36:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=82=AE=E4=BB=B6=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=AE=E6=94=B9--010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helper/SendEmailHelper.cs | 3 + .../IRaCIS.Core.Application.xml | 34 +++-- .../Common/DTO/EmailNoticeConfigViewModel.cs | 7 +- .../Service/Common/_MapConfig.cs | 6 +- .../DTO/TrialEmailNoticeConfigViewModel.cs | 45 ++++--- .../Service/Document/EmailSendService.cs | 121 ++++++++++++++++++ .../Document/TrialEmailNoticeConfigService.cs | 94 +++++++++++++- .../Common/EmailNoticeConfig.cs | 3 + .../Document/TrialEmailNoticeConfig.cs | 4 +- IRaCIS.Core.Domain/Trial/Trial.cs | 2 +- 10 files changed, 283 insertions(+), 36 deletions(-) create mode 100644 IRaCIS.Core.Application/Service/Document/EmailSendService.cs diff --git a/IRaCIS.Core.Application/Helper/SendEmailHelper.cs b/IRaCIS.Core.Application/Helper/SendEmailHelper.cs index d15a5d857..57cb50bc1 100644 --- a/IRaCIS.Core.Application/Helper/SendEmailHelper.cs +++ b/IRaCIS.Core.Application/Helper/SendEmailHelper.cs @@ -144,6 +144,9 @@ public static class SendEmailHelper } } + + + } diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 956f11d32..bea106462 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -609,6 +609,20 @@ + + + 获取系统 邮件配置 勾选列表 + + + + + + + 批量勾选 传递列表每行数据,后台进行处理转换,建立关联关系 + + + + 指定资源Id,渲染Dicom检查的Jpeg预览图像 Dicom检查的Id @@ -8074,30 +8088,30 @@ TrialEmailNoticeConfigQuery 列表查询参数模型 - - TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 - - + 业务模块 /// - + 业务层级 /// - + 邮件类型 /// - + 邮件加急类型 /// - + 定时周期 /// - + 邮件主题 /// - + 附件 /// + + TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 + SystemAnonymizationView 列表视图模型 diff --git a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs index a4b6e0622..b77a742aa 100644 --- a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs @@ -8,6 +8,11 @@ using IRaCIS.Core.Domain.Share; using Newtonsoft.Json; namespace IRaCIS.Core.Application.Contracts { + public class TrialSelectEmailNoticeConfigView: EmailNoticeConfigView + { + public bool IsHaveSelected { get; set; } + } + /// EmailNoticeConfigView 列表视图模型 public class EmailNoticeConfigView : EmailNoticeConfigAddOrEdit { @@ -54,7 +59,7 @@ namespace IRaCIS.Core.Application.Contracts public CriterionType? CriterionTypeEnum { get; set; } - + public Guid? TrialId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Common/_MapConfig.cs b/IRaCIS.Core.Application/Service/Common/_MapConfig.cs index 02a1990e8..9c2c3c95c 100644 --- a/IRaCIS.Core.Application/Service/Common/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Common/_MapConfig.cs @@ -24,9 +24,13 @@ namespace IRaCIS.Core.Application.Service CreateMap(); - + var trialId = Guid.Empty; + CreateMap().IncludeBase() + .ForMember(o => o.IsHaveSelected, t => t.MapFrom(u => u.TrialEmailNoticeConfigList.Any(c=>c.TrialId==trialId && c.SysEmailNoticeConfigId==u.Id))) + ; + CreateMap() .ForMember(t => t.EmailNoticeUserList, u => u.MapFrom(c => c.EmailNoticeUserTypeList)); diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs index 9d787eab1..0f1c89010 100644 --- a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs @@ -77,7 +77,7 @@ namespace IRaCIS.Core.Application.ViewModel /// /// SMTP端口 /// - public int? EmailSMTPServerPort { get; set; } + public int EmailSMTPServerPort { get; set; } /// /// 是否配置过邮箱 @@ -120,39 +120,30 @@ namespace IRaCIS.Core.Application.ViewModel public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; } } - /// TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 - public class TrialEmailNoticeConfigAddOrEdit + public class BatchAddTrialEmailNoticeConfig { + + + public Guid? Id { get; set; } public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; } public string Code { get; set; } = string.Empty; - public Guid? TrialReadingCriterionId { get; set; } + public Guid TrialId { get; set; } - public string AuthorizationCode { get; set; } = string.Empty; - - public string SMTPServerAddress { get; set; } = string.Empty; - - public int SMTPServerPort { get; set; } - + public CriterionType CriterionTypeEnum { get; set; } - public string FromName { get; set; } = string.Empty; - - public string FromEmail { get; set; } = string.Empty; - public List ToUserTypeList { get; set; } public List CopyUserTypeList { get; set; } - public bool IsUrgent { get; set; } - public bool IsAutoSend { get; set; } @@ -160,8 +151,6 @@ namespace IRaCIS.Core.Application.ViewModel - - /// 业务模块 /// public int BusinessModuleEnum { get; set; } @@ -197,6 +186,26 @@ namespace IRaCIS.Core.Application.ViewModel public string EmailHtmlContent { get; set; } = string.Empty; public string EmailHtmlContentCN { get; set; } = string.Empty; + } + + + /// TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 + public class TrialEmailNoticeConfigAddOrEdit: BatchAddTrialEmailNoticeConfig + { + + public Guid? TrialReadingCriterionId { get; set; } + + + public string AuthorizationCode { get; set; } = string.Empty; + + public string SMTPServerAddress { get; set; } = string.Empty; + + public int SMTPServerPort { get; set; } + + + public string FromName { get; set; } = string.Empty; + + public string FromEmail { get; set; } = string.Empty; public List BlackUserIdList { get; set; } diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs new file mode 100644 index 000000000..f1e72986e --- /dev/null +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -0,0 +1,121 @@ +using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infrastructure; +using MailKit; +using MimeKit; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Mail; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Service +{ + + + + public class EmailSendService : BaseService + { + private readonly IRepository _trialEmailNoticeConfigRepository; + + private readonly IRepository _emailNoticeConfigRepository; + public EmailSendService(IRepository trialEmailNoticeConfigRepository, IRepository emailNoticeConfigRepository) + { + _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; + _emailNoticeConfigRepository = emailNoticeConfigRepository; + } + + public async Task BaseTrialEmailConfigSendEmail(Guid trialId, CommonDocumentBusinessScenario businessScenario, Guid? trialReadingCriterionId, Guid? subjectId) + { + + //找到配置 + + + var trialEmailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.BusinessScenarioEnum == businessScenario, ignoreQueryFilters: true) + .Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync(); + + + if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false) + { + return; + } + else + { + + var sendEmailConfig = new SMTPEmailConfig(); + + //收件人 如果是CRC CRA 要按照中心发送 + var toUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList(); + + var copyUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(c => c.UserType).ToList(); + + var allUserTypeEnumList= toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList(); + + var allUserList= _repository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.User.EMail, t.User.FullName ,t.User.UserTypeEnum }).ToList(); + + + var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum)).ToList(); + + if(subjectId!=null) + { + toUserList = _repository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum) && t.TrialSite.SubjectList.Any(c=>c.Id==subjectId)).Select(t => new { t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToList(); + } + + + var copyUserList = allUserList.Where(t => copyUserTypeEnumList.Contains(t.UserTypeEnum)).ToList(); + + + if (toUserList.Count() == 0) + { + //---没有收件人,无法发送邮件 + throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]); + } + + + if (trialEmailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(trialEmailConfig.FromEmail)) + { + + sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(trialEmailConfig.FromName, trialEmailConfig.FromEmail); + sendEmailConfig.AuthorizationCode = trialEmailConfig.AuthorizationCode; + sendEmailConfig.UserName = trialEmailConfig.FromEmail; + + sendEmailConfig.Host = trialEmailConfig.SMTPServerAddress; + sendEmailConfig.Port = trialEmailConfig.SMTPServerPort; + } + else + { + //---项目发件邮箱配置有误,请核实 + throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]); + } + + foreach (var item in toUserList) + { + + if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail)) + { + + sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail)); + + } + } + foreach (var item in copyUserList) + { + + if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail)) + { + + sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail)); + + } + } + + + } + + } + + } +} diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 8a6f4b1ee..923da4b34 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -33,11 +33,12 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _trialEmailNoticeConfigRepository; - private readonly IRepository _trialRepository; private readonly IRepository _trialEmailBlackUserRepository; private readonly IRepository _taskMedicalReviewRepository; + private readonly IRepository _emailNoticeConfigRepository; + public IRepository _visitTaskRepository { get; } public IRepository _trialUserRepository { get; } @@ -46,9 +47,13 @@ namespace IRaCIS.Core.Application.Service public IRepository _subjectVisitRepository { get; } + + + public TrialEmailNoticeConfigService(IRepository trialEmailNoticeConfigRepository, IRepository visitTaskRepository, IRepository trialRepository, - IRepository trialUserRepository, IRepository taskMedicalReviewRepository, IRepository subjectRepository, IRepository subjectVisitRepository, IRepository trialEmailBlackUserRepository) + IRepository trialUserRepository, IRepository taskMedicalReviewRepository, IRepository subjectRepository, + Repository subjectVisitRepository, IRepository trialEmailBlackUserRepository, IRepository emailNoticeConfigRepository) { _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; _visitTaskRepository = visitTaskRepository; @@ -59,6 +64,7 @@ namespace IRaCIS.Core.Application.Service _subjectVisitRepository = subjectVisitRepository; _trialEmailBlackUserRepository = trialEmailBlackUserRepository; + _emailNoticeConfigRepository = emailNoticeConfigRepository; } /// @@ -97,7 +103,7 @@ namespace IRaCIS.Core.Application.Service FromEmail = inDto.EmailFromEmail, FromName = inDto.EmailFromName, SMTPServerAddress = inDto.EmailSMTPServerAddress, - SMTPServerPort = inDto.EmailSMTPServerPort.Value, + SMTPServerPort = inDto.EmailSMTPServerPort, TrialId = inDto.TrialId, }); @@ -120,7 +126,7 @@ namespace IRaCIS.Core.Application.Service FromEmail = inDto.EmailFromEmail, FromName = inDto.EmailFromName, SMTPServerAddress = inDto.EmailSMTPServerAddress, - SMTPServerPort = inDto.EmailSMTPServerPort.Value, + SMTPServerPort = inDto.EmailSMTPServerPort, }); await _trialRepository.SaveChangesAsync(); @@ -1518,6 +1524,83 @@ namespace IRaCIS.Core.Application.Service return await query.ToListAsync(); } + /// + /// 获取系统 邮件配置 勾选列表 + /// + /// + /// + public async Task> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig) + { + var emailNoticeConfigQueryable = _emailNoticeConfigRepository + .WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum) + .WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired) + .WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable) + + .ProjectTo(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId }); + + return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc); + } + + /// + /// 批量勾选 传递列表每行数据,后台进行处理转换,建立关联关系 + /// + /// + /// + public async Task BatchAddSysEmailConfig(List batchAddList) + { + + var first = batchAddList.First(); + var trialId = first.TrialId; + + var emailConfig = await _trialRepository.Where(t => t.Id == trialId).Select(x => new + { + TrialId = x.Id, + EmailAuthorizationCode = x.EmailAuthorizationCode, + EmailSMTPServerAddress = x.EmailSMTPServerAddress, + EmailFromEmail = x.EmailFromEmail, + EmailFromName = x.EmailFromName, + IsConfigureEmail = x.IsConfigureEmail, + EmailSMTPServerPort = x.EmailSMTPServerPort + + }).FirstNotNullAsync(); + + var list = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).Select(t => new { t.CriterionType, TrialReadingCriterionId = t.Id }).ToListAsync(); + + + var addList = _mapper.Map>(batchAddList); + + + foreach (var item in addList) + { + item.SysEmailNoticeConfigId = item.Id; + item.Id = Guid.Empty; + + item.AuthorizationCode = emailConfig.EmailAuthorizationCode; + item.FromEmail = emailConfig.EmailFromEmail; + item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress; + item.FromName=emailConfig.EmailFromName; + item.SMTPServerPort = emailConfig.EmailSMTPServerPort; + + + item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId; + + item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId) + .SelectMany(t => t.ToUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = t })); + + item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId) + .SelectMany(t => t.CopyUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = t })); + + + await _trialEmailNoticeConfigRepository.AddAsync(item); + + } + + await _trialEmailNoticeConfigRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + + + } [HttpPost] @@ -1534,6 +1617,7 @@ namespace IRaCIS.Core.Application.Service return await trialEmailNoticeConfigQueryable.ToListAsync(); } + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig) { @@ -1609,6 +1693,8 @@ namespace IRaCIS.Core.Application.Service } + + private async Task TestEmailConfigAsync(TrialEmailNoticeConfigAddOrEdit config) { diff --git a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs index d086d5e48..344c2961b 100644 --- a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs +++ b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs @@ -18,6 +18,9 @@ namespace IRaCIS.Core.Domain.Models [Table("EmailNoticeConfig")] public class EmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd,ISoftDelete { + [JsonIgnore] + public List TrialEmailNoticeConfigList { get; set; } + [JsonIgnore] public List EmailNoticeUserTypeList { get; set; } public string Code { get; set; } = String.Empty; diff --git a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs index f54f4b1fa..e75d90472 100644 --- a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs +++ b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs @@ -76,10 +76,12 @@ namespace IRaCIS.Core.Domain.Models public string EmailHtmlContent { get; set; } = string.Empty; public string EmailHtmlContentCN { get; set; } = string.Empty; - + [JsonIgnore] + + public EmailNoticeConfig SysEmailNoticeConfig { get; set; } public Guid? SysEmailNoticeConfigId { get; set; } diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index cdac60b49..c40b80e07 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -382,7 +382,7 @@ namespace IRaCIS.Core.Domain.Models /// /// SMTP˿ /// - public int? EmailSMTPServerPort { get; set; } + public int EmailSMTPServerPort { get; set; } /// /// Ƿù