feat: 扩展领域模型与配置
This commit is contained in:
100
src/Domain/TakeoutSaaS.Domain/Products/Entities/Product.cs
Normal file
100
src/Domain/TakeoutSaaS.Domain/Products/Entities/Product.cs
Normal 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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user