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

---
 FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs         |   25 +
 FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs                      |   16 
 FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/SendInviteElectronSignSmsCommand.cs  |   26 +
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |   51 +++
 FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletExpandindirectOrderStatus.cs                        |    6 
 FlexJobApi.Core/Jobs/RefreshEnterpriseWalletStatusJob.cs                                            |  151 +++++-----
 FlexJobApi.Core/Utils/SmsUtils/SendSmsModel.cs                                                      |   28 ++
 FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs                                                 |  201 +++++++-------
 FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs      |    4 
 FlexJobApi.Web.Entry/appsettings.json                                                               |    5 
 FlexJobApi.Core/Enums/Common/EnumSmsTemplateCode.cs                                                 |   13 
 FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs               |   13 
 FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs                                                          |   11 
 FlexJobApi.Core/Jobs/RefreshEnterpriseWalletTransactionStatusJob.cs                                 |  115 ++++---
 FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs         |    9 
 FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs                                       |    4 
 FlexJobApi.Core/FlexJobApi.Core.xml                                                                 |   94 ++++++
 FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml                             |   12 
 FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs                                 |   10 
 FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs             |   17 +
 FlexJobApi.UserServer.Application/ElectronSign/Commands/PersonalUserRealCommandHandler.cs           |    2 
 21 files changed, 551 insertions(+), 262 deletions(-)

diff --git a/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs b/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs
index 8b23979..48ec371 100644
--- a/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs
+++ b/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseWallet.cs
@@ -28,6 +28,16 @@
         public EnumEnterpriseWalletAccess Access { get; set; }
 
         /// <summary>
+        /// 璐﹀彿
+        /// </summary>
+        public string Account { get; set; }
+
+        /// <summary>
+        /// 鍟嗘埛Id
+        /// </summary>
+        public string MerchantId { get; set; }
+
+        /// <summary>
         /// 浣欓
         /// </summary>
         public decimal Balance { get; set; }
diff --git a/FlexJobApi.Core/Enums/Common/EnumSmsTemplateCode.cs b/FlexJobApi.Core/Enums/Common/EnumSmsTemplateCode.cs
index ea2f72a..4e12fcd 100644
--- a/FlexJobApi.Core/Enums/Common/EnumSmsTemplateCode.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumSmsTemplateCode.cs
@@ -90,6 +90,17 @@
         /// 818閽卞寘寮�閫� 
         /// 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙伴挶鍖呭紑閫氾紝璇ラ獙璇佺爜5鍒嗛挓鍐呮湁鏁堬紝璇峰嬁娉勯湶浜庝粬浜恒��
         /// </summary>
-        BankWalletAccountOpen
+        BankWalletAccountOpen,
+
+        /// <summary>
+        /// 鐢靛瓙绛鹃個绾�
+        /// ${name}璇锋偍鐐瑰嚮绛剧害http://testwww.81812333.com/sg/${code}
+        /// </summary>
+        InviteElectronSign,
+        /// <summary>
+        /// 绛剧害鍦板潃
+        /// ${name}璇锋偍鐐瑰嚮绛剧害https://testwww.81812333.com/sgu/${code}
+        /// </summary>
+        ElectronSignUrl,
     }
 }
