21
This commit is contained in:
parent
7e4beb00af
commit
b3d0782b91
|
|
@ -45,6 +45,10 @@ public class GoodsService : IGoodsService
|
||||||
|
|
||||||
#region 商品管理
|
#region 商品管理
|
||||||
|
|
||||||
|
// 使用模板奖品的类型(无限赏类型):库存直接使用 goods 表的 stock/sale_stock
|
||||||
|
// 其他类型(箱号类型):库存需要从 goods_items 表汇总计算
|
||||||
|
private static readonly int[] TemplateTypes = { 2, 8, 9, 15, 16, 17 };
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<PagedResult<GoodsListResponse>> GetGoodsListAsync(GoodsListRequest request)
|
public async Task<PagedResult<GoodsListResponse>> GetGoodsListAsync(GoodsListRequest request)
|
||||||
{
|
{
|
||||||
|
|
@ -66,8 +70,36 @@ public class GoodsService : IGoodsService
|
||||||
.Take(request.PageSize)
|
.Take(request.PageSize)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
// 映射结果
|
// 获取非无限赏类型商品的ID列表,用于计算实际库存
|
||||||
var list = goods.Select(MapToGoodsListResponse).ToList();
|
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);
|
return PagedResult<GoodsListResponse>.Create(list, total, request.Page, request.PageSize);
|
||||||
}
|
}
|
||||||
|
|
@ -812,8 +844,35 @@ public class GoodsService : IGoodsService
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 映射商品到列表响应
|
/// 映射商品到列表响应
|
||||||
/// </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
|
return new GoodsListResponse
|
||||||
{
|
{
|
||||||
Id = goods.Id,
|
Id = goods.Id,
|
||||||
|
|
@ -823,8 +882,8 @@ public class GoodsService : IGoodsService
|
||||||
Type = goods.Type,
|
Type = goods.Type,
|
||||||
TypeName = BoxTypeNames.GetValueOrDefault(goods.Type, "未知类型"),
|
TypeName = BoxTypeNames.GetValueOrDefault(goods.Type, "未知类型"),
|
||||||
Status = goods.Status,
|
Status = goods.Status,
|
||||||
Stock = goods.Stock,
|
Stock = stock,
|
||||||
SaleStock = goods.SaleStock,
|
SaleStock = saleStock,
|
||||||
Sort = goods.Sort,
|
Sort = goods.Sort,
|
||||||
FlwStartTime = goods.FlwStartTime,
|
FlwStartTime = goods.FlwStartTime,
|
||||||
FlwEndTime = goods.FlwEndTime,
|
FlwEndTime = goods.FlwEndTime,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user