lijin
2025-11-20 ee552e8f4dd8a2d7bd59f7bd87845de0188d7a36
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, "转账正在进行中,请勿重复操作");
                    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
            {