diff --git a/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletExpandindirectOrderStatus.cs b/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletExpandindirectOrderStatus.cs
index d2827cd..51e1cb6 100644
--- a/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletExpandindirectOrderStatus.cs
+++ b/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletExpandindirectOrderStatus.cs
@@ -12,11 +12,15 @@
     public enum EnumEnterpriseWalletExpandindirectOrderStatus
     {
         /// <summary>
+        /// 鏈繘浠�
+        /// </summary>
+        Wait = 1,
+        /// <summary>
         /// 瀹℃壒涓�
         /// </summary>
         PROCESSING = 10,
         /// <summary>
-        /// 宸茬敓鏁�
+        /// 宸茶繘浠�
         /// </summary>
         VALID = 20,
         /// <summary>
diff --git a/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs b/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs
index 122c239..bf4d430 100644
--- a/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs
+++ b/FlexJobApi.Core/Enums/Users/EnumEnterpriseWalletSignStatus.cs
@@ -12,6 +12,10 @@
     public enum EnumEnterpriseWalletSignStatus
     {
         /// <summary>
+        /// 鏈绾�
+        /// </summary>
+        Wait = 1,
+        /// <summary>
         /// 鐢宠涓�
         /// </summary>
         Apply = 10,
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index e374924..b647fd6 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -2050,6 +2050,16 @@
             閫氶亾
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.EnterpriseWallet.Account">
+            <summary>
+            璐﹀彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseWallet.MerchantId">
+            <summary>
+            鍟嗘埛Id
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.EnterpriseWallet.Balance">
             <summary>
             浣欓
@@ -3697,6 +3707,18 @@
             楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙伴挶鍖呭紑閫氾紝璇ラ獙璇佺爜5鍒嗛挓鍐呮湁鏁堬紝璇峰嬁娉勯湶浜庝粬浜恒��
             </summary>
         </member>
+        <member name="F:FlexJobApi.Core.EnumSmsTemplateCode.InviteElectronSign">
+            <summary>
+            鐢靛瓙绛鹃個绾�
+            ${name}璇锋偍鐐瑰嚮绛剧害http://testwww.81812333.com/sg/${code}
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumSmsTemplateCode.ElectronSignUrl">
+            <summary>
+            绛剧害鍦板潃
+            ${name}璇锋偍鐐瑰嚮绛剧害https://testwww.81812333.com/sgu/${code}
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.EnumValidationTypes">
             <summary>
             楠岃瘉绫诲瀷
@@ -4142,6 +4164,11 @@
             浼佷笟閽卞寘浠h繘浠跺崟鐘舵��
             </summary>
         </member>
+        <member name="F:FlexJobApi.Core.EnumEnterpriseWalletExpandindirectOrderStatus.Wait">
+            <summary>
+            鏈繘浠�
+            </summary>
+        </member>
         <member name="F:FlexJobApi.Core.EnumEnterpriseWalletExpandindirectOrderStatus.PROCESSING">
             <summary>
             瀹℃壒涓�
@@ -4149,7 +4176,7 @@
         </member>
         <member name="F:FlexJobApi.Core.EnumEnterpriseWalletExpandindirectOrderStatus.VALID">
             <summary>
-            宸茬敓鏁�
+            宸茶繘浠�
             </summary>
         </member>
         <member name="F:FlexJobApi.Core.EnumEnterpriseWalletExpandindirectOrderStatus.INVALID">
@@ -4170,6 +4197,11 @@
         <member name="T:FlexJobApi.Core.EnumEnterpriseWalletSignStatus">
             <summary>
             浼佷笟閽卞寘绛剧害鐘舵��
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumEnterpriseWalletSignStatus.Wait">
+            <summary>
+            鏈绾�
             </summary>
         </member>
         <member name="F:FlexJobApi.Core.EnumEnterpriseWalletSignStatus.Apply">
@@ -8201,11 +8233,6 @@
             浠诲姟Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQuery.Keywords">
-            <summary>
-            鍏抽敭瀛�
-            </summary>
-        </member>
         <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQuery.SettlementOrderUrl">
             <summary>
             缁撶畻鍗曞湴鍧�
@@ -8214,6 +8241,11 @@
         <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQueryResult">
             <summary>
             鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResult.Data">
+            <summary>
+            缁撶畻鍚嶅崟
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResult.Errors">
@@ -9670,6 +9702,16 @@
             绛剧讲鍚堝悓闀块摼鎺�
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.SendInviteElectronSignSmsCommand">
+            <summary>
+            鍙戦�侀個璇风绾︾煭淇�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SendInviteElectronSignSmsCommand.Ids">
+            <summary>
+            Id
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.StopElectronSignCommand">
             <summary>
             鐏靛伐瑙g害
@@ -10633,6 +10675,16 @@
             閫氶亾
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommand.Account">
+            <summary>
+            璐﹀彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommand.MerchantId">
+            <summary>
+            鍟嗘埛Id
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.OpenEnterpriseWalletCommandResult">
             <summary>
             寮�閫氫紒涓氶挶鍖�
@@ -10843,6 +10895,16 @@
             閫氶亾
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.Account">
+            <summary>
+            璐﹀彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.MerchantId">
+            <summary>
+            鍟嗘埛Id
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.Code">
             <summary>
             鍗忚鍙�
@@ -10871,6 +10933,11 @@
         <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.SignStatus">
             <summary>
             绛剧害鐘舵��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseWalletQueryResult.ExpandindirectOrderStatus">
+            <summary>
+            寰呰繘浠剁姸鎬�
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.GetEnterpriseWalletTransactionQuery">
@@ -15208,6 +15275,21 @@
             楠岃瘉鐮�
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.SendSmsModel">
+            <summary>
+            鍙戦�佺煭淇�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SendSmsModel.PhoneNumber">
+            <summary>
+            鎵嬫満鍙风爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SendSmsModel.TemplateCode">
+            <summary>
+            鐭俊妯℃澘缂栧彿
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.SendVerifyCodeModel">
             <summary>
             鍙戦�侀獙璇佺爜
diff --git a/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs b/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs
index 52742c1..032363c 100644
--- a/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs
+++ b/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs
@@ -34,115 +34,116 @@
         [UnitOfWork(false)]
         public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
         {
-            var now = DateTime.Now;
             var env = App.GetConfig<string>("Environment");
-            var q = rep.AsQueryable()
-                .Where(it => it.SettlementStatus == EnumTaskSettlementStatus.InProcess);
-            var minTime = env == "Local"
-                ? now.AddMinutes(-1)
-                : env == "Test"
-                ? now.AddMinutes(-5)
-                : now.AddDays(-1);
-            q = q.Where(it => it.SettlementStartTime.HasValue && it.SettlementStartTime < minTime);
-            var tasks = await q.ToListAsync();
-            var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId);
-            var taskIds = tasks.DistinctSelect(it => it.Id);
-            var taskUsers = await repTaskInfoUser
-                .Where(it => taskIds.Contains(it.TaskInfoId) && it.SettlementStatus == EnumTaskSettlementStatus.InProcess)
-                .ToListAsync();
-            var wallets = await repEnterpriseWallet.AsQueryable()
-                .Where(it => enterpriseIds.Contains(it.EnterpriseId) && it.Access == EnumEnterpriseWalletAccess.Alipay)
-                .ToListAsync();
-            foreach (var wallet in wallets)
+            if (env != "Local")
             {
-                var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
+                var now = DateTime.Now;
+                var q = rep.AsQueryable()
+                    .Where(it => it.SettlementStatus == EnumTaskSettlementStatus.InProcess);
+                var minTime = env == "Test"
+                    ? now.AddMinutes(-5)
+                    : now.AddDays(-1);
+                q = q.Where(it => it.SettlementStartTime.HasValue && it.SettlementStartTime < minTime);
+                var tasks = await q.ToListAsync();
+                var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId);
+                var taskIds = tasks.DistinctSelect(it => it.Id);
+                var taskUsers = await repTaskInfoUser
+                    .Where(it => taskIds.Contains(it.TaskInfoId) && it.SettlementStatus == EnumTaskSettlementStatus.InProcess)
+                    .ToListAsync();
+                var wallets = await repEnterpriseWallet.AsQueryable()
+                    .Where(it => enterpriseIds.Contains(it.EnterpriseId) && it.Access == EnumEnterpriseWalletAccess.Alipay)
+                    .ToListAsync();
+                foreach (var wallet in wallets)
                 {
-                    AccountBookId = wallet.AccountBookId,
-                    SceneCode = "SATF_FUND_BOOK",
-                    MerchantUserId = wallet.Code,
-                });
-                if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
-                wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0;
-                await repEnterpriseWallet.UpdateNowAsync(wallet);
-            }
-            if (tasks.IsNotNull())
-            {
-                foreach (var task in tasks)
-                {
-                    var wallet = wallets.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId);
-                    task.SettlementStatus = EnumTaskSettlementStatus.Completed;
-                    task.SettlementTime = DateTime.Now;
-                    await rep.UpdateNowAsync(task);
-
-                    var users = taskUsers.Where(it => it.TaskInfoId == task.Id).ToList();
-                    foreach (var user in users)
+                    var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
                     {
-                        user.SettlementStatus = EnumTaskSettlementStatus.Completed;
-                        user.SettlementTime = DateTime.Now;
-                        await repTaskInfoUser.UpdateNowAsync(user);
+                        AccountBookId = wallet.AccountBookId,
+                        SceneCode = "SATF_FUND_BOOK",
+                        MerchantUserId = wallet.Code,
+                    });
+                    if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
+                    wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0;
+                    await repEnterpriseWallet.UpdateNowAsync(wallet);
+                }
+                if (tasks.IsNotNull())
+                {
+                    foreach (var task in tasks)
+                    {
+                        var wallet = wallets.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId);
+                        task.SettlementStatus = EnumTaskSettlementStatus.Completed;
+                        task.SettlementTime = DateTime.Now;
+                        await rep.UpdateNowAsync(task);
 
-                        var order = new EnterpriseWalletTransaction();
-                        order.Type = EnumEnterpriseWalletTransactionType.Recharge;
-                        order.WalletId = wallet.Id;
-                        order.Amount = user.ActualSettlementAmount ?? 0;
-                        order.Remark = user.SettlementRemark;
-                        order.ProductCode = "SINGLE_TRANSFER_NO_PWD";
-                        order.BizScene = "ENTRUST_TRANSFER";
-                        order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit;
-                        order.Balance = wallet.Balance;
-                        await SetCode(order);
-                        await repEnterpriseWalletTransaction.InsertNowAsync(order);
-
-                        var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
+                        var users = taskUsers.Where(it => it.TaskInfoId == task.Id).ToList();
+                        foreach (var user in users)
                         {
-                            OutBizNo = order.Code,
-                            TransAmount = order.Amount.ToString(),
-                            ProductCode = order.ProductCode,
-                            BizScene = order.BizScene,
-                            PayeeInfo = new Participant
+                            user.SettlementStatus = EnumTaskSettlementStatus.Completed;
+                            user.SettlementTime = DateTime.Now;
+                            await repTaskInfoUser.UpdateNowAsync(user);
+
+                            var order = new EnterpriseWalletTransaction();
+                            order.Type = EnumEnterpriseWalletTransactionType.Recharge;
+                            order.WalletId = wallet.Id;
+                            order.Amount = user.ActualSettlementAmount ?? 0;
+                            order.Remark = user.SettlementRemark;
+                            order.ProductCode = "SINGLE_TRANSFER_NO_PWD";
+                            order.BizScene = "ENTRUST_TRANSFER";
+                            order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit;
+                            order.Balance = wallet.Balance;
+                            await SetCode(order);
+                            await repEnterpriseWalletTransaction.InsertNowAsync(order);
+
+                            var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
                             {
-                                IdentityType = "ALIPAY_LOGON_ID",
-                                Identity = user.ReceiveAccount,
-                                Name = user.ReceiveName,
-                            },
-                            PayerInfo = new Participant
-                            {
-                                IdentityType = "ACCOUNT_BOOK_ID",
-                                Identity = wallet.AccountBookId,
-                                ExtInfo = new
+                                OutBizNo = order.Code,
+                                TransAmount = order.Amount.ToString(),
+                                ProductCode = order.ProductCode,
+                                BizScene = order.BizScene,
+                                PayeeInfo = new Participant
                                 {
-                                    agreement_no = wallet.AgreementNo,
-                                }.ToJson(),
-                            },
-                            OrderTitle = order.Remark,
-                            Remark = order.Remark,
-                            BusinessParams = new
+                                    IdentityType = "ALIPAY_LOGON_ID",
+                                    Identity = user.ReceiveAccount,
+                                    Name = user.ReceiveName,
+                                },
+                                PayerInfo = new Participant
+                                {
+                                    IdentityType = "ACCOUNT_BOOK_ID",
+                                    Identity = wallet.AccountBookId,
+                                    ExtInfo = new
+                                    {
+                                        agreement_no = wallet.AgreementNo,
+                                    }.ToJson(),
+                                },
+                                OrderTitle = order.Remark,
+                                Remark = order.Remark,
+                                BusinessParams = new
+                                {
+                                    withdraw_timeliness = "T0"
+                                }.ToJson()
+                            }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
+                            if (response.IsError)
                             {
-                                withdraw_timeliness = "T0"
-                            }.ToJson()
-                        }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
-                        if (response.IsError)
-                        {
-                            order.ErrorCode = response.Code;
-                            order.FailReason = response.SubMsg ?? response.Msg;
-                        }
-                        else
-                        {
-                            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
-                                : EnumEnterpriseWalletTransactionStatus.Fail;
-                            await repEnterpriseWalletTransaction.UpdateNowAsync(order);
+                                order.ErrorCode = response.Code;
+                                order.FailReason = response.SubMsg ?? response.Msg;
+                            }
+                            else
+                            {
+                                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
+                                    : EnumEnterpriseWalletTransactionStatus.Fail;
+                                await repEnterpriseWalletTransaction.UpdateNowAsync(order);
+                            }
                         }
                     }
                 }
