zhengyuxuan
2025-03-21 d7b01cca243ea2a767adbb1418a52258b4f2d765
LifePayment/LifePayment.Application/LifePay/LifePayService.cs
@@ -26,6 +26,7 @@
using Volo.Abp.Domain.Entities;
using Volo.Abp.ObjectMapping;
using NPOI.SS.Formula.Functions;
using StackExchange.Redis;
namespace LifePayment.Application;
@@ -60,7 +61,6 @@
                          IRepository<LifePayUser, Guid> lifePayUserRepository,
                          IRepository<LifePayPremium, Guid> lifePayPremiumRepository,
                          IRepository<LifePayIntroInfo, Guid> lifePayIntroInfoRepository,
                          IRepository<DallyStatistics, Guid> dallyStatisticsRepository,
                          IRepository<OperateHistory, Guid> operateHistory,
                          IAliPayApi aliPayApi,
                          IAlipayInterfaceManager aliPayInterfaceManager,
@@ -78,7 +78,6 @@
        _lifePayUserRepository = lifePayUserRepository;
        _lifePayPremiumRepository = lifePayPremiumRepository;
        _lifePayIntroInfoRepository = lifePayIntroInfoRepository;
        _dallyStatisticsRepository = dallyStatisticsRepository;
        _aliPayApi = aliPayApi;
        _alipayInterfaceManager = aliPayInterfaceManager;
        _wxPayApi = wxPayApi;
@@ -93,65 +92,6 @@
    #region 查询
    public async Task<TopStatisticsOutput> 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).SumAsync(x => x.PayAmount);
            var receiptsYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today).SumAsync(x => x.PayAmount);
            var accumulatedOrders = await _lifePayOrderRepository.Where(x => x.CreationTime < today).CountAsync();
            var accumulatedIncome = await _lifePayOrderRepository.Where(x => x.CreationTime < today).SumAsync(x => x.ActualRechargeAmount);
            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 entity = new DallyStatistics()
            {
                Id = GuidGenerator.Create(),
                CreationTime = DateTime.Now,
                Amount = 0,
                AccumulatedReceipts = accumulatedReceipts,
                ReceiptsYesterday = receiptsYesterday,
                AccumulatedOrders = accumulatedOrders,
                OrdersNumYesterday = ordersNumYesterday,
                YesterdaySuccess = yesterdaySuccess,
                YesterdayFail = yesterdayFail,
                AccumulatedUsers = accumulatedUsers,
            };
            await _dallyStatisticsRepository.InsertAsync(entity);
            TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput()
            {
                Amount = entity.Amount,
                AccumulatedReceipts = entity.AccumulatedReceipts,
                ReceiptsYesterday = entity.ReceiptsYesterday,
                AccumulatedOrders = entity.AccumulatedOrders,
                OrdersNumYesterday = entity.OrdersNumYesterday,
                YesterdaySuccess = entity.YesterdaySuccess,
                YesterdayFail = entity.YesterdayFail,
                AccumulatedUsers = entity.AccumulatedUsers,
            };
            return topStatisticsOutput;
        }
        else
        {
            TopStatisticsOutput topStatisticsOutput = new TopStatisticsOutput()
            {
                Amount = statistics.Amount,
                AccumulatedReceipts = statistics.AccumulatedReceipts,
                ReceiptsYesterday = statistics.ReceiptsYesterday,
                AccumulatedOrders = statistics.AccumulatedOrders,
                OrdersNumYesterday = statistics.OrdersNumYesterday,
                YesterdaySuccess = statistics.YesterdaySuccess,
                YesterdayFail = statistics.YesterdayFail,
                AccumulatedUsers = statistics.AccumulatedUsers,
            };
            return topStatisticsOutput;
        }
    }
    /// <summary>
    /// 获取电费面值
