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