From a47038826eb7d1c152a50e95b3c9be177a130e8d Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 20 十一月 2025 09:26:18 +0800
Subject: [PATCH] feat:开发平安转账

---
 ApiTools.Core/Jobs/RefreshChannelWalletTransactionStatusJob.cs                   |   10 
 ApiTools.Application/ApiTools.Application.xml                                    |    8 
 ApiTools.Core/Models/ChannelWallets/Queries/GetChannelWalletTransactionsQuery.cs |  208 ++++++++++++++++++++
 ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs      |  101 +++++++---
 ApiTools.Core/ApiTools.Core.xml                                                  |  200 ++++++++++++++++++++
 ApiTools.Application/ChannelWallets/Queries/ChannelWalletQueryHandler.cs         |   26 ++
 6 files changed, 516 insertions(+), 37 deletions(-)

diff --git a/ApiTools.Application/ApiTools.Application.xml b/ApiTools.Application/ApiTools.Application.xml
index 6b48838..7fdf5ec 100644
--- a/ApiTools.Application/ApiTools.Application.xml
+++ b/ApiTools.Application/ApiTools.Application.xml
@@ -191,6 +191,14 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:ApiTools.Application.ChannelWalletQueryHandler.Handle(ApiTools.Core.GetChannelWalletTransactionsQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="M:ApiTools.Application.SendSmsCommandHandler.Handle(ApiTools.Core.SendSmsCommand,System.Threading.CancellationToken)">
             <summary>
             鍙戦�佺煭淇�
diff --git a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
index 0fd2503..50032f2 100644
--- a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
+++ b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
@@ -90,37 +90,76 @@
             await channelWalletService.GetEnterpriseWalletBalance(wallet);
             if (request.Amount > wallet.Balance) throw Oops.Oh(EnumErrorCodeType.s404, "浣欓涓嶈冻");
 
-            var checkExist = await channelWalletTransactionRepository.GetQueryable()
-                .AnyAsync(it => it.WalletId == wallet.Id && it.OutCode == request.OutCode);
-            if (checkExist) throw Oops.Oh(EnumErrorCodeType.s405, "浜ゆ槗鍗曞彿");
-
-            var transaction = new ChannelWalletTransaction();
-            transaction.Type = EnumWalletTransactionType.Transfer;
-            transaction.WalletId = wallet.Id;
-            transaction.OutCode = request.OutCode;
-            transaction.ConcurrencyLock = $"{logier.ChannelId}:{transaction.OutCode}";
-            transaction.Amount = request.Amount;
-            transaction.Remark = request.Remark;
-            transaction.TransactionStatus = EnumWalletTransactionStatus.WaitSubmit;
-            transaction.Balance = wallet.Balance;
-            transaction.AfterBalance = wallet.Balance - transaction.Amount;
-            transaction.OutOperatorId = request.OutOperatorId;
-            transaction.OperatorTime = request.OperatorTime;
-            transaction.PayerName = wallet.Name;
-            transaction.PayerAccount = wallet.Identity;
-            transaction.PayerBank = wallet.Bank;
-            transaction.PayerBankBranch = wallet.BankBranch;
-            transaction.OutReceiveId = request.OutReceiveId;
-            transaction.ReceiveBank = request.ReceiveBank;
-            transaction.ReceiveBankBranch = request.ReceiveBankBranch;
-            transaction.ReceiveName = request.ReceiveName;
-            transaction.ReceiveIdentity = request.ReceiveIdentity;
-            transaction.ReceiveAccount = request.ReceiveAccount;
-            transaction.Currency = request.Currency;
-            transaction.Purpose = request.Purpose;
-            transaction.Remark = request.Remark;
-            await channelWalletTransactionRepository.SetCode(transaction);
-            await channelWalletTransactionRepository.InsertNowAsync(transaction);
+            var transaction = await channelWalletTransactionRepository.GetQueryable()
+                .Where(it => it.WalletId == wallet.Id && it.OutCode == request.OutCode)
+                .FirstOrDefaultAsync();
+            if (transaction == null)
+            {
+                transaction = new ChannelWalletTransaction();
+                transaction.Type = EnumWalletTransactionType.Transfer;
+                transaction.WalletId = wallet.Id;
+                transaction.OutCode = request.OutCode;
+                transaction.ConcurrencyLock = $"{logier.ChannelId}:{transaction.OutCode}";
+                transaction.TransactionStatus = EnumWalletTransactionStatus.WaitSubmit;
+                transaction.Amount = request.Amount;
+                transaction.Balance = wallet.Balance;
+                transaction.AfterBalance = wallet.Balance - transaction.Amount;
+                transaction.OutOperatorId = request.OutOperatorId;
+                transaction.OperatorTime = request.OperatorTime;
+                transaction.PayerName = wallet.Name;
+                transaction.PayerAccount = wallet.Identity;
+                transaction.PayerBank = wallet.Bank;
+                transaction.PayerBankBranch = wallet.BankBranch;
+                transaction.OutReceiveId = request.OutReceiveId;
+                transaction.ReceiveBank = request.ReceiveBank;
+                transaction.ReceiveBankBranch = request.ReceiveBankBranch;
+                transaction.ReceiveName = request.ReceiveName;
+                transaction.ReceiveIdentity = request.ReceiveIdentity;
+                transaction.ReceiveAccount = request.ReceiveAccount;
+                transaction.Currency = request.Currency;
+                transaction.Purpose = request.Purpose;
+                transaction.Remark = request.Remark;
+                await channelWalletTransactionRepository.SetCode(transaction);
+                await channelWalletTransactionRepository.InsertNowAsync(transaction);
+            }
+            else
+            {
+                switch (transaction.TransactionStatus)
+                {
+                    case EnumWalletTransactionStatus.WaitSubmit:
+                        throw Oops.Oh(EnumErrorCodeType.s510, "宸插瓨鍦ㄦ鍦ㄥ鐞嗙殑杞处锛岃鍕块噸澶嶆搷浣�");
+                    case EnumWalletTransactionStatus.WaitPay:
+                    case EnumWalletTransactionStatus.Dealing:
+                        throw Oops.Oh(EnumErrorCodeType.s510, "杞处姝e湪杩涜涓紝璇峰嬁閲嶅鎿嶄綔");
+                    case EnumWalletTransactionStatus.Success:
+                        throw Oops.Oh(EnumErrorCodeType.s510, "宸茶浆璐︼紝璇峰嬁閲嶅鎿嶄綔");
+                    case EnumWalletTransactionStatus.Refund:
+                    case EnumWalletTransactionStatus.Fail:
+                        transaction.TransactionStatus = EnumWalletTransactionStatus.WaitSubmit;
+                        transaction.Amount = request.Amount;
+                        transaction.Balance = wallet.Balance;
+                        transaction.AfterBalance = wallet.Balance - transaction.Amount;
+                        transaction.OutOperatorId = request.OutOperatorId;
+                        transaction.OperatorTime = request.OperatorTime;
+                        transaction.PayerName = wallet.Name;
+                        transaction.PayerAccount = wallet.Identity;
+                        transaction.PayerBank = wallet.Bank;
+                        transaction.PayerBankBranch = wallet.BankBranch;
+                        transaction.OutReceiveId = request.OutReceiveId;
+                        transaction.ReceiveBank = request.ReceiveBank;
+                        transaction.ReceiveBankBranch = request.ReceiveBankBranch;
+                        transaction.ReceiveName = request.ReceiveName;
+                        transaction.ReceiveIdentity = request.ReceiveIdentity;
+                        transaction.ReceiveAccount = request.ReceiveAccount;
+                        transaction.Currency = request.Currency;
+                        transaction.Purpose = request.Purpose;
+                        transaction.Remark = request.Remark;
+                        await channelWalletTransactionRepository.UpdateNowAsync(transaction);
+                        break;
+                    default:
+                        break;
+                }
+            }
             await channelWalletService.Transfer(wallet, transaction);
             return new SubmitChannelWalletTransferCommandResult
             {
diff --git a/ApiTools.Application/ChannelWallets/Queries/ChannelWalletQueryHandler.cs b/ApiTools.Application/ChannelWallets/Queries/ChannelWalletQueryHandler.cs
index 59fa35e..81ad08b 100644
--- a/ApiTools.Application/ChannelWallets/Queries/ChannelWalletQueryHandler.cs
+++ b/ApiTools.Application/ChannelWallets/Queries/ChannelWalletQueryHandler.cs
@@ -18,7 +18,8 @@
             ChannelWalletTransactionRepository channelWalletTransactionRepository
         ) :
         IRequestHandler<GetChannelPingAnPayWalletQuery, GetChannelPingAnPayWalletQueryResult>,
-        IRequestHandler<GetChannelWalletTransactionQuery, GetChannelWalletTransactionQueryResult>
+        IRequestHandler<GetChannelWalletTransactionQuery, GetChannelWalletTransactionQueryResult>,
+        IRequestHandler<GetChannelWalletTransactionsQuery, GetChannelWalletTransactionsQueryResult>
     {
         private readonly ChannelWalletRepository channelWalletRepository = channelWalletRepository;
         private readonly ChannelWalletTransactionRepository channelWalletTransactionRepository = channelWalletTransactionRepository;
@@ -51,5 +52,28 @@
                 .FirstOrDefaultAsync();
         }
 
+        /// <summary>
+        /// 鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetChannelWalletTransactionsQueryResult> Handle(GetChannelWalletTransactionsQuery request, CancellationToken cancellationToken)
+        {
+            var list = new GetChannelWalletTransactionsQueryResult();
+            list.Items = await channelWalletTransactionRepository.GetQueryable()
+                .Where(it => request.OutCodes.Contains(it.OutCode))
+                .ProjectToType<GetChannelWalletTransactionsQueryResultItem>()
+                .ToListAsync();
+            foreach (var item in list.Items)
+            {
+                if (item.EreceiptStatus == EnumWalletTransactionEreceiptStatus.SUCCESS
+                    && item.EreceiptDownloadOssUrl.IsNotNull())
+                {
+                    item.EreceiptDownloadOssFullUrl = AliyunOSSUtils.GetUrl(item.EreceiptDownloadOssUrl);
+                }
+            }
+            return list;
+        }
     }
 }