@@ -350,8 +290,7 @@
    {
        var result = await (from a in _channelFilter.GetChannelLifePayOrderFilter(_lifePayOrderRepository)
        .Where(x => x.PayStatus == LifePayStatusEnum.待退款 || x.PayStatus == LifePayStatusEnum.已退款 || x.PayStatus == LifePayStatusEnum.退款中
        || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款待审核 || x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款失败
        .Where(x => x.LifePayOrderStatus == LifePayOrderStatusEnum.待退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款中
        || x.LifePayRefundStatus > LifePayRefundStatusEnum.无需退款)
                                            .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime)
                                            .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime)
@@ -402,10 +341,8 @@
    public async Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo)
    {
        var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
        var platformRate = await _lifePayRateRepository.FirstOrDefaultAsync(r => r.RateType == LifePayRateTypeEnum.供应商折扣价);
        var channle = await _lifePayChannlesRep.FirstOrDefaultAsync(r => r.ChannlesNum == order.ChannelId);
        var premium = await _lifePayPremiumRepository.Where(x => x.IsDeleted == false && x.PremiumType == order.LifePayType).FirstOrDefaultAsync();
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
         CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        var user = await _lifePayUserRepository.FirstOrDefaultAsync(x => x.Id == order.UserId);
        
        var channlesRakePrice = (order.PayAmount - (order.PlatformDeductionAmount == null ? 0 : order.PlatformDeductionAmount)) * channle.ChannlesRakeRate / 100;
@@ -436,16 +373,16 @@
            LifePayRefundStatus = order.LifePayRefundStatus,
            ActualRechargeAmount = order.ActualRechargeAmount,
            RefundPrice = order.RefundPrice,
            PlatformRate = platformRate.Rate,
            PlatformRate = order.PlatformRate,
            PlatformPrice = order.PlatformDeductionAmount,
            ElecBillUrl = order.ElecBillUrl.GetOssPath(),
            RefundElecBillUrl = order.RefundElecBillUrl.GetOssPath(),
            ChannleRate = channle.ChannlesRate,
            ChannlesRakeRate = channle.ChannlesRakeRate,
            ChannlesRakePrice = channlesRakePrice.HasValue ? 0 : Math.Round(channlesRakePrice.Value, 2),
            PremiumRate = premium == null ? 0 : premium.Rate,
            PremiumPrice = premium == null ? 0 : Math.Round(order.PayAmount * premium.Rate, 2),
            Profit = (order.PayAmount - order.PlatformDeductionAmount) * (1.00m - channle.ChannlesRakeRate / 100) - (premium == null ? 0 : Math.Round(order.PayAmount * premium.Rate, 2))
            PremiumRate = order.PremiumRate,
            PremiumPrice = Math.Round(order.PayAmount * (order.PremiumRate.HasValue ? order.PremiumRate.Value:0), 2),
            Profit = (order.PayAmount - order.PlatformDeductionAmount) * (1.00m - channle.ChannlesRakeRate / 100) - Math.Round(order.PayAmount * (order.PremiumRate.HasValue ? order.PremiumRate.Value : 0), 2)
        };
        return result;
@@ -833,10 +770,13 @@
        var amount = CalculateAmount(input.ProductData.ParValue, rate.FirstOrDefault(x => x.RateType == LifePayRateTypeEnum.默认话费折扣).Rate);
        var platformRate = await _lifePayRateRepository.FirstOrDefaultAsync(r => r.RateType == LifePayRateTypeEnum.供应商折扣价);
        var orderInput = new CreateLifePayOrderInput
        {
            OrderNo = channle.ChannlesNum + CreateOrderNo(),
            LifePayOrderStatus = LifePayOrderStatusEnum.待确认,
            LifePayOrderStatus = LifePayOrderStatusEnum.充值中,
            LifePayOrderType = LifePayOrderTypeEnum.话费订单,
            //LifePayType = input.LifePayType,
            OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData),
@@ -846,7 +786,10 @@
            PayAmount = amount.PayAmont,
            DiscountAmount = amount.DiscountAmount,
            RechargeAmount = amount.RechargeAmount,
            ChannelId = channle.ChannlesNum
            ChannelId = channle.ChannlesNum,
            PlatformRate = platformRate.Rate,
            ChannleRate = channle.ChannlesRate,
            ChannlesRakeRate = channle.ChannlesRakeRate,
        };
        await CreateLifePayOrder(orderInput);
@@ -877,10 +820,12 @@
        var amount = CalculateAmount(input.ProductData.ParValue, rate.FirstOrDefault(x => x.RateType == LifePayRateTypeEnum.默认电费折扣).Rate);
        var platformRate = await _lifePayRateRepository.FirstOrDefaultAsync(r => r.RateType == LifePayRateTypeEnum.供应商折扣价);
        var orderInput = new CreateLifePayOrderInput
        {
            OrderNo = channle.ChannlesNum + CreateOrderNo(),
            LifePayOrderStatus = LifePayOrderStatusEnum.待确认,
            LifePayOrderStatus = LifePayOrderStatusEnum.充值中,
            LifePayOrderType = LifePayOrderTypeEnum.电费订单,
            // LifePayType = input.LifePayType,
            OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData),
