From 6b9333d8ba03965a221cec5ba8249900d0c3683c Mon Sep 17 00:00:00 2001
From: zhengyuxuan <zhengyuxuan1995>
Date: 星期一, 07 四月 2025 11:12:02 +0800
Subject: [PATCH] fix:统计查询优化

---
 LifePayment/LifePayment.Application/LifePay/StatisticsService.cs |  101 +++++++++++++++++++++++++++-----------------------
 1 files changed, 55 insertions(+), 46 deletions(-)

diff --git a/LifePayment/LifePayment.Application/LifePay/StatisticsService.cs b/LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
index c526c4b..17ab4c9 100644
--- a/LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
+++ b/LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
@@ -60,11 +60,11 @@
             var statistics = await _dallyStatisticsRepository.Where(x => x.CreationTime.Date == today)
                 .WhereIf(channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
                 .ToListAsync();
-            var totalRechargeReceipts = await _lifePayRechargeReceiptsRepository.Where(x => x.IsDeleted == false && x.CreationTime < today).SumAsync(x => x.RechargeAmount);
+            var totalRechargeReceipts = await _lifePayRechargeReceiptsRepository.Where(x => x.CreationTime < today).SumAsync(x => x.RechargeAmount);
             if (statistics == null || statistics.Count() == 0)
             {
                 TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { };
-                var allChannle = await _lifePayChannlesRep.Where(x => x.IsDeleted == false).ToListAsync();
+                var allChannle = await _lifePayChannlesRep.ToListAsync();
                 foreach (var item in allChannle)
                 {
                     var entity = await TopStatistics(item.ChannlesNum, today);
@@ -86,9 +86,8 @@
                 if (channleList.Count() == 0)
                 {
                     /// 璐︽埛浣欓
-                    var accountBalance = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�兼垚鍔� || x.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || x.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�)
-                      .SumAsync(x => x.PlatformDeductionAmount);
-                    topStatisticsOutput.Amount = accountBalance ?? 0;
+                    topStatisticsOutput.Amount = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�兼垚鍔� || x.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || x.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�)
+                      .SumAsync(x => x.PlatformDeductionAmount) ?? 0;
                 }
 
                 return topStatisticsOutput;
@@ -111,9 +110,8 @@
                 if (channleList.Count() == 0)
                 {
                     /// 璐︽埛浣欓
-                    var accountBalance = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�兼垚鍔� || x.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || x.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�)
-                      .SumAsync(x => x.PlatformDeductionAmount);
-                    topStatisticsOutput.Amount = accountBalance ?? 0;
+                    topStatisticsOutput.Amount = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�兼垚鍔� || x.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || x.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�)
+                      .SumAsync(x => x.PlatformDeductionAmount) ?? 0;
                 }
 
                 return topStatisticsOutput;