diff --git a/ApiTools.Core/ApiTools.Core.xml b/ApiTools.Core/ApiTools.Core.xml
index 9e8d375..28fa741 100644
--- a/ApiTools.Core/ApiTools.Core.xml
+++ b/ApiTools.Core/ApiTools.Core.xml
@@ -2418,6 +2418,11 @@
             浣欓
             </summary>
         </member>
+        <member name="P:ApiTools.Core.GetChannelPingAnPayWalletQueryResult.SignStatus">
+            <summary>
+            绛剧害鐘舵��
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.GetChannelWalletTransactionQuery">
             <summary>
             鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
@@ -2598,6 +2603,201 @@
             鐘舵��
             </summary>
         </member>
+        <member name="T:ApiTools.Core.GetChannelWalletTransactionsQuery">
+            <summary>
+            鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQuery.OutCodes">
+            <summary>
+            澶栭儴璁㈠崟鍙�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetChannelWalletTransactionsQueryResult">
+            <summary>
+            鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResult.Items">
+            <summary>
+            椤�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem">
+            <summary>
+            鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Id">
+            <summary>
+            浜ゆ槗Id
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Type">
+            <summary>
+            绫诲瀷
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Code">
+            <summary>
+            璁㈠崟鍙�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.OutCode">
+            <summary>
+            澶栭儴璁㈠崟鍙�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ConcurrencyLock">
+            <summary>
+            骞跺彂閿�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Amount">
+            <summary>
+            閲戦
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Balance">
+            <summary>
+            浣欓
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.AfterBalance">
+            <summary>
+            鏀舵敮鍚庝綑棰�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.OutOperatorId">
+            <summary>
+            澶栭儴鎿嶄綔浜篒d
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.OperatorTime">
+            <summary>
+            鎿嶄綔鏃堕棿
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.PayerAccount">
+            <summary>
+            浠樻浜鸿处鎴�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.PayerName">
+            <summary>
+            浠樻浜哄悕绉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.PayerBank">
+            <summary>
+            浠樻浜哄紑鎴疯
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.PayerBankBranch">
+            <summary>
+            浠樻浜烘敮琛�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.OutReceiveId">
+            <summary>
+            澶栭儴鏀舵浜篒d
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ReceiveName">
+            <summary>
+            鏀舵浜哄鍚�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ReceiveIdentity">
+            <summary>
+            鏀舵浜鸿韩浠借瘉鍙�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ReceiveAccount">
+            <summary>
+            鏀舵璐︽埛
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ReceiveBank">
+            <summary>
+            鏀舵浜哄紑鎴疯
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ReceiveBankBranch">
+            <summary>
+            鏀舵浜烘敮琛�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Currency">
+            <summary>
+            甯佺
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Purpose">
+            <summary>
+            鐢ㄩ��
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.Remark">
+            <summary>
+            澶囨敞
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.ErrorCode">
+            <summary>
+            鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥為敊璇唬鐮�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.FailReason">
+            <summary>
+            鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥炲叿浣撶殑鍘熷洜銆�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.TransDate">
+            <summary>
+            璁㈠崟鏀粯鏃堕棿
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.OrderFee">
+            <summary>
+            棰勮鏀惰垂閲戦锛堝厓锛夛紝杞处鍒伴摱琛屽崱涓撶敤
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptFileId">
+            <summary>
+            鐢靛瓙鏀舵嵁Id
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptDownloadUrl">
+            <summary>
+            鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptDownloadOssUrl">
+            <summary>
+            鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptDownloadOssFullUrl">
+            <summary>
+            鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptStatus">
+            <summary>
+            鐢靛瓙鏀舵嵁鐘舵��
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.EreceiptErrorMessage">
+            <summary>
+            鐢靛瓙鏀舵嵁閿欒淇℃伅
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetChannelWalletTransactionsQueryResultItem.TransactionStatus">
+            <summary>
+            鐘舵��
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.CheckHealthQuery">
             <summary>
             鍋ュ悍鏍¢獙
