admin/src/Oms.Application/Services/Orders/Issues/IssuePlaceholderRenderer.cs
zzh 90f6c25b04 feat(order): 问题件/理赔件标记、通知投递与自动触发
新增 mark-problematic/mark-claimed/handle-status 接口,异常事件审计表与占位符渲染;inApp/email 通知及下单/入库/出库自动触发运行时。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 16:46:52 +08:00

81 lines
2.5 KiB
C#

using Oms.Domain.ChannelsAggregate.Consts;
using Oms.Domain.OrdersAggregate.Entities;
namespace Oms.Application.Services.Orders.Issues;
public sealed class IssuePlaceholderContext
{
public string? ServiceNo { get; init; }
public string? ClientNo { get; init; }
public string? TrackNo { get; init; }
public string? ProductCode { get; init; }
public string? ChannelCode { get; init; }
public string? IssueType { get; init; }
public string? IssueTypeName { get; init; }
public string? IssueTitle { get; init; }
public static IssuePlaceholderContext FromOrder(Order order, string? issueType = null, string? issueTitle = null) =>
new()
{
ServiceNo = order.ServiceNo,
ClientNo = order.ClientNo,
TrackNo = order.TrackNo,
ProductCode = order.ProductCode,
ChannelCode = order.ChannelCode,
IssueType = issueType,
IssueTypeName = IssueTypeCodes.GetDisplayName(issueType),
IssueTitle = issueTitle
};
}
public static class IssuePlaceholderRenderer
{
private static readonly (string Key, Func<IssuePlaceholderContext, string?> Resolver)[] Placeholders =
[
("serviceNo", ctx => ctx.ServiceNo),
("clientNo", ctx => ctx.ClientNo),
("trackNo", ctx => ctx.TrackNo),
("productCode", ctx => ctx.ProductCode),
("channelCode", ctx => ctx.ChannelCode),
("issueType", ctx => ctx.IssueType),
("issueTypeName", ctx => ctx.IssueTypeName),
("issueTitle", ctx => ctx.IssueTitle),
("运单号", ctx => ctx.ServiceNo),
("客户单号", ctx => ctx.ClientNo),
("跟踪号", ctx => ctx.TrackNo),
("产品编码", ctx => ctx.ProductCode),
("渠道编码", ctx => ctx.ChannelCode),
("问题类型", ctx => ctx.IssueTypeName ?? ctx.IssueType),
("问题标题", ctx => ctx.IssueTitle),
];
public static string Render(string? template, IssuePlaceholderContext context)
{
if (string.IsNullOrWhiteSpace(template))
{
return string.Empty;
}
var result = template;
foreach (var (key, resolver) in Placeholders)
{
var token = "{" + key + "}";
if (!result.Contains(token, StringComparison.Ordinal))
{
continue;
}
result = result.Replace(token, resolver(context) ?? string.Empty, StringComparison.Ordinal);
}
return result;
}
}