zhengyiming
4 天以前 a5f0843b6b8f1d12ba8d100c81461386b80d7883
fix: 退款
10个文件已修改
254 ■■■■■ 已修改文件
LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayOrderService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application/LifePay/LifePayService.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayOrderService.cs
@@ -24,6 +24,12 @@
    Task AddLifePayExpensesReceipts(AddLifePayExpensesReceiptsInput input);
    /// <summary>
    /// 获取退款平台流水详情
    /// </summary>
    /// <returns></returns>
    Task<GetRefundPlatformTradeDetailOutput> GetRefundPlatformTradeDetail(string orderNo);
    Task GetAllLifePayExpensesReceipts();
    Task GetAllChannlesRake();
LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs
@@ -65,6 +65,13 @@
    Task LifePayRefundsHandler(string orderNo, LifePayRefundStatusEnum refundStatus);
    /// <summary>
    /// 退款成功处理
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<int> LifePayRefundsSuccessHandler(AddLifePayExpensesReceiptsInput input);
    /// <summary>
    /// 供应商回调处理
    /// </summary>
    /// <param name="orderNo"></param>
@@ -345,6 +352,6 @@
    Task<bool> CheckChannelsStatus(string channlesId);
    Task LifePayOrderHistory(string operateContent, string operateName, Guid relationId, int? tableType = (int)OperateHistoryTypeEnum.LifePayRefund);
}
LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs
@@ -894,4 +894,39 @@
    public decimal SupplierRate { get; set; }
    public decimal Rate { get; set; }
}
public class GetRefundPlatformTradeDetailOutput
{
    /// <summary>
    /// 订单号
    /// </summary>
    public string OrderNo { get; set; }
    /// <summary>
    /// 退款订单号
    /// </summary>
    public string RefundOrderNo { get; set; }
    /// <summary>
    /// 退款申请时间
    /// </summary>
    public DateTime RefundTime { get; set; }
    /// <summary>
    /// 退款成功时间
    /// </summary>
    public DateTime RefundSuccessTime { get; set; }
    public RefundPlatformStatusEnum RefundPlatformStatus { get; set; }
    /// <summary>
    /// 渠道流水号
    /// </summary>
    public string OutOrderNo { get; set; }
    /// <summary>
    /// 支付渠道
    /// </summary>
    public LifePayTypeEnum LifePayType { get; set; }
}
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
{
@@ -297,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);
@@ -336,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 = Convert.ToDateTime(order.RefundTime);
                result.RefundSuccessTime = Convert.ToDateTime(query.GmtRefundPay);
                result.RefundPlatformStatus = MapWxpayRefundStatusToPlatformEnum(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 = Convert.ToDateTime(query.CreateTime);
                result.RefundSuccessTime = 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>
        /// 统计所有消费流水
@@ -587,6 +654,5 @@
        }
        #endregion
    }
}
LifePayment/LifePayment.Application/LifePay/LifePayService.cs
@@ -1534,6 +1534,38 @@
        }
    }
    /// <summary>
    /// 退款成功处理
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<int> LifePayRefundsSuccessHandler(AddLifePayExpensesReceiptsInput input)
    {
        var order = await _lifePayOrderRepository.Where(x => x.OrderNo == input.OrderNo).FirstOrDefaultAsync();
        CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在");
        CheckExtensions.IfTrueThrowUserFriendlyException(order.LifePayRefundStatus != LifePayRefundStatusEnum.待退款 && order.LifePayRefundStatus != LifePayRefundStatusEnum.退款中, "当前订单状态无法查看退款流水");
        CheckExtensions.IfTrueThrowUserFriendlyException(order.RefundOrderNo.IsNullOrEmpty(), "不存在退款流水订单");
        await LifePayRefundsHandler(input.OrderNo, LifePayRefundStatusEnum.已退款);
        // 插入收支流水
        await _lifePayOrderService.AddLifePayExpensesReceipts(new AddLifePayExpensesReceiptsInput()
        {
            OrderNo = input.OrderNo,
            OutRefundNo = input.OutRefundNo,
            OutOrderNo = input.OutOrderNo,
            LifePayType = input.LifePayType,
            ExpensesReceiptsType = ExpensesReceiptsTypeEnum.Receipts
        });
        #region 记录日志
        await LifePayOrderHistory("更新订单退款状态", "更新订单退款状态", order.Id, (int)OperateHistoryTypeEnum.LifePayRefund);
        #endregion
        return Constant.SUCCESS;
    }
    /// <summary>
    /// ACOOLYO订单通知处理
