feat: 扩展领域模型与配置

This commit is contained in:
贺爱泽
2025-12-01 13:26:05 +08:00
parent a08804658b
commit 5ddad07658
148 changed files with 8519 additions and 2 deletions

View File

@@ -0,0 +1,100 @@
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品SPU信息。
/// </summary>
public sealed class Product : MultiTenantEntityBase
{
/// <summary>
/// 所属门店。
/// </summary>
public Guid StoreId { get; set; }
/// <summary>
/// 所属分类。
/// </summary>
public Guid CategoryId { get; set; }
/// <summary>
/// 商品编码。
/// </summary>
public string SpuCode { get; set; } = string.Empty;
/// <summary>
/// 商品名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 副标题/卖点。
/// </summary>
public string? Subtitle { get; set; }
/// <summary>
/// 售卖单位(份/杯等)。
/// </summary>
public string? Unit { get; set; }
/// <summary>
/// 现价。
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 原价。
/// </summary>
public decimal? OriginalPrice { get; set; }
/// <summary>
/// 库存数量(可选)。
/// </summary>
public int? StockQuantity { get; set; }
/// <summary>
/// 最大每单限购。
/// </summary>
public int? MaxQuantityPerOrder { get; set; }
/// <summary>
/// 商品状态。
/// </summary>
public ProductStatus Status { get; set; } = ProductStatus.Draft;
/// <summary>
/// 主图。
/// </summary>
public string? CoverImage { get; set; }
/// <summary>
/// Gallery 图片逗号分隔。
/// </summary>
public string? GalleryImages { get; set; }
/// <summary>
/// 商品描述。
/// </summary>
public string? Description { get; set; }
/// <summary>
/// 支持堂食。
/// </summary>
public bool EnableDineIn { get; set; } = true;
/// <summary>
/// 支持自提。
/// </summary>
public bool EnablePickup { get; set; } = true;
/// <summary>
/// 支持配送。
/// </summary>
public bool EnableDelivery { get; set; } = true;
/// <summary>
/// 是否热门推荐。
/// </summary>
public bool IsFeatured { get; set; }
}

View File

