feat(marketing): add new customer gift backend module

This commit is contained in:
2026-03-02 15:58:06 +08:00
parent c9e2226b48
commit 6588c85f27
38 changed files with 12525 additions and 1 deletions

View File

@@ -0,0 +1,45 @@
using TakeoutSaaS.Domain.Coupons.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Coupons.Entities;
/// <summary>
/// 新客有礼券规则。
/// </summary>
public sealed class NewCustomerCouponRule : MultiTenantEntityBase
{
/// <summary>
/// 门店 ID。
/// </summary>
public long StoreId { get; set; }
/// <summary>
/// 券规则场景。
/// </summary>
public NewCustomerCouponScene Scene { get; set; } = NewCustomerCouponScene.Welcome;
/// <summary>
/// 券类型。
/// </summary>
public NewCustomerCouponType CouponType { get; set; } = NewCustomerCouponType.AmountOff;
/// <summary>
/// 面值或折扣值。
/// </summary>
public decimal? Value { get; set; }
/// <summary>
/// 使用门槛。
/// </summary>
public decimal? MinimumSpend { get; set; }
/// <summary>
/// 有效期天数。
/// </summary>
public int ValidDays { get; set; }
/// <summary>
/// 排序值(同场景内递增)。
/// </summary>
public int SortOrder { get; set; }
}

View File

@@ -0,0 +1,45 @@
using TakeoutSaaS.Domain.Coupons.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Coupons.Entities;
/// <summary>
/// 新客有礼门店配置。
/// </summary>
public sealed class NewCustomerGiftSetting : MultiTenantEntityBase
{
/// <summary>
/// 门店 ID。
/// </summary>
public long StoreId { get; set; }
/// <summary>
/// 是否开启新客礼包。
/// </summary>
public bool GiftEnabled { get; set; }
/// <summary>
/// 礼包类型。
/// </summary>
public NewCustomerGiftType GiftType { get; set; } = NewCustomerGiftType.Coupon;
/// <summary>
/// 首单直减金额。
/// </summary>
public decimal? DirectReduceAmount { get; set; }
/// <summary>
/// 首单直减门槛金额。
/// </summary>
public decimal? DirectMinimumSpend { get; set; }
/// <summary>
/// 是否开启老带新分享。
/// </summary>
public bool InviteEnabled { get; set; }
/// <summary>
/// 分享渠道JSON
/// </summary>
public string ShareChannelsJson { get; set; } = "[]";
}

View File

@@ -0,0 +1,44 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Coupons.Entities;
/// <summary>
/// 新客成长记录。
/// </summary>
public sealed class NewCustomerGrowthRecord : MultiTenantEntityBase
{
/// <summary>
/// 门店 ID。
/// </summary>
public long StoreId { get; set; }
/// <summary>
/// 顾客业务唯一键。
/// </summary>
public string CustomerKey { get; set; } = string.Empty;
/// <summary>
/// 顾客展示名。
/// </summary>
public string? CustomerName { get; set; }
/// <summary>
/// 注册时间。
/// </summary>
public DateTime RegisteredAt { get; set; }
/// <summary>
/// 礼包领取时间。
/// </summary>
public DateTime? GiftClaimedAt { get; set; }
/// <summary>
/// 首单时间。
/// </summary>
public DateTime? FirstOrderAt { get; set; }
/// <summary>
/// 渠道来源。
/// </summary>
public string? SourceChannel { get; set; }
}

View File

@@ -0,0 +1,50 @@
using TakeoutSaaS.Domain.Coupons.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Coupons.Entities;
/// <summary>
/// 新客邀请记录。
/// </summary>
public sealed class NewCustomerInviteRecord : MultiTenantEntityBase
{
/// <summary>
/// 门店 ID。
/// </summary>
public long StoreId { get; set; }
/// <summary>
/// 邀请人展示名。
/// </summary>
public string InviterName { get; set; } = string.Empty;
/// <summary>
/// 被邀请人展示名。
/// </summary>
public string InviteeName { get; set; } = string.Empty;
/// <summary>
/// 邀请时间。
/// </summary>
public DateTime InviteTime { get; set; }
/// <summary>
/// 订单状态。
/// </summary>
public NewCustomerInviteOrderStatus OrderStatus { get; set; } = NewCustomerInviteOrderStatus.PendingOrder;
/// <summary>
/// 奖励状态。
/// </summary>
public NewCustomerInviteRewardStatus RewardStatus { get; set; } = NewCustomerInviteRewardStatus.Pending;
/// <summary>
/// 奖励发放时间。
/// </summary>
public DateTime? RewardIssuedAt { get; set; }
/// <summary>
/// 邀请来源渠道。
/// </summary>
public string? SourceChannel { get; set; }
}