Files
zszq-trs/YLErpDAL/Modules/AppModule/EmailTemplateService.cs
T

163 lines
5.0 KiB
C#

using System.Text.RegularExpressions;
namespace YLErp.Modules.AppModule
{
/// <summary>
/// 邮件模板服务
/// </summary>
public class EmailTemplateService : YLBaseService
{
public EmailTemplateService(OptUserInfo userInfo) : base(userInfo)
{
}
public EmailTemplateService(YLBaseService baseService) : base(baseService)
{
}
public EmailTemplate GetData(string emailType)
{
return DbContext.EmailTemplate.AsNoTracking().FirstOrDefault(n => n.EmailType == emailType);
}
/// <summary>
/// 保存数据
/// </summary>
public virtual int SaveData(EmailTemplate data)
{
if (data == null)
{
throw new ArgumentNullException(nameof(data));
}
if (string.IsNullOrWhiteSpace(data.EmailType))
{
throw new ServiceException("缺少邮件类型");
}
var dbmodel = DbContext.EmailTemplate.FirstOrDefault(n => n.EmailType == data.EmailType);
if (dbmodel == null)
{
DbContext.EmailTemplate.Add(dbmodel = new EmailTemplate());
}
UpdateChanges(dbmodel, data, "id");
return DbContext.SaveChanges();
}
/// <summary>
/// 生成邮件信息,如果从数据库中取不到模板配置,返回null
/// </summary>
public MailInfoResultModel GenerateMailInfo(string emailType, MailInfoRequestModel reqModel)
{
if (string.IsNullOrEmpty(emailType))
{
throw new ArgumentException("不能为空", nameof(emailType));
}
if (reqModel == null)
{
throw new ArgumentNullException(nameof(reqModel));
}
var template = DbContext.EmailTemplate.AsNoTracking().FirstOrDefault(n => n.EmailType == emailType);
if (template == null)
{
return null;
}
return GenerateMailInfo(template, reqModel);
}
/// <summary>
/// 生成邮件信息,如果template为null,返回null。
/// 【设计决策·勿单边"升级"】占位符为朴素文本替换(非模板引擎),与本表另一消费者
/// bond-oms Java SwapEmailHandler.replaceMailPlaceholders 保持同构渲染语义——
/// 单边引入 FreeMarker/Thymeleaf 等更强语法或 HTML 转义,会造成两侧发出内容不一致。
/// 替换值(客户名称/文档编号等)不做 HTML 转义是有意为之:均为内部维护的可信数据;
/// 若未来要拼接用户自由输入的内容,必须两侧同步加转义。新占位符同样两侧同步加白名单。
/// </summary>
public static MailInfoResultModel GenerateMailInfo(EmailTemplate template, MailInfoRequestModel reqModel)
{
if (template is null)
{
return null;
}
if (reqModel == null)
{
throw new ArgumentNullException(nameof(reqModel));
}
string replace(Match m)
{
switch (m.Groups[1].Value)
{
case "客户名称":
return reqModel.ClientName;
case "交易日期":
return reqModel.TradeDate;
case "文档编号":
return reqModel.DocNumber;
case "交易列表":
return reqModel.TradeList;
}
return string.Empty;
}
var pattern = @"\{\{(客户名称|交易日期|文档编号|交易列表)\}\}";
var result = new MailInfoResultModel
{
IsBodyHtml = template.IsBodyHtml,
Title = Regex.Replace(template.TitleTemplate, pattern, replace),
Body = Regex.Replace(template.BodyTemplate, pattern, replace)
};
return result;
}
}
/// <summary>
/// 邮件信息请求Model
/// </summary>
public class MailInfoRequestModel
{
/// <summary>
/// {{客户名称}}
/// </summary>
public string ClientName { get; set; }
/// <summary>
/// {{交易日期}}
/// </summary>
public string TradeDate { get; set; }
/// <summary>
/// {{文档编号}}
/// </summary>
public string DocNumber { get; set; }
/// <summary>
/// {{交易列表}}
/// </summary>
public string TradeList { get; set; }
}
/// <summary>
/// 邮件信息结果Model
/// </summary>
public class MailInfoResultModel
{
public string Title { get; set; } = string.Empty;
public string Body { get; set; } = string.Empty;
public bool IsBodyHtml { get; set; }
}
}