feat(product): complete combo and detail editing data model
All checks were successful
Build and Deploy TenantApi / build-and-deploy (push) Successful in 47s

This commit is contained in:
2026-02-22 09:35:57 +08:00
parent f7c2ae4bac
commit d66879f5cf
22 changed files with 19099 additions and 75 deletions

View File

@@ -128,6 +128,21 @@ public sealed class Product : MultiTenantEntityBase
/// </summary>
public string? Description { get; set; }
/// <summary>
/// 排序权重,越大越靠前。
/// </summary>
public int SortWeight { get; set; }
/// <summary>
/// 库存预警值。
/// </summary>
public int? WarningStock { get; set; }
/// <summary>
/// 打包费(元/份)。
/// </summary>
public decimal? PackingFee { get; set; }
/// <summary>
/// 支持堂食。
/// </summary>

View File

@@ -0,0 +1,34 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 套餐分组。
/// </summary>
public sealed class ProductComboGroup : MultiTenantEntityBase
{
/// <summary>
/// 套餐商品 ID。
/// </summary>
public long ProductId { get; set; }
/// <summary>
/// 分组名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 最小选择数。
/// </summary>
public int MinSelect { get; set; } = 1;
/// <summary>
/// 最大选择数。
/// </summary>
public int MaxSelect { get; set; } = 1;
/// <summary>
/// 排序值。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -0,0 +1,29 @@
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Products.Entities;
/// <summary>
/// 套餐分组内商品。
/// </summary>
public sealed class ProductComboGroupItem : MultiTenantEntityBase
{
/// <summary>
/// 所属套餐分组 ID。
/// </summary>
public long ComboGroupId { get; set; }
/// <summary>
/// 商品 ID。
/// </summary>
public long ProductId { get; set; }
/// <summary>
/// 数量。
/// </summary>
public int Quantity { get; set; } = 1;
/// <summary>
/// 排序值。
/// </summary>
public int SortOrder { get; set; } = 100;
}

View File

@@ -51,4 +51,9 @@ public sealed class ProductSku : MultiTenantEntityBase
/// 排序值。
/// </summary>
public int SortOrder { get; set; } = 100;
/// <summary>
/// 是否启用。
/// </summary>
public bool IsEnabled { get; set; } = true;
}

View File

@@ -153,6 +153,26 @@ public interface IProductRepository
/// </summary>
Task<IReadOnlyList<ProductSku>> GetSkusByProductIdsAsync(IReadOnlyCollection<long> productIds, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取商品套餐分组。
/// </summary>
Task<IReadOnlyList<ProductComboGroup>> GetComboGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 批量获取商品套餐分组。
/// </summary>
Task<IReadOnlyList<ProductComboGroup>> GetComboGroupsByProductIdsAsync(IReadOnlyCollection<long> productIds, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取套餐分组内商品。
/// </summary>
Task<IReadOnlyList<ProductComboGroupItem>> GetComboGroupItemsAsync(long productId, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 批量获取套餐分组内商品。
/// </summary>
Task<IReadOnlyList<ProductComboGroupItem>> GetComboGroupItemsByGroupIdsAsync(IReadOnlyCollection<long> comboGroupIds, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取商品加料组与选项。
/// </summary>
@@ -291,6 +311,15 @@ public interface IProductRepository
/// <returns>异步任务。</returns>
Task AddSkusAsync(IEnumerable<ProductSku> skus, CancellationToken cancellationToken = default);
/// <summary>
/// 新增套餐分组与分组商品。
/// </summary>
/// <param name="groups">套餐分组集合。</param>
/// <param name="items">分组商品集合。</param>
/// <param name="cancellationToken">取消标记。</param>
/// <returns>异步任务。</returns>
Task AddComboGroupsAsync(IEnumerable<ProductComboGroup> groups, IEnumerable<ProductComboGroupItem> items, CancellationToken cancellationToken = default);
/// <summary>
/// 新增加料组与选项。
/// </summary>
@@ -405,6 +434,15 @@ public interface IProductRepository
/// <returns>异步任务。</returns>
Task RemoveSkusAsync(long productId, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 删除商品下的套餐分组及分组商品。
/// </summary>
/// <param name="productId">商品 ID。</param>
/// <param name="tenantId">租户 ID。</param>
/// <param name="cancellationToken">取消标记。</param>
/// <returns>异步任务。</returns>
Task RemoveComboGroupsAsync(long productId, long tenantId, CancellationToken cancellationToken = default);
/// <summary>
/// 删除模板下的规格做法选项。
/// </summary>