diff --git a/ApiTools.Core/Jobs/RefreshChannelWalletTransactionStatusJob.cs b/ApiTools.Core/Jobs/RefreshChannelWalletTransactionStatusJob.cs
index c92df86..c0f092b 100644
--- a/ApiTools.Core/Jobs/RefreshChannelWalletTransactionStatusJob.cs
+++ b/ApiTools.Core/Jobs/RefreshChannelWalletTransactionStatusJob.cs
@@ -29,15 +29,15 @@
 
         public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
         {
-            var env = App.GetConfig<string>("Environment");
-            if (env != "Local")
-            {
+            //var env = App.GetConfig<string>("Environment");
+            //if (env != "Local")
+            //{
                 var transactions = await channelWalletTransactionRepository.GetQueryable(false)
                 .Where(it =>
                     it.TransactionStatus == EnumWalletTransactionStatus.WaitPay
                     || it.TransactionStatus == EnumWalletTransactionStatus.Dealing)
                 .ToListAsync();
-                var walletIds = transactions.DistinctSelect(it => it.WalletId);
+                var walletIds = transactions.Select(it => it.WalletId).Distinct().ToList();
                 var wallets = await channelWalletRepository.GetQueryable(false)
                     .Where(it => walletIds.Contains(it.Id))
                     .ToListAsync();
@@ -52,7 +52,7 @@
                         await channelWalletService.DownloadEreceiptUrl(wallet, transaction);
                     }
                 }
