From e2d2994059dc80b71f0a216c5a959032ea73a439 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 04 九月 2025 13:13:35 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 150 insertions(+), 20 deletions(-) diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs index e34811a..93fe50d 100644 --- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs @@ -19,12 +19,14 @@ /// </summary> public class EnterpriseWalletCommandHandler( IRepository<EnterpriseWallet> rep, + IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction, IRepository<Enterprise> repEnterprise, AlipayUtils alipayUtils ) : IRequestHandler<OpenEnterpriseWalletCommand, OpenEnterpriseWalletCommandResult>, IRequestHandler<CloseEnterpriseWalletCommand, Guid>, - IRequestHandler<AlipayTransferCommand, Guid> + IRequestHandler<RechargeEnterpriseWalletCommand, RechargeEnterpriseWalletCommandResult>, + IRequestHandler<TransferEnterpriseWalletCommand, Guid> { private readonly IRepository<EnterpriseWallet> rep = rep; private readonly IRepository<Enterprise> repEnterprise = repEnterprise; @@ -109,41 +111,169 @@ return entity.Id; } - public async Task<Guid> Handle(AlipayTransferCommand request, CancellationToken cancellationToken) + /// <summary> + /// 浼佷笟閽卞寘鍏呭�� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + /// <exception cref="NotImplementedException"></exception> + [UnitOfWork(false)] + public async Task<RechargeEnterpriseWalletCommandResult> Handle(RechargeEnterpriseWalletCommand request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var entity = await rep.AsQueryable() + .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); + if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈绾�"); + if (entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑閫氳璐︽湰"); + await GetBalance(entity); + var order = new EnterpriseWalletTransaction(); + order.Type = EnumEnterpriseWalletTransactionType.Recharge; + order.WalletId = entity.Id; + order.Amount = request.Amount; + order.Remark = request.Remark ?? "鍏呭��"; + order.ProductCode = "FUND_ACCOUNT_BOOK"; + order.BizScene = "SATF_DEPOSIT"; + order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit; + order.Balance = entity.Balance; + await SetCode(order); + await repEnterpriseWalletTransaction.InsertAsync(order); + + var response = alipayUtils.FundTransPagePay(new AlipayFundTransPagePayModel + { + OutBizNo = order.Code, + TransAmount = order.Amount.ToString(), + ProductCode = order.ProductCode, + BizScene = order.BizScene, + Remark = order.Remark, + OrderTitle = order.Remark, + TimeExpire = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd HH:mm"), + PayeeInfo = new Participant + { + IdentityType = "ACCOUNT_BOOK_ID", + Identity = entity.AccountBookId, + ExtInfo = new + { + agreement_no = entity.AgreementNo, + }.ToJson(), + }, + }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify"); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitPay; + await repEnterpriseWalletTransaction.UpdateAsync(order); + return new RechargeEnterpriseWalletCommandResult + { + PayUrl = response.Body + }; + } + + /// <summary> + /// 浼佷笟閽卞寘杞处 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + [UnitOfWork(false)] + public async Task<Guid> Handle(TransferEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entity = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == EnumEnterpriseWalletAccess.Alipay) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); + if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈绾�"); + if (entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑閫氳璐︽湰"); + await GetBalance(entity); + + var order = new EnterpriseWalletTransaction(); + order.Type = EnumEnterpriseWalletTransactionType.Recharge; + order.WalletId = entity.Id; + order.Amount = request.Amount; + order.Remark = request.Remark; + order.ProductCode = "SINGLE_TRANSFER_NO_PWD"; + order.BizScene = "ENTRUST_TRANSFER"; + order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit; + order.Balance = entity.Balance; + await SetCode(order); + await repEnterpriseWalletTransaction.InsertAsync(order); + var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel { - OutBizNo = $"Test{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}", - TransAmount = "0.01", - ProductCode = "TRANS_ACCOUNT_NO_PWD", + OutBizNo = order.Code, + TransAmount = order.Amount.ToString(), + ProductCode = order.ProductCode, + BizScene = order.BizScene, PayeeInfo = new Participant { - IdentityType = "BANKCARD_ACCOUNT", - Identity = "6214180000016351382", - Name = "瀛欓箯椋�", - BankcardExtInfo = new BankcardExtInfo - { - AccountType = "2", - InstName = "瀹佹尝閾惰" - } + IdentityType = "ALIPAY_LOGON_ID", + Identity = "13616515310", + Name = "鏉ㄦ尟瀹�", }, PayerInfo = new Participant { - IdentityType = "ALIPAY_OPEN_ID", - Identity = entity.PrincipalOpenId, - Name = "瀛欓箯椋�" + IdentityType = "ACCOUNT_BOOK_ID", + Identity = entity.AccountBookId, + ExtInfo = new + { + agreement_no = entity.AgreementNo, + }.ToJson(), }, - BizScene = "CAE_TRANSFER", - OrderTitle = "娴嬭瘯浠f墸", - Remark = "娴嬭瘯浠f墸澶囨敞" + OrderTitle = order.Remark, + Remark = order.Remark, + BusinessParams = new + { + withdraw_timeliness = "T0" + }.ToJson() + }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify"); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + order.OrderId = response.OrderId; + order.PayFundOrderId = response.PayFundOrderId; + order.SettleSerialNo = response.SettleSerialNo; + order.TransDate = response.TransDate.ToDateTime(); + order.Link = response.Link; + order.Status = response.Status; + order.SubStatus = response.SubStatus; + order.TransactionStatus = response.Status == "SUCCESS" + ? EnumEnterpriseWalletTransactionStatus.Success + : response.Status == "DEALING" + ? EnumEnterpriseWalletTransactionStatus.Dealing + : response.Status == "REFUND" + ? EnumEnterpriseWalletTransactionStatus.Refund + : response.Status == "FAIL" + ? EnumEnterpriseWalletTransactionStatus.Fail + : throw Oops.Oh(EnumErrorCodeType.s510, $"鏈瘑鍒殑鐘舵�侊細{response.Status}"); + await repEnterpriseWalletTransaction.UpdateAsync(order); + if (order.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Success) + { + await GetBalance(entity); + } + return entity.Id; + } + + private async Task GetBalance(EnterpriseWallet entity) + { + var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel + { + AccountBookId = entity.AccountBookId, + SceneCode = "SATF_FUND_BOOK", + MerchantUserId = entity.Code, }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); - return entity.Id; + entity.Balance = response.AvailableAmount.ToDecimal() ?? 0; + await rep.UpdateNowAsync(entity); + } + + private async Task SetCode(EnterpriseWalletTransaction entity) + { + entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; + var exist = await repEnterpriseWalletTransaction.AsQueryable().AsNoTracking() + .AnyAsync(it => it.Code == entity.Code); + if (exist) + { + await SetCode(entity); + } } private async Task SetCode(EnterpriseWallet entity) -- Gitblit v1.9.1