From ced7ed5d9b3e0cd0c1bdbc9d76d1906301d189c2 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期二, 09 九月 2025 14:04:26 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs |  123 +++++++++++++++++++++++++++++++---------
 1 files changed, 95 insertions(+), 28 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
index e34811a..8a33475 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
@@ -19,12 +19,13 @@
     /// </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>
     {
         private readonly IRepository<EnterpriseWallet> rep = rep;
         private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
@@ -39,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";
@@ -63,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);
             }
@@ -93,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, "鏈绾�");
@@ -109,41 +124,93 @@
             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();
+            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 == EnumEnterpriseWalletAccess.Alipay)
+                .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access)
                 .FirstOrDefaultAsync();
             if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘");
-            var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
+            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 = 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 = $"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,
+                Remark = order.Remark,
+                OrderTitle = order.Remark,
+                TimeExpire = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd HH:mm"),
                 PayeeInfo = new Participant
                 {
-                    IdentityType = "BANKCARD_ACCOUNT",
-                    Identity = "6214180000016351382",
-                    Name = "瀛欓箯椋�",
-                    BankcardExtInfo = new BankcardExtInfo
+                    IdentityType = "ACCOUNT_BOOK_ID",
+                    Identity = entity.AccountBookId,
+                    ExtInfo = new
                     {
-                        AccountType = "2",
-                        InstName = "瀹佹尝閾惰"
-                    }
+                        agreement_no = entity.AgreementNo,
+                    }.ToJson(),
                 },
-                PayerInfo = new Participant
-                {
-                    IdentityType = "ALIPAY_OPEN_ID",
-                    Identity = entity.PrincipalOpenId,
-                    Name = "瀛欓箯椋�"
-                },
-                BizScene = "CAE_TRANSFER",
-                OrderTitle = "娴嬭瘯浠f墸",
-                Remark = "娴嬭瘯浠f墸澶囨敞"
+            }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
+            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
+            order.TransactionStatus = EnumWalletTransactionStatus.WaitPay;
+            await repEnterpriseWalletTransaction.UpdateAsync(order);
+            return new RechargeEnterpriseWalletCommandResult
+            {
+                PayUrl = response.Body
+            };
+        }
+
+        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