diff --git a/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletStatusJob.cs b/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletStatusJob.cs
index bc174a2..7a2b393 100644
--- a/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletStatusJob.cs
+++ b/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletStatusJob.cs
@@ -1,4 +1,5 @@
 锘縰sing Aop.Api.Domain;
+using Furion;
 using Furion.DatabaseAccessor;
 using Furion.FriendlyException;
 using Furion.Schedule;
@@ -24,92 +25,96 @@
         [UnitOfWork(false)]
         public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
         {
-            var entities = await rep.AsQueryable()
+            var env = App.GetConfig<string>("Environment");
+            if (env != "Local")
+            {
+                var entities = await rep.AsQueryable()
                 .Include(it => it.Enterprise)
                 .Where(it =>
                     it.Access == EnumEnterpriseWalletAccess.Alipay
                     && (it.SignStatus == EnumEnterpriseWalletSignStatus.Apply
                     || it.AccountBookStatus == null))
                 .ToListAsync();
-            foreach (var entity in entities)
-            {
-                var update = false;
-                if (entity.Access == EnumEnterpriseWalletAccess.Alipay)
+                foreach (var entity in entities)
                 {
-                    if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Apply)
+                    var update = false;
+                    if (entity.Access == EnumEnterpriseWalletAccess.Alipay)
                     {
-                        var response = alipayUtils.UserAgreementQuery(new Aop.Api.Domain.AlipayUserAgreementQueryModel
+                        if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Apply)
                         {
-                            PersonalProductCode = entity.PersonalProductCode,
-                            SignScene = entity.SignScene,
-                            ExternalAgreementNo = entity.Code,
-                            ThirdPartyType = entity.ThirdPartyType,
-                        });
-                        if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
-                        entity.AgreementNo = response.AgreementNo;
-                        entity.SignTime = response.SignTime.ToDateTime();
-                        entity.ValidTime = response.ValidTime.ToDateTime();
-                        entity.InvalidTime = response.InvalidTime.ToDateTime();
-                        entity.SignStatus = response.Status == "TEMP"
-                            ? EnumEnterpriseWalletSignStatus.Apply
-                            : response.Status == "NORMAL"
-                            ? EnumEnterpriseWalletSignStatus.Normal
-                            : response.Status == "STOP"
-                            ? EnumEnterpriseWalletSignStatus.Stop
-                            : throw Oops.Oh(EnumErrorCodeType.s510, "鐘舵�佸紓甯�");
-                        entity.PricipalType = response.PricipalType;
-                        entity.AlipayLogonId = response.AlipayLogonId;
-                        entity.PrincipalId = response.PrincipalId;
-                        entity.PrincipalOpenId = response.PrincipalOpenId;
-                        entity.ZmOpenId = response.ZmOpenId;
-                        entity.CreditAuthMode = response.CreditAuthMode;
-                        update = true;
-                    }
-
-                    if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal && entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal)
-                    {
-                        var response = alipayUtils.FundAccountbookCreate(new Aop.Api.Domain.AlipayFundAccountbookCreateModel
-                        {
-                            MerchantUserId = entity.Code,
-                            MerchantUserType = "BUSINESS_ORGANIZATION",
-                            SceneCode = "SATF_FUND_BOOK",
-                            ExtInfo = new
+                            var response = alipayUtils.UserAgreementQuery(new Aop.Api.Domain.AlipayUserAgreementQueryModel
                             {
-                                agreement_no = entity.AgreementNo,
-                                cert_no = entity.Enterprise.SocietyCreditCode
-                            }.ToJson()
-                        });
-                        if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
-                        entity.AccountBookId = response.AccountBookId;
-                        entity.BankAccName = response.ExtCardInfo.BankAccName;
-                        entity.CardBank = response.ExtCardInfo.CardBank;
-                        entity.CardBranch = response.ExtCardInfo.CardBranch;
-                        entity.CardDeposit = response.ExtCardInfo.CardDeposit;
-                        entity.CardLocation = response.ExtCardInfo.CardLocation;
-                        entity.CardNo = response.ExtCardInfo.CardNo;
-                        entity.AccountBookStatus = response.ExtCardInfo.Status == "A"
-                            ? EnumEnterpriseWalletAccountBookStatus.Normal
-                            : EnumEnterpriseWalletAccountBookStatus.Exception;
-                        update = true;
-                    }
+                                PersonalProductCode = entity.PersonalProductCode,
+                                SignScene = entity.SignScene,
+                                ExternalAgreementNo = entity.Code,
+                                ThirdPartyType = entity.ThirdPartyType,
+                            });
+                            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
+                            entity.AgreementNo = response.AgreementNo;
+                            entity.SignTime = response.SignTime.ToDateTime();
+                            entity.ValidTime = response.ValidTime.ToDateTime();
+                            entity.InvalidTime = response.InvalidTime.ToDateTime();
+                            entity.SignStatus = response.Status == "TEMP"
+                                ? EnumEnterpriseWalletSignStatus.Apply
+                                : response.Status == "NORMAL"
+                                ? EnumEnterpriseWalletSignStatus.Normal
+                                : response.Status == "STOP"
+                                ? EnumEnterpriseWalletSignStatus.Stop
+                                : throw Oops.Oh(EnumErrorCodeType.s510, "鐘舵�佸紓甯�");
+                            entity.PricipalType = response.PricipalType;
+                            entity.AlipayLogonId = response.AlipayLogonId;
+                            entity.PrincipalId = response.PrincipalId;
+                            entity.PrincipalOpenId = response.PrincipalOpenId;
+                            entity.ZmOpenId = response.ZmOpenId;
+                            entity.CreditAuthMode = response.CreditAuthMode;
+                            update = true;
+                        }
 
