sunpengfei
2025-06-13 67fc39c356d8b480b7005cb2fa4769a0a6c6cfb1
pref:优化事务
4个文件已修改
215 ■■■■■ 已修改文件
LifePayment/LifePayment.Application/LifePay/LifePayService.cs 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application/LifePay/LifePayService.cs
@@ -1533,82 +1533,91 @@
    {
        await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{orderNo}", TimeSpan.FromSeconds(60));
        _logger.LogInformation($"锁:LockKey:UpdateOrder:{orderNo} - {orderLock != null}");
        var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        if (order.ACOOLYStatus.HasValue && (int)order.ACOOLYStatus > (int)acoolyStatus)
        try
        {
            _logger.LogInformation($"订单({orderNo})由{order.ACOOLYStatus}至{acoolyStatus}失败,不可回滚状态");
            return;
        }
            var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
        if (order.LifePayOrderStatus == status && order.ACOOLYStatus == acoolyStatus)
        {
            _logger.LogInformation($"订单({orderNo})已处理该状态");
            return;
        }
            CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        order.ActualReceivedAmount = actualParValue;
        order.PlatformDeductionAmount = Math.Round((order.ActualReceivedAmount ?? 0) * (order.PlatformRate ?? 0) / 100, 2);
        if (acoolyOrderNo.IsNotNullOrEmpty())
        {
            order.ACOOLYOrderNo = acoolyOrderNo;
        }
        if (status == LifePayOrderStatusEnum.待退款)
        {
            order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款;
        }
        if (refundApplyRemark.IsNotNullOrEmpty())
        {
            order.RefundApplyRemark = refundApplyRemark;
        }
        order.LifePayOrderStatus = status;
        order.ACOOLYStatus = acoolyStatus;
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成
            || order.LifePayOrderStatus == LifePayOrderStatusEnum.已退款)
        {
            order.FinishTime = DateTime.Now;
        }
        if (order.ACOOLYStatus == ACOOLYStatusEnum.已退款 || order.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功)
        {
            order.RefundPrice = Math.Round((1 - ((order.ActualReceivedAmount ?? 0) / (order.RechargeAmount ?? 0))) * (order.PayAmount ?? 0), 2);
        }
        if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成)
        {
            ///结算渠道佣金
            /// 毛利
            var grossProfit = order.RechargeAmount * (order.ChannleRate - order.PlatformRate) / 100;
            /// 渠道佣金  ((充值面额 * 渠道折扣比例)-(充值面额 * 平台折扣比例))* 佣金比例
            var channlesRakePrice = grossProfit * (order.ChannlesRakeRate) / 100;
            if (channlesRakePrice.HasValue)
            if (order.ACOOLYStatus.HasValue && (int)order.ACOOLYStatus > (int)acoolyStatus)
            {
                LifePayChannlesRake lifePayChannlesRake = new LifePayChannlesRake()
                {
                    OrderNo = order.OrderNo,
                    PayAmount = order.RechargeAmount ?? 0,
                    ChannlesRakeRate = order.ChannlesRakeRate ?? 0,
                    ChannlesRakePrice = channlesRakePrice ?? 0,
                    FinishTime = order.FinishTime.Value,
                    ChannelId = order.ChannelId,
                };
                await _lifePayChannlesRakeRepository.InsertAsync(lifePayChannlesRake);
                _logger.LogInformation($"订单({orderNo})由{order.ACOOLYStatus}至{acoolyStatus}失败,不可回滚状态");
                return;
            }
            if (order.LifePayOrderStatus == status && order.ACOOLYStatus == acoolyStatus)
            {
                _logger.LogInformation($"订单({orderNo})已处理该状态");
                return;
            }
            order.ActualReceivedAmount = actualParValue;
            order.PlatformDeductionAmount = Math.Round((order.ActualReceivedAmount ?? 0) * (order.PlatformRate ?? 0) / 100, 2);
            if (acoolyOrderNo.IsNotNullOrEmpty())
            {
                order.ACOOLYOrderNo = acoolyOrderNo;
            }
            if (status == LifePayOrderStatusEnum.待退款)
            {
                order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款;
            }
            if (refundApplyRemark.IsNotNullOrEmpty())
            {
                order.RefundApplyRemark = refundApplyRemark;
            }
            order.LifePayOrderStatus = status;
            order.ACOOLYStatus = acoolyStatus;
            if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成
                || order.LifePayOrderStatus == LifePayOrderStatusEnum.已退款)
            {
                order.FinishTime = DateTime.Now;
            }
            if (order.ACOOLYStatus == ACOOLYStatusEnum.已退款 || order.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功)
            {
                order.RefundPrice = Math.Round((1 - ((order.ActualReceivedAmount ?? 0) / (order.RechargeAmount ?? 0))) * (order.PayAmount ?? 0), 2);
            }
            if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成)
            {
                ///结算渠道佣金
                /// 毛利
                var grossProfit = order.RechargeAmount * (order.ChannleRate - order.PlatformRate) / 100;
                /// 渠道佣金  ((充值面额 * 渠道折扣比例)-(充值面额 * 平台折扣比例))* 佣金比例
                var channlesRakePrice = grossProfit * (order.ChannlesRakeRate) / 100;
                if (channlesRakePrice.HasValue)
                {
                    LifePayChannlesRake lifePayChannlesRake = new LifePayChannlesRake()
                    {
                        OrderNo = order.OrderNo,
                        PayAmount = order.RechargeAmount ?? 0,
                        ChannlesRakeRate = order.ChannlesRakeRate ?? 0,
                        ChannlesRakePrice = channlesRakePrice ?? 0,
                        FinishTime = order.FinishTime.Value,
                        ChannelId = order.ChannelId,
                    };
                    await _lifePayChannlesRakeRepository.InsertAsync(lifePayChannlesRake);
                }
            }
            /// 创建生活缴费消费记录
            await _lifePayOrderService.CreatLifePayConsumption(acoolyStatus, order.OrderNo, order.ACOOLYOrderNo,
                        order.PlatformDeductionAmount ?? 0, order.ChannelId, order.CreationTime, order.FinishTime, order.ChannleRate, parValue, actualParValue);
            await CurrentUnitOfWork.CompleteAsync();
            _logger.LogInformation("事务完成");
        }
        /// 创建生活缴费消费记录
        await _lifePayOrderService.CreatLifePayConsumption(acoolyStatus, order.OrderNo, order.ACOOLYOrderNo,
                    order.PlatformDeductionAmount ?? 0, order.ChannelId, order.CreationTime, order.FinishTime, order.ChannleRate, parValue, actualParValue);
        await CurrentUnitOfWork.SaveChangesAsync();
        catch (Exception ex)
        {
            await CurrentUnitOfWork.RollbackAsync();
            _logger.LogError($"供应商回调异常:{ex.Message}", ex);
        }
    }
    /// <summary>
LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs
@@ -41,6 +41,7 @@
        /// <returns></returns>
        [HttpPost]
        [AllowAnonymous]
        [UnitOfWork(false)]
        public async Task ACOOLYNotify()
        {
            _logger.LogError("ACOOLY回调通知开始进入");
LifePayment/LifePayment.HttpApi/LifePay/AliPayNotifyController.cs
@@ -49,6 +49,7 @@
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [UnitOfWork(false)]
        public async Task<ContentResult> AliRechargeNotify()
        {
            _logger.LogError($"生活管家支付宝充值回调通知:进入支付宝回调");
@@ -65,34 +66,44 @@
            if (input.OutTradeNo.Contains("JF"))
            {
                if (input.TradeStatus == LifePaymentConstant.AliPayStatus.支付成功 && input.OutBizNo.IsNullOrEmpty())
                try
                {
                    await _lifePayService.LifePaySuccessHandler(input.OutTradeNo, input.TradeNo);
                    // 插入收支流水
                    await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput()
                    if (input.TradeStatus == LifePaymentConstant.AliPayStatus.支付成功 && input.OutBizNo.IsNullOrEmpty())
                    {
                        OrderNo = input.OutTradeNo,
                        OutOrderNo = input.TradeNo,
                        LifePayType = LifePayTypeEnum.AliPay,
                        ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses
                    });
                    await CurrentUnitOfWork.SaveChangesAsync();
                        await _lifePayService.LifePaySuccessHandler(input.OutTradeNo, input.TradeNo);
                        // 插入收支流水
                        await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput()
                        {
                            OrderNo = input.OutTradeNo,
                            OutOrderNo = input.TradeNo,
                            LifePayType = LifePayTypeEnum.AliPay,
                            ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Expenses
                        });
                        await CurrentUnitOfWork.SaveChangesAsync();
                        _logger.LogInformation("事务完成");
                    }
                    else if (((input.TradeStatus == LifePaymentConstant.AliPayStatus.支付成功 || input.TradeStatus == LifePaymentConstant.AliPayStatus.超时关闭)
                        && input.OutBizNo.IsNotNullOrEmpty()
                        && (input.RefundFee.HasValue && input.RefundFee > 0)))
                    {
                        await _lifePayService.LifePayRefundsHandler(input.OutTradeNo, LifePayRefundStatusEnum.已退款);
                        // 插入收支流水
                        await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput()
                        {
                            OrderNo = input.OutTradeNo,
                            OutRefundNo = input.OutBizNo,
                            OutOrderNo = input.TradeNo,
                            LifePayType = LifePayTypeEnum.AliPay,
                            ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts
                        });
                        await CurrentUnitOfWork.CompleteAsync();
                        _logger.LogInformation("事务完成");
                    }
                }
                else if (((input.TradeStatus == LifePaymentConstant.AliPayStatus.支付成功 || input.TradeStatus == LifePaymentConstant.AliPayStatus.超时关闭)
                    && input.OutBizNo.IsNotNullOrEmpty()
                    && (input.RefundFee.HasValue && input.RefundFee > 0)))
                catch (Exception ex)
                {
                    await _lifePayService.LifePayRefundsHandler(input.OutTradeNo, LifePayRefundStatusEnum.已退款);
                    // 插入收支流水
                    await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput()
                    {
                        OrderNo = input.OutTradeNo,
                        OutRefundNo = input.OutBizNo,
                        OutOrderNo = input.TradeNo,
                        LifePayType = LifePayTypeEnum.AliPay,
                        ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts
                    });
                    await CurrentUnitOfWork.SaveChangesAsync();
                    await CurrentUnitOfWork.RollbackAsync();
                    _logger.LogError($"支付宝支付回调异常:{ex.Message}", ex);
                }
            }
            else
LifePayment/LifePayment.HttpApi/LifePay/WxPayNotifyController.cs
@@ -53,6 +53,7 @@
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        [UnitOfWork(false)]
        public async Task<WxRechargeNotifyResult> WxRechargeNotify(WxRechargeNotifyInput input)
        {
            try
@@ -94,7 +95,8 @@
                                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
                            });
                            await CurrentUnitOfWork.SaveChangesAsync();
                            await CurrentUnitOfWork.CompleteAsync();
                            _logger.LogInformation("事务完成");
                        }
                        else
                        {
@@ -113,6 +115,8 @@
            }
            catch (Exception ex)
            {
                await CurrentUnitOfWork.RollbackAsync();
                _logger.LogError($"微信支付回调异常:{ex.Message}", ex);
                return new WxRechargeNotifyResult
                {
                    Code = "FAIL",