zhengyuxuan
2025-04-07 f291f615859f129265f740526cba144415d7b49e
LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
@@ -20,6 +20,7 @@
using ZeroD.Util;
using NPOI.SS.Formula.Functions;
using System.Security.Principal;
using StackExchange.Redis;
namespace LifePayment.Application.LifePay
{
@@ -59,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);
@@ -85,11 +86,8 @@
                if (channleList.Count() == 0)
                {
                    /// 账户余额
                    var accountBalance = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.PayStatus == LifePayStatusEnum.已支付
                    && (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;
@@ -112,10 +110,8 @@
                if (channleList.Count() == 0)
                {
                    /// 账户余额
                    var accountBalance = totalRechargeReceipts - await _lifePayOrderRepository.Where(x => x.PayStatus == LifePayStatusEnum.已支付
                    && (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;
@@ -134,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
@@ -148,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);
@@ -165,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, "佣金统计失败");
            var groupedStatistics = statistics
               .GroupBy(x => x.FinishTime.ToString("yyyy-MM-dd"))
               .Select(g => new
@@ -183,27 +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.Count() > 0, x => channleList.Contains(x.ChannelId))
                            .ToListAsync();
            .ToListAsync();
            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "渠道收款统计失败");
            var groupedStatistics = statistics
               .GroupBy(x => x.ChannelId)
               .Select(g => new
@@ -221,11 +228,11 @@
            {
                ChannelDataReceive receive = new ChannelDataReceive()
                {
                    ChannelName = _lifePayChannlesRep.Where(x => x.ChannlesNum == item.ChannelId).FirstOrDefault().ChannlesName,
                    ChannelName = _lifePayChannlesRep.Where(x => x.ChannlesNum == item.ChannelId).FirstOrDefault()?.ChannlesName,
                    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
@@ -247,10 +255,10 @@
            {
                ChannelDataUserNumber usernumber = new ChannelDataUserNumber()
                {
                    ChannelName = _lifePayChannlesRep.Where(x => x.ChannlesNum == item.ChannelId).FirstOrDefault().ChannlesName,
                    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);
@@ -313,11 +321,16 @@
            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 accumulatedUsers = await _lifePayUserRepository.Where(x => x.IsDeleted == false).WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).CountAsync();
            var accumulatedUsers = await _lifePayUserRepository.Where(x => x.CreationTime < today)
                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).CountAsync();
            /// 昨日活跃用户
            var yesterdayActiveUsers = await _lifePayUserRepository.Where(x => x.IsDeleted == false).WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).Where(x => x.LastLoginTime >= today.AddDays(-1) && x.LastLoginTime < today).CountAsync();
            var accumulatedChannlesRakePrice = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false && x.FinishTime < today)
            var yesterdayActiveUsers = await (from a in _lifePayUserRepository
                                              join b in _lifePayOrderRepository on a.Id equals b.UserId
                                              where b.CreationTime >= today.AddDays(-1) && b.CreationTime < today
                                              && (b.ACOOLYStatus == ACOOLYStatusEnum.充值中 || b.ACOOLYStatus == ACOOLYStatusEnum.充值成功 || b.ACOOLYStatus == ACOOLYStatusEnum.已完成 || b.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功)
                                              select b).Distinct().CountAsync();
            /// 累计佣金
            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()