163 lines
5.0 KiB
C#
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; }
|
|
}
|
|
}
|