diff --git a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs index ef2d61c..74b3f10 100644 --- a/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs +++ b/netcore/src/Modularity/Extend/NCC.Extend/LqKhxxService.cs @@ -548,25 +548,61 @@ namespace NCC.Extend.LqKhxx _logger.LogWarning("会员不存在,会员ID:{MemberId}", memberId); throw NCCException.Oh("会员不存在"); } - // 2. 查询开单记录ID列表 - var remainingItems = await _db.Queryable() + // 2. 分步查询,避免子查询问题 + // 先查询基础品项数据 + var baseItems = await _db.Queryable() .Where(x => x.MemberId == memberId) - .Select(x => new RemainingItemInfo + .Select(x => new { - BillingItemId = x.Id, - ItemId = x.Px, - ItemName = x.Pxmc, - ItemPrice = x.Pxjg, - SourceType = x.SourceType, - TotalPurchased = x.ProjectNumber, - ConsumedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)), - RefundedCount = SqlFunc.Subqueryable().Where(y => y.BillingItemId == x.Id).Sum(y => SqlFunc.ToDecimal(y.ProjectNumber)), + x.Id, + x.Px, + x.Pxmc, + x.Pxjg, + x.SourceType, + x.ProjectNumber }) - .Mapper(x => + .ToListAsync(); + + // 查询消费数据 + var consumedData = await _db.Queryable() + .Where(x => baseItems.Select(b => b.Id).Contains(x.BillingItemId)) + .GroupBy(x => x.BillingItemId) + .Select(x => new + { + BillingItemId = x.BillingItemId, + TotalConsumed = SqlFunc.AggregateSum(x.ProjectNumber) + }) + .ToListAsync(); + + // 查询退卡数据 + var refundedData = await _db.Queryable() + .Where(x => baseItems.Select(b => b.Id).Contains(x.BillingItemId)) + .GroupBy(x => x.BillingItemId) + .Select(x => new { - x.RemainingCount = x.TotalPurchased - x.ConsumedCount - x.RefundedCount; + BillingItemId = x.BillingItemId, + TotalRefunded = SqlFunc.AggregateSum(x.ProjectNumber) }) .ToListAsync(); + + // 组装结果 + var remainingItems = baseItems.Select(item => new RemainingItemInfo + { + BillingItemId = item.Id, + ItemId = item.Px, + ItemName = item.Pxmc, + ItemPrice = item.Pxjg, + SourceType = item.SourceType, + TotalPurchased = item.ProjectNumber, + ConsumedCount = consumedData.FirstOrDefault(c => c.BillingItemId == item.Id)?.TotalConsumed ?? 0, + RefundedCount = refundedData.FirstOrDefault(r => r.BillingItemId == item.Id)?.TotalRefunded ?? 0, + }).ToList(); + + // 计算剩余数量 + foreach (var item in remainingItems) + { + item.RemainingCount = item.TotalPurchased - item.ConsumedCount - item.RefundedCount; + } return new MemberRemainingItemsOutput { MemberId = memberId,