namespace TakeoutSaaS.Application.App.Members.MessageReach.Dto;
///
/// 消息触达统计 DTO。
///
public sealed class MemberMessageReachStatsDto
{
///
/// 本月发送消息条数。
///
public int MonthlySentCount { get; init; }
///
/// 本月触达人数。
///
public int ReachMemberCount { get; init; }
///
/// 打开率百分比(0-100)。
///
public decimal OpenRate { get; init; }
///
/// 转化率百分比(0-100)。
///
public decimal ConversionRate { get; init; }
}
///
/// 消息列表结果 DTO。
///
public sealed class MemberMessageReachListResultDto
{
///
/// 列表项。
///
public IReadOnlyList Items { get; init; } = [];
///
/// 总数。
///
public int TotalCount { get; init; }
///
/// 页码。
///
public int Page { get; init; }
///
/// 每页条数。
///
public int PageSize { get; init; }
}
///
/// 消息列表项 DTO。
///
public sealed class MemberMessageReachListItemDto
{
///
/// 消息标识。
///
public long MessageId { get; init; }
///
/// 消息标题。
///
public string Title { get; init; } = string.Empty;
///
/// 渠道。
///
public IReadOnlyList Channels { get; init; } = [];
///
/// 目标描述。
///
public string AudienceText { get; init; } = string.Empty;
///
/// 预计触达人数。
///
public int EstimatedReachCount { get; init; }
///
/// 发送状态。
///
public string Status { get; init; } = string.Empty;
///
/// 发送时间(UTC)。
///
public DateTime? SentAt { get; init; }
///
/// 定时发送时间(UTC)。
///
public DateTime? ScheduledAt { get; init; }
///
/// 打开率百分比(0-100)。
///
public decimal OpenRate { get; init; }
///
/// 转化率百分比(0-100)。
///
public decimal ConversionRate { get; init; }
}
///
/// 消息详情 DTO。
///
public sealed class MemberMessageReachDetailDto
{
///
/// 消息标识。
///
public long MessageId { get; init; }
///
/// 模板标识。
///
public long? TemplateId { get; init; }
///
/// 消息标题。
///
public string Title { get; init; } = string.Empty;
///
/// 消息正文。
///
public string Content { get; init; } = string.Empty;
///
/// 渠道。
///
public IReadOnlyList Channels { get; init; } = [];
///
/// 目标类型。
///
public string AudienceType { get; init; } = string.Empty;
///
/// 目标标签。
///
public IReadOnlyList AudienceTags { get; init; } = [];
///
/// 目标描述。
///
public string AudienceText { get; init; } = string.Empty;
///
/// 预计触达人数。
///
public int EstimatedReachCount { get; init; }
///
/// 发送时间类型。
///
public string ScheduleType { get; init; } = string.Empty;
///
/// 定时发送时间(UTC)。
///
public DateTime? ScheduledAt { get; init; }
///
/// 发送状态。
///
public string Status { get; init; } = string.Empty;
///
/// 实际发送时间(UTC)。
///
public DateTime? SentAt { get; init; }
///
/// 发送成功数量。
///
public int SentCount { get; init; }
///
/// 已读数量。
///
public int ReadCount { get; init; }
///
/// 转化数量。
///
public int ConvertedCount { get; init; }
///
/// 打开率百分比(0-100)。
///
public decimal OpenRate { get; init; }
///
/// 转化率百分比(0-100)。
///
public decimal ConversionRate { get; init; }
///
/// 最后错误信息。
///
public string? LastError { get; init; }
///
/// 收件明细。
///
public IReadOnlyList Recipients { get; init; } = [];
}
///
/// 收件明细 DTO。
///
public sealed class MemberMessageReachRecipientDto
{
///
/// 会员标识。
///
public long MemberId { get; init; }
///
/// 渠道。
///
public string Channel { get; init; } = string.Empty;
///
/// 状态。
///
public string Status { get; init; } = string.Empty;
///
/// 手机号快照。
///
public string? Mobile { get; init; }
///
/// OpenId 快照。
///
public string? OpenId { get; init; }
///
/// 发送时间(UTC)。
///
public DateTime? SentAt { get; init; }
///
/// 已读时间(UTC)。
///
public DateTime? ReadAt { get; init; }
///
/// 转化时间(UTC)。
///
public DateTime? ConvertedAt { get; init; }
///
/// 失败信息。
///
public string? ErrorMessage { get; init; }
}
///
/// 模板列表结果 DTO。
///
public sealed class MemberMessageTemplateListResultDto
{
///
/// 列表项。
///
public IReadOnlyList Items { get; init; } = [];
///
/// 总数。
///
public int TotalCount { get; init; }
///
/// 页码。
///
public int Page { get; init; }
///
/// 每页条数。
///
public int PageSize { get; init; }
}
///
/// 模板 DTO。
///
public sealed class MemberMessageTemplateDto
{
///
/// 模板标识。
///
public long TemplateId { get; init; }
///
/// 模板名称。
///
public string Name { get; init; } = string.Empty;
///
/// 模板分类。
///
public string Category { get; init; } = string.Empty;
///
/// 模板内容。
///
public string Content { get; init; } = string.Empty;
///
/// 使用次数。
///
public int UsageCount { get; init; }
///
/// 最近使用时间(UTC)。
///
public DateTime? LastUsedAt { get; init; }
}
///
/// 目标人群估算 DTO。
///
public sealed class MemberMessageAudienceEstimateDto
{
///
/// 预计触达人数。
///
public int ReachCount { get; init; }
}
///
/// 消息调度元信息 DTO。
///
public sealed class MemberMessageDispatchMetaDto
{
///
/// 消息标识。
///
public long MessageId { get; init; }
///
/// 发送状态。
///
public string Status { get; init; } = string.Empty;
///
/// 发送时间类型。
///
public string ScheduleType { get; init; } = string.Empty;
///
/// 定时发送时间(UTC)。
///
public DateTime? ScheduledAt { get; init; }
///
/// Hangfire 任务 ID。
///
public string? HangfireJobId { get; init; }
}
///
/// 保存消息请求输入。
///
public sealed class SaveMemberMessageInput
{
///
/// 消息标识。
///
public long? MessageId { get; init; }
///
/// 门店标识。
///
public long? StoreId { get; init; }
///
/// 模板标识。
///
public long? TemplateId { get; init; }
///
/// 标题。
///
public string Title { get; init; } = string.Empty;
///
/// 内容。
///
public string Content { get; init; } = string.Empty;
///
/// 渠道。
///
public IReadOnlyList Channels { get; init; } = [];
///
/// 目标类型。
///
public string AudienceType { get; init; } = string.Empty;
///
/// 目标标签。
///
public IReadOnlyList AudienceTags { get; init; } = [];
///
/// 发送时间类型。
///
public string ScheduleType { get; init; } = string.Empty;
///
/// 定时发送时间(UTC)。
///
public DateTime? ScheduledAt { get; init; }
///
/// 提交动作(draft/send)。
///
public string SubmitAction { get; init; } = "draft";
}
///
/// 搜索消息输入。
///
public sealed class SearchMemberMessageInput
{
///
/// 状态过滤。
///
public string? Status { get; init; }
///
/// 渠道过滤。
///
public string? Channel { get; init; }
///
/// 标题关键词。
///
public string? Keyword { get; init; }
///
/// 页码。
///
public int Page { get; init; } = 1;
///
/// 每页条数。
///
public int PageSize { get; init; } = 10;
}
///
/// 搜索模板输入。
///
public sealed class SearchMemberMessageTemplateInput
{
///
/// 分类。
///
public string? Category { get; init; }
///
/// 关键词。
///
public string? Keyword { get; init; }
///
/// 页码。
///
public int Page { get; init; } = 1;
///
/// 每页条数。
///
public int PageSize { get; init; } = 10;
}
///
/// 保存模板输入。
///
public sealed class SaveMemberMessageTemplateInput
{
///
/// 模板标识。
///
public long? TemplateId { get; init; }
///
/// 模板名称。
///
public string Name { get; init; } = string.Empty;
///
/// 模板分类。
///
public string Category { get; init; } = string.Empty;
///
/// 模板内容。
///
public string Content { get; init; } = string.Empty;
}
///
/// 估算人群输入。
///
public sealed class MemberMessageAudienceEstimateInput
{
///
/// 目标类型。
///
public string AudienceType { get; init; } = string.Empty;
///
/// 标签列表。
///
public IReadOnlyList Tags { get; init; } = [];
}