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 |  147 ++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 116 insertions(+), 31 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
index 8901516..93fe50d 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
@@ -19,13 +19,14 @@
     /// </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>,
+        IRequestHandler<TransferEnterpriseWalletCommand, Guid>
     {
         private readonly IRepository<EnterpriseWallet> rep = rep;
         private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
@@ -117,7 +118,8 @@
         /// <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();
             var entity = await rep.AsQueryable()
@@ -126,19 +128,28 @@
             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 = 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 = "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 +159,121 @@
                         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 = EnumEnterpriseWalletTransactionStatus.WaitPay;
+            await repEnterpriseWalletTransaction.UpdateAsync(order);
+            return new RechargeEnterpriseWalletCommandResult
+            {
+                PayUrl = response.Body
+            };
         }
 
-        public async Task<Guid> Handle(AlipayTransferCommand request, CancellationToken cancellationToken)
+        /// <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