feat(member): implement member center management module
Some checks failed
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Failing after 1m54s

This commit is contained in:
2026-03-03 20:38:31 +08:00
parent c2821202c7
commit d96ca4971a
40 changed files with 4846 additions and 1 deletions

View File

@@ -0,0 +1,567 @@
namespace TakeoutSaaS.Application.App.Members.Dto;
/// <summary>
/// 会员列表行 DTO。
/// </summary>
public sealed class MemberListItemDto
{
/// <summary>
/// 会员标识。
/// </summary>
public long MemberId { get; init; }
/// <summary>
/// 会员名称。
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// 头像文案。
/// </summary>
public string AvatarText { get; init; } = string.Empty;
/// <summary>
/// 头像颜色。
/// </summary>
public string AvatarColor { get; init; } = string.Empty;
/// <summary>
/// 手机号(脱敏)。
/// </summary>
public string MobileMasked { get; init; } = string.Empty;
/// <summary>
/// 会员等级标识。
/// </summary>
public long? TierId { get; init; }
/// <summary>
/// 会员等级名称。
/// </summary>
public string TierName { get; init; } = string.Empty;
/// <summary>
/// 等级主题色。
/// </summary>
public string TierColorHex { get; init; } = string.Empty;
/// <summary>
/// 累计消费。
/// </summary>
public decimal TotalAmount { get; init; }
/// <summary>
/// 消费次数。
/// </summary>
public int OrderCount { get; init; }
/// <summary>
/// 最近消费时间。
/// </summary>
public DateTime LastOrderAt { get; init; }
/// <summary>
/// 储值余额。
/// </summary>
public decimal StoredBalance { get; init; }
/// <summary>
/// 积分余额。
/// </summary>
public int PointsBalance { get; init; }
/// <summary>
/// 是否沉睡会员(用于弱化展示)。
/// </summary>
public bool IsDormant { get; init; }
}
/// <summary>
/// 会员列表统计 DTO。
/// </summary>
public sealed class MemberListStatsDto
{
/// <summary>
/// 会员总数。
/// </summary>
public int TotalMembers { get; init; }
/// <summary>
/// 本月新增会员数。
/// </summary>
public int MonthlyNewMembers { get; init; }
/// <summary>
/// 活跃会员数(近 30 天有消费)。
/// </summary>
public int ActiveMembers { get; init; }
/// <summary>
/// 沉睡会员数(超过 60 天未消费)。
/// </summary>
public int DormantMembers { get; init; }
}
/// <summary>
/// 会员最近订单 DTO。
/// </summary>
public sealed class MemberRecentOrderDto
{
/// <summary>
/// 日期。
/// </summary>
public DateTime OrderedAt { get; init; }
/// <summary>
/// 订单号。
/// </summary>
public string OrderNo { get; init; } = string.Empty;
/// <summary>
/// 订单金额。
/// </summary>
public decimal Amount { get; init; }
/// <summary>
/// 订单状态文案。
/// </summary>
public string StatusText { get; init; } = string.Empty;
}
/// <summary>
/// 会员详情 DTO。
/// </summary>
public sealed class MemberDetailDto
{
/// <summary>
/// 会员标识。
/// </summary>
public long MemberId { get; init; }
/// <summary>
/// 会员名称。
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// 头像文案。
/// </summary>
public string AvatarText { get; init; } = string.Empty;
/// <summary>
/// 头像颜色。
/// </summary>
public string AvatarColor { get; init; } = string.Empty;
/// <summary>
/// 手机号(脱敏)。
/// </summary>
public string MobileMasked { get; init; } = string.Empty;
/// <summary>
/// 注册时间。
/// </summary>
public DateTime JoinedAt { get; init; }
/// <summary>
/// 会员等级标识。
/// </summary>
public long? TierId { get; init; }
/// <summary>
/// 会员等级名称。
/// </summary>
public string TierName { get; init; } = string.Empty;
/// <summary>
/// 等级主题色。
/// </summary>
public string TierColorHex { get; init; } = string.Empty;
/// <summary>
/// 累计消费。
/// </summary>
public decimal TotalAmount { get; init; }
/// <summary>
/// 消费次数。
/// </summary>
public int OrderCount { get; init; }
/// <summary>
/// 平均客单价。
/// </summary>
public decimal AverageAmount { get; init; }
/// <summary>
/// 储值余额。
/// </summary>
public decimal StoredBalance { get; init; }
/// <summary>
/// 储值实充余额。
/// </summary>
public decimal StoredRechargeBalance { get; init; }
/// <summary>
/// 储值赠金余额。
/// </summary>
public decimal StoredGiftBalance { get; init; }
/// <summary>
/// 积分余额。
/// </summary>
public int PointsBalance { get; init; }
/// <summary>
/// 会员标签。
/// </summary>
public IReadOnlyList<string> Tags { get; init; } = [];
/// <summary>
/// 最近订单。
/// </summary>
public IReadOnlyList<MemberRecentOrderDto> RecentOrders { get; init; } = [];
}
/// <summary>
/// 会员列表导出 DTO。
/// </summary>
public sealed class MemberExportDto
{
/// <summary>
/// 文件名。
/// </summary>
public string FileName { get; init; } = string.Empty;
/// <summary>
/// 文件内容 Base64。
/// </summary>
public string FileContentBase64 { get; init; } = string.Empty;
/// <summary>
/// 导出总数。
/// </summary>
public int TotalCount { get; init; }
}
/// <summary>
/// 会员等级列表项 DTO。
/// </summary>
public sealed class MemberTierListItemDto
{
/// <summary>
/// 等级标识。
/// </summary>
public long TierId { get; init; }
/// <summary>
/// 排序序号。
/// </summary>
public int SortOrder { get; init; }
/// <summary>
/// 等级名称。
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// 图标键。
/// </summary>
public string IconKey { get; init; } = string.Empty;
/// <summary>
/// 主题色。
/// </summary>
public string ColorHex { get; init; } = string.Empty;
/// <summary>
/// 升级条件文案。
/// </summary>
public string ConditionText { get; init; } = string.Empty;
/// <summary>
/// 权益摘要。
/// </summary>
public IReadOnlyList<string> Perks { get; init; } = [];
/// <summary>
/// 等级会员数。
/// </summary>
public int MemberCount { get; init; }
/// <summary>
/// 是否默认等级。
/// </summary>
public bool IsDefault { get; init; }
/// <summary>
/// 是否可删除。
/// </summary>
public bool CanDelete { get; init; }
}
/// <summary>
/// 会员等级规则 DTO。
/// </summary>
public sealed class MemberTierRuleDto
{
/// <summary>
/// 升级规则类型none/amount/count/both
/// </summary>
public string UpgradeRuleType { get; init; } = "none";
/// <summary>
/// 升级累计消费门槛。
/// </summary>
public decimal? UpgradeAmountThreshold { get; init; }
/// <summary>
/// 升级消费次数门槛。
/// </summary>
public int? UpgradeOrderCountThreshold { get; init; }
/// <summary>
/// 降级观察窗口天数。
/// </summary>
public int DowngradeWindowDays { get; init; } = 90;
}
/// <summary>
/// 会员等级权益 DTO。
/// </summary>
public sealed class MemberTierBenefitsDto
{
/// <summary>
/// 折扣权益。
/// </summary>
public MemberTierDiscountBenefitDto Discount { get; init; } = new();
/// <summary>
/// 积分倍率权益。
/// </summary>
public MemberTierPointMultiplierBenefitDto PointMultiplier { get; init; } = new();
/// <summary>
/// 生日特权。
/// </summary>
public MemberTierBirthdayBenefitDto Birthday { get; init; } = new();
/// <summary>
/// 每月赠券。
/// </summary>
public MemberTierMonthlyCouponBenefitDto MonthlyCoupon { get; init; } = new();
/// <summary>
/// 免配送费权益。
/// </summary>
public MemberTierFreeDeliveryBenefitDto FreeDelivery { get; init; } = new();
/// <summary>
/// 优先配送。
/// </summary>
public bool PriorityDeliveryEnabled { get; init; }
/// <summary>
/// 专属客服。
/// </summary>
public bool ExclusiveServiceEnabled { get; init; }
}
/// <summary>
/// 折扣权益 DTO。
/// </summary>
public sealed class MemberTierDiscountBenefitDto
{
/// <summary>
/// 是否启用。
/// </summary>
public bool Enabled { get; init; }
/// <summary>
/// 折扣值(如 9.5)。
/// </summary>
public decimal? DiscountRate { get; init; }
}
/// <summary>
/// 积分倍率权益 DTO。
/// </summary>
public sealed class MemberTierPointMultiplierBenefitDto
{
/// <summary>
/// 是否启用。
/// </summary>
public bool Enabled { get; init; }
/// <summary>
/// 倍率(如 1.5)。
/// </summary>
public decimal? Multiplier { get; init; }
}
/// <summary>
/// 生日特权 DTO。
/// </summary>
public sealed class MemberTierBirthdayBenefitDto
{
/// <summary>
/// 是否启用。
/// </summary>
public bool Enabled { get; init; }
/// <summary>
/// 是否双倍积分。
/// </summary>
public bool DoublePointsEnabled { get; init; }
/// <summary>
/// 生日赠券模板 ID。
/// </summary>
public IReadOnlyList<long> CouponTemplateIds { get; init; } = [];
}
/// <summary>
/// 每月赠券 DTO。
/// </summary>
public sealed class MemberTierMonthlyCouponBenefitDto
{
/// <summary>
/// 是否启用。
/// </summary>
public bool Enabled { get; init; }
/// <summary>
/// 每月发放日1-28
/// </summary>
public int GrantDay { get; init; } = 1;
/// <summary>
/// 每月赠券模板 ID。
/// </summary>
public IReadOnlyList<long> CouponTemplateIds { get; init; } = [];
}
/// <summary>
/// 免配送费权益 DTO。
/// </summary>
public sealed class MemberTierFreeDeliveryBenefitDto
{
/// <summary>
/// 是否启用。
/// </summary>
public bool Enabled { get; init; }
/// <summary>
/// 每月免配送费次数。
/// </summary>
public int MonthlyFreeTimes { get; init; }
}
/// <summary>
/// 会员等级详情 DTO。
/// </summary>
public sealed class MemberTierDetailDto
{
/// <summary>
/// 等级标识。
/// </summary>
public long? TierId { get; init; }
/// <summary>
/// 排序序号。
/// </summary>
public int SortOrder { get; init; }
/// <summary>
/// 等级名称。
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// 图标键。
/// </summary>
public string IconKey { get; init; } = string.Empty;
/// <summary>
/// 主题色。
/// </summary>
public string ColorHex { get; init; } = string.Empty;
/// <summary>
/// 是否默认等级。
/// </summary>
public bool IsDefault { get; init; }
/// <summary>
/// 升降级规则。
/// </summary>
public MemberTierRuleDto Rule { get; init; } = new();
/// <summary>
/// 等级权益。
/// </summary>
public MemberTierBenefitsDto Benefits { get; init; } = new();
/// <summary>
/// 是否可删除。
/// </summary>
public bool CanDelete { get; init; }
}
/// <summary>
/// 会员日配置 DTO。
/// </summary>
public sealed class MemberDaySettingDto
{
/// <summary>
/// 是否启用会员日。
/// </summary>
public bool IsEnabled { get; init; }
/// <summary>
/// 周几1-7对应周一到周日
/// </summary>
public int Weekday { get; init; }
/// <summary>
/// 会员日额外折扣(如 9 表示 9 折)。
/// </summary>
public decimal ExtraDiscountRate { get; init; }
}
/// <summary>
/// 优惠券选择项 DTO。
/// </summary>
public sealed class MemberCouponPickerItemDto
{
/// <summary>
/// 券模板标识。
/// </summary>
public long CouponTemplateId { get; init; }
/// <summary>
/// 券名称。
/// </summary>
public string Name { get; init; } = string.Empty;
/// <summary>
/// 券类型。
/// </summary>
public string CouponType { get; init; } = string.Empty;
/// <summary>
/// 面值或折扣值。
/// </summary>
public decimal Value { get; init; }
/// <summary>
/// 最低消费门槛。
/// </summary>
public decimal? MinimumSpend { get; init; }
/// <summary>
/// 展示文案。
/// </summary>
public string DisplayText { get; init; } = string.Empty;
}