| | |
| | | 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(); |
| | |
| | | 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 |
| | | }; |
| | | } |
| | | |
| | |
| | | .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() |
| | | .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, "转账正在进行中,请勿重复操作"); |
| | | 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 |
| | | { |