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 Microsoft.EntityFrameworkCore; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Runtime.InteropServices.JavaScript.JSType; namespace ApiTools.Application { public class ChannelWalletCommandHandler( IDistributedLockProvider distributedLockProvider, ChannelWalletRepository channelWalletRepository, ChannelWalletTransactionRepository channelWalletTransactionRepository, ChannelWalletService channelWalletService, NongYePayUtils nongYePayUtils ) : IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler { 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; /// /// 保存渠道平安银行钱包 /// /// /// /// public async Task Handle(SaveChannelPingAnPayWalletCommand 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.PingAnPay; 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 { Id = wallet.Id, Balance = wallet.Balance, }; } /// /// 保存渠道农业银行钱包 /// /// /// /// public async Task 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, }; } /// /// 提交渠道钱包转账 /// /// /// /// public async Task Handle(SubmitChannelWalletTransferCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); await using var handle = await distributedLockProvider.TryAcquireAsync( channelWalletService.GetLockKey(logier.ChannelId.Value, request.OutWalletId), TimeSpan.FromMinutes(30)); if (handle == null) throw Oops.Oh(EnumErrorCodeType.s429); var wallet = await channelWalletRepository.GetQueryable(false) .Where(it => it.ChannelId == logier.ChannelId && it.OutWalletId == request.OutWalletId) .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) { UnifyContext.Fill(new { request.Amount, wallet.Balance, wallet.Id }); throw Oops.Oh(EnumErrorCodeType.s510, "余额不足"); } if (wallet.Access == EnumWalletAccess.NongYePay && request.Currency.IsNull()) { request.Currency = "01"; } 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 { Id = transaction.Id, Code = transaction.Code, TransactionStatus = transaction.TransactionStatus, ErrorCode = transaction.ErrorCode, FailReason = transaction.FailReason, }; } /// /// 测试农业银行接口 /// /// /// /// public async Task 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; } } }