zhengyuxuan
2025-04-02 dbf044662b9a75e5b42f8f76c65faaf89c95bb21
LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
@@ -19,6 +19,8 @@
using System.Threading.Channels;
using ZeroD.Util;
using NPOI.SS.Formula.Functions;
using System.Security.Principal;
using StackExchange.Redis;
namespace LifePayment.Application.LifePay
{
@@ -28,19 +30,22 @@
        private readonly IRepository<LifePayUser, Guid> _lifePayUserRepository;
        private readonly IRepository<DallyStatistics, Guid> _dallyStatisticsRepository;
        private readonly IRepository<LifePayChannlesRake, Guid> _lifePayChannlesRakeRepository;
        private readonly IRepository<LifePayRechargeReceipts, Guid> _lifePayRechargeReceiptsRepository;
        private readonly IRepository<LifePayChannles, Guid> _lifePayChannlesRep;
        public StatisticsService(
                              IRepository<LifePayOrder, Guid> lifePayOrderRepository,
                              IRepository<LifePayUser, Guid> lifePayUserRepository,
                            IRepository<DallyStatistics, Guid> dallyStatisticsRepository,
                            IRepository<LifePayChannlesRake, Guid> lifePayChannlesRakeRepository,
                            IRepository<LifePayChannles, Guid> lifePayChannlesRep)
                                IRepository<DallyStatistics, Guid> dallyStatisticsRepository,
                                IRepository<LifePayChannlesRake, Guid> lifePayChannlesRakeRepository,
                                IRepository<LifePayRechargeReceipts, Guid> lifePayRechargeReceiptsRepository,
                                IRepository<LifePayChannles, Guid> lifePayChannlesRep)
        {
            _lifePayOrderRepository = lifePayOrderRepository;
            _lifePayUserRepository = lifePayUserRepository;
            _dallyStatisticsRepository = dallyStatisticsRepository;
            _lifePayChannlesRakeRepository = lifePayChannlesRakeRepository;
            _lifePayRechargeReceiptsRepository = lifePayRechargeReceiptsRepository;
            _lifePayChannlesRep = lifePayChannlesRep;
        }
@@ -55,6 +60,7 @@
            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);
            if (statistics == null || statistics.Count() == 0)
            {
                TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { };
@@ -64,7 +70,6 @@
                    var entity = await TopStatistics(item.ChannlesNum, today);
                    if (channleList.Count() == 0 || channleList.Contains(item.ChannlesNum))
                    {
                        topStatisticsOutput.Amount += entity.Amount;
                        topStatisticsOutput.AccumulatedReceipts += entity.AccumulatedReceipts;
                        topStatisticsOutput.AccumulatedIncome += entity.AccumulatedIncome;
                        topStatisticsOutput.ReceiptsYesterday += entity.ReceiptsYesterday;
@@ -74,15 +79,24 @@
                        topStatisticsOutput.YesterdayFail += entity.YesterdayFail;
                        topStatisticsOutput.AccumulatedUsers += entity.AccumulatedUsers;
                        topStatisticsOutput.YesterdayActiveUsers += entity.YesterdayActiveUsers;
                        topStatisticsOutput.AccumulatedChannlesRakePrice += entity.AccumulatedChannlesRakePrice;
                    }
                }
                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;
                }
                return topStatisticsOutput;
            }
            else
            {
                TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput()
                {
                    Amount = statistics.Sum(s => s.Amount),
                    AccumulatedReceipts = statistics.Sum(s => s.AccumulatedReceipts),
                    AccumulatedIncome = statistics.Sum(s => s.AccumulatedIncome),
                    ReceiptsYesterday = statistics.Sum(s => s.ReceiptsYesterday),
@@ -92,7 +106,16 @@
                    YesterdayFail = statistics.Sum(s => s.YesterdayFail),
                    AccumulatedUsers = statistics.Sum(s => s.AccumulatedUsers),
                    YesterdayActiveUsers = statistics.Sum(s => s.YesterdayActiveUsers),
                    AccumulatedChannlesRakePrice = statistics.Sum(s => s.AccumulatedChannlesRakePrice)
                };
                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;
                }
                return topStatisticsOutput;
            }
        }
@@ -177,8 +200,10 @@
        {
            var statistics = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false)
                            .WhereIf(channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
                            .ToListAsync();
                            .WhereIf(channleList != null && channleList.Count() > 0, x => channleList.Contains(x.ChannelId))
            .ToListAsync();
            CheckExtensions.IfTrueThrowUserFriendlyException(statistics == null, "统计失败");
            var groupedStatistics = statistics
               .GroupBy(x => x.ChannelId)
               .Select(g => new
@@ -196,7 +221,7 @@
            {
                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,
                };
@@ -222,7 +247,7 @@
            {
                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)
@@ -234,9 +259,29 @@
            return channelDataList;
        }
        public async Task StatisticsByDate(int days)
        {
            var today = DateTime.Now.Date;
            for (var i = 0; i < days; i++)
            {
                var statistics = await _dallyStatisticsRepository.Where(x => x.CreationTime.Date == today)
                .ToListAsync();
                if (statistics == null || statistics.Count() == 0)
                {
                    TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { };
                    var allChannle = await _lifePayChannlesRep.Where(x => x.IsDeleted == false).ToListAsync();
                    foreach (var item in allChannle)
                    {
                        var entity = await TopStatistics(item.ChannlesNum, today);
                    }
                }
                today = today.AddDays(-1);
            }
        }
        private async Task<DallyStatistics> TopStatistics(string channleId, DateTime today)
        {
@@ -268,16 +313,22 @@
            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.IsDeleted == false && 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)).CountAsync();
            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.IsDeleted == false && x.FinishTime < today)
                .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.ChannlesRakePrice);
            var entity = new DallyStatistics()
            {
                Id = GuidGenerator.Create(),
                CreationTime = today,
                Amount = 0,
                AccumulatedReceipts = accumulatedReceipts ?? 0,
                AccumulatedIncome = accumulatedIncome ?? 0,
                IncomeYesterday = yesterdayIncome ?? 0,
@@ -289,6 +340,7 @@
                AccumulatedUsers = accumulatedUsers,
                YesterdayActiveUsers = yesterdayActiveUsers,
                ChannelId = channleId,
                AccumulatedChannlesRakePrice = accumulatedChannlesRakePrice,
                Date = today.AddDays(-1)
            };
            await _dallyStatisticsRepository.InsertAsync(entity);