| | |
| | | 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; |
| | | using ZeroD.Util; |
| | | using ZeroD.Util.Fadd; |
| | | using static LifePayment.Domain.Shared.LifePaymentConstant; |
| | | |
| | | namespace LifePayment.Application; |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo; |
| | | 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, |
| | |
| | | order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; |
| | | order.ACOOLYStatus = ACOOLYStatusEnum.充值失败; |
| | | order.RefundApplyRemark = ex.Message; |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | _logger.LogError("生活缴费订单状态:" + order.LifePayOrderStatus.ToString()); |
| | | } |
| | | _logger.LogError("生活缴费订单状态:" + order.LifePayOrderStatus.ToString()); |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | } |
| | | |
| | | public async Task LifePayRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus) |
| | |
| | | /// <returns></returns> |
| | | public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount, string refundApplyRemark, decimal? parValue = 0, decimal? actualParValue = 0) |
| | | { |
| | | 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) |
| | |
| | | order.RefundPrice = Math.Round((1 - ((order.ActualReceivedAmount ?? 0) / (order.RechargeAmount ?? 0))) * (order.PayAmount ?? 0), 2); |
| | | } |
| | | |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | |
| | | if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) |
| | | { |
| | | ///结算渠道佣金 |
| | |
| | | /// 创建生活缴费消费记录 |
| | | await _lifePayOrderService.CreatLifePayConsumption(acoolyStatus, order.OrderNo, order.ACOOLYOrderNo, |
| | | order.PlatformDeductionAmount ?? 0, order.ChannelId, order.CreationTime, order.FinishTime, order.ChannleRate, parValue, actualParValue); |
| | | |
| | | await CurrentUnitOfWork.SaveChangesAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | if (order.LifePayOrderStatus == LifePayOrderStatusEnum.待退款 || order.LifePayRefundStatus == LifePayRefundStatusEnum.待退款) |
| | | { |
| | | if (order.ACOOLYStatus == ACOOLYStatusEnum.已完成 || order.ACOOLYStatus == ACOOLYStatusEnum.充值成功) |
| | | { |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.已完成; |
| | | order.LifePayRefundStatus = null; |
| | | } |
| | | else |
| | | { |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; |
| | | order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; |
| | | } |
| | | |
| | | order.RefundCheckRemark = input.RefundCheckRemark; |
| | | order.RefundCheckUserId = CurrentUser.Id; |
| | | order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; |
| | | order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; |
| | | |
| | | await _lifePayOrderRepository.UpdateAsync(order); |
| | | |
| | |
| | | PlatformDeductionAmount = a.PlatformDeductionAmount, |
| | | ACOOLYStatus = a.ACOOLYStatus, |
| | | LifePayRefundStatus = a.LifePayRefundStatus, |
| | | OrderParamDetailJsonStr = a.OrderParamDetailJsonStr |
| | | }); |
| | | |
| | | |
| | |
| | | .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)) |
| | | .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.PhoneNumber.Contains(input.KeyWords) || x.RefundOrderNo.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 |