This commit is contained in:
zpc 2026-02-05 23:57:20 +08:00
parent 7e4beb00af
commit b3d0782b91

View File

@ -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 };
/// <inheritdoc />
public async Task<PagedResult<GoodsListResponse>> 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<int, (int TotalStock, int SurplusStock)>();
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<GoodsListResponse>.Create(list, total, request.Page, request.PageSize);
}
@ -812,8 +844,35 @@ public class GoodsService : IGoodsService
/// <summary>
/// 映射商品到列表响应
/// </summary>
private GoodsListResponse MapToGoodsListResponse(Good goods)
/// <param name="goods">商品实体</param>
/// <param name="stockSummary">非无限赏商品的库存汇总(可选)</param>
private GoodsListResponse MapToGoodsListResponse(Good goods, Dictionary<int, (int TotalStock, int SurplusStock)>? 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,