-                    if (entity.AccountBookStatus == EnumEnterpriseWalletAccountBookStatus.Normal)
-                    {
-                        var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
+                        if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal && entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal)
                         {
-                            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;
-                        update = true;
-                    }
-                }
+                            var response = alipayUtils.FundAccountbookCreate(new Aop.Api.Domain.AlipayFundAccountbookCreateModel
+                            {
+                                MerchantUserId = entity.Code,
+                                MerchantUserType = "BUSINESS_ORGANIZATION",
+                                SceneCode = "SATF_FUND_BOOK",
+                                ExtInfo = new
+                                {
+                                    agreement_no = entity.AgreementNo,
+                                    cert_no = entity.Enterprise.SocietyCreditCode
+                                }.ToJson()
+                            });
+                            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
+                            entity.AccountBookId = response.AccountBookId;
+                            entity.BankAccName = response.ExtCardInfo.BankAccName;
+                            entity.CardBank = response.ExtCardInfo.CardBank;
+                            entity.CardBranch = response.ExtCardInfo.CardBranch;
+                            entity.CardDeposit = response.ExtCardInfo.CardDeposit;
+                            entity.CardLocation = response.ExtCardInfo.CardLocation;
+                            entity.CardNo = response.ExtCardInfo.CardNo;
+                            entity.AccountBookStatus = response.ExtCardInfo.Status == "A"
+                                ? EnumEnterpriseWalletAccountBookStatus.Normal
+                                : EnumEnterpriseWalletAccountBookStatus.Exception;
+                            update = true;
+                        }
 
