From 1deb3d68f4caf2f54107e67c991ec9e50b360fa0 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 20 十一月 2025 09:26:19 +0800
Subject: [PATCH] Merge branch 'dev-818-3.4.2.12' of http://120.26.58.240:8888/r/ApiTools into dev-818-3.4.2.12

---
 ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs |  101 +++++++++++++++++++++++++++++++++++---------------
 1 files changed, 70 insertions(+), 31 deletions(-)

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
             {

--
Gitblit v1.9.1