From ab9b84ee42c872cd2277d2e3a863718355bcc6aa Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 15 十二月 2025 16:20:27 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs |  129 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 96 insertions(+), 33 deletions(-)

diff --git a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
index 0fd2503..51d567d 100644
--- a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
+++ b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
@@ -19,15 +19,18 @@
             IDistributedLockProvider distributedLockProvider,
             ChannelWalletRepository channelWalletRepository,
             ChannelWalletTransactionRepository channelWalletTransactionRepository,
-            ChannelWalletService channelWalletService
+            ChannelWalletService channelWalletService,
+            NongYePayUtils nongYePayUtils
         ) :
         IRequestHandler<SaveChannelPingAnPayWalletCommand, SaveChannelPingAnPayWalletCommandResult>,
-        IRequestHandler<SubmitChannelWalletTransferCommand, SubmitChannelWalletTransferCommandResult>
+        IRequestHandler<SubmitChannelWalletTransferCommand, SubmitChannelWalletTransferCommandResult>,
+        IRequestHandler<TestNongYePayCommand, bool>
     {
         private readonly IDistributedLockProvider distributedLockProvider = distributedLockProvider;
         private readonly ChannelWalletRepository channelWalletRepository = channelWalletRepository;
         private readonly ChannelWalletTransactionRepository channelWalletTransactionRepository = channelWalletTransactionRepository;
         private readonly ChannelWalletService channelWalletService = channelWalletService;
+        private readonly NongYePayUtils nongYePayUtils = nongYePayUtils;
 
         /// <summary>
         /// 淇濆瓨娓犻亾骞冲畨閾惰閽卞寘
@@ -90,37 +93,77 @@
             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()
+                .Include(it => it.PingAnPay)
+                .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
             {
@@ -131,5 +174,25 @@
                 FailReason = transaction.FailReason,
             };
         }
+
+        /// <summary>
+        /// 娴嬭瘯鍐滀笟閾惰鎺ュ彛
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<bool> Handle(TestNongYePayCommand request, CancellationToken cancellationToken)
+        {
+            var res = await nongYePayUtils.GetBalance(new Core.Utils.NongYePayUtils.Models.NongYePayGetBalanceRequest
+            {
+                Cmp = new Core.Utils.NongYePayUtils.Models.NongYePayGetBalanceRequestCmp
+                {
+                    AccountNo = "314101046433493",
+                    CurrencyCode = "01",
+                    ProvinceCode = "14"
+                }
+            });
+            return true;
+        }
     }
 }

--
Gitblit v1.9.1