zhengyiming
4 天以前 83b72e32a89988dd721ef7bc8ea673751092fb4a
LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
@@ -1,7 +1,10 @@
using LifePayment.Application.Contracts;
using LifePayment.Domain;
using LifePayment.Domain.LifePay;
using LifePayment.Domain.Models;
using LifePayment.Domain.Shared;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -9,11 +12,9 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Microsoft.EntityFrameworkCore;
using ZeroD.Util;
using LifePayment.Domain;
using ZeroD.Util.Fadd;
using static LifePayment.Domain.Shared.LifePaymentConstant;
using Newtonsoft.Json;
namespace LifePayment.Application.LifePay
{
@@ -78,8 +79,8 @@
                })
                .GetPageResult(input.PageModel);
            var totalDeductionAmount = await _lifePayConsumption.SumAsync(x => x.DeductionAmount);
            var totalFrozenAmount = await _lifePayConsumption.SumAsync(x => x.FrozenAmount);
            var totalDeductionAmount = await _lifePayConsumption.Where(it => it.ACOOLYStatus == ACOOLYStatusEnum.已完成 || it.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功).SumAsync(x => x.DeductionAmount);
            var totalFrozenAmount = await _lifePayConsumption.Where(it => it.ACOOLYStatus == ACOOLYStatusEnum.充值中 || it.ACOOLYStatus == ACOOLYStatusEnum.充值失败).SumAsync(x => x.FrozenAmount);
            LifePayConsumptionStatistics objectData = new LifePayConsumptionStatistics();
            objectData.TotalDeductionAmount = totalDeductionAmount;
            objectData.TotalFrozenAmount = totalFrozenAmount ?? 0;
@@ -215,6 +216,7 @@
                s.ChannlesRakePriceStr = s.ChannlesRakePrice.ToString("F2");
                s.FinishTimeStr = s.FinishTime.HasValue ? s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmmss) : "";
            });
            CheckExtensions.IfTrueThrowUserFriendlyException(result.IsNullOrEmpty(), "暂无数据导出");
            return result;
        }
@@ -296,7 +298,7 @@
                            var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = input.OrderNo, OutRefundNo = input.OutRefundNo });
                            if (query.Code == AlipayResultCode.Success && query.RefundStatus == AlipayRefundStatus.Success)
                            {
                                data.OrderNo = input.OutRefundNo;
                                data.OrderNo = input.OrderNo;
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                data.FinishTime = Convert.ToDateTime(query.GmtRefundPay);
                                data.Amount = Convert.ToDecimal(query.RefundAmount);
@@ -322,7 +324,7 @@
                            var query = await _wxPayApi.WxPayDomesticRefundsQuery(input.OutRefundNo);
                            if (query.Status == WxPayRefundStatus.退款成功)
                            {
                                data.OrderNo = input.OutRefundNo;
                                data.OrderNo = input.OrderNo;
                                data.ExtraProperties = JsonConvert.SerializeObject(query);
                                data.FinishTime = Convert.ToDateTime(query.SuccessTime);
                                data.Amount = Convert.ToDecimal(query.Amount.Total) / 100;
@@ -335,8 +337,74 @@
            }
        }
        /// <summary>
        /// 获取退款平台流水详情
        /// </summary>
        /// <returns></returns>
        public async Task<GetRefundPlatformTradeDetailOutput> GetRefundPlatformTradeDetail(string orderNo)
        {
            var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync();
            CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
            CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayRefundStatus != LifePayRefundStatusEnum.待退款 && order.LifePayRefundStatus != LifePayRefundStatusEnum.退款中, "当前订单状态无法查看退款流水");
            CheckExtensions.IfTrueThrowUserFriendlyException(order.RefundOrderNo.IsNullOrEmpty(), "不存在退款流水订单");
            var result = new GetRefundPlatformTradeDetailOutput();
            if (order.LifePayType == LifePayTypeEnum.AliPay)
            {
                var query = await _aliPayApi.QueryAlipayTradeRefund(new OrderInQuiryInput() { OutTradeNo = order.OrderNo, OutRefundNo = order.RefundOrderNo });
                result.OrderNo = order.OrderNo;
                result.RefundOrderNo = order.RefundOrderNo;
                result.OutOrderNo = query.TradeNo;
                result.LifePayType = LifePayTypeEnum.AliPay;
                result.RefundTime = order.RefundTime;
                result.RefundSuccessTime = query.GmtRefundPay.IsNullOrEmpty() ? null : Convert.ToDateTime(query.GmtRefundPay);
                result.RefundPlatformStatus = MapAlipayRefundStatusToPlatformEnum(query.RefundStatus);
            }
            else if (order.LifePayType == LifePayTypeEnum.WxPay)
            {
                var query = await _wxPayApi.WxPayDomesticRefundsQuery(order.RefundOrderNo);
                result.OrderNo = order.OrderNo;
                result.RefundOrderNo = order.RefundOrderNo;
                result.OutOrderNo = query.TransactionId;
                result.LifePayType = LifePayTypeEnum.WxPay;
                result.RefundTime = query.CreateTime.IsNullOrEmpty() ? null : Convert.ToDateTime(query.CreateTime);
                result.RefundSuccessTime = query.SuccessTime.IsNullOrEmpty() ? null : Convert.ToDateTime(query.SuccessTime);
                result.RefundPlatformStatus = MapWxpayRefundStatusToPlatformEnum(query.Status);
            }
            return result;
        }
        /// <summary>
        /// 支付宝退款状态映射到通用退款平台状态(Switch 版本)
        /// </summary>
        /// <param name="alipayStatus">支付宝退款状态</param>
        /// <returns>通用退款平台状态</returns>
        public static RefundPlatformStatusEnum MapAlipayRefundStatusToPlatformEnum(string alipayRefundStatus)
        {
            return alipayRefundStatus switch
            {
                AlipayRefundStatus.Success => RefundPlatformStatusEnum.SUCCESS,
                _ => RefundPlatformStatusEnum.PROCESSING
            };
        }
        /// <summary>
        /// 微信退款状态映射到通用退款平台状态(Switch 版本)
        /// </summary>
        /// <param name="wxPayRefundStatus">微信退款状态</param>
        /// <returns>通用退款平台状态</returns>
        public static RefundPlatformStatusEnum MapWxpayRefundStatusToPlatformEnum(string wxPayRefundStatus)
        {
            return wxPayRefundStatus switch
            {
                WxPayRefundStatus.退款成功 => RefundPlatformStatusEnum.SUCCESS,
                WxPayRefundStatus.退款关闭 => RefundPlatformStatusEnum.CLOSED,
                WxPayRefundStatus.退款处理中 => RefundPlatformStatusEnum.PROCESSING,
                _ => RefundPlatformStatusEnum.ABNORMAL
            };
        }
        /// <summary>
        /// 统计所有消费流水
