using LifePayment.Application.Contracts; using LifePayment.Domain.LifePay; using LifePayment.Domain.Models; using LifePayment.Domain.Shared; using LifePayment.Domain; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; using Volo.Abp.EventBus.Distributed; using static Nest.FileSystemStats; using Microsoft.EntityFrameworkCore; namespace LifePayment.Application.LifePay { public class StatisticsService : ApplicationService, IStatisticsService { private readonly IRepository _lifePayOrderRepository; private readonly IRepository _lifePayUserRepository; private readonly IRepository _dallyStatisticsRepository; public StatisticsService( IRepository lifePayOrderRepository, IRepository lifePayUserRepository, IRepository dallyStatisticsRepository) { _lifePayOrderRepository = lifePayOrderRepository; _lifePayUserRepository = lifePayUserRepository; _dallyStatisticsRepository = dallyStatisticsRepository; } public async Task GetTopStatistics() { var today = DateTime.Now.Date; var statistics = await _dallyStatisticsRepository.Where(x => x.CreationTime.Date == today).FirstOrDefaultAsync(); if (statistics == null) { /// 累计收款:统计平台账户下订单创建时间在昨天及之前收到的【用户支付成功的金额-退款给用户的金额】; var accumulatedReceipts = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.PayStatus != LifePayStatusEnum.未支付).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => (x.RefundPrice ?? 0)); /// 昨日收款:统计平台账户下订单创建时间在昨天收到的【用户支付成功的金额-退款给用户的金额】; var receiptsYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.PayStatus == LifePayStatusEnum.已支付).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => x.PayAmount); /// 累计收入:统计平台账户下订单状态为“已完成”且订单创建时间在昨天及之前收到的【用户实付金额-平台扣款金额-部分退款金额】; var accumulatedIncome = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成).SumAsync(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0)); /// 累计下单:统计平台中订单下单时间在昨天及之前时间的订单记录; var accumulatedOrders = await _lifePayOrderRepository.Where(x => x.CreationTime < today).CountAsync(); /// 昨日下单:统计平台中订单下单时间在昨天的订单记录; var ordersNumYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today).CountAsync(); /// 昨日成功:统计平台中订单状态为“已完成/部分充值成功”且订单下单时间在昨天的订单记录; var yesterdaySuccess = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成).CountAsync(); /// 昨日失败:统计平台中订单状态为“充值失败/已退款”且订单下单时间在昨天的订单记录; var yesterdayFail = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款).CountAsync(); /// 累计用户 var accumulatedUsers = await _lifePayUserRepository.CountAsync(); /// 昨日活跃用户 var yesterdayActiveUsers = await _lifePayUserRepository.Where(x => x.LastLoginTime >= today.AddDays(-1)).CountAsync(); var entity = new DallyStatistics() { Id = GuidGenerator.Create(), CreationTime = DateTime.Now, Amount = 0, AccumulatedReceipts = accumulatedReceipts, AccumulatedIncome = accumulatedIncome, ReceiptsYesterday = receiptsYesterday, AccumulatedOrders = accumulatedOrders, OrdersNumYesterday = ordersNumYesterday, YesterdaySuccess = yesterdaySuccess, YesterdayFail = yesterdayFail, AccumulatedUsers = accumulatedUsers, YesterdayActiveUsers = yesterdayActiveUsers }; await _dallyStatisticsRepository.InsertAsync(entity); TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { Amount = entity.Amount, AccumulatedReceipts = entity.AccumulatedReceipts, AccumulatedIncome = entity.AccumulatedIncome, ReceiptsYesterday = entity.ReceiptsYesterday, AccumulatedOrders = entity.AccumulatedOrders, OrdersNumYesterday = entity.OrdersNumYesterday, YesterdaySuccess = entity.YesterdaySuccess, YesterdayFail = entity.YesterdayFail, AccumulatedUsers = entity.AccumulatedUsers, YesterdayActiveUsers = entity.YesterdayActiveUsers, }; return topStatisticsOutput; } else { TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput() { Amount = statistics.Amount, AccumulatedReceipts = statistics.AccumulatedReceipts, AccumulatedIncome = statistics.AccumulatedIncome, ReceiptsYesterday = statistics.ReceiptsYesterday, AccumulatedOrders = statistics.AccumulatedOrders, OrdersNumYesterday = statistics.OrdersNumYesterday, YesterdaySuccess = statistics.YesterdaySuccess, YesterdayFail = statistics.YesterdayFail, AccumulatedUsers = statistics.AccumulatedUsers, YesterdayActiveUsers = statistics.YesterdayActiveUsers, }; return topStatisticsOutput; } } } }