-                if (update)
-                {
-                    await rep.UpdateAsync(entity);
+                        if (entity.AccountBookStatus == EnumEnterpriseWalletAccountBookStatus.Normal)
+                        {
+                            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;
+                            update = true;
+                        }
+                    }
+
+                    if (update)
+                    {
+                        await rep.UpdateAsync(entity);
+                    }
                 }
             }
         }
diff --git a/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletTransactionStatusJob.cs b/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletTransactionStatusJob.cs
index bfa894c..19c6efc 100644
--- a/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletTransactionStatusJob.cs
+++ b/FlexJobApi.Core/Jobs/RefreshEnterpriseWalletTransactionStatusJob.cs
@@ -1,4 +1,5 @@
 锘縰sing Aop.Api.Domain;
+using Furion;
 using Furion.DatabaseAccessor;
 using Furion.FriendlyException;
 using Furion.Schedule;
@@ -25,70 +26,74 @@
 
         public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
         {
-            var entities = await rep.AsQueryable()
+            var env = App.GetConfig<string>("Environment");
+            if (env != "Local")
+            {
+                var entities = await rep.AsQueryable()
                 .Where(it =>
                     it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.WaitPay
                     || it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Dealing)
                 .ToListAsync();
-            if (entities.IsNotNull())
-            {
-                foreach (var entity in entities)
+                if (entities.IsNotNull())
                 {
-                    var response = alipayUtils.FundTransCommonQuery(new Aop.Api.Domain.AlipayFundTransCommonQueryModel
+                    foreach (var entity in entities)
                     {
-                        ProductCode = entity.ProductCode,
-                        BizScene = entity.BizScene,
-                        OutBizNo = entity.Code
-                    });
-                    if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
-                    entity.OrderId = response.OrderId;
-                    entity.InflowSettleSerialNo = response.InflowSettleSerialNo;
-                    entity.SettleSerialNo = response.SettleSerialNo;
-                    entity.ReceiverOpenId = response.ReceiverOpenId;
-                    entity.ReceiverUserId = response.ReceiverUserId;
-                    entity.PayFundOrderId = response.PayFundOrderId;
-                    entity.ArrivalTimeEnd = response.ArrivalTimeEnd.ToDateTime();
-                    entity.OrderFee = response.OrderFee.ToDecimal();
-                    entity.ErrorCode = response.ErrorCode;
-                    entity.FailReason = response.FailReason;
-                    entity.FailInstReason = response.FailInstReason;
-                    entity.FailInstName = response.FailInstName;
-                    entity.FailInstErrorCode = response.FailInstErrorCode;
-                    entity.SubStatus = response.SubStatus;
-                    entity.TransDate = response.PayDate.ToDateTime();
-                    entity.Status = response.Status;
-                    entity.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 rep.UpdateAsync(entity);
-                }
-                var walletIds = entities
-                    .Where(it => it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Success)
-                    .Select(it => it.WalletId)
-                    .Distinct()
-                    .ToList();
-                if (walletIds.IsNotNull())
-                {
-                    var wallets = await repEnterpriseWallet.AsQueryable()
-                        .Where(it => walletIds.Contains(it.Id))
-                        .ToListAsync();
-                    foreach (var wallet in wallets)
-                    {
-                        var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
+                        var response = alipayUtils.FundTransCommonQuery(new Aop.Api.Domain.AlipayFundTransCommonQueryModel
                         {
-                            AccountBookId = wallet.AccountBookId,
-                            SceneCode = "SATF_FUND_BOOK",
-                            MerchantUserId = wallet.Code,
+                            ProductCode = entity.ProductCode,
+                            BizScene = entity.BizScene,
+                            OutBizNo = entity.Code
                         });
                         if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
-                        wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0;
-                        await repEnterpriseWallet.UpdateAsync(wallet);
+                        entity.OrderId = response.OrderId;
+                        entity.InflowSettleSerialNo = response.InflowSettleSerialNo;
+                        entity.SettleSerialNo = response.SettleSerialNo;
+                        entity.ReceiverOpenId = response.ReceiverOpenId;
+                        entity.ReceiverUserId = response.ReceiverUserId;
+                        entity.PayFundOrderId = response.PayFundOrderId;
+                        entity.ArrivalTimeEnd = response.ArrivalTimeEnd.ToDateTime();
+                        entity.OrderFee = response.OrderFee.ToDecimal();
+                        entity.ErrorCode = response.ErrorCode;
+                        entity.FailReason = response.FailReason;
+                        entity.FailInstReason = response.FailInstReason;
+                        entity.FailInstName = response.FailInstName;
+                        entity.FailInstErrorCode = response.FailInstErrorCode;
+                        entity.SubStatus = response.SubStatus;
+                        entity.TransDate = response.PayDate.ToDateTime();
+                        entity.Status = response.Status;
+                        entity.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 rep.UpdateAsync(entity);
+                    }
+                    var walletIds = entities
+                        .Where(it => it.TransactionStatus == EnumEnterpriseWalletTransactionStatus.Success)
+                        .Select(it => it.WalletId)
+                        .Distinct()
+                        .ToList();
+                    if (walletIds.IsNotNull())
+                    {
+                        var wallets = await repEnterpriseWallet.AsQueryable()
+                            .Where(it => walletIds.Contains(it.Id))
+                            .ToListAsync();
+                        foreach (var wallet in wallets)
+                        {
+                            var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
+                            {
+                                AccountBookId = wallet.AccountBookId,
+                                SceneCode = "SATF_FUND_BOOK",
+                                MerchantUserId = wallet.Code,
+                            });
+                            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
+                            wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0;
+                            await repEnterpriseWallet.UpdateAsync(wallet);
+                        }
                     }
                 }
             }
diff --git a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs
index ccdd30a..2e4e2d1 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs
@@ -12,17 +12,12 @@
     /// 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁
     /// </summary>
     [Resource([EnumResourceController.FlexJobServerTaskUser])]
-    public class GetSettlementTaskUsersQuery : PagedListQuery<GetSettlementTaskUsersQueryResult, GetSettlementTaskUsersQueryResultItem>
+    public class GetSettlementTaskUsersQuery : IRequest<GetSettlementTaskUsersQueryResult>
     {
         /// <summary>
         /// 浠诲姟Id
         /// </summary>
         public Guid TaskInfoId { get; set; }
-
-        /// <summary>
-        /// 鍏抽敭瀛�
-        /// </summary>
-        public string Keywords { get; set; }
 
         /// <summary>
         /// 缁撶畻鍗曞湴鍧�
@@ -33,9 +28,13 @@
     /// <summary>
     /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁
     /// </summary>
-    public class GetSettlementTaskUsersQueryResult : PagedListQueryResult<GetSettlementTaskUsersQueryResultItem>
+    public class GetSettlementTaskUsersQueryResult
     {
         /// <summary>
+        /// 缁撶畻鍚嶅崟
+        /// </summary>
+        public List<GetSettlementTaskUsersQueryResultItem> Data { get; set; }
+        /// <summary>
         /// 閿欒淇℃伅
         /// </summary>
         public List<GetSettlementTaskUsersQueryResultError> Errors { get; set; }
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/SendInviteElectronSignSmsCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/SendInviteElectronSignSmsCommand.cs
new file mode 100644
index 0000000..efd653f
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/SendInviteElectronSignSmsCommand.cs
@@ -0,0 +1,26 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍙戦�侀個璇风绾︾煭淇�
+    /// </summary>
+    [Resource([EnumResourceController.UserServerEnterpriseEmployee])]
+    public class SendInviteElectronSignSmsCommand : IRequest<int>
+    {
+        public SendInviteElectronSignSmsCommand()
+        {
+            Ids = [];
+        }
+
+        /// <summary>
+        /// Id
+        /// </summary>
+        public List<Guid> Ids { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs
index c0dda74..48051cf 100644
--- a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs
@@ -22,6 +22,15 @@
         /// </summary>
         public EnumEnterpriseWalletAccess Access { get; set; }
 
+        /// <summary>
+        /// 璐﹀彿
+        /// </summary>
+        public string Account { get; set; }
+
+        /// <summary>
+        /// 鍟嗘埛Id
+        /// </summary>
+        public string MerchantId { get; set; }
     }
 
     /// <summary>
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs
index b8bbe9e..2986898 100644
--- a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs
+++ b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Queries/GetEnterpriseWalletQuery.cs
@@ -34,12 +34,22 @@
         /// <summary>
         /// 閽卞寘Id
         /// </summary>
-        public Guid Id { get; set; }
+        public Guid? Id { get; set; }
 
         /// <summary>
         /// 閫氶亾
         /// </summary>
         public EnumEnterpriseWalletAccess Access { get; set; }
+
+        /// <summary>
+        /// 璐﹀彿
+        /// </summary>
+        public string Account { get; set; }
+
+        /// <summary>
+        /// 鍟嗘埛Id
+        /// </summary>
+        public string MerchantId { get; set; }
 
         /// <summary>
         /// 鍗忚鍙�
@@ -70,5 +80,10 @@
         /// 绛剧害鐘舵��
         /// </summary>
         public EnumEnterpriseWalletSignStatus SignStatus { get; set; }
+
+        /// <summary>
+        /// 寰呰繘浠剁姸鎬�
+        /// </summary>
+        public EnumEnterpriseWalletExpandindirectOrderStatus ExpandindirectOrderStatus { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Utils/SmsUtils/SendSmsModel.cs b/FlexJobApi.Core/Utils/SmsUtils/SendSmsModel.cs
new file mode 100644
index 0000000..5968363
--- /dev/null
+++ b/FlexJobApi.Core/Utils/SmsUtils/SendSmsModel.cs
@@ -0,0 +1,28 @@
+锘縰sing Furion.DataValidation;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍙戦�佺煭淇�
+    /// </summary>
+    public class SendSmsModel
+    {
+        /// <summary>
+        /// 鎵嬫満鍙风爜
+        /// </summary>
+        [Required, DataValidation(ValidationTypes.PhoneNumber)]
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 鐭俊妯℃澘缂栧彿
+        /// </summary>
+        public EnumSmsTemplateCode TemplateCode { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs b/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
index a54090b..fe1f343 100644
--- a/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
+++ b/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
@@ -36,6 +36,17 @@
             this.aliyunSmsUtils = aliyunSmsUtils;
         }
 
+        public async Task<Guid> Send(SendSmsModel model, object templateParam, CancellationToken cancellationToken = default)
+        {
+            var entity = new SmsLog();
+            model.Adapt(entity);
+            entity.Expiry = DateTime.Now.AddMinutes(10);
+            entity.TemplateParam = templateParam.ToJson();
+            await aliyunSmsUtils.SendAsync(model.PhoneNumber, model.TemplateCode, entity.TemplateParam, cancellationToken);
+            await rep.InsertAsync(entity);
+            return entity.Id;
+        }
+
         public async Task<Guid> SendVerifyCode(SendVerifyCodeModel model, CancellationToken cancellationToken = default)
         {
             var code = new Random().Next(100000, 999999).ToString();
diff --git a/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs
index e051adb..e9e64e6 100644
--- a/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs
@@ -168,9 +168,10 @@
         public async Task<GetSettlementTaskUsersQueryResult> Handle(GetSettlementTaskUsersQuery request, CancellationToken cancellationToken)
         {
             var logier = JwtUtils.GetCurrentLogier();
+            var list = new GetSettlementTaskUsersQueryResult();
             var q = rep.AsQueryable().AsNoTracking()
                 .Where(it => it.TaskInfoId == request.TaskInfoId);
-            var s = q
+            list.Data = q
                 .Select(it => new GetSettlementTaskUsersQueryResultItem
                 {
                     Id = it.Id,
@@ -184,8 +185,8 @@
                     SettlementAmount = it.SettlementAmount,
                     ActualSettlementAmount = it.ActualSettlementAmount,
                     SettlementTime = it.SettlementTime
-                });
-            var list = await request.PageModel.GetPagedListAsync<GetSettlementTaskUsersQueryResult, GetSettlementTaskUsersQueryResultItem>(s, cancellationToken);
+                })
+                .ToList();
 
             var successList = new List<GetSettlementTaskUsersQueryResultExcelRow>();
             if (request.SettlementOrderUrl.IsNotNull())
@@ -270,14 +271,9 @@
                 }
             }
 
-            var pagedList = await list.Data
+            list.Data = list.Data
                 .Where(it => successList.Any(s => s.Identity == it.Identity))
-                .AsQueryable()
-                .ToPagedListAsync(request.PageModel.Page, request.PageModel.Rows, cancellationToken);
-            list.PageModel = request.PageModel.Adapt<PagedListQueryResultPageModel>();
-            list.PageModel.TotalCount = pagedList.TotalCount;
-            list.PageModel.TotalPage = pagedList.TotalPages;
-            list.Data = pagedList.Items.ToList();
+                .ToList();
 
             return list;
         }
diff --git a/FlexJobApi.UserServer.Application/ElectronSign/Commands/PersonalUserRealCommandHandler.cs b/FlexJobApi.UserServer.Application/ElectronSign/Commands/PersonalUserRealCommandHandler.cs
index 5d05d63..3c04111 100644
--- a/FlexJobApi.UserServer.Application/ElectronSign/Commands/PersonalUserRealCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/ElectronSign/Commands/PersonalUserRealCommandHandler.cs
@@ -191,7 +191,7 @@
                 faceRealUrl: result.Result.FaceUrl);
             await repUser.UpdateAsync(user);
 
-            return result.Result.FaceUrl;
+            return result.Result.FaceUrl.Replace("https://h5-v2.kych5.com", "https://wx05.ssqian.com.cn");
         }
 
         /// <summary>
diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index 26a0f07..e807a1b 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -30,6 +30,7 @@
     /// 鐏靛伐鍛戒护澶勭悊鍣�
     /// </summary>
     public class EnterpriseEmployeesCommandHandler(
+            SmsUtils smsUtils,
             IMediator mediator,
             IRepository<EnterpriseEmployee> rep,
             IRepository<User> repUser,
@@ -45,8 +46,10 @@
         IRequestHandler<InviteElectronSignCommand, int>,
         IRequestHandler<PersonalUserElectronSignCommand, PersonalUserElectronSignCommandResult>,
         IRequestHandler<EnterpriseUserElectronSignCommand, EnterpriseUserElectronSignCommandResult>,
-        IRequestHandler<StopElectronSignCommand, int>
+        IRequestHandler<StopElectronSignCommand, int>,
+        IRequestHandler<SendInviteElectronSignSmsCommand, int>
     {
+        private readonly SmsUtils smsUtils = smsUtils;
         private readonly IMediator mediator = mediator;
         private readonly IRepository<EnterpriseEmployee> rep = rep;
         private readonly IRepository<User> repUser = repUser;
@@ -266,6 +269,39 @@
         }
 
         /// <summary>
+        /// 鍙戦�侀個璇风绾︾煭淇�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<int> Handle(SendInviteElectronSignSmsCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var entities = await rep.AsQueryable()
+                .Include(it => it.Enterprise)
+                .Include(it => it.ContractTemplate)
+                .Where(it =>
+                    it.EnterpriseId == logier.EnterpriseId
+                    && request.Ids.Contains(it.Id)
+                    && it.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait)
+                .ToListAsync();
+            foreach (var entity in entities)
+            {
+                await smsUtils.Send(new SendSmsModel
+                {
+                    PhoneNumber = entity.ContactPhoneNumber,
+                    TemplateCode = EnumSmsTemplateCode.InviteElectronSign,
+                },
+                new
+                {
+                    name = entity.Enterprise.EnterpriseName,
+                    code = entity.ContractTemplate.Code
+                });
+            }
+            return entities.Count;
+        }
+
+        /// <summary>
         /// 涓汉鐢ㄦ埛绛剧害
         /// </summary>
         /// <param name="request"></param>
@@ -332,7 +368,11 @@
             {
                 throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
             }
-            return result.Result.Adapt<PersonalUserElectronSignCommandResult>();
+            var model = result.Result.Adapt<PersonalUserElectronSignCommandResult>();
+            model.SignContractLongUrl = model.SignContractLongUrl
+                .Replace("https://openapi.bestsign.info:443", "https://wx115.bestsign.info")
+                .Replace("https://openapi.bestsign.cn:443", "https://wx115.bestsign.cn");
+            return model;
         }
 
         /// <summary>
