修改统计, 采购金额=有效订单的采购金额

This commit is contained in:
chfei committed 2026-10-09 20:22:37 +08:00
1 parent 0df1f8c54e
commit f1a03e521a
3 files changed
+119 -32

No files matched your search

@@ -157,6 +157,11 @@ public class ShopRevenueStatistics
{
public long Id { get; set; }
/// <summary>
/// 是否有效订单
/// 主订单未退款采用的买手订单
/// </summary>
public bool IsValid { get; set; }
/// <summary>
/// 采购类型
/// </summary>
public PurchaseType PurchaseType { get; set; }
@@ -196,8 +196,8 @@ public class ShopRevenueStatisticsService : ITransientDependency
if (orders.Count == 0) return result;
// 加载买手订单(直拍和中转仓都要查),并回填商铺订单的退款金额
LoadBuyerOrder(orders);
FillRefunds(orders);
LoadBuyerOrder(orders);
CalcProfit(orders);
foreach (var order in orders)
@@ -337,8 +337,8 @@ public class ShopRevenueStatisticsService : ITransientDependency
{
var orders = LoadOrders(date, shopId);
LoadBuyerOrder(orders);
FillRefunds(orders);
LoadBuyerOrder(orders);
CalcProfit(orders);
SaveShopStats(date.Date, orders);
@@ -649,6 +649,15 @@ public class ShopRevenueStatisticsService : ITransientDependency
if (orders[i].BuyerOrders.Count == 0)
orders.RemoveAt(i);
}
//设置有效订单
foreach (var o in orders)
{
if (o.HasRefund == false)
{
if (o.BuyerOrders.Count > 0)
o.BuyerOrders.Last().IsValid = true;
}
}
}
/// <summary>回填商铺订单的退款信息</summary>
@@ -763,31 +772,39 @@ public class ShopRevenueStatisticsService : ITransientDependency
// 按店铺分组,每个店铺下展开所有买手订单
foreach (var shopGroup in orders.GroupBy(o => o.ShopId))
{
var buyerOrders = shopGroup
.Where(o => o.BuyerOrders != null)
.SelectMany(o => o.BuyerOrders)
.ToList();
var valid = shopGroup.Where(a => !a.HasRefund).ToList();
var afterSale = shopGroup.Where(a => a.HasRefund).ToList();
if (buyerOrders.Count == 0) continue;
// 该店铺当天没有采购单,不写入
// 同一个外部订单可能有多条记录,按 OutOrderSn 再分组
// OutOrderSn 为空时用 SkuId 兜底,避免多个空单号被合并成一个
var outOrderGroups = buyerOrders
// 有效订单:每单只有一条 IsValid 的采购单
var validBuyerOrders = valid
.Where(o => o.BuyerOrders != null)
.Select(o => o.BuyerOrders.FirstOrDefault(b => b.IsValid))
.Where(b => b != null)
.ToList();
// 售后订单下的采购单,按外部订单分组
var afterSaleGroups = afterSale
.Where(o => o.BuyerOrders != null)
.SelectMany(o => o.BuyerOrders)
.GroupBy(b => b.OutOrderSn)
.ToList();
if (buyerOrders.Any(a => a.OutOrderSn == "261007-181907044681346"))
{
}
if (validBuyerOrders.Count == 0 && afterSaleGroups.Count == 0) continue; // 当天没有采购单,不写入
// 采购金额:直接累加每个有效订单的有效采购单
long totalPurchase = validBuyerOrders.Sum(b => (long)b.OutAmount);
// 外部订单数:有效 + 售后 去重
int purchaseCount = validBuyerOrders.Select(b => b.OutOrderSn)
.Union(afterSaleGroups.Select(g => g.Key))
.Count();
// 售后订单按退款状态分类
long done = 0, pending = 0, rejected = 0;
long totalPurchase = 0;
foreach (var g in outOrderGroups)
{
//购买金额:同一外部订单的多条记录可能是退款记录重复展开,购买金额只算一次
totalPurchase += g.Max(x => x.OutAmount);
// 只要有一条退款成功,整个外部订单视为退款成功
foreach (var g in afterSaleGroups)
{
// 已退款:只要有一条退款成功,整个外部订单视为已退款
var successRow = g.FirstOrDefault(x => IsRefundDone(x.RefundStatusText));
if (successRow != null)
{
@@ -795,34 +812,99 @@ public class ShopRevenueStatisticsService : ITransientDependency
continue;
}
// 没有任何退款信息,说明没发生退款
// 未退款:取有退款信息的记录
var refundRows = g.Where(x => x.RefundAmount > 0 || !string.IsNullOrEmpty(x.RefundStatusText)).ToList();
if (refundRows.Count == 0) continue;
// 没有成功记录:视为未成功,金额取该订单下最大的退款金额,避免重复累加
long refundAmount = refundRows.Max(x => x.RefundAmount);
// 金额取该订单下最大退款金额,避免重复累加
long refundAmount = refundRows.Max(x => (long)x.RefundAmount);
if (refundRows.Any(x => IsRefundRejected(x.RefundStatusText)))
rejected += refundAmount;
rejected += refundAmount; // 已拒绝
else
pending += refundAmount;
pending += refundAmount; // 待处理
}
statsList.Add(new BuyerDailyStatsEntity
{
ShopId = shopGroup.Key.ToString(),
BuyerId = "",
StatDate = statDate.Date,
PurchaseCount = outOrderGroups.Count, // 按外部订单数统计
PurchaseCount = purchaseCount,
TotalPurchase = totalPurchase,
DoneRefund = done,
PendingRefund = pending,
RejectedRefund = rejected,
});
}
if (statsList.Count == 0) return;
if (statsList.Count == 0) return; // 空集合不要提交
_freeSql.InsertOrUpdate<BuyerDailyStatsEntity>()
.SetSource(statsList, a => new { a.ShopId, a.StatDate })
.ExecuteAffrows();
// var buyerOrders = shopGroup
// .Where(o => o.BuyerOrders != null)
// .SelectMany(o => o.BuyerOrders)
// .ToList();
// if (buyerOrders.Count == 0) continue;
// // 该店铺当天没有采购单,不写入
// // 同一个外部订单可能有多条记录,按 OutOrderSn 再分组
// // OutOrderSn 为空时用 SkuId 兜底,避免多个空单号被合并成一个
// var outOrderGroups = buyerOrders
// .GroupBy(b => b.OutOrderSn)
// .ToList();
// if (buyerOrders.Any(a => a.OutOrderSn == "261007-181907044681346"))
// {
// }
// long done = 0, pending = 0, rejected = 0;
// long validTotalPurchase = 0;
// foreach (var g in outOrderGroups)
// {
// var validItems = g.Where(a => a.IsValid).ToList();
// if (validItems.Count > 0)
// {
// validTotalPurchase += validItems.Max(a => a.OutAmount);
// }
// // 只要有一条退款成功,整个外部订单视为退款成功
// var successRow = g.FirstOrDefault(x => IsRefundDone(x.RefundStatusText));
// if (successRow != null)
// {
// done += successRow.RefundAmount;
// continue;
// }
// // 没有任何退款信息,说明没发生退款
// var refundRows = g.Where(x => x.RefundAmount > 0 || !string.IsNullOrEmpty(x.RefundStatusText)).ToList();
// if (refundRows.Count == 0) continue;
// // 没有成功记录:视为未成功,金额取该订单下最大的退款金额,避免重复累加
// long refundAmount = refundRows.Max(x => x.RefundAmount);
// if (refundRows.Any(x => IsRefundRejected(x.RefundStatusText)))
// rejected += refundAmount;
// else
// pending += refundAmount;
// }
// statsList.Add(new BuyerDailyStatsEntity
// {
// ShopId = shopGroup.Key.ToString(),
// BuyerId = "",
// StatDate = statDate.Date,
// PurchaseCount = outOrderGroups.Count, // 按外部订单数统计
// TotalPurchase = validTotalPurchase,
// DoneRefund = done,
// PendingRefund = pending,
// RejectedRefund = rejected,
// });
//}
//if (statsList.Count == 0) return;
//_freeSql.InsertOrUpdate<BuyerDailyStatsEntity>()
// .SetSource(statsList, a => new { a.ShopId, a.StatDate })
// .ExecuteAffrows();
}
+5 -5
View File
@@ -136,15 +136,15 @@ internal class ShopTest
[Test]
public void GetShopSalesOrderTest()
{
var shopService = _container.Resolve<ShopRevenueStatisticsService>();
DateTime date = DateTime.Parse("2026/10/01");
var shopService = _container.Resolve<ShopService>();
var shopIds =shopService.GetShopIds("taiyuanqiji");
var shopStatsService = _container.Resolve<ShopRevenueStatisticsService>();
DateTime date = DateTime.Parse("2026/09/10");
Console.WriteLine($"开始:{date.ToLongDateString()}");
try
{
shopService.ShopDailyStats(date, [
1960967267443626508,
]);
shopStatsService.ShopDailyStats(date, shopIds);
}
catch
{