|  |  | 
 |  |  | using NPOI.SS.Formula.Functions; | 
 |  |  | using StackExchange.Redis; | 
 |  |  | using static Volo.Abp.Identity.Settings.IdentitySettingNames; | 
 |  |  | using static Microsoft.EntityFrameworkCore.DbLoggerCategory; | 
 |  |  | using LifePayment.Application.LifePay; | 
 |  |  |  | 
 |  |  | namespace LifePayment.Application; | 
 |  |  |  | 
 |  |  | 
 |  |  |     private readonly IRepository<LifePayChannles, Guid> _lifePayChannlesRep; | 
 |  |  |     private readonly IRepository<LifePayAccount, Guid> _lifePayAccount; | 
 |  |  |     private readonly IRepository<OperateHistory, Guid> _operateHistory; | 
 |  |  |     private readonly IRepository<LifePayChannlesRake, Guid> _lifePayChannlesRakeRepository; | 
 |  |  |     private readonly ILifePayOrderService _lifePayOrderService; | 
 |  |  |     private readonly IDataFilter dataFilter; | 
 |  |  |     private readonly IChannelFilter _channelFilter; | 
 |  |  |     private readonly IAliPayApi _aliPayApi; | 
 |  |  | 
 |  |  |                           IRepository<LifePayUser, Guid> lifePayUserRepository, | 
 |  |  |                           IRepository<LifePayPremium, Guid> lifePayPremiumRepository, | 
 |  |  |                           IRepository<LifePayIntroInfo, Guid> lifePayIntroInfoRepository, | 
 |  |  |                           IRepository<LifePayChannlesRake, Guid> lifePayChannlesRakeRepository, | 
 |  |  |                           IRepository<OperateHistory, Guid> operateHistory, | 
 |  |  |                           ILifePayOrderService lifePayOrderService, | 
 |  |  |                           IAliPayApi aliPayApi, | 
 |  |  |                           IAlipayInterfaceManager aliPayInterfaceManager, | 
 |  |  |                           IWxPayApi wxPayApi, | 
 |  |  | 
 |  |  |         _lifePayRateRepository = lifePayRateRepository; | 
 |  |  |         _lifePayOrderRepository = lifePayOrderRepository; | 
 |  |  |         _lifePayUserRepository = lifePayUserRepository; | 
 |  |  |         _lifePayChannlesRakeRepository = lifePayChannlesRakeRepository; | 
 |  |  |         _lifePayPremiumRepository = lifePayPremiumRepository; | 
 |  |  |         _lifePayIntroInfoRepository = lifePayIntroInfoRepository; | 
 |  |  |         _aliPayApi = aliPayApi; | 
 |  |  |         _lifePayOrderService = lifePayOrderService; | 
 |  |  |         _alipayInterfaceManager = aliPayInterfaceManager; | 
 |  |  |         _wxPayApi = wxPayApi; | 
 |  |  |         _wxPayOptions = wxPayOptions.Value; | 
 |  |  | 
 |  |  |     public async Task<AlipayTradeQueryResponse> QueryAlipayTrade(OrderInQuiryInput input) | 
 |  |  |     { | 
 |  |  |         var result = await _aliPayApi.OrderInQuiry(input); | 
 |  |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     /// <returns></returns> | 
 |  |  |     public async Task<AlipayTradeFastpayRefundQueryResponse> QueryAlipayTradeRefund(OrderInQuiryInput input) | 
 |  |  |     { | 
 |  |  |         var order = await _lifePayOrderRepository.Where(x => x.OrderNo == input.OutTradeNo).FirstOrDefaultAsync(); | 
 |  |  |         input.OutRefundNo = order.RefundOrderNo; | 
 |  |  |         var result = await _aliPayApi.QueryAlipayTradeRefund(input); | 
 |  |  |         if (result.Code == AlipayResultCode.Success && result.RefundStatus == AlipayRefundStatus.Success) | 
 |  |  |         { | 
 |  |  |             order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; | 
 |  |  |             order.LifePayRefundStatus = LifePayRefundStatusEnum.已退款; | 
 |  |  |             await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput() | 
 |  |  |             { | 
 |  |  |                 OrderNo = result.OutTradeNo, | 
 |  |  |                 OutOrderNo = result.TradeNo, | 
 |  |  |                 LifePayType = LifePayTypeEnum.AliPay, | 
 |  |  |                 ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     /// </summary> | 
 |  |  |     /// <param name="outTradeNo"></param> | 
 |  |  |     /// <returns></returns> | 
 |  |  |     public async Task WxPayTradeQuery(string outTradeNo) | 
 |  |  |     public async Task<WxPayTradeQueryReponse> WxPayTradeQuery(string outTradeNo) | 
 |  |  |     { | 
 |  |  |         await _wxPayApi.WxPayTradeQuery(outTradeNo); | 
 |  |  |         return await _wxPayApi.WxPayTradeQuery(outTradeNo); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |    | 
 |  |  |  | 
 |  |  |     #endregion | 
 |  |  |  | 
 |  |  | 
 |  |  |         //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, 0.01m, ip, input.H5Type); | 
 |  |  |         var payUrl = await GetPayQRCode(res.LifePayType, res.OrderNo, res.Desc, res.PayAmount, ip, input.H5Type); | 
 |  |  | #else | 
 |  |  |       //var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, 0.01m, ip, input.H5Type); | 
 |  |  |         var payUrl = await GetPayQRCode(order.LifePayType.Value, order.OrderNo, desc, order.PayAmount??0, ip, input.H5Type); | 
 |  |  |       //var payUrl = await GetPayQRCode(res.LifePayType, res.OrderNo, res.Desc, 0.01m, ip, input.H5Type); | 
 |  |  |         var payUrl = await GetPayQRCode(res.LifePayType, res.OrderNo, res.Desc, res.PayAmount, ip, input.H5Type); | 
 |  |  | #endif | 
 |  |  |  | 
 |  |  |         return payUrl; | 
 |  |  | 
 |  |  |         await _lifePayOrderRepository.UpdateAsync(order); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public async Task WxPayDomesticRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus) | 
 |  |  |     public async Task LifePayRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus) | 
 |  |  |     { | 
 |  |  |         var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); | 
 |  |  |         CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在"); | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /// <summary> | 
 |  |  |     /// ACOOLYO订单通知处理 | 
 |  |  |     /// </summary> | 
 |  |  | 
 |  |  |         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()) | 
 |  |  | 
 |  |  |         order.ACOOLYStatus = acoolyStatus; | 
 |  |  |         order.FinishTime = DateTime.Now; | 
 |  |  |         await _lifePayOrderRepository.UpdateAsync(order); | 
 |  |  |  | 
 |  |  |         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.PayAmount.Value, | 
 |  |  |                     ChannlesRakeRate = order.ChannlesRakeRate.Value, | 
 |  |  |                     ChannlesRakePrice = channlesRakePrice.Value, | 
 |  |  |                     FinishTime = order.FinishTime.Value, | 
 |  |  |                     ChannelId = order.ChannelId, | 
 |  |  |                 }; | 
 |  |  |                 await _lifePayChannlesRakeRepository.InsertAsync(lifePayChannlesRake); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /// <summary> | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         var outRefundNo = order.ChannelId + CreateRefundOrderNo(); | 
 |  |  |         order.RefundOrderNo = outRefundNo; | 
 |  |  |         switch (order.LifePayType) | 
 |  |  |         { | 
 |  |  |             case LifePayTypeEnum.WxPay: | 
 |  |  | 
 |  |  |                     throw new UserFriendlyException("退款失败:" + aliRefundResult.SubMsg); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; | 
 |  |  |                 order.LifePayRefundStatus = LifePayRefundStatusEnum.已退款; | 
 |  |  |                 order.LifePayOrderStatus = LifePayOrderStatusEnum.退款中; | 
 |  |  |                 order.LifePayRefundStatus = LifePayRefundStatusEnum.退款中; | 
 |  |  |                 break; | 
 |  |  |             default: throw new UserFriendlyException("退款失败"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         order.RefundOrderNo = outRefundNo; | 
 |  |  |         order.RefundCredentialsImgUrl = input.RefundCredentialsImgUrl; | 
 |  |  |         order.RefundCheckRemark = input.RefundCheckRemark; | 
 |  |  |         order.RefundTime = DateTime.Now; | 
 |  |  | 
 |  |  |             await _lifePayAccount.InsertAsync(userAccount); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (input.LifePayType == LifePayOrderTypeEnum.PhoneOrder) | 
 |  |  |         if (input.LifePayType == LifePayOrderTypeEnum.PhoneOrder || input.LifePayType == LifePayOrderTypeEnum.ElectricOrder) | 
 |  |  |         { | 
 |  |  |             var extraProperties = JsonConvert.DeserializeObject<Model_UserAccountExtraProperties>(input.ExtraProperties); | 
 |  |  |             if (!string.IsNullOrEmpty(extraProperties.Name) && extraProperties.Phone == user.PhoneNumber) | 
 |  |  | 
 |  |  |         string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n"; | 
 |  |  |         return message; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private async Task<IQueryable<LifePayOrderListOutput>> GetLifePayOrderListFilter(QueryLifePayOrderListInput input) | 
 |  |  |     { |