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; } = []; }