| | |
| | | using Microsoft.Extensions.Logging; |
| | | using Microsoft.Extensions.Options; |
| | | using Newtonsoft.Json; |
| | | using StackExchange.Redis; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Data; |
| | |
| | | using Volo.Abp; |
| | | using Volo.Abp.Application.Services; |
| | | using Volo.Abp.Data; |
| | | using Volo.Abp.DistributedLocking; |
| | | using Volo.Abp.Domain.Repositories; |
| | | using Volo.Abp.EventBus.Distributed; |
| | | using Z.EntityFramework.Plus; |
| | |
| | | private readonly ILifePayOrderService _lifePayOrderService; |
| | | private readonly IDataFilter dataFilter; |
| | | private readonly IChannelFilter _channelFilter; |
| | | private readonly IAbpDistributedLock distributedLock; |
| | | private readonly IAliPayApi _aliPayApi; |
| | | private readonly IAlipayInterfaceManager _alipayInterfaceManager; |
| | | private readonly IWxPayApi _wxPayApi; |
| | |
| | | IRepository<LifePayChannles, Guid> lifePayChannlesRep, |
| | | IRepository<LifePayAccount, Guid> lifePayAccount, |
| | | IDataFilter dataFilter, |
| | | IChannelFilter channelFilter) |
| | | IChannelFilter channelFilter, |
| | | IAbpDistributedLock distributedLock) |
| | | { |
| | | _logger = logger; |
| | | _aCOOLYManager = aCOOLYManager; |
| | |
| | | _lifePayAccount = lifePayAccount; |
| | | this.dataFilter = dataFilter; |
| | | _channelFilter = channelFilter; |
| | | this.distributedLock = distributedLock; |
| | | _operateHistory = operateHistory; |
| | | } |
| | | |
| | |
| | | PlatformDeductionAmount = a.PlatformDeductionAmount, |
| | | ACOOLYStatus = a.ACOOLYStatus, |
| | | LifePayRefundStatus = a.LifePayRefundStatus, |
| | | OrderParamDetailJsonStr = a.OrderParamDetailJsonStr, |
| | | }).GetPageResult(input.PageModel); |
| | | |
| | | if (result != null && result.Data != null && result.Data.Count > 0) |
| | | { |
| | | foreach (var s in result.Data) |
| | | { |
| | | if (!string.IsNullOrWhiteSpace(s.OrderParamDetailJsonStr)) |
| | | { |
| | | if (s.LifePayOrderType == LifePayOrderTypeEnum.PhoneOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifePhoneData>()?.IspCode; |
| | | if (Enum.TryParse<IspCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.ElectricOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeElectricData>()?.ElectricType; |
| | | if (Enum.TryParse<ElectricTypeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.GasOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeGasData>()?.GasOrgType; |
| | | if (Enum.TryParse<GasOrgCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | |
| | | s.FinishTimeStr = !s.FinishTime.HasValue ? string.Empty : s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmm); |
| | | s.RefundApplyTimeStr = !s.RefundApplyTime.HasValue ? string.Empty : s.RefundApplyTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmm); |
| | | }); |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(result.IsNullOrEmpty(), "暂无数据导出"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | ACOOLYStatus = x.ACOOLYStatus, |
| | | //RefundApplyRemark = x.RefundApplyRemark, |
| | | ChannelName = x.ChannelName, |
| | | PlatformPrice = x.PlatformDeductionAmount.HasValue ? x.PlatformDeductionAmount.Value : 0.00m |
| | | PlatformPrice = x.PlatformDeductionAmount.HasValue ? x.PlatformDeductionAmount.Value : 0.00m, |
| | | OrderParamDetailJsonStr = x.OrderParamDetailJsonStr, |
| | | }).OrderByDescending(r => r.CreationTime).ToListAsync(); |
| | | var i = 0; |
| | | result.ForEach(s => |
| | |
| | | s.ACOOLYStatusStr = s.ACOOLYStatus.GetDescription(); |
| | | s.LifePayOrderStatusStr = s.LifePayOrderStatus.GetDescription(); |
| | | s.FinishTimeStr = !s.FinishTime.HasValue ? string.Empty : s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmmss); |
| | | if (!string.IsNullOrWhiteSpace(s.OrderParamDetailJsonStr)) |
| | | { |
| | | if (s.LifePayOrderType == LifePayOrderTypeEnum.PhoneOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifePhoneData>()?.IspCode; |
| | | if (Enum.TryParse<IspCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.ElectricOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeElectricData>()?.ElectricType; |
| | | if (Enum.TryParse<ElectricTypeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.GasOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeGasData>()?.GasOrgType; |
| | | if (Enum.TryParse<GasOrgCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(result.IsNullOrEmpty(), "暂无数据导出"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | ACOOLYStatus = x.ACOOLYStatus, |
| | | //RefundApplyRemark = x.RefundApplyRemark, |
| | | ChannelName = x.ChannelName, |
| | | PlatformPrice = x.PlatformDeductionAmount.HasValue ? x.PlatformDeductionAmount.Value : 0.00m |
| | | PlatformPrice = x.PlatformDeductionAmount.HasValue ? x.PlatformDeductionAmount.Value : 0.00m, |
| | | OrderParamDetailJsonStr = x.OrderParamDetailJsonStr, |
| | | }).OrderByDescending(r => r.CreationTime).ToListAsync(); |
| | | var i = 0; |
| | | result.ForEach(s => |
| | |
| | | s.ACOOLYStatusStr = s.ACOOLYStatus.GetDescription(); |
| | | s.LifePayOrderStatusStr = s.LifePayOrderStatus.GetDescription(); |
| | | s.FinishTimeStr = !s.FinishTime.HasValue ? string.Empty : s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmmss); |
| | | if (!string.IsNullOrWhiteSpace(s.OrderParamDetailJsonStr)) |
| | | { |
| | | if (s.LifePayOrderType == LifePayOrderTypeEnum.PhoneOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifePhoneData>()?.IspCode; |
| | | if (Enum.TryParse<IspCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.ElectricOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeElectricData>()?.ElectricType; |
| | | if (Enum.TryParse<ElectricTypeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | else if (s.LifePayOrderType == LifePayOrderTypeEnum.GasOrder) |
| | | { |
| | | var name = s.OrderParamDetailJsonStr.JsonToObject<LifeGasData>()?.GasOrgType; |
| | | if (Enum.TryParse<GasOrgCodeEnum>(name, true, out var @enum)) |
| | | { |
| | | s.Operator = @enum.GetDescription(); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(result.IsNullOrEmpty(), "暂无数据导出"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | order.ACOOLYOrderNo = result.ACOOLYOrderNo; |
| | | order.ACOOLYStatus = ACOOLYStatusEnum.充值中; |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | _logger.LogInformation("生活缴费订单状态:" + order.LifePayOrderStatus.ToString()); |
| | | _logger.LogInformation("生活缴费订单:" + order.ToJson()); |
| | | |
| | | /// 创建生活缴费消费记录 |
| | | await _lifePayOrderService.CreatLifePayConsumption(ACOOLYStatusEnum.充值中, order.OrderNo, order.ACOOLYOrderNo, |
| | |
| | | public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount, string refundApplyRemark, decimal? parValue = 0, decimal? actualParValue = 0) |
| | | { |
| | | var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); |
| | | |
| | | CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在"); |
| | | |
| | | await using var orderLock = await distributedLock.TryAcquireAsync($"LockKey:UpdateOrder:{orderNo}", TimeSpan.FromSeconds(60)); |
| | | |
| | | if (order.ACOOLYStatus.HasValue && (int)order.ACOOLYStatus > (int)acoolyStatus) |
| | | { |
| | | _logger.LogInformation($"订单({orderNo})由{order.ACOOLYStatus}至{acoolyStatus}失败,不可回滚状态"); |
| | | return; |
| | | } |
| | | |
| | | if (order.LifePayOrderStatus == status && order.ACOOLYStatus == acoolyStatus) |
| | | { |
| | |
| | | } |
| | | |
| | | order.ActualReceivedAmount = actualParValue; |
| | | order.PlatformDeductionAmount = Math.Round((order.ActualReceivedAmount ?? 0) * (order.PlatformRate ?? 0) / 100, 2); |
| | | |
| | | if (acoolyOrderNo.IsNotNullOrEmpty()) |
| | | { |
| | |
| | | |
| | | order.LifePayOrderStatus = status; |
| | | order.ACOOLYStatus = acoolyStatus; |
| | | |
| | | if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成 |
| | | || order.LifePayOrderStatus == LifePayOrderStatusEnum.已退款) |
| | | { |
| | | order.FinishTime = DateTime.Now; |
| | | order.PlatformDeductionAmount = Math.Round((order.ActualReceivedAmount ?? 0) * (order.PlatformRate ?? 0) / 100, 2); |
| | | } |
| | | |
| | | 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.待退款 || order.LifePayRefundStatus == LifePayRefundStatusEnum.待退款) |
| | | { |
| | | if (order.ACOOLYStatus == ACOOLYStatusEnum.已完成 || order.ACOOLYStatus == ACOOLYStatusEnum.充值成功 || order.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功) |
| | | { |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.已完成; |
| | | } |
| | | else |
| | | { |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败; |
| | | } |
| | | |
| | | order.RefundCheckRemark = input.RefundCheckRemark; |
| | | order.RefundCheckUserId = CurrentUser.Id; |
| | | order.LifePayRefundStatus = LifePayRefundStatusEnum.退款驳回; |
| | | order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; |
| | | |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | |
| | |
| | | PlatformDeductionAmount = a.PlatformDeductionAmount, |
| | | ACOOLYStatus = a.ACOOLYStatus, |
| | | LifePayRefundStatus = a.LifePayRefundStatus, |
| | | OrderParamDetailJsonStr = a.OrderParamDetailJsonStr |
| | | }); |
| | | |
| | | |