From 28db30e5a458ee012959269d50e16eadaa0c5d12 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 05 九月 2025 15:10:09 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs |  201 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 194 insertions(+), 7 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
index 5fd388d..6dac49a 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
@@ -19,11 +19,14 @@
     /// </summary>
     public class EnterpriseWalletCommandHandler(
             IRepository<EnterpriseWallet> rep,
+            IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction,
             IRepository<Enterprise> repEnterprise,
             AlipayUtils alipayUtils
         ) :
         IRequestHandler<OpenEnterpriseWalletCommand, OpenEnterpriseWalletCommandResult>,
-        IRequestHandler<CloseEnterpriseWalletCommand, Guid>
+        IRequestHandler<CloseEnterpriseWalletCommand, Guid>,
+        IRequestHandler<RechargeEnterpriseWalletCommand, RechargeEnterpriseWalletCommandResult>,
+        IRequestHandler<TransferEnterpriseWalletCommand, Guid>
     {
         private readonly IRepository<EnterpriseWallet> rep = rep;
         private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
@@ -38,19 +41,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";
@@ -62,6 +72,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);
             }
@@ -76,10 +88,10 @@
             {
                 Channel = "QRCODE"
             };
-            var response = alipayUtils.UserAgreementPageSign(model, $"/api/user/enterpriseWallet/getAlipayUserAgreementPageSignNotify");
+            var response = alipayUtils.UserAgreementPageSign(model, $"/api/user/enterpriseWallet/alipayUserAgreementPageSignNotify");
             if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
             var result = new OpenEnterpriseWalletCommandResult();
-            result.SignUrl =  response.PageRedirectionData;
+            result.SignUrl = response.Body;
             return result;
         }
 
@@ -92,8 +104,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, "鏈绾�");
@@ -108,6 +125,176 @@
             return entity.Id;
         }
 
+        /// <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 == 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.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 = order.Code,
+                TransAmount = order.Amount.ToString(),
+                ProductCode = order.ProductCode,
+                BizScene = order.BizScene,
+                PayeeInfo = new Participant
+                {
+                    IdentityType = "ALIPAY_LOGON_ID",
+                    Identity = "13616515310",
+                    Name = "鏉ㄦ尟瀹�",
+                },
+                PayerInfo = new Participant
+                {
+                    IdentityType = "ACCOUNT_BOOK_ID",
+                    Identity = entity.AccountBookId,
+                    ExtInfo = new
+                    {
+                        agreement_no = entity.AgreementNo,
+                    }.ToJson(),
+                },
+                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);
+            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)
         {
             entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";

--
Gitblit v1.9.1