@@ -383,7 +423,11 @@
             {
                 throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
             }
-            return result.Result.Adapt<EnterpriseUserElectronSignCommandResult>();
+            var model = result.Result.Adapt<EnterpriseUserElectronSignCommandResult>();
+            model.SignContractLongUrl = model.SignContractLongUrl
+                .Replace("https://openapi.bestsign.info:443", "https://wx115.bestsign.info")
+                .Replace("https://openapi.bestsign.cn:443", "https://wx115.bestsign.cn");
+            return model;
         }
 
         /// <summary>
@@ -433,5 +477,6 @@
 
             return entities.Count;
         }
+
     }
 }
diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
index d40fbc0..6dac49a 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
@@ -59,6 +59,8 @@
                 entity = new EnterpriseWallet();
                 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";
@@ -70,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);
             }
diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs
index aacd13c..05d4624 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs
@@ -21,6 +21,7 @@
     public class EnterpriseWalletQueryHandler(
             IRepository<EnterpriseWallet> rep,
             IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction,
+            IRepository<EnterpriseWalletExpandindirectOrder> repEnterpriseWalletExpandindirectOrder,
             IRepository<Enterprise> repEnterprise,
             AlipayUtils alipayUtils
         ) :
@@ -29,6 +30,7 @@
     {
         private readonly IRepository<EnterpriseWallet> rep = rep;
         private readonly IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction = repEnterpriseWalletTransaction;
+        private readonly IRepository<EnterpriseWalletExpandindirectOrder> repEnterpriseWalletExpandindirectOrder = repEnterpriseWalletExpandindirectOrder;
         private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
         private readonly AlipayUtils alipayUtils = alipayUtils;
 
@@ -53,7 +55,15 @@
             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 == null)
