diff --git a/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs b/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs
index 8e22f23e..7580f588 100644
--- a/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs
+++ b/server/HoneyBox/src/HoneyBox.Admin.Business/Services/GoodsService.cs
@@ -45,6 +45,10 @@ public class GoodsService : IGoodsService
#region 商品管理
+ // 使用模板奖品的类型(无限赏类型):库存直接使用 goods 表的 stock/sale_stock
+ // 其他类型(箱号类型):库存需要从 goods_items 表汇总计算
+ private static readonly int[] TemplateTypes = { 2, 8, 9, 15, 16, 17 };
+
///
public async Task> GetGoodsListAsync(GoodsListRequest request)
{
@@ -66,8 +70,36 @@ public class GoodsService : IGoodsService
.Take(request.PageSize)
.ToListAsync();
- // 映射结果
- var list = goods.Select(MapToGoodsListResponse).ToList();
+ // 获取非无限赏类型商品的ID列表,用于计算实际库存
+ var nonTemplateGoodsIds = goods
+ .Where(g => !TemplateTypes.Contains(g.Type))
+ .Select(g => g.Id)
+ .ToList();
+
+ // 批量查询非无限赏商品的奖品库存汇总
+ var stockSummary = new Dictionary();
+ if (nonTemplateGoodsIds.Any())
+ {
+ var summary = await _dbContext.GoodsItems
+ .AsNoTracking()
+ .Where(gi => nonTemplateGoodsIds.Contains(gi.GoodsId) && gi.GoodsListId == 0) // 只统计父奖品
+ .GroupBy(gi => gi.GoodsId)
+ .Select(g => new
+ {
+ GoodsId = g.Key,
+ TotalStock = g.Sum(x => x.Stock),
+ SurplusStock = g.Sum(x => x.SurplusStock)
+ })
+ .ToListAsync();
+
+ foreach (var s in summary)
+ {
+ stockSummary[s.GoodsId] = (s.TotalStock, s.SurplusStock);
+ }
+ }
+
+ // 映射结果,传入库存汇总数据
+ var list = goods.Select(g => MapToGoodsListResponse(g, stockSummary)).ToList();
return PagedResult.Create(list, total, request.Page, request.PageSize);
}
@@ -812,8 +844,35 @@ public class GoodsService : IGoodsService
///
/// 映射商品到列表响应
///
- private GoodsListResponse MapToGoodsListResponse(Good goods)
+ /// 商品实体
+ /// 非无限赏商品的库存汇总(可选)
+ private GoodsListResponse MapToGoodsListResponse(Good goods, Dictionary? stockSummary = null)
{
+ int stock, saleStock;
+
+ // 判断是否为无限赏类型(使用模板奖品的类型)
+ if (TemplateTypes.Contains(goods.Type))
+ {
+ // 无限赏类型:直接使用 goods 表的库存字段
+ stock = goods.Stock;
+ saleStock = goods.SaleStock;
+ }
+ else
+ {
+ // 非无限赏类型(箱号类型):从奖品汇总计算库存
+ if (stockSummary != null && stockSummary.TryGetValue(goods.Id, out var summary))
+ {
+ stock = summary.TotalStock;
+ saleStock = summary.TotalStock - summary.SurplusStock;
+ }
+ else
+ {
+ // 没有奖品数据时,显示0
+ stock = 0;
+ saleStock = 0;
+ }
+ }
+
return new GoodsListResponse
{
Id = goods.Id,
@@ -823,8 +882,8 @@ public class GoodsService : IGoodsService
Type = goods.Type,
TypeName = BoxTypeNames.GetValueOrDefault(goods.Type, "未知类型"),
Status = goods.Status,
- Stock = goods.Stock,
- SaleStock = goods.SaleStock,
+ Stock = stock,
+ SaleStock = saleStock,
Sort = goods.Sort,
FlwStartTime = goods.FlwStartTime,
FlwEndTime = goods.FlwEndTime,