@@ -347,7 +415,7 @@
            var orderList = await _lifePayOrderRepository.Where(x => x.PayStatus == LifePayStatusEnum.已支付).ToListAsync();
            foreach (var item in orderList)
            {
                if (item.ACOOLYStatus != null)
                {
                    switch (item.ACOOLYStatus)
@@ -474,7 +542,7 @@
        #region 方法
        public async Task CreatLifePayConsumption(ACOOLYStatusEnum status, string orderNo, string aCOOLYOrderNo,
            decimal platformDeductionAmount, string channelId, DateTime orderCreationTime, DateTime? orderFinishTime)
            decimal platformDeductionAmount, string channelId, DateTime orderCreationTime, DateTime? orderFinishTime, decimal? channelRate = 0, decimal? parValue = 0, decimal? actualParValue = 0)
        {
            LifePayConsumption lifePayConsumption = new LifePayConsumption()
            {
@@ -525,22 +593,32 @@
                    lifePayConsumption.DeductionAmount = 0;
                    lifePayConsumption.FrozenAmount = 0;
                    break;
                //case ACOOLYStatusEnum.部分充值成功:
                //    lifePayConsumption.FinishTime = orderCreationTime;
                //    lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.部分充值成功;
                //    lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw;
                //    lifePayConsumption.Flow = ConsumptionFlowEnum.Unchanged;
                //    lifePayConsumption.DeductionAmount = 0;
                //    lifePayConsumption.FrozenAmount = lifePayConsumption.Amount;
                case ACOOLYStatusEnum.部分充值成功:
                    lifePayConsumption.FinishTime = orderCreationTime;
                    lifePayConsumption.ACOOLYStatus = ACOOLYStatusEnum.部分充值成功;
                    lifePayConsumption.FrozenStatus = ConsumptionFrozenStatusEnum.Thaw;
                    lifePayConsumption.Flow = ConsumptionFlowEnum.Out;
                    lifePayConsumption.DeductionAmount = lifePayConsumption.Amount;
                    lifePayConsumption.FrozenAmount = 0;
                    if ((parValue ?? 0) != 0 && (parValue ?? 0) != actualParValue)
                    {
                        LifePayConsumption lifePayConsumptionOther = new LifePayConsumption()
                        {
                            OrderNo = orderNo,
                            AcoolyOrderNo = aCOOLYOrderNo,
                            Amount = ((parValue ?? 0) - (actualParValue ?? 0)) * (channelRate ?? 0),
                            ChannelId = channelId,
                            FinishTime = orderCreationTime,
                            ACOOLYStatus = ACOOLYStatusEnum.部分充值成功,
                            FrozenStatus = ConsumptionFrozenStatusEnum.Thaw,
                            Flow = ConsumptionFlowEnum.Unchanged,
                            DeductionAmount = 0,
                            FrozenAmount = 0
                        };
                        await _lifePayConsumption.InsertAsync(lifePayConsumptionOther);
                    }
                //    repeat = await _lifePayConsumption.Where(x => x.OrderNo == lifePayConsumption.OrderNo
                //    && x.ACOOLYStatus == lifePayConsumption.ACOOLYStatus && x.Flow == lifePayConsumption.Flow).FirstOrDefaultAsync();
                //    if (repeat == null)
                //    {
                //        await _lifePayConsumption.InsertAsync(lifePayConsumption);
                //    }
                //    break;
                    break;
                default: break;
            }
@@ -576,6 +654,5 @@
        }
        #endregion
    }
}