From 67d5dbb966df4af4304b4168378c68ce83ad01b1 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期三, 10 九月 2025 13:05:50 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs | 118 +++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 70 insertions(+), 48 deletions(-) diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs index 8901516..8a33475 100644 --- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs @@ -19,13 +19,13 @@ /// </summary> public class EnterpriseWalletCommandHandler( IRepository<EnterpriseWallet> rep, + IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction, IRepository<Enterprise> repEnterprise, AlipayUtils alipayUtils ) : IRequestHandler<OpenEnterpriseWalletCommand, OpenEnterpriseWalletCommandResult>, IRequestHandler<CloseEnterpriseWalletCommand, Guid>, - IRequestHandler<RechargeEnterpriseWalletCommand, Guid>, - IRequestHandler<AlipayTransferCommand, Guid> + IRequestHandler<RechargeEnterpriseWalletCommand, RechargeEnterpriseWalletCommandResult> { private readonly IRepository<EnterpriseWallet> rep = rep; private readonly IRepository<Enterprise> repEnterprise = repEnterprise; @@ -40,19 +40,26 @@ public async Task<OpenEnterpriseWalletCommandResult> Handle(OpenEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var enterprise = await repEnterprise.AsQueryable().AsNoTracking() - .Where(it => it.Id == logier.EnterpriseId) + .Where(it => it.Id == request.EnterpriseId) .FirstOrDefaultAsync(); if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟"); if (!enterprise.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛瀹炲悕"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) { entity = new EnterpriseWallet(); - entity.EnterpriseId = logier.EnterpriseId!.Value; + entity.EnterpriseId = request.EnterpriseId!.Value; entity.Access = EnumEnterpriseWalletAccess.Alipay; + entity.Account = request.Account; + entity.MerchantId = request.MerchantId; entity.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; entity.SignScene = "INDUSTRY|SATF_ACC"; entity.ThirdPartyType = "PARTNER"; @@ -64,6 +71,8 @@ else { if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬绾�"); + entity.Account = request.Account; + entity.MerchantId = request.MerchantId; entity.SignStatus = EnumEnterpriseWalletSignStatus.Apply; await rep.UpdateAsync(entity); } @@ -94,8 +103,13 @@ public async Task<Guid> Handle(CloseEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈绾�"); @@ -117,28 +131,45 @@ /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> - public async Task<Guid> Handle(RechargeEnterpriseWalletCommand request, CancellationToken cancellationToken) + [UnitOfWork(false)] + public async Task<RechargeEnterpriseWalletCommandResult> Handle(RechargeEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.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.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; + 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 = EnumWalletTransactionStatus.WaitSubmit; + order.Balance = entity.Balance; + order.OperatorUserId = logier.Id; + order.OperatorTime = DateTime.Now; + await SetCode(order); + await repEnterpriseWalletTransaction.InsertAsync(order); + var response = alipayUtils.FundTransPagePay(new AlipayFundTransPagePayModel { OutBizNo = order.Code, TransAmount = order.Amount.ToString(), - ProductCode = "FUND_ACCOUNT_BOOK", - BizScene = "SATF_DEPOSIT", - Remark = "璁拌处鏈厖鍊�", - OrderTitle = "璁拌处鏈厖鍊�", - TimeExpire = DateTime.Now.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss"), + 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", @@ -148,47 +179,38 @@ agreement_no = entity.AgreementNo, }.ToJson(), }, - }); + }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify"); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); - order.OrderId = response.OrderId; - return order.Id; + order.TransactionStatus = EnumWalletTransactionStatus.WaitPay; + await repEnterpriseWalletTransaction.UpdateAsync(order); + return new RechargeEnterpriseWalletCommandResult + { + PayUrl = response.Body + }; } - public async Task<Guid> Handle(AlipayTransferCommand request, CancellationToken cancellationToken) + private async Task GetBalance(EnterpriseWallet entity) { - 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, "浼佷笟閽卞寘"); - var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel + var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel { - OutBizNo = $"Test{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}", - TransAmount = "0.01", - ProductCode = "TRANS_ACCOUNT_NO_PWD", - PayeeInfo = new Participant - { - IdentityType = "BANKCARD_ACCOUNT", - Identity = "6214180000016351382", - Name = "瀛欓箯椋�", - BankcardExtInfo = new BankcardExtInfo - { - AccountType = "2", - InstName = "瀹佹尝閾惰" - } - }, - PayerInfo = new Participant - { - IdentityType = "ALIPAY_OPEN_ID", - Identity = entity.PrincipalOpenId, - Name = "瀛欓箯椋�" - }, - BizScene = "CAE_TRANSFER", - OrderTitle = "娴嬭瘯浠f墸", - Remark = "娴嬭瘯浠f墸澶囨敞" + 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