@@ -890,7 +835,10 @@
            PayAmount = amount.PayAmont,
            DiscountAmount = amount.DiscountAmount,
            RechargeAmount = amount.RechargeAmount,
            ChannelId = channle.ChannlesNum
            ChannelId = channle.ChannlesNum,
            PlatformRate = platformRate.Rate,
            ChannleRate = channle.ChannlesRate,
            ChannlesRakeRate = channle.ChannlesRakeRate,
        };
        await CreateLifePayOrder(orderInput);
@@ -921,10 +869,12 @@
        var amount = CalculateAmount(input.ProductData.ParValue, rate.FirstOrDefault(x => x.RateType == LifePayRateTypeEnum.默认燃气折扣).Rate);
        var platformRate = await _lifePayRateRepository.FirstOrDefaultAsync(r => r.RateType == LifePayRateTypeEnum.供应商折扣价);
        var orderInput = new CreateLifePayOrderInput
        {
            OrderNo = channle.ChannlesNum + CreateOrderNo(),
            LifePayOrderStatus = LifePayOrderStatusEnum.待确认,
            LifePayOrderStatus = LifePayOrderStatusEnum.充值中,
            LifePayOrderType = LifePayOrderTypeEnum.燃气订单,
            // LifePayType = input.LifePayType,
            OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData),
@@ -959,7 +909,8 @@
        CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayType.HasValue, "当前订单已选择支付类型");
        order.LifePayType = input.LifePayType;
        var premium = await _lifePayPremiumRepository.Where(x => x.IsDeleted == false && x.PremiumType == order.LifePayType).FirstOrDefaultAsync();
        order.PremiumRate = premium == null ? 0 : premium.Rate;
        await _lifePayOrderRepository.UpdateAsync(order);
        var desc = "生活缴费-";
@@ -1236,7 +1187,7 @@
            }
            order.LifePayRefundStatus = LifePayRefundStatusEnum.无需退款;
            order.LifePayOrderStatus = LifePayOrderStatusEnum.待确认;
            order.LifePayOrderStatus = LifePayOrderStatusEnum.充值中;
            //SetOrderStatus(order, result.Code);
            order.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo;
            order.ACOOLYOrderNo = result.ACOOLYOrderNo.IsNullOrEmpty() ? null : result.ACOOLYOrderNo;
@@ -1244,7 +1195,7 @@
        catch (Exception ex)
        {
            _logger.LogError(ex, "处理生活缴费支付成功回调时异常");
            order.LifePayOrderStatus = LifePayOrderStatusEnum.已失败;
            order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款;
            order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款;
        }
        _logger.LogError("生活缴费订单状态:" + order.LifePayOrderStatus.ToString());
@@ -1262,10 +1213,10 @@
        var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成)
        {
            return;
        }
        //if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成)
        //{
        //    return;
        //}
        order.PlatformDeductionAmount = payAmount;
        if (acoolyOrderNo.IsNotNullOrEmpty())
@@ -1273,15 +1224,6 @@
            order.ACOOLYOrderNo = acoolyOrderNo;
        }
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成)
        {
            order.FinishTime = DateTime.Now;
        }
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已失败 && order.PayStatus != LifePayStatusEnum.已退款)
        {
            order.PayStatus = LifePayStatusEnum.待退款;
        }
        order.LifePayOrderStatus = status;
        order.ACOOLYStatus = acoolyStatus;
@@ -1300,20 +1242,22 @@
        var order = await _lifePayOrderRepository.FirstOrDefaultAsync(x => x.Id == input.Id);
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        if (order.PayStatus == LifePayStatusEnum.已退款)
        if (order.LifePayRefundStatus == LifePayRefundStatusEnum.已退款)
        {
            return;
        }
        if (input.RefundPrice > order.PayAmount)
        {
            throw new UserFriendlyException("退款的金额不能大于实付金额");
        }
        if (input.LifePayRefundType == LifePayRefundTypeEnum.全额退款 && input.RefundPrice != order.PayAmount)
        if (input.LifePayRefundType == LifePayRefundTypeEnum.全额退款)
        {
            throw new UserFriendlyException("全额退款的金额与实付金额不一致");
            input.RefundPrice = order.PayAmount;
        }
        if (order.LifePayOrderStatus != LifePayOrderStatusEnum.已失败 && order.PayStatus != LifePayStatusEnum.待退款 && order.LifePayOrderStatus != LifePayOrderStatusEnum.退款待审核)
        if (order.LifePayOrderStatus != LifePayOrderStatusEnum.待退款 || order.PayStatus != LifePayStatusEnum.已支付 || order.LifePayRefundStatus != LifePayRefundStatusEnum.待退款)
        {
            throw new UserFriendlyException("当前订单状态无法退款");
        }