-            }
+            //}
         }
     }
 }
diff --git a/ApiTools.Core/Models/ChannelWallets/Queries/GetChannelWalletTransactionsQuery.cs b/ApiTools.Core/Models/ChannelWallets/Queries/GetChannelWalletTransactionsQuery.cs
new file mode 100644
index 0000000..d89ba72
--- /dev/null
+++ b/ApiTools.Core/Models/ChannelWallets/Queries/GetChannelWalletTransactionsQuery.cs
@@ -0,0 +1,208 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+    /// <summary>
+    /// 鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+    /// </summary>
+    [Resource([EnumResourceController.UserServerChannelWallet], Method = EnumResourceMethod.Post)]
+    public class GetChannelWalletTransactionsQuery : IRequest<GetChannelWalletTransactionsQueryResult>
+    {
+        /// <summary>
+        /// 澶栭儴璁㈠崟鍙�
+        /// </summary>
+        public List<string> OutCodes { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+    /// </summary>
+    public class GetChannelWalletTransactionsQueryResult
+    {
+        /// <summary>
+        /// 椤�
+        /// </summary>
+        public List<GetChannelWalletTransactionsQueryResultItem> Items { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 鏌ヨ娓犻亾閽卞寘浜ゆ槗璇︽儏
+    /// </summary>
+    public class GetChannelWalletTransactionsQueryResultItem
+    {
+        /// <summary>
+        /// 浜ゆ槗Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 绫诲瀷
+        /// </summary>
+        public EnumWalletTransactionType Type { get; set; }
+
+        /// <summary>
+        /// 璁㈠崟鍙�
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 澶栭儴璁㈠崟鍙�
+        /// </summary>
+        public string OutCode { get; set; }
+
+        /// <summary>
+        /// 骞跺彂閿�
+        /// </summary>
+        public string ConcurrencyLock { get; set; }
+
+        /// <summary>
+        /// 閲戦
+        /// </summary>
+        public decimal Amount { get; set; }
+
+        /// <summary>
+        /// 浣欓
+        /// </summary>
+        public decimal Balance { get; set; }
+
+        /// <summary>
+        /// 鏀舵敮鍚庝綑棰�
+        /// </summary>
+        public decimal AfterBalance { get; set; }
+
+        /// <summary>
+        /// 澶栭儴鎿嶄綔浜篒d
+        /// </summary>
+        public string OutOperatorId { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔鏃堕棿
+        /// </summary>
+        public DateTime? OperatorTime { get; set; }
+
+        /// <summary>
+        /// 浠樻浜鸿处鎴�
+        /// </summary>
+        public string PayerAccount { get; set; }
+
+        /// <summary>
+        /// 浠樻浜哄悕绉�
+        /// </summary>
+        public string PayerName { get; set; }
+
+        /// <summary>
+        /// 浠樻浜哄紑鎴疯
+        /// </summary>
+        public string PayerBank { get; set; }
+
+        /// <summary>
+        /// 浠樻浜烘敮琛�
+        /// </summary>
+        public string PayerBankBranch { get; set; }
+
+        /// <summary>
+        /// 澶栭儴鏀舵浜篒d
+        /// </summary>
+        public string OutReceiveId { get; set; }
+
+        /// <summary>
+        /// 鏀舵浜哄鍚�
+        /// </summary>
+        public string ReceiveName { get; set; }
+
+        /// <summary>
+        /// 鏀舵浜鸿韩浠借瘉鍙�
+        /// </summary>
+        public string ReceiveIdentity { get; set; }
+
+        /// <summary>
+        /// 鏀舵璐︽埛
+        /// </summary>
+        public string ReceiveAccount { get; set; }
+
+        /// <summary>
+        /// 鏀舵浜哄紑鎴疯
+        /// </summary>
+        public string ReceiveBank { get; set; }
+
+        /// <summary>
+        /// 鏀舵浜烘敮琛�
+        /// </summary>
+        public string ReceiveBankBranch { get; set; }
+
+        /// <summary>
+        /// 甯佺
+        /// </summary>
+        public string Currency { get; set; }
+
+        /// <summary>
+        /// 鐢ㄩ��
+        /// </summary>
+        public string Purpose { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥為敊璇唬鐮�
+        /// </summary>
+        public string ErrorCode { get; set; }
+
+        /// <summary>
+        /// 鏌ヨ鍒扮殑璁㈠崟鐘舵�佷负FAIL澶辫触鎴朢EFUND閫�绁ㄦ椂锛岃繑鍥炲叿浣撶殑鍘熷洜銆�
+        /// </summary>
+        public string FailReason { get; set; }
+
+        /// <summary>
+        /// 璁㈠崟鏀粯鏃堕棿
+        /// </summary>
+        public DateTime? TransDate { get; set; }
+
+        /// <summary>
+        /// 棰勮鏀惰垂閲戦锛堝厓锛夛紝杞处鍒伴摱琛屽崱涓撶敤
+        /// </summary>
+        public decimal? OrderFee { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁Id
+        /// </summary>
+        public string EreceiptFileId { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+        /// </summary>
+        public string EreceiptDownloadUrl { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+        /// </summary>
+        public string EreceiptDownloadOssUrl { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁涓嬭浇閾炬帴
+        /// </summary>
+        public string EreceiptDownloadOssFullUrl { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁鐘舵��
+        /// </summary>
+        public EnumWalletTransactionEreceiptStatus? EreceiptStatus { get; set; }
+
+        /// <summary>
+        /// 鐢靛瓙鏀舵嵁閿欒淇℃伅
+        /// </summary>
+        public string EreceiptErrorMessage { get; set; }
+
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public EnumWalletTransactionStatus TransactionStatus { get; set; }
+    }
+}

--
Gitblit v1.9.1