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.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs |  117 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 81 insertions(+), 36 deletions(-)

diff --git a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
index 3feb977..50032f2 100644
--- a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
+++ b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
@@ -29,6 +29,12 @@
         private readonly ChannelWalletTransactionRepository channelWalletTransactionRepository = channelWalletTransactionRepository;
         private readonly ChannelWalletService channelWalletService = channelWalletService;
 
+        /// <summary>
+        /// 淇濆瓨娓犻亾骞冲畨閾惰閽卞寘
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
         public async Task<SaveChannelPingAnPayWalletCommandResult> Handle(SaveChannelPingAnPayWalletCommand request, CancellationToken cancellationToken)
         {
             var logier = JwtUtils.GetCurrentLogier();
@@ -40,23 +46,23 @@
                 wallet = new ChannelWallet();
                 wallet.ChannelId = logier.ChannelId;
                 wallet.Access = EnumWalletAccess.PingAnPay;
-                wallet.SignStatus = EnumWalletSignStatus.Normal;
+                wallet.Bank = "骞冲畨閾惰";
+                wallet.SignStatus = EnumWalletSignStatus.Apply;
                 request.Adapt(wallet);
                 await channelWalletRepository.SetCode(wallet);
                 await channelWalletRepository.InsertNowAsync(wallet);
             }
             else
             {
+                wallet.SignStatus = EnumWalletSignStatus.Apply;
                 request.Adapt(wallet);
                 await channelWalletRepository.UpdateNowAsync(wallet);
             }
             await channelWalletService.GetEnterpriseWalletBalance(wallet);
             return new SaveChannelPingAnPayWalletCommandResult
             {
-                WalletId = wallet.Id,
+                Id = wallet.Id,
                 Balance = wallet.Balance,
-                ErrorCode = wallet.ErrorCode,
-                FailReason = wallet.FailReason
             };
         }
 
@@ -80,41 +86,80 @@
                 .FirstOrDefaultAsync();
 
             if (wallet == null) throw Oops.Oh(EnumErrorCodeType.s404, "鏈紑閫氶挶鍖�");
-
+            if (wallet.SignStatus != EnumWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s404, "閽卞寘鏈绾�");
             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