@@ -1326,20 +1270,17 @@
                var wxRefundResult = await WxPayDomesticRefunds(order.OrderNo, outRefundNo,order.RefundApplyRemark, Convert.ToInt32(input.RefundPrice * 100), Convert.ToInt32(order.PayAmount * 100));
                if (wxRefundResult.Status == "SUCCESS")
                {
                    order.PayStatus = LifePayStatusEnum.已退款;
                    order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款;
                    order.LifePayRefundStatus = LifePayRefundStatusEnum.已退款;
                }
                else if (wxRefundResult.Status == "PROCESSING")
                {
                    order.PayStatus = LifePayStatusEnum.退款中;
                    order.LifePayOrderStatus = LifePayOrderStatusEnum.退款中;
                    order.LifePayRefundStatus = LifePayRefundStatusEnum.退款中;
                }
                else
                {
                    order.PayStatus = LifePayStatusEnum.待退款;
                    order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败;
                    order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款;
                    order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款;
                }
@@ -1350,8 +1291,6 @@
                {
                    throw new UserFriendlyException("退款失败");
                }
                order.PayStatus = LifePayStatusEnum.已退款;
                order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款;
                break;
            default: throw new UserFriendlyException("退款失败");
@@ -1388,18 +1327,17 @@
            throw new UserFriendlyException("非用户本人退款");
        }
        if (order.PayStatus == LifePayStatusEnum.已退款)
        if (order.LifePayRefundStatus == LifePayRefundStatusEnum.已退款)
        {
            return;
        }
        if (order.LifePayOrderStatus != LifePayOrderStatusEnum.待确认 && order.LifePayOrderStatus != LifePayOrderStatusEnum.已失败
            && order.PayStatus != LifePayStatusEnum.已支付)
        if (order.PayStatus != LifePayStatusEnum.已支付 || order.LifePayOrderStatus != LifePayOrderStatusEnum.已完成)
        {
            throw new UserFriendlyException("当前订单状态无法申请退款");
        }
        order.LifePayOrderStatus = LifePayOrderStatusEnum.退款待审核;
        order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款;
        order.RefundApplyRemark = input.RefundApplyRemark;
        order.RefundApplyTime = DateTime.Now;
@@ -1522,15 +1460,22 @@
        var order = await _lifePayOrderRepository.FirstOrDefaultAsync(x => x.Id == input.Id);
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        if (order.PayStatus == LifePayStatusEnum.已退款)
        if(order.LifePayRefundStatus == LifePayRefundStatusEnum.已退款)
        {
            return;
        }
        if ((order.LifePayOrderStatus == LifePayOrderStatusEnum.已失败 && order.PayStatus == LifePayStatusEnum.待退款) ||
            order.LifePayOrderStatus == LifePayOrderStatusEnum.退款待审核 || order.LifePayOrderStatus == LifePayOrderStatusEnum.待确认)
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.待退款)
        {
            order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败;
            if (order.ACOOLYStatus == ACOOLYStatusEnum.已完成 || order.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功)
            {
                order.LifePayOrderStatus = LifePayOrderStatusEnum.已完成;
            }
            else if (order.ACOOLYStatus == ACOOLYStatusEnum.充值失败)
            {
                order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败;
            }
            order.RefundCheckRemark = input.RefundCheckRemark;
            order.RefundCheckUserId = CurrentUser.Id;
@@ -1729,7 +1674,7 @@
                order.FinishTime = DateTime.Now;
                break;
            case ACOOLYConstant.Code.PROCESSING:
                order.LifePayOrderStatus = LifePayOrderStatusEnum.待确认;
                order.LifePayOrderStatus = LifePayOrderStatusEnum.充值中;
                break;
            default:
                break;