+            {
+                return new GetEnterpriseWalletQueryResult
+                {
+                    Access = request.Access,
+                    SignStatus = EnumEnterpriseWalletSignStatus.Wait,
+                    ExpandindirectOrderStatus = EnumEnterpriseWalletExpandindirectOrderStatus.Wait
+                };
+            }
             var update = false;
             if (entity.Access == EnumEnterpriseWalletAccess.Alipay)
             {
@@ -134,6 +144,19 @@
             }
 
             var model = entity.Adapt<GetEnterpriseWalletQueryResult>();
+
+            var expandindirectOrder = await repEnterpriseWalletExpandindirectOrder.AsQueryable().AsNoTracking()
+                .OrderByDescending(it => it.CreatedTime)
+                .Where(it => it.WalletId == model.Id)
+                .Select(it => new
+                {
+                    it.OrderStatus
+                })
+                .FirstOrDefaultAsync();
+            model.ExpandindirectOrderStatus = expandindirectOrder == null
+                ? EnumEnterpriseWalletExpandindirectOrderStatus.Wait
+                : expandindirectOrder.OrderStatus;
+
             return model;
         }
 
diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
index 66d3a15..5693cf0 100644
--- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
+++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -374,7 +374,7 @@
             鐏靛伐鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.UserServer.Application.EnterpriseEmployeesCommandHandler.#ctor(MediatR.IMediator,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseEmployee},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseEmployeeContract},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ElectronSignSetting},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ContractTemplate},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseCost},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfoUser})">
