From fd1d2c1d5f519ddb4667019d6685ff270ad6716b Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 11 九月 2025 09:49:42 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs |  114 +++++++++++++++++++++++++++++++++------------------------
 1 files changed, 66 insertions(+), 48 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
index 8901516..b59fc51 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,18 +40,23 @@
         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.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P";
                 entity.SignScene = "INDUSTRY|SATF_ACC";
@@ -94,8 +99,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 +127,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 +175,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