| | |
| | | using Aop.Api.Domain; |
| | | using ApiTools.Core; |
| | | using Baidu.Aip; |
| | | using Consul; |
| | | using Furion.DistributedIDGenerator; |
| | | using Furion.FriendlyException; |
| | | using Furion.UnifyResult; |
| | | using Mapster; |
| | | using Medallion.Threading; |
| | | using MediatR; |
| | |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using static System.Runtime.InteropServices.JavaScript.JSType; |
| | | |
| | | namespace ApiTools.Application |
| | | { |
| | |
| | | IDistributedLockProvider distributedLockProvider, |
| | | ChannelWalletRepository channelWalletRepository, |
| | | ChannelWalletTransactionRepository channelWalletTransactionRepository, |
| | | ChannelWalletService channelWalletService |
| | | ChannelWalletService channelWalletService, |
| | | NongYePayUtils nongYePayUtils |
| | | ) : |
| | | IRequestHandler<SaveChannelPingAnPayWalletCommand, SaveChannelPingAnPayWalletCommandResult>, |
| | | IRequestHandler<SubmitChannelWalletTransferCommand, SubmitChannelWalletTransferCommandResult> |
| | | IRequestHandler<SaveChannelNongYePayWalletCommand, SaveChannelNongYePayWalletCommandResult>, |
| | | IRequestHandler<SubmitChannelWalletTransferCommand, SubmitChannelWalletTransferCommandResult>, |
| | | IRequestHandler<TestNongYePayCommand, bool> |
| | | { |
| | | private readonly IDistributedLockProvider distributedLockProvider = distributedLockProvider; |
| | | private readonly ChannelWalletRepository channelWalletRepository = channelWalletRepository; |
| | | private readonly ChannelWalletTransactionRepository channelWalletTransactionRepository = channelWalletTransactionRepository; |
| | | private readonly ChannelWalletService channelWalletService = channelWalletService; |
| | | private readonly NongYePayUtils nongYePayUtils = nongYePayUtils; |
| | | |
| | | /// <summary> |
| | | /// 保存渠道平安银行钱包 |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 保存渠道农业银行钱包 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<SaveChannelNongYePayWalletCommandResult> Handle(SaveChannelNongYePayWalletCommand request, CancellationToken cancellationToken) |
| | | { |
| | | var logier = JwtUtils.GetCurrentLogier(); |
| | | var wallet = await channelWalletRepository.GetQueryable(false) |
| | | .Where(it => it.ChannelId == logier.ChannelId && it.OutWalletId == request.OutWalletId) |
| | | .FirstOrDefaultAsync(); |
| | | if (wallet == null) |
| | | { |
| | | wallet = new ChannelWallet(); |
| | | wallet.ChannelId = logier.ChannelId; |
| | | wallet.Access = EnumWalletAccess.NongYePay; |
| | | wallet.Bank = "农业银行"; |
| | | wallet.Currency = "01"; |
| | | wallet.CurrencyName = "人民币"; |
| | | 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 SaveChannelNongYePayWalletCommandResult |
| | | { |
| | | Id = wallet.Id, |
| | | Balance = wallet.Balance, |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 提交渠道钱包转账 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | |
| | | 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, "余额不足"); |
| | | if (request.Amount > wallet.Balance) |
| | | { |
| | | UnifyContext.Fill(new |
| | | { |
| | | request.Amount, |
| | | wallet.Balance, |
| | | wallet.Id |
| | | }); |
| | | throw Oops.Oh(EnumErrorCodeType.s510, "余额不足"); |
| | | } |
| | | |
| | | var checkExist = await channelWalletTransactionRepository.GetQueryable() |
| | | .AnyAsync(it => it.WalletId == wallet.Id && it.OutCode == request.OutCode); |
| | | if (checkExist) throw Oops.Oh(EnumErrorCodeType.s405, "交易单号"); |
| | | if (wallet.Access == EnumWalletAccess.NongYePay |
| | | && request.Currency.IsNull()) |
| | | { |
| | | request.Currency = "01"; |
| | | } |
| | | |
| | | 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 |
| | | { |
| | |
| | | FailReason = transaction.FailReason, |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 测试农业银行接口 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<bool> Handle(TestNongYePayCommand request, CancellationToken cancellationToken) |
| | | { |
| | | //var res = await nongYePayUtils.GetBalance(new Core.Utils.NongYePayUtils.Models.NongYePayGetBalanceRequest |
| | | //{ |
| | | // Cmp = new Core.Utils.NongYePayUtils.Models.NongYePayGetBalanceRequestCmp |
| | | // { |
| | | // DbAccNo = "314101046433493", |
| | | // DbCur = "01", |
| | | // DbProv = "14" |
| | | // } |
| | | //}); |
| | | |
| | | //var seqNo = nongYePayUtils.GetSeqNo(); |
| | | //var res2 = await nongYePayUtils.SingleCorporateTransfer(new Core.Utils.NongYePayUtils.Models.NongYePaySingleCorporateTransferRequest |
| | | //{ |
| | | // ReqSeqNo = seqNo, |
| | | // Amt = 3, |
| | | // Corp = new Core.Utils.NongYePayUtils.Models.NongYePaySingleCorporateTransferRequestCorp |
| | | // { |
| | | // BookingFlag = "0", |
| | | // Postscript = "出账", |
| | | // OthBankFlag = "1", |
| | | // CrAccName = "兰兴托仪蹬笔予慊观速", |
| | | // CrBankNo = "105", |
| | | // DbAccName = "孔小土伊箭旺策夕余慊冠宋", |
| | | // }, |
| | | // Cmp = new Core.Utils.NongYePayUtils.Models.NongYePaySingleCorporateTransferRequestCmp |
| | | // { |
| | | // DbAccNo = "314101046433493", |
| | | // DbProv = "14", |
| | | // DbCur = "01", |
| | | // CrAccNo = "3141010464105171", |
| | | // CrCur = "01", |
| | | // ConFlag = "1" |
| | | // } |
| | | //}); |
| | | |
| | | //var res3 = await nongYePayUtils.GetTransferStatus(new Core.Utils.NongYePayUtils.Models.NongYePayGetTransferStatusRequest |
| | | //{ |
| | | // Cme = new Core.Utils.NongYePayUtils.Models.NongYePayGetTransferStatusRequestCme |
| | | // { |
| | | // SerialNo = seqNo |
| | | // } |
| | | //}); |
| | | |
| | | //Console.WriteLine(); |
| | | |
| | | //var res4 = await nongYePayUtils.GetEreceipts(new Core.Utils.NongYePayUtils.Models.NongYePayGetEreceiptsRequest |
| | | //{ |
| | | // Cmp = new Core.Utils.NongYePayUtils.Models.NongYePayGetEreceiptsRequestCmp |
| | | // { |
| | | // DbProv = "14", |
| | | // DbAccNo = "314101046433493", |
| | | // DbCur = "01" |
| | | // }, |
| | | // Corp = new Core.Utils.NongYePayUtils.Models.NongYePayGetEreceiptsRequestCorp |
| | | // { |
| | | // StartDate = "20251217", |
| | | // EndDate = "20251217", |
| | | // IntAmt = 1, |
| | | // PrtAmt = 3 |
| | | // } |
| | | //}); |
| | | |
| | | var res6 = await nongYePayUtils.GetTransferDetails(new Core.Utils.NongYePayUtils.Models.NongYePayGetTransferDetailsRequest |
| | | { |
| | | Corp = new Core.Utils.NongYePayUtils.Models.NongYePayGetTransferDetailsRequestCorp |
| | | { |
| | | StartDate = "20251217", |
| | | EndDate = "20251217", |
| | | |
| | | }, |
| | | Cmp = new Core.Utils.NongYePayUtils.Models.NongYePayGetTransferDetailsRequestCmp |
| | | { |
| | | DbProv = "14", |
| | | DbAccNo = "314101046433493", |
| | | DbCur = "01", |
| | | } |
| | | }); |
| | | |
| | | //var res9 = await nongYePayUtils.DownloadEreceipt(new Core.Utils.NongYePayUtils.Models.NongYePayDownloadEreceiptRequest |
| | | //{ |
| | | // Corp = new Core.Utils.NongYePayUtils.Models.NongYePayDownloadEreceiptRequestCorp |
| | | // { |
| | | // StartDate = "20251218", |
| | | // AlterFlag = "1" |
| | | // } |
| | | //}); |
| | | //foreach (var item in res9.Items) |
| | | //{ |
| | | // var url = AliyunOSSUtils.Upload( |
| | | // "NongYePay", |
| | | // item.Stream, |
| | | // $"电子回单-{IDGen.NextID()}.pdf") |
| | | // .Url; |
| | | // url = AliyunOSSUtils.GetUrl(url); |
| | | // Console.WriteLine(); |
| | | //} |
| | | Console.WriteLine(); |
| | | |
| | | //var a = res6.Items.FirstOrDefault().TrJrn; |
| | | |
| | | //var res8 = await nongYePayUtils.RealTimeDownloadEreceipt(new Core.Utils.NongYePayUtils.Models.NongYePayRealTimeDownloadEreceiptRequest |
| | | //{ |
| | | // Amt = "3", |
| | | // Cmp = new Core.Utils.NongYePayUtils.Models.NongYePayRealTimeDownloadEreceiptRequestCmp |
| | | // { |
| | | // DbAccNo = res6.Items[0].AccNo, |
| | | // DbProv = res6.Items[0].ProCode, |
| | | // DbCur = res6.Items[0].Cur, |
| | | // CrAccNo = res6.Items[0].OppAccNo, |
| | | // CrProv = res6.Items[0].OppProCode, |
| | | // CrCur = res6.Items[0].OppCur, |
| | | // TrDate = res6.Items[0].TrDate, |
| | | // JrnNo = res6.Items[0].TrJrn |
| | | // } |
| | | //}); |
| | | |
| | | //Console.WriteLine(); |
| | | |
| | | //var res5 = await nongYePayUtils.DownloadEreceipt(new Core.Utils.NongYePayUtils.Models.NongYePayDownloadEreceiptRequest |
| | | //{ |
| | | // Corp = new Core.Utils.NongYePayUtils.Models.NongYePayDownloadEreceiptRequestCorp |
| | | // { |
| | | // StartDate = "20251215", |
| | | // AlterFlag = "1" |
| | | // } |
| | | //}); |
| | | |
| | | var res7 = await nongYePayUtils.GetBanks(new Core.Utils.NongYePayUtils.Models.NongYePayGetBanksRequest |
| | | { |
| | | Corp = new Core.Utils.NongYePayUtils.Models.NongYePayGetBanksRequestCorp |
| | | { |
| | | CrBankName = "建设银行宁波鄞州支行", |
| | | } |
| | | }); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | } |
| | | } |