180 lines
6.0 KiB
C#
180 lines
6.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)
|
|
{
|
|
// 同时兼容标准 {{变量}} 和历史模板中的 {变量} 写法。
|
|
var variableName = m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value;
|
|
switch (variableName)
|
|
{
|
|
case "客户名称":
|
|
return reqModel.ClientName;
|
|
case "交易日期":
|
|
return reqModel.TradeDate;
|
|
case "文档编号":
|
|
return reqModel.DocNumber;
|
|
case "交易列表":
|
|
return reqModel.TradeList;
|
|
// 结算邮件扩展变量:可同时用于邮件标题和正文。
|
|
case "交易编号":
|
|
return reqModel.TradeNumber ?? string.Empty;
|
|
case "平仓总额":
|
|
return reqModel.UnwindTotalAmount ?? string.Empty;
|
|
}
|
|
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>
|
|
/// {{交易编号}}:当前客户在本次结算日邮件中涉及的交易编号,多个编号以逗号分隔。
|
|
/// </summary>
|
|
public string TradeNumber { get; set; }
|
|
|
|
/// <summary>
|
|
/// {{平仓总额}}:当前客户在本次结算日邮件中的平仓金额合计,使用客户视角。
|
|
/// </summary>
|
|
public string UnwindTotalAmount { 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; }
|
|
}
|
|
}
|