@@ -2153,7 +2185,7 @@
        await _distributedEventBus.PublishAsync(recordEto, false);
    }
    private async Task LifePayOrderHistory(string operateContent, string operateName, Guid relationId, int? tableType = (int)OperateHistoryTypeEnum.LifePayRefund)
    public async Task LifePayOrderHistory(string operateContent, string operateName, Guid relationId, int? tableType = (int)OperateHistoryTypeEnum.LifePayRefund)
    {
        var operateHistory = new OperateHistory
        {
LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs
@@ -1,4 +1,5 @@
using System.ComponentModel;
using static LifePayment.Domain.Shared.LifePaymentConstant;
namespace LifePayment.Domain.Shared;
@@ -216,3 +217,18 @@
    [Description("出金")]
    Out = 20,
}
public enum RefundPlatformStatusEnum
{
    [Description("退款成功")]
    SUCCESS = 10,
    [Description("退款关闭")]
    CLOSED = 20,
    [Description("退款处理中")]
    PROCESSING = 30,
    [Description("退款异常")]
    ABNORMAL = 40,
}
LifePayment/LifePayment.Domain.Shared/Wallet/WalletConstant.cs
@@ -33,4 +33,5 @@
        /// </summary>
        public const int NotFoundWallet = 10050;
    }
}
LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml
@@ -411,6 +411,19 @@
            </summary>
            <returns></returns>
        </member>
        <member name="M:LifePayment.HttpApi.LifePayController.GetRefundPlatformTradeDetail(System.String)">
            <summary>
            获取退款平台流水详情
            </summary>
            <returns></returns>
        </member>
        <member name="M:LifePayment.HttpApi.LifePayController.LifePayRefundsSuccessHandler(LifePayment.Application.Contracts.AddLifePayExpensesReceiptsInput)">
            <summary>
            退款成功处理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:LifePayment.HttpApi.LifePayController.CreateLifePayPhoneOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifePhoneData})">
            <summary>
            创建生活缴费话费订单
LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml
@@ -31,6 +31,12 @@
            </summary>
            <returns></returns>
        </member>
        <member name="M:LifePayment.Application.Contracts.ILifePayOrderService.GetRefundPlatformTradeDetail(System.String)">
            <summary>
            获取退款平台流水详情
            </summary>
            <returns></returns>
        </member>
        <member name="M:LifePayment.Application.Contracts.ILifePayRateService.GetLifePayRateChannelPage(ZeroD.Util.PageInput)">
            <summary>
            获取折扣通道配置分页
@@ -118,6 +124,13 @@
            </summary>
            <param name="orderNo"></param>
            <param name="refundStatus"></param>
            <returns></returns>
        </member>
        <member name="M:LifePayment.Application.Contracts.ILifePayService.LifePayRefundsSuccessHandler(LifePayment.Application.Contracts.AddLifePayExpensesReceiptsInput)">
            <summary>
            退款成功处理
            </summary>
            <param name="input"></param>
            <returns></returns>
        </member>
        <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum,LifePayment.Domain.Shared.ACOOLYStatusEnum,System.Decimal,System.String,System.Nullable{System.Decimal},System.Nullable{System.Decimal})">
@@ -1067,6 +1080,36 @@
            终止结算时间
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.OrderNo">
            <summary>
            订单号
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.RefundOrderNo">
            <summary>
            退款订单号
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.RefundTime">
            <summary>
            退款申请时间
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.RefundSuccessTime">
            <summary>
            退款成功时间
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.OutOrderNo">
            <summary>
            渠道流水号
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.GetRefundPlatformTradeDetailOutput.LifePayType">
            <summary>
            支付渠道
            </summary>
        </member>
        <member name="P:LifePayment.Application.Contracts.LifePayIntroInfoInput.LifePayType">
            <summary>
            生活缴费类型
LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs
@@ -684,11 +684,32 @@
        {
            await _lifePayOrderService.GetAllLifePayConsumption();
        }
        /// <summary>
        /// 获取退款平台流水详情
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<GetRefundPlatformTradeDetailOutput> GetRefundPlatformTradeDetail(string orderNo)
        {
            return await _lifePayOrderService.GetRefundPlatformTradeDetail(orderNo);
        }
        #endregion
        #region 操作
        /// <summary>
        /// 退款成功处理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<int> LifePayRefundsSuccessHandler(AddLifePayExpensesReceiptsInput input)
        {
            return await _lifePayService.LifePayRefundsSuccessHandler(input);
        }
        /// <summary>
        /// 创建生活缴费话费订单
        /// </summary>
        /// <param name="input"></param>