@@ -132,7 +130,7 @@
                 .WhereIf(channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
                 .OrderBy(o => o.CreationTime)
                 .ToListAsync();
-
+            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "鏀舵缁熻澶辫触");
             var groupedStatistics = statistics
                 .GroupBy(x => x.CreationTime)
                 .Select(g => new
@@ -146,14 +144,16 @@
 
             foreach (var item in groupedStatistics)
             {
+                /// 瀹為檯鏀舵鏃ユ湡
+                var creationTime = item.CreationTime.AddDays(-1).ToString("yyyy-MM-dd");
                 ReceiptsDetail receive = new ReceiptsDetail()
                 {
-                    CreationTime = item.CreationTime.AddDays(-1).ToString("yyyy-MM-dd"),
+                    CreationTime = creationTime,
                     Amount = item.TotalReceiptsYesterday
                 };
                 ReceiptsDetail income = new ReceiptsDetail()
                 {
-                    CreationTime = item.CreationTime.AddDays(-1).ToString("yyyy-MM-dd"),
+                    CreationTime = creationTime,
                     Amount = item.TotalIncomeYesterday
                 };
                 receiptsListOutPut.ReceiveList.Add(receive);
@@ -163,13 +163,18 @@
             return receiptsListOutPut;
         }
 
+        /// <summary>
+        /// 鑾峰彇30澶╀剑閲�
+        /// </summary>
+        /// <param name="channleList"></param>
+        /// <returns></returns>
         public async Task<ChannlesRakeListOutPut> GetChannlesRakeList(List<string> channleList)
         {
             var today = DateTime.Now.Date;
-            var statistics = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false &&
-            x.FinishTime.Date <= today && x.FinishTime.Date >= today.AddDays(-30))
+            var statistics = await _lifePayChannlesRakeRepository.Where(x => x.FinishTime.Date <= today && x.FinishTime.Date >= today.AddDays(-30))
                             .WhereIf(channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
                             .ToListAsync();
+            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "浣i噾缁熻澶辫触");
             var groupedStatistics = statistics
                .GroupBy(x => x.FinishTime.ToString("yyyy-MM-dd"))
                .Select(g => new
@@ -181,29 +186,31 @@
 
             ChannlesRakeListOutPut channlesRakeListOutPut = new ChannlesRakeListOutPut();
 
-            foreach (var item in groupedStatistics)
+            var dateList = Enumerable.Range(1, 31)
+                        .Select(i => today.AddDays(-i))
+                        .ToList();
+            foreach (var date in dateList)
             {
+                var stat = groupedStatistics.FirstOrDefault(g => g.FinishTime == date.ToString("yyyy-MM-dd"));
                 ReceiptsDetail receive = new ReceiptsDetail()
                 {
-                    CreationTime = item.FinishTime,
-                    Amount = item.ChannlesRakePrice
+                    CreationTime = date.ToString("yyyy-MM-dd"),
+                    Amount = stat?.ChannlesRakePrice ?? 0
                 };
-
                 channlesRakeListOutPut.ChannlesRakeList.Add(receive);
             }
 
             return channlesRakeListOutPut;
-
         }
 
         public async Task<ChannelDataListOutPut> GetChannelDataList(List<string> channleList)
         {
-
+            int maxStatisticsNumber = 5;
+            /// 杩欓噷涓嶅姞鍏�.Where()浼氭姤閿�
             var statistics = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false)
-                            .WhereIf(channleList != null && channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
+                            .WhereIf(channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
             .ToListAsync();
-
-            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "缁熻澶辫触");
+            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "娓犻亾鏀舵缁熻澶辫触");
             var groupedStatistics = statistics
                .GroupBy(x => x.ChannelId)
                .Select(g => new
@@ -225,7 +232,7 @@
                     ReceivePrice = item.ReceivePrice,
                     ChannlesRakePrice = item.ChannlesRakePrice,
                 };
-                if (channelDataList.ReceiveList.Count() < 5)
+                if (channelDataList.ReceiveList.Count() < maxStatisticsNumber)
                 {
                     channelDataList.ReceiveList.Add(receive);
                 }
@@ -234,6 +241,7 @@
             /// 绱鐢ㄦ埛
             var users = await _lifePayUserRepository.Where(x => x.IsDeleted == false).WhereIf(channleList.Count() > 0, x => channleList.Contains(x.CreationChannleNum))
                 .ToListAsync();
+            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "绱鐢ㄦ埛缁熻澶辫触");
             var groupedUsers = users
               .GroupBy(x => x.CreationChannleNum)
               .Select(g => new
@@ -250,7 +258,7 @@
                     ChannelName = _lifePayChannlesRep.Where(x => x.ChannlesNum == item.ChannelId).FirstOrDefault()?.ChannlesName,
                     Number = item.Number,
                 };
-                if (channelDataList.UserNumberList.Count() < 5)
+                if (channelDataList.UserNumberList.Count() < maxStatisticsNumber)
                 {
                     channelDataList.UserNumberList.Add(usernumber);
                 }
@@ -272,7 +280,7 @@
                 if (statistics == null || statistics.Count() == 0)
                 {
                     TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { };
-                    var allChannle = await _lifePayChannlesRep.Where(x => x.IsDeleted == false).ToListAsync();
+                    var allChannle = await _lifePayChannlesRep.ToListAsync();
                     foreach (var item in allChannle)
                     {
                         var entity = await TopStatistics(item.ChannlesNum, today);
@@ -285,35 +293,36 @@
 
         private async Task<DallyStatistics> TopStatistics(string channleId, DateTime today)
         {
+            var lifepayOrderBaseList = await _lifePayOrderRepository.Where(x => x.CreationTime < today)
+                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).ToListAsync();
+
             /// 绱鏀舵锛氱粺璁″钩鍙拌处鎴蜂笅璁㈠崟鍒涘缓鏃堕棿鍦ㄦ槰澶╁強涔嬪墠鏀跺埌鐨勩�愮敤鎴锋敮浠樻垚鍔熺殑閲戦-閫�娆剧粰鐢ㄦ埛鐨勯噾棰濄�戯紱
-            var accumulatedReceipts = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.PayStatus != LifePayStatusEnum.鏈敮浠�)
-            .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) - 
-            await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.宸查��娆�)
-            .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => (x.RefundPrice ?? 0));
+            var accumulatedReceipts = lifepayOrderBaseList.Where(x => x.PayStatus != LifePayStatusEnum.鏈敮浠�).Sum(x => x.PayAmount)
+               - lifepayOrderBaseList.Where(x => x.LifePayRefundStatus == LifePayRefundStatusEnum.宸查��娆�).Sum(x => (x.RefundPrice ?? 0));
+
             /// 鏄ㄦ棩鏀舵锛氱粺璁″钩鍙拌处鎴蜂笅璁㈠崟鍒涘缓鏃堕棿鍦ㄦ槰澶╂敹鍒扮殑銆愮敤鎴锋敮浠樻垚鍔熺殑閲戦-閫�娆剧粰鐢ㄦ埛鐨勯噾棰濄�戯紱