+        <member name="M:FlexJobApi.UserServer.Application.EnterpriseEmployeesCommandHandler.#ctor(FlexJobApi.Core.SmsUtils,MediatR.IMediator,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseEmployee},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseEmployeeContract},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ElectronSignSetting},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ContractTemplate},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseCost},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfoUser})">
             <summary>
             鐏靛伐鍛戒护澶勭悊鍣�
             </summary>
@@ -398,6 +398,14 @@
         <member name="M:FlexJobApi.UserServer.Application.EnterpriseEmployeesCommandHandler.Handle(FlexJobApi.Core.InviteElectronSignCommand,System.Threading.CancellationToken)">
             <summary>
             閭�璇风伒宸ョ绾�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.EnterpriseEmployeesCommandHandler.Handle(FlexJobApi.Core.SendInviteElectronSignSmsCommand,System.Threading.CancellationToken)">
+            <summary>
+            鍙戦�侀個璇风绾︾煭淇�
             </summary>
             <param name="request"></param>
             <param name="cancellationToken"></param>
@@ -699,7 +707,7 @@
             浼佷笟閽卞寘鏌ヨ澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWalletTransaction},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},FlexJobApi.Core.AlipayUtils)">
+        <member name="M:FlexJobApi.UserServer.Application.EnterpriseWalletQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWalletTransaction},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWalletExpandindirectOrder},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},FlexJobApi.Core.AlipayUtils)">
             <summary>
             浼佷笟閽卞寘鏌ヨ澶勭悊鍣�
             </summary>
diff --git a/FlexJobApi.Web.Entry/appsettings.json b/FlexJobApi.Web.Entry/appsettings.json
index 6623cbc..4defa19 100644
--- a/FlexJobApi.Web.Entry/appsettings.json
+++ b/FlexJobApi.Web.Entry/appsettings.json
@@ -117,7 +117,10 @@
         "UserElectronSign": "SMS_476485061",
 
         //818閽卞寘寮�閫� 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙伴挶鍖呭紑閫氾紝璇ラ獙璇佺爜5鍒嗛挓鍐呮湁鏁堬紝璇峰嬁娉勯湶浜庝粬浜恒��
-        "BankWalletAccountOpen": "SMS_473860301"
+        "BankWalletAccountOpen": "SMS_473860301",
+
+        "InviteElectronSign": "SMS_493755029",
+        "ElectronSignUrl": "SMS_493715033"
       }
     }
   },

--
Gitblit v1.9.1