From 88d75ff9141204ffaf904f70f265fb59e45d3390 Mon Sep 17 00:00:00 2001 From: chfei Date: Mon, 10 Aug 2026 09:54:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=9F=E8=AE=A1=20table?= =?UTF-8?q?=E5=88=97=E8=A1=A8=20=E6=80=BB=E9=87=91=E9=A2=9D=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=20=E5=A4=9A=E5=87=BA=E4=BA=86=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ShopRevenueStatisticsService.cs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/29WxOrderWpf/Ctrls/Statistics/Services/ShopRevenueStatisticsService.cs b/29WxOrderWpf/Ctrls/Statistics/Services/ShopRevenueStatisticsService.cs index f3569ff..c9da6a5 100644 --- a/29WxOrderWpf/Ctrls/Statistics/Services/ShopRevenueStatisticsService.cs +++ b/29WxOrderWpf/Ctrls/Statistics/Services/ShopRevenueStatisticsService.cs @@ -105,10 +105,14 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services { return row.BuyerRefundStatus == "退款成功"; } + private static List GetPaymentOrderList(IEnumerable rows) + { + return (rows ?? new List()).Where(a => a.OutAmount > 0).ToList(); //买手付钱后的订单数量 + } /// 汇总卡片 public static ShopRevenueSummary GetSummary(IEnumerable rows) { - var list = (rows ?? new List()).Where(a => a.OutAmount > 0).ToList(); //买手付钱后的订单数量 + var list = GetPaymentOrderList(rows); //买手付钱后的订单数量 var valid = list.Where(IsValidOrder).ToList(); var refunded = list.Where(IsRefunded).ToList(); @@ -149,7 +153,8 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services /// 销售趋势(按天,缺失日期补 0,仅统计有效订单) public static List GetSalesTrend(IEnumerable rows, DateTime startDate, DateTime endDate) { - var list = (rows ?? new List()).Where(IsValidOrder).ToList(); + var list = GetPaymentOrderList(rows); + list = list.Where(IsValidOrder).ToList(); var map = list .GroupBy(r => r.CreateTime.Date) .ToDictionary( @@ -175,7 +180,8 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services /// 店铺销售占比(饼图,仅统计有效订单) public static List GetShopSalesProportion(IEnumerable rows) { - var list = (rows ?? new List()).Where(IsValidOrder).ToList(); + var list = GetPaymentOrderList(rows); + list = list.Where(IsValidOrder).ToList(); decimal total = list.Sum(r => (decimal)(r.OrderPrice)) / 100m; return list @@ -193,7 +199,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services /// 店铺统计表格 public static List GetShopStatistics(IEnumerable rows) { - var list = (rows ?? new List()).Where(a => a.OutAmount > 0).ToList(); //买手付钱后的订单 + var list = GetPaymentOrderList(rows); //买手付钱后的订单 return list .GroupBy(r => r.ShopName) @@ -201,7 +207,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services { var valid = g.Where(IsValidOrder).ToList(); var refunded = g.Where(IsRefunded).ToList(); - decimal salesAmount = g.Sum(r => (decimal)(r.OrderPrice)) / 100m; //与 GetSummary 一致:含已退款订单的销售额 + decimal salesAmount = valid.Sum(r => (decimal)(r.OrderPrice)) / 100m; //与 GetSummary 一致:不含已退款订单的销售额 int orderCount = valid.Select(r => r.OrderId).Distinct().Count(); decimal profit = valid.Concat(refunded).Sum(r => (decimal)(r.Profit)) / 100m; //与 GetSummary 一致:有效+退款订单利润 decimal purchaseAmount = valid.Sum(r => (decimal)(r.OutAmount)) / 100m; //与 GetSummary 一致:买手付款金额(采购金额) @@ -238,7 +244,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services { var valid = g.Where(IsValidOrder).ToList(); var refunded = g.Where(IsRefunded).ToList(); - decimal salesAmount = g.Sum(r => (decimal)(r.OrderPrice)) / 100m; //与 GetSummary 一致:含已退款订单的销售额 + decimal salesAmount = valid.Sum(r => (decimal)(r.OrderPrice)) / 100m; //与 GetSummary 一致:不含已退款订单的销售额 decimal profit = valid.Concat(refunded).Sum(r => (decimal)(r.Profit)) / 100m; //与 GetSummary 一致:有效+退款订单利润 decimal purchaseAmount = valid.Sum(r => (decimal)(r.OutAmount)) / 100m; //与 GetSummary 一致:买手付款金额(采购金额) int orderCount = valid.Select(r => r.OrderId).Distinct().Count(); @@ -358,7 +364,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Services /// 查询时按天命中:未命中的天合并成连续段一次请求,返回后按天拆分写入; /// 前台选某一个或某多个店铺时,按所选店铺(ShopName)过滤,复用同一批时间数据。 /// - private readonly Dictionary _rowCache = + private static readonly Dictionary _rowCache = new Dictionary(); private readonly object _cacheLock = new object();