-            var receiptsYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.PayStatus == LifePayStatusEnum.宸叉敮浠�)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) -
-                await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.宸查��娆�)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => (x.RefundPrice ?? 0));
+            var receiptsYesterday = lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1) && x.PayStatus == LifePayStatusEnum.宸叉敮浠�)
+                .Sum(x => x.PayAmount) -
+                lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1) && x.LifePayRefundStatus == LifePayRefundStatusEnum.宸查��娆�)
+                .Sum(x => (x.RefundPrice ?? 0));
             /// 绱鏀跺叆锛氱粺璁″钩鍙拌处鎴蜂笅璁㈠崟鐘舵�佷负鈥滃凡瀹屾垚鈥濅笖璁㈠崟鍒涘缓鏃堕棿鍦ㄦ槰澶╁強涔嬪墠鏀跺埌鐨勩�愮敤鎴峰疄浠橀噾棰�-骞冲彴鎵f閲戦-閮ㄥ垎閫�娆鹃噾棰濄�戯紱
-            var accumulatedIncome = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0));
+            var accumulatedIncome = lifepayOrderBaseList.Where(x => x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
+              .Sum(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0));
             /// 鏄ㄦ棩鏀跺叆锛氱粺璁″钩鍙拌处鎴蜂笅璁㈠崟鐘舵�佷负鈥滃凡瀹屾垚鈥濅笖璁㈠崟鍒涘缓鏃堕棿鍦ㄦ槰澶╂敹鍒扮殑銆愮敤鎴峰疄浠橀噾棰�-骞冲彴鎵f閲戦-閮ㄥ垎閫�娆鹃噾棰濄�戯紱
-            var yesterdayIncome = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0));
+            var yesterdayIncome = lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1) && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
+                .Sum(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0));
             /// 绱涓嬪崟锛氱粺璁″钩鍙颁腑璁㈠崟涓嬪崟鏃堕棿鍦ㄦ槰澶╁強涔嬪墠鏃堕棿鐨勮鍗曡褰曪紱
-            var accumulatedOrders = await _lifePayOrderRepository.Where(x => x.CreationTime < today).WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync();
+            var accumulatedOrders = lifepayOrderBaseList.Count();
             /// 鏄ㄦ棩涓嬪崟锛氱粺璁″钩鍙颁腑璁㈠崟涓嬪崟鏃堕棿鍦ㄦ槰澶╃殑璁㈠崟璁板綍锛�
-            var ordersNumYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync();
+            var ordersNumYesterday = lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1)).Count();
             /// 鏄ㄦ棩鎴愬姛锛氱粺璁″钩鍙颁腑璁㈠崟鐘舵�佷负鈥滃凡瀹屾垚/閮ㄥ垎鍏呭�兼垚鍔熲�濅笖璁㈠崟涓嬪崟鏃堕棿鍦ㄦ槰澶╃殑璁㈠崟璁板綍锛�
-            var yesterdaySuccess = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
-                .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync();
+            var yesterdaySuccess = lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1) && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸插畬鎴�)
+                .Count();
             /// 鏄ㄦ棩澶辫触锛氱粺璁″钩鍙颁腑璁㈠崟鐘舵�佷负鈥滃厖鍊煎け璐�/宸查��娆锯�濅笖璁㈠崟涓嬪崟鏃堕棿鍦ㄦ槰澶╃殑璁㈠崟璁板綍锛�
-            var yesterdayFail = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸查��娆�)
-                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync();
+            var yesterdayFail = lifepayOrderBaseList.Where(x => x.CreationTime >= today.AddDays(-1) && x.LifePayOrderStatus == LifePayOrderStatusEnum.宸查��娆�)
+                .Count();
             /// 绱鐢ㄦ埛
-            var accumulatedUsers = await _lifePayUserRepository.Where(x => x.IsDeleted == false && x.CreationTime < today)
+            var accumulatedUsers = await _lifePayUserRepository.Where(x => x.CreationTime < today)
                 .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).CountAsync();
             /// 鏄ㄦ棩娲昏穬鐢ㄦ埛
             var yesterdayActiveUsers = await (from a in _lifePayUserRepository
@@ -322,7 +331,7 @@
                                               && (b.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�间腑 || b.ACOOLYStatus == ACOOLYStatusEnum.鍏呭�兼垚鍔� || b.ACOOLYStatus == ACOOLYStatusEnum.宸插畬鎴� || b.ACOOLYStatus == ACOOLYStatusEnum.閮ㄥ垎鍏呭�兼垚鍔�)
                                               select b).Distinct().CountAsync();
             /// 绱浣i噾
-            var accumulatedChannlesRakePrice = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false && x.FinishTime < today)
+            var accumulatedChannlesRakePrice = await _lifePayChannlesRakeRepository.Where(x => x.FinishTime < today)
                 .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.ChannlesRakePrice);
 
             var entity = new DallyStatistics()

--
Gitblit v1.9.1