feat(member): implement member center management module
Some checks failed
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Failing after 1m54s
Some checks failed
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Failing after 1m54s
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user