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,