@@ -0,0 +1,45 @@
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 加料/做法分组。
/// </summary>
public sealed class ProductAddonGroup : MultiTenantEntityBase
{
/// <summary>
/// 所属商品。
/// </summary>
public Guid ProductId { get; set; }
/// <summary>
/// 分组名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 选择类型。
/// </summary>
public AddonSelectionType SelectionType { get; set; } = AddonSelectionType.Single;
/// <summary>
/// 最小选择数量。
/// </summary>
public int? MinSelect { get; set; }
/// <summary>
/// 最大选择数量。
/// </summary>
public int? MaxSelect { get; set; }
/// <summary>
/// 是否必选。
/// </summary>
public bool IsRequired { get; set; }
/// <summary>
/// 排序值。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -0,0 +1,34 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 加料选项。
/// </summary>
public sealed class ProductAddonOption : MultiTenantEntityBase
{
/// <summary>
/// 所属加料分组。
/// </summary>
public Guid AddonGroupId { get; set; }
/// <summary>
/// 选项名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 附加价格。
/// </summary>
public decimal? ExtraPrice { get; set; }
/// <summary>
/// 是否默认选项。
/// </summary>
public bool IsDefault { get; set; }
/// <summary>
/// 排序。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -0,0 +1,35 @@
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品规格/属性分组。
/// </summary>
public sealed class ProductAttributeGroup : MultiTenantEntityBase
{
/// <summary>
/// 关联门店,可为空表示所有门店共享。
/// </summary>
public Guid? StoreId { get; set; }
/// <summary>
/// 分组名称,例如“辣度”“份量”。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 选择类型(单选/多选)。
/// </summary>
public AttributeSelectionType SelectionType { get; set; } = AttributeSelectionType.Single;
/// <summary>
/// 是否必选。
/// </summary>
public bool IsRequired { get; set; }
/// <summary>
/// 显示排序。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -0,0 +1,34 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品规格选项。
/// </summary>
public sealed class ProductAttributeOption : MultiTenantEntityBase
{
/// <summary>
/// 所属规格组。
/// </summary>
public Guid AttributeGroupId { get; set; }
/// <summary>
/// 选项名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 附加价格。
/// </summary>
public decimal? ExtraPrice { get; set; }
/// <summary>
/// 排序。
/// </summary>
public int SortOrder { get; set; } = 100;
/// <summary>
/// 是否默认选中。
/// </summary>
public bool IsDefault { get; set; }
}

View File

@@ -0,0 +1,34 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品分类。
/// </summary>
public sealed class ProductCategory : MultiTenantEntityBase
{
/// <summary>
/// 所属门店。
/// </summary>
public Guid StoreId { get; set; }
/// <summary>
/// 分类名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 分类描述。
/// </summary>
public string? Description { get; set; }
/// <summary>
/// 排序值。
/// </summary>
public int SortOrder { get; set; } = 100;
/// <summary>
/// 是否启用。
/// </summary>
public bool IsEnabled { get; set; } = true;
}

View File

@@ -0,0 +1,35 @@
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品媒资素材。
/// </summary>
public sealed class ProductMediaAsset : MultiTenantEntityBase
{
/// <summary>
/// 商品标识。
/// </summary>
public Guid ProductId { get; set; }
/// <summary>
/// 媒体类型。
/// </summary>
public MediaAssetType MediaType { get; set; } = MediaAssetType.Image;
/// <summary>
/// 媒资链接。
/// </summary>
public string Url { get; set; } = string.Empty;
/// <summary>
/// 描述或标题。
/// </summary>
public string? Caption { get; set; }
/// <summary>
/// 排序。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -0,0 +1,45 @@
using TakeoutSaaS.Domain.Products.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品价格策略,支持会员价/时段价等。
/// </summary>
public sealed class ProductPricingRule : MultiTenantEntityBase
{
/// <summary>
/// 所属商品。
/// </summary>
public Guid ProductId { get; set; }
/// <summary>
/// 策略类型。
/// </summary>
public PricingRuleType RuleType { get; set; } = PricingRuleType.Member;
/// <summary>
/// 条件描述JSON如会员等级、渠道等。
/// </summary>
public string ConditionsJson { get; set; } = string.Empty;
/// <summary>
/// 特殊价格。
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 生效开始时间。
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 生效结束时间。
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 生效星期JSON 数组)。
/// </summary>
public string? WeekdaysJson { get; set; }
}

View File

@@ -0,0 +1,49 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 商品 SKU记录具体规格组合价格。
/// </summary>
public sealed class ProductSku : MultiTenantEntityBase
{
/// <summary>
/// 所属商品标识。
/// </summary>
public Guid ProductId { get; set; }
/// <summary>
/// SKU 编码。
/// </summary>
public string SkuCode { get; set; } = string.Empty;
/// <summary>
/// 条形码。
/// </summary>
public string? Barcode { get; set; }
/// <summary>
/// 售价。
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 原价。
/// </summary>
public decimal? OriginalPrice { get; set; }
/// <summary>
/// 可售库存。
/// </summary>
public int? StockQuantity { get; set; }
/// <summary>
/// 重量(千克)。
/// </summary>
public decimal? Weight { get; set; }
/// <summary>
/// 规格属性 JSON记录选项 ID
/// </summary>
public string AttributesJson { get; set; } = string.Empty;
}

View File

@@ -0,0 +1,17 @@
namespace TakeoutSaaS.Domain.Products.Enums;
/// <summary>
/// 加料选择类型。
/// </summary>
public enum AddonSelectionType
{
/// <summary>
/// 单选。
/// </summary>
Single = 0,
/// <summary>
/// 多选。
/// </summary>
Multiple = 1
}

View File

@@ -0,0 +1,17 @@
namespace TakeoutSaaS.Domain.Products.Enums;
/// <summary>
/// 规格/加料的选择方式。
/// </summary>
public enum AttributeSelectionType
{
/// <summary>
/// 单选。
/// </summary>
Single = 0,
/// <summary>
/// 多选。
/// </summary>
Multiple = 1
}

View File

@@ -0,0 +1,22 @@
namespace TakeoutSaaS.Domain.Products.Enums;
/// <summary>
/// 商品媒资类型。
/// </summary>
public enum MediaAssetType
{
/// <summary>
/// 图片。
/// </summary>
Image = 0,
/// <summary>
/// 视频。
/// </summary>
Video = 1,
/// <summary>
/// PDF 或说明文档。
/// </summary>
Document = 2
}

View File

@@ -0,0 +1,32 @@
namespace TakeoutSaaS.Domain.Products.Enums;
/// <summary>
/// 价格策略类型。
/// </summary>
public enum PricingRuleType
{
/// <summary>
/// 会员价格。
/// </summary>
Member = 0,
/// <summary>
/// 不同门店价格。
/// </summary>
Store = 1,
/// <summary>
/// 时间段价格。
/// </summary>
TimePeriod = 2,
/// <summary>
/// 区域价格。
/// </summary>
Region = 3,
/// <summary>
/// 活动价格。
/// </summary>
Promotion = 4
}

View File

@@ -0,0 +1,12 @@
namespace TakeoutSaaS.Domain.Products.Enums;
/// <summary>
/// 商品状态。
/// </summary>
public enum ProductStatus
{
Draft = 0,
OnSale = 1,
OffShelf = 2,
Archived = 3
}