From bda2679db0d10a0328a71ff4f55f000d26ef10dc Mon Sep 17 00:00:00 2001 From: zhengyuxuan <zhengyuxuan1995> Date: 星期五, 21 三月 2025 14:51:32 +0800 Subject: [PATCH] fix:bug修复 --- LifePayment/LifePayment.Application/LifePay/LifePayService.cs | 184 +++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 164 insertions(+), 20 deletions(-) diff --git a/LifePayment/LifePayment.Application/LifePay/LifePayService.cs b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs index b10cf07..e24db15 100644 --- a/LifePayment/LifePayment.Application/LifePay/LifePayService.cs +++ b/LifePayment/LifePayment.Application/LifePay/LifePayService.cs @@ -25,6 +25,7 @@ using Nest; using Volo.Abp.Domain.Entities; using Volo.Abp.ObjectMapping; +using NPOI.SS.Formula.Functions; namespace LifePayment.Application; @@ -41,9 +42,11 @@ private readonly IRepository<DallyStatistics, Guid> _dallyStatisticsRepository; private readonly IRepository<LifePayChannles, Guid> _lifePayChannlesRep; private readonly IRepository<LifePayAccount, Guid> _lifePayAccount; + private readonly IRepository<OperateHistory, Guid> _operateHistory; private readonly IDataFilter dataFilter; private readonly IChannelFilter _channelFilter; private readonly IAliPayApi _aliPayApi; + private readonly IAlipayInterfaceManager _alipayInterfaceManager; private readonly IWxPayApi _wxPayApi; private readonly WxPayOption _wxPayOptions; @@ -58,7 +61,9 @@ IRepository<LifePayPremium, Guid> lifePayPremiumRepository, IRepository<LifePayIntroInfo, Guid> lifePayIntroInfoRepository, IRepository<DallyStatistics, Guid> dallyStatisticsRepository, + IRepository<OperateHistory, Guid> operateHistory, IAliPayApi aliPayApi, + IAlipayInterfaceManager aliPayInterfaceManager, IWxPayApi wxPayApi, IOptions<WxPayOption> wxPayOptions, IRepository<LifePayChannles, Guid> lifePayChannlesRep, @@ -75,6 +80,7 @@ _lifePayIntroInfoRepository = lifePayIntroInfoRepository; _dallyStatisticsRepository = dallyStatisticsRepository; _aliPayApi = aliPayApi; + _alipayInterfaceManager = aliPayInterfaceManager; _wxPayApi = wxPayApi; _wxPayOptions = wxPayOptions.Value; _distributedEventBus = distributedEventBus; @@ -82,40 +88,48 @@ _lifePayAccount = lifePayAccount; this.dataFilter = dataFilter; _channelFilter = channelFilter; + _operateHistory = operateHistory; } #region 鏌ヨ public async Task<TopStatisticsOutput> GetTopStatistics() { - var today = DateTime.Now.ToString("yyyy-MM-dd"); - var statistics = await _dallyStatisticsRepository.Where(x => x.CreationTime.ToString("yyyy-MM-dd") == today).FirstOrDefaultAsync(); + 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 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 = "0", - ReceiptsYesterda = "0", - AccumulatedOrders = "0", - OrdersNumYesterda = "0", - YesterdaSuccess = "0", - YesterdaFail = "0", - AccumulatedUsers = "0", + Amount = 0, + AccumulatedReceipts = accumulatedReceipts, + ReceiptsYesterday = receiptsYesterday, + AccumulatedOrders = accumulatedOrders, + OrdersNumYesterday = ordersNumYesterday, + YesterdaySuccess = yesterdaySuccess, + YesterdayFail = yesterdayFail, + AccumulatedUsers = accumulatedUsers, }; - + await _dallyStatisticsRepository.InsertAsync(entity); + //var result = ObjectMapper.Map<DallyStatistics, TopStatisticsOutput>(entity); return new TopStatisticsOutput(); } else { - var result = ObjectMapper.Map<DallyStatistics,TopStatisticsOutput>(statistics); + var result = ObjectMapper.Map<DallyStatistics, TopStatisticsOutput>(statistics); return result; } - } /// <summary> @@ -267,6 +281,64 @@ .WhereIf(input.EndPayTime.HasValue, x => x.PayTime <= input.EndPayTime) .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) .WhereIf(input.PayStatus.HasValue, x => x.PayStatus == input.PayStatus.Value) + .WhereIf(input.ACOOLYStatus.HasValue, x => x.ACOOLYStatus == input.ACOOLYStatus.Value) + .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) + .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) + .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.PhoneNumber.Contains(input.KeyWords) || x.OrderNo.Contains(input.KeyWords) || x.OutOrderNo.Contains(input.KeyWords) || x.ACOOLYOrderNo.Contains(input.KeyWords)) + join b in _lifePayChannlesRep on a.ChannelId equals b.ChannlesNum into temp + from b in temp.DefaultIfEmpty() + select new LifePayOrderListOutput + { + DiscountAmount = a.DiscountAmount, + FinishTime = a.FinishTime, + Id = a.Id, + LifePayOrderStatus = a.LifePayOrderStatus, + LifePayOrderType = a.LifePayOrderType, + LifePayType = a.LifePayType, + OrderNo = a.OrderNo, + PayAmount = a.PayAmount, + PhoneNumber = a.PhoneNumber, + RechargeAmount = a.RechargeAmount, + UserId = a.UserId, + OutOrderNo = a.OutOrderNo, + PayStatus = a.PayStatus, + PayTime = a.PayTime, + ACOOLYOrderNo = a.ACOOLYOrderNo, + RefundCredentialsImgUrl = a.RefundCredentialsImgUrl.GetOssPath(), + RefundPrice = a.RefundPrice, + CreationTime = a.CreationTime, + RefundCheckRemark = a.RefundCheckRemark, + RefundApplyRemark = a.RefundApplyRemark, + RefundTime = a.RefundTime, + ChannelName = b.ChannlesName, + ActualRechargeAmount = a.ActualRechargeAmount, + PlatformDeductionAmount = a.PlatformDeductionAmount, + ACOOLYStatus = a.ACOOLYStatus, + LifePayRefundStatus = a.LifePayRefundStatus, + }).GetPageResult(input.PageModel); + + return result; + } + + /// <summary> + /// 閫�娆捐鍗曞垎椤� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<PageOutput<LifePayOrderListOutput>> GetLifePayRefundOrderPage(QueryLifePayRefundOrderListInput input) + { + + 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.閫�娆惧け璐� + || x.LifePayRefundStatus > LifePayRefundStatusEnum.鏃犻渶閫�娆�) + .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) + .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) + .WhereIf(input.BeginRefundApplyTime.HasValue, x => x.RefundApplyTime >= input.BeginRefundApplyTime) + .WhereIf(input.LifePayType.HasValue, x => x.LifePayType == input.LifePayType) + .WhereIf(input.EndRefundApplyTime.HasValue, x => x.RefundApplyTime <= input.EndRefundApplyTime) + .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) + .WhereIf(input.ACOOLYStatus.HasValue, x => x.ACOOLYStatus == input.ACOOLYStatus.Value) .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.PhoneNumber.Contains(input.KeyWords) || x.OrderNo.Contains(input.KeyWords) || x.OutOrderNo.Contains(input.KeyWords) || x.ACOOLYOrderNo.Contains(input.KeyWords)) @@ -293,7 +365,9 @@ CreationTime = a.CreationTime, RefundCheckRemark = a.RefundCheckRemark, RefundApplyRemark = a.RefundApplyRemark, + RefundApplyTime = a.RefundApplyTime, RefundTime = a.RefundTime, + RefundPrice = a.RefundPrice, ChannelName = b.ChannlesName, ActualRechargeAmount = a.ActualRechargeAmount, PlatformDeductionAmount = a.PlatformDeductionAmount, @@ -343,6 +417,8 @@ RefundPrice = order.RefundPrice, PlatformRate = platformRate.Rate, 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), @@ -391,7 +467,10 @@ ACOOLYOrderNo = order.ACOOLYOrderNo, LifePayRefundStatus = order.LifePayRefundStatus, ActualRechargeAmount = order.ActualRechargeAmount, + ActualReceivedAmount = order.ActualReceivedAmount, RefundPrice = order.RefundPrice, + ElecBillUrl = order.ElecBillUrl.GetOssPath(), + RefundElecBillUrl = order.RefundElecBillUrl.GetOssPath(), }; return result; @@ -660,7 +739,54 @@ }); return result; } + public async Task<string> GetBillErceiptExport(string orderNo) + { + try + { + var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); + CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "鏈壘鍒拌鍗曚俊鎭�"); + if (order.LifePayType == LifePayTypeEnum.AliPay) + { + var elecInfoInput = new DataBillErceiptApplyInput + { + Type = "FUND_DETAIL", + Key = order.OutOrderNo + }; + + var elecInfoOutput = await _alipayInterfaceManager.DataBillErceiptApply(elecInfoInput); + if (elecInfoOutput != null) + { + var elecFileInput = new DataBillEreceiptQueryInput + { + FileId = elecInfoOutput.FileId, + }; + var elecFileOutput = await _alipayInterfaceManager.DataBillEreceiptQuery(elecFileInput); + if (!string.IsNullOrEmpty(elecFileOutput.DownloadUrl)) + { + return elecFileOutput.DownloadUrl; + } + return ""; + } + return ""; + } + else + { + WxPayTradeBillApplyRequest req = new WxPayTradeBillApplyRequest + { + OutBillNo = order.OutOrderNo, + }; + + var res = await _wxPayApi.WxPayTradeBillApply(req); + return ""; + } + } + catch (Exception ex) + { + _logger.LogError("鑾峰彇璁㈠崟鍙蜂负{0}鐢靛瓙鍥炲崟鍑虹幇閿欒锛歿1}", orderNo, ex.Message); + return ""; + } + } #endregion #region 鎿嶄綔 @@ -823,6 +949,9 @@ break; case LifePayOrderTypeEnum.鐢佃垂璁㈠崟: desc += "鐢佃垂"; + break; + case LifePayOrderTypeEnum.鐕冩皵璁㈠崟: + desc += "鐕冩皵"; break; default: break; @@ -1085,6 +1214,7 @@ break; } + order.LifePayRefundStatus = LifePayRefundStatusEnum.鏃犻渶閫�娆�; order.LifePayOrderStatus = LifePayOrderStatusEnum.寰呯‘璁�; //SetOrderStatus(order, result.Code); order.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo; @@ -1094,7 +1224,7 @@ { _logger.LogError(ex, "澶勭悊鐢熸椿缂磋垂鏀粯鎴愬姛鍥炶皟鏃跺紓甯�"); order.LifePayOrderStatus = LifePayOrderStatusEnum.宸插け璐�; - order.PayStatus = LifePayStatusEnum.寰呴��娆�; + order.LifePayRefundStatus = LifePayRefundStatusEnum.寰呴��娆�; } _logger.LogError("鐢熸椿缂磋垂璁㈠崟鐘舵�侊細" + order.LifePayOrderStatus.ToString()); await _lifePayOrderRepository.UpdateAsync(order); @@ -1116,8 +1246,6 @@ return; } - order.LifePayOrderStatus = status; - order.ACOOLYStatus = acoolyStatus; order.PlatformDeductionAmount = payAmount; if (acoolyOrderNo.IsNotNullOrEmpty()) { @@ -1134,6 +1262,8 @@ order.PayStatus = LifePayStatusEnum.寰呴��娆�; } + order.LifePayOrderStatus = status; + order.ACOOLYStatus = acoolyStatus; await _lifePayOrderRepository.UpdateAsync(order); } @@ -1208,7 +1338,7 @@ #region 璁板綍鏃ュ織 - await PublishLifePayOrderHistoryEvent("閫�娆�", "閫�娆�", order.Id); + await LifePayOrderHistory("閫�娆�", "閫�娆�", order.Id, (int)OperateHistoryTypeEnum.LifePayRefund); #endregion @@ -1551,10 +1681,10 @@ private (decimal PayAmont, decimal DiscountAmount, decimal RechargeAmount) CalculateAmount(decimal amount, decimal rate) { /// 姝e父鏀粯 - var payAmount = decimal.Round(amount * rate / 100, 2, MidpointRounding.AwayFromZero); + //var payAmount = decimal.Round(amount * rate / 100, 2, MidpointRounding.AwayFromZero); /// 1鍒嗛挶鏀粯 - //decimal payAmount = 0.01m; + decimal payAmount = 0.01m; CheckExtensions.IfTrueThrowUserFriendlyException(payAmount < 0.01m, "鏀粯閲戦閿欒"); @@ -1596,6 +1726,20 @@ await _distributedEventBus.PublishAsync(recordEto, false); } + private async Task LifePayOrderHistory(string operateContent, string operateName, Guid relationId, int? tableType = (int)OperateHistoryTypeEnum.LifePayRefund) + { + var operateHistory = new OperateHistory + { + CreatorName = CurrentUser.Name, + OperateContent = operateName, + OperateName = operateName, + RelationId = relationId, + TableType = tableType + + }; + await _operateHistory.InsertAsync(operateHistory); + } + /// <summary> /// 鑾峰彇鏀粯浜岀淮鐮� /// </summary> -- Gitblit v1.9.1