From eeb1019e42abc3fc0e4b10b181b46c02b6e58843 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 09 十月 2025 15:16:21 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs                |   14 
 ApiTools.Web.Entry/appsettings.json                                                     |   76 +++
 ApiTools.Core/Utils/SmsUtils/ChengLiYe/ChengLiYeSmsOptions.cs                           |    4 
 ApiTools.Application/Resources/Queries/CheckHealthQueryHandler.cs                       |   27 +
 ApiTools.Core/Utils/AliyunUtils/AliyunOptions.cs                                        |    5 
 ApiTools.Core/Utils/SmsUtils/Services/ChengLiYeSmsService.cs                            |    6 
 ApiTools.Database.Migrations/REDEME.MD                                                  |    2 
 ApiTools.Core/Utils/SmsUtils/Services/ISmsService.cs                                    |    3 
 ApiTools.Core/Utils/SmsUtils/SmsUtils.cs                                                |   18 
 ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.Designer.cs |  651 ++++++++++++++++++++++++++++++++++++++
 ApiTools.Application/ApiTools.Application.xml                                           |   15 
 ApiTools.Application/SmsUtils/Commands/SmsChengLiYeNotifyCommandHandler.cs              |   21 +
 ApiTools.Core/Models/Resources/Queries/CheckHealthQuery.cs                              |   17 +
 ApiTools.Core/ApiTools.Core.xml                                                         |   46 +-
 ApiTools.Core/Models/SmsUtils/Commands/SaveSmsSettingCommand.cs                         |    5 
 ApiTools.Core/Models/SmsUtils/Queries/GetSmsSettingQuery.cs                             |    5 
 ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.cs          |   59 +++
 ApiTools.Application/SmsUtils/Commands/SmsAliyunNotifyCommandHandler.cs                 |   18 +
 ApiTools.Core/Entities/SmsUtils/SmsSettingAccess.cs                                     |   14 
 ApiTools.Core/Utils/SmsUtils/Services/AliyunSmsService.cs                               |    5 
 20 files changed, 925 insertions(+), 86 deletions(-)

diff --git a/ApiTools.Application/ApiTools.Application.xml b/ApiTools.Application/ApiTools.Application.xml
index f18a0cb..d083aed 100644
--- a/ApiTools.Application/ApiTools.Application.xml
+++ b/ApiTools.Application/ApiTools.Application.xml
@@ -136,6 +136,19 @@
             鏌ヨ娓犻亾鐢ㄦ埛鍒嗛〉鍒楄〃鏁版嵁
             </summary>
         </member>
+        <member name="T:ApiTools.UserServer.Application.CheckHealthQueryHandler">
+            <summary>
+            鍋ュ悍鏍¢獙
+            </summary>
+        </member>
+        <member name="M:ApiTools.UserServer.Application.CheckHealthQueryHandler.Handle(ApiTools.Core.CheckHealthQuery,System.Threading.CancellationToken)">
+            <summary>
+            鍋ュ悍鏍¢獙
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:ApiTools.CommonServer.Application.SaveSmsSettingCommandHandler">
             <summary>
             淇濆瓨鐭俊閰嶇疆
@@ -159,7 +172,7 @@
             闃块噷浜戠煭淇″钩鍙板洖浼犻�氱煡
             </summary>
         </member>
-        <member name="M:ApiTools.CommonServer.Application.SmsAliyunNotifyCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{ApiTools.Core.SmsSetting},Furion.DatabaseAccessor.IRepository{ApiTools.Core.SmsLog},ApiTools.Core.SmsUtils)">
+        <member name="M:ApiTools.CommonServer.Application.SmsAliyunNotifyCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{ApiTools.Core.SmsSetting},Furion.DatabaseAccessor.IRepository{ApiTools.Core.SmsLog},ApiTools.Core.SmsUtils,Furion.HttpRemote.IHttpRemoteService)">
             <summary>
             闃块噷浜戠煭淇″钩鍙板洖浼犻�氱煡
             </summary>
diff --git a/ApiTools.Application/Resources/Queries/CheckHealthQueryHandler.cs b/ApiTools.Application/Resources/Queries/CheckHealthQueryHandler.cs
new file mode 100644
index 0000000..d266419
--- /dev/null
+++ b/ApiTools.Application/Resources/Queries/CheckHealthQueryHandler.cs
@@ -0,0 +1,27 @@
+锘縰sing ApiTools.Core;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.UserServer.Application
+{
+    /// <summary>
+    /// 鍋ュ悍鏍¢獙
+    /// </summary>
+    public class CheckHealthQueryHandler : IRequestHandler<CheckHealthQuery, bool>
+    {
+        /// <summary>
+        /// 鍋ュ悍鏍¢獙
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<bool> Handle(CheckHealthQuery request, CancellationToken cancellationToken)
+        {
+            return Task.FromResult(true);
+        }
+    }
+}
diff --git a/ApiTools.Application/SmsUtils/Commands/SmsAliyunNotifyCommandHandler.cs b/ApiTools.Application/SmsUtils/Commands/SmsAliyunNotifyCommandHandler.cs
index ab7383e..3329d1d 100644
--- a/ApiTools.Application/SmsUtils/Commands/SmsAliyunNotifyCommandHandler.cs
+++ b/ApiTools.Application/SmsUtils/Commands/SmsAliyunNotifyCommandHandler.cs
@@ -1,5 +1,7 @@
 锘縰sing ApiTools.Core;
+using Furion;
 using Furion.DatabaseAccessor;
+using Furion.HttpRemote;
 using MediatR;
 using Microsoft.AspNetCore.Http;
 using Microsoft.EntityFrameworkCore;
@@ -18,13 +20,15 @@
     public class SmsAliyunNotifyCommandHandler(
             IRepository<SmsSetting> repSmsSetting,
             IRepository<SmsLog> repSmsLog,
-            ApiTools.Core.SmsUtils smsUtils
+            ApiTools.Core.SmsUtils smsUtils,
+            IHttpRemoteService httpRemoteService
         )
         : IRequestHandler<SmsAliyunNotifyCommand, SmsAliyunNotifyCommandResult>
     {
         private readonly IRepository<SmsSetting> repSmsSetting = repSmsSetting;
         private readonly IRepository<SmsLog> repSmsLog = repSmsLog;
         private readonly Core.SmsUtils smsUtils = smsUtils;
+        private readonly IHttpRemoteService httpRemoteService = httpRemoteService;
 
         /// <summary>
         /// 闃块噷浜戠煭淇″钩鍙板洖浼犻�氱煡
@@ -34,6 +38,18 @@
         /// <returns></returns>
         public async Task<SmsAliyunNotifyCommandResult> Handle(SmsAliyunNotifyCommand request, CancellationToken cancellationToken)
         {
+            if (App.GetConfig<string>("Environment") == "Product")
+            {
+                try
+                {
+                    await httpRemoteService.PostAsStringAsync("http://118.178.252.28:8780/api/common/sms/smsAliyunNotify",
+                        builder => builder.SetJsonContent(request));
+                }
+                catch
+                {
+
+                }
+            }
             var templateCodes = await EnumUtils.GetModel<EnumSmsTemplateCode>();
             var msgIds = request.DistinctSelect(it => it.BizId.ToString());
             var entities = await repSmsLog.AsQueryable()
diff --git a/ApiTools.Application/SmsUtils/Commands/SmsChengLiYeNotifyCommandHandler.cs b/ApiTools.Application/SmsUtils/Commands/SmsChengLiYeNotifyCommandHandler.cs
index ccb1e2f..fa100f2 100644
--- a/ApiTools.Application/SmsUtils/Commands/SmsChengLiYeNotifyCommandHandler.cs
+++ b/ApiTools.Application/SmsUtils/Commands/SmsChengLiYeNotifyCommandHandler.cs
@@ -1,5 +1,6 @@
-锘縰sing Baidu.Aip.BodyAnalysis;
-using ApiTools.Core;
+锘縰sing ApiTools.Core;
+using Baidu.Aip.BodyAnalysis;
+using Furion;
 using Furion.DatabaseAccessor;
 using Furion.HttpRemote;
 using MediatR;
@@ -22,7 +23,8 @@
             IHttpContextAccessor httpContextAccessor,
             IRepository<SmsSetting> repSmsSetting,
             IRepository<SmsLog> repSmsLog,
-            ApiTools.Core.SmsUtils smsUtils
+            ApiTools.Core.SmsUtils smsUtils,
+            IHttpRemoteService httpRemoteService
         ) :
         IRequestHandler<SmsChengLiYeNotifyCommand, bool>
     {
@@ -30,6 +32,7 @@
         private readonly IRepository<SmsSetting> repSmsSetting = repSmsSetting;
         private readonly IRepository<SmsLog> repSmsLog = repSmsLog;
         private readonly ApiTools.Core.SmsUtils smsUtils = smsUtils;
+        private readonly IHttpRemoteService httpRemoteService = httpRemoteService;
 
         /// <summary>
         /// 璇氱珛涓氱煭淇″钩鍙板洖浼犻�氱煡
@@ -39,6 +42,18 @@
         /// <returns></returns>
         public async Task<bool> Handle(SmsChengLiYeNotifyCommand request, CancellationToken cancellationToken)
         {
+            if (App.GetConfig<string>("Environment") == "Product")
+            {
+                try
+                {
+                    await httpRemoteService.PostAsStringAsync("http://118.178.252.28:8780/api/common/sms/smsChengLiYeNotify",
+                        builder => builder.SetJsonContent(request));
+                }
+                catch
+                {
+
+                }
+            }
             if (request.MsgReports.IsNotNull())
             {
                 var templateCodes = await EnumUtils.GetModel<EnumSmsTemplateCode>();
diff --git a/ApiTools.Core/ApiTools.Core.xml b/ApiTools.Core/ApiTools.Core.xml
index 6adf6cf..9faeae3 100644
--- a/ApiTools.Core/ApiTools.Core.xml
+++ b/ApiTools.Core/ApiTools.Core.xml
@@ -764,16 +764,6 @@
             鐭俊閫氶亾閰嶇疆
             </summary>
         </member>
-        <member name="P:ApiTools.Core.SmsSettingAccess.ChannelId">
-            <summary>
-            娓犻亾Id
-            </summary>
-        </member>
-        <member name="P:ApiTools.Core.SmsSettingAccess.Channel">
-            <summary>
-            娓犻亾
-            </summary>
-        </member>
         <member name="P:ApiTools.Core.SmsSettingAccess.SettingId">
             <summary>
             閰嶇疆Id
@@ -792,6 +782,11 @@
         <member name="P:ApiTools.Core.SmsSettingAccess.IsDisabled">
             <summary>
             鏄惁绂佺敤
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SmsSettingAccess.SignName">
+            <summary>
+            绛惧悕鍚嶇О
             </summary>
         </member>
         <member name="T:ApiTools.Core.Channel">
@@ -1651,6 +1646,11 @@
             鐘舵��
             </summary>
         </member>
+        <member name="T:ApiTools.Core.CheckHealthQuery">
+            <summary>
+            鍋ュ悍鏍¢獙
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.CheckVerifyCodeSmsCommand">
             <summary>
             鏍¢獙楠岃瘉鐮�
@@ -1724,6 +1724,11 @@
         <member name="P:ApiTools.Core.SaveSmsSettingCommandAccess.Sort">
             <summary>
             鎺掑簭
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SaveSmsSettingCommandAccess.SignName">
+            <summary>
+            绛惧悕鍚嶇О
             </summary>
         </member>
         <member name="T:ApiTools.Core.SendSmsCommand">
@@ -2076,6 +2081,11 @@
             鎺掑簭
             </summary>
         </member>
+        <member name="P:ApiTools.Core.GetSmsSettingQueryResultAccess.SignName">
+            <summary>
+            绛惧悕鍚嶇О
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.AlipayUtils">
             <summary>
             闃块噷鏀粯宸ュ叿
@@ -2198,11 +2208,6 @@
         <member name="P:ApiTools.Core.AliyunSMSOptions.Version">
             <summary>
             鐗堟湰
-            </summary>
-        </member>
-        <member name="P:ApiTools.Core.AliyunSMSOptions.SignName">
-            <summary>
-            绛惧悕鍚嶇О
             </summary>
         </member>
         <member name="P:ApiTools.Core.AliyunSMSOptions.RegionId">
@@ -5699,11 +5704,6 @@
             璇氱珛涓氶厤缃�
             </summary>
         </member>
-        <member name="P:ApiTools.Core.ChengLiYeSmsOptions.SignName">
-            <summary>
-            绛惧悕鍚嶇О
-            </summary>
-        </member>
         <member name="P:ApiTools.Core.ChengLiYeSmsOptions.UserName">
             <summary>
             鐢ㄦ埛鍚�
@@ -5878,10 +5878,11 @@
             鍥炰紶娑堟伅
             </summary>
         </member>
-        <member name="M:ApiTools.Core.AliyunSmsService.SendAsync(System.String,ApiTools.Core.EnumSmsTemplateCode,System.Object,System.Threading.CancellationToken)">
+        <member name="M:ApiTools.Core.AliyunSmsService.SendAsync(System.String,System.String,ApiTools.Core.EnumSmsTemplateCode,System.Object,System.Threading.CancellationToken)">
             <summary>
             鍙戦�佺煭淇�
             </summary>
+            <param name="signName"></param>
             <param name="phoneNumber">鎵嬫満鍙风爜</param>
             <param name="templateCode">妯℃澘浠g爜</param>
             <param name="templateParam">妯℃澘鍙傛暟</param>
@@ -5904,10 +5905,11 @@
             <param name="key"></param>
             <returns></returns>
         </member>
-        <member name="M:ApiTools.Core.ISmsService.SendAsync(System.String,ApiTools.Core.EnumSmsTemplateCode,System.Object,System.Threading.CancellationToken)">
+        <member name="M:ApiTools.Core.ISmsService.SendAsync(System.String,System.String,ApiTools.Core.EnumSmsTemplateCode,System.Object,System.Threading.CancellationToken)">
             <summary>
             鍙戦�佺煭淇�
             </summary>
+            <param name="signName"></param>
             <param name="phoneNumber">鎵嬫満鍙风爜</param>
             <param name="templateCode">妯℃澘浠g爜</param>
             <param name="templateParam">妯℃澘鍙傛暟</param>
diff --git a/ApiTools.Core/Entities/SmsUtils/SmsSettingAccess.cs b/ApiTools.Core/Entities/SmsUtils/SmsSettingAccess.cs
index 28e56ef..2510b56 100644
--- a/ApiTools.Core/Entities/SmsUtils/SmsSettingAccess.cs
+++ b/ApiTools.Core/Entities/SmsUtils/SmsSettingAccess.cs
@@ -13,16 +13,6 @@
     public class SmsSettingAccess : CommonEntity<MasterDbContextLocator>
     {
         /// <summary>
-        /// 娓犻亾Id
-        /// </summary>
-        public Guid? ChannelId { get; set; }
-
-        /// <summary>
-        /// 娓犻亾
-        /// </summary>
-        public Channel Channel { get; set; }
-
-        /// <summary>
         /// 閰嶇疆Id
         /// </summary>
         public Guid SettingId { get; set; }
@@ -42,5 +32,9 @@
         /// </summary>
         public bool IsDisabled { get; set; }
 
+        /// <summary>
+        /// 绛惧悕鍚嶇О
+        /// </summary>
+        public string SignName { get; set; }
     }
 }
diff --git a/ApiTools.Core/Models/Resources/Queries/CheckHealthQuery.cs b/ApiTools.Core/Models/Resources/Queries/CheckHealthQuery.cs
new file mode 100644
index 0000000..176f403
--- /dev/null
+++ b/ApiTools.Core/Models/Resources/Queries/CheckHealthQuery.cs
@@ -0,0 +1,17 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+    /// <summary>
+    /// 鍋ュ悍鏍¢獙
+    /// </summary>
+    [Resource([EnumResourceController.UserServerResource], Method = EnumResourceMethod.Get, AllowAnonymous = true)]
+    public class CheckHealthQuery : IRequest<bool>
+    {
+    }
+}
diff --git a/ApiTools.Core/Models/SmsUtils/Commands/SaveSmsSettingCommand.cs b/ApiTools.Core/Models/SmsUtils/Commands/SaveSmsSettingCommand.cs
index 2987e7f..7daa167 100644
--- a/ApiTools.Core/Models/SmsUtils/Commands/SaveSmsSettingCommand.cs
+++ b/ApiTools.Core/Models/SmsUtils/Commands/SaveSmsSettingCommand.cs
@@ -68,5 +68,10 @@
         /// 鎺掑簭
         /// </summary>
         public int Sort { get; set; }
+
+        /// <summary>
+        /// 绛惧悕鍚嶇О
+        /// </summary>
+        public string SignName { get; set; }
     }
 }
diff --git a/ApiTools.Core/Models/SmsUtils/Queries/GetSmsSettingQuery.cs b/ApiTools.Core/Models/SmsUtils/Queries/GetSmsSettingQuery.cs
index 77e9e39..2416f0a 100644
--- a/ApiTools.Core/Models/SmsUtils/Queries/GetSmsSettingQuery.cs
+++ b/ApiTools.Core/Models/SmsUtils/Queries/GetSmsSettingQuery.cs
@@ -76,5 +76,10 @@
         /// 鎺掑簭
         /// </summary>
         public int Sort { get; set; }
+
+        /// <summary>
+        /// 绛惧悕鍚嶇О
+        /// </summary>
+        public string SignName { get; set; }
     }
 }
diff --git a/ApiTools.Core/Utils/AliyunUtils/AliyunOptions.cs b/ApiTools.Core/Utils/AliyunUtils/AliyunOptions.cs
index d8952ac..adeb657 100644
--- a/ApiTools.Core/Utils/AliyunUtils/AliyunOptions.cs
+++ b/ApiTools.Core/Utils/AliyunUtils/AliyunOptions.cs
@@ -48,11 +48,6 @@
         public string Version { get; set; }
 
         /// <summary>
-        /// 绛惧悕鍚嶇О
-        /// </summary>
-        public string SignName { get; set; }
-
-        /// <summary>
         /// 鍖哄煙Id
         /// </summary>
         public string RegionId { get; set; }
diff --git a/ApiTools.Core/Utils/SmsUtils/ChengLiYe/ChengLiYeSmsOptions.cs b/ApiTools.Core/Utils/SmsUtils/ChengLiYe/ChengLiYeSmsOptions.cs
index 0380d51..49da12a 100644
--- a/ApiTools.Core/Utils/SmsUtils/ChengLiYe/ChengLiYeSmsOptions.cs
+++ b/ApiTools.Core/Utils/SmsUtils/ChengLiYe/ChengLiYeSmsOptions.cs
@@ -18,10 +18,6 @@
         }
 
         /// <summary>
-        /// 绛惧悕鍚嶇О
-        /// </summary>
-        public string SignName { get; set; }
-        /// <summary>
         /// 鐢ㄦ埛鍚�
         /// </summary>
         public string UserName { get; set; }
diff --git a/ApiTools.Core/Utils/SmsUtils/Services/AliyunSmsService.cs b/ApiTools.Core/Utils/SmsUtils/Services/AliyunSmsService.cs
index 790cb2e..80a01fe 100644
--- a/ApiTools.Core/Utils/SmsUtils/Services/AliyunSmsService.cs
+++ b/ApiTools.Core/Utils/SmsUtils/Services/AliyunSmsService.cs
@@ -38,13 +38,14 @@
         /// <summary>
         /// 鍙戦�佺煭淇�
         /// </summary>
+        /// <param name="signName"></param>
         /// <param name="phoneNumber">鎵嬫満鍙风爜</param>
         /// <param name="templateCode">妯℃澘浠g爜</param>
         /// <param name="templateParam">妯℃澘鍙傛暟</param>
         /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
         /// <returns></returns>
         /// <exception cref="Oops"></exception>
-        public async Task<SmsResponse> SendAsync(string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken)
+        public async Task<SmsResponse> SendAsync(string signName, string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken)
         {
             AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
             {
@@ -56,7 +57,7 @@
             AlibabaCloud.SDK.Dysmsapi20170525.Models.SendSmsRequest sendSmsRequest = new AlibabaCloud.SDK.Dysmsapi20170525.Models.SendSmsRequest
             {
                 PhoneNumbers = phoneNumber,
-                SignName = options.Value.SMS.SignName,
+                SignName = signName,
                 TemplateCode = options.Value.SMS.TemplateCodes[templateCode.ToString()],
                 TemplateParam = templateParam.ToJson()
             };
diff --git a/ApiTools.Core/Utils/SmsUtils/Services/ChengLiYeSmsService.cs b/ApiTools.Core/Utils/SmsUtils/Services/ChengLiYeSmsService.cs
index cd47bbc..d21998e 100644
--- a/ApiTools.Core/Utils/SmsUtils/Services/ChengLiYeSmsService.cs
+++ b/ApiTools.Core/Utils/SmsUtils/Services/ChengLiYeSmsService.cs
@@ -24,7 +24,7 @@
         private readonly IOptions<ChengLiYeSmsOptions> options = options;
         private readonly IHttpRemoteService httpRemoteService = httpRemoteService;
 
-        public async Task<SmsResponse> SendAsync(string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken)
+        public async Task<SmsResponse> SendAsync(string signName, string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken)
         {
             var content = options.Value.TemplateCodes[templateCode.ToString()];
             if (templateParam != null)
@@ -40,9 +40,9 @@
             var body = new ChengLiYeSmsSubmitRequest
             {
                 UserName = options.Value.UserName,
-                Sign = MD5Encryption.Encrypt($"{options.Value.UserName}{options.Value.Password}{phoneNumber}銆恵options.Value.SignName}銆憑content}"),
+                Sign = MD5Encryption.Encrypt($"{options.Value.UserName}{options.Value.Password}{phoneNumber}銆恵signName}銆憑content}"),
                 Mobile = phoneNumber,
-                Content = $"銆恵options.Value.SignName}銆憑content}",
+                Content = $"銆恵signName}銆憑content}",
             };
             var log = new ThreeResourceLog
             {
diff --git a/ApiTools.Core/Utils/SmsUtils/Services/ISmsService.cs b/ApiTools.Core/Utils/SmsUtils/Services/ISmsService.cs
index b3671bb..6da9da8 100644
--- a/ApiTools.Core/Utils/SmsUtils/Services/ISmsService.cs
+++ b/ApiTools.Core/Utils/SmsUtils/Services/ISmsService.cs
@@ -13,12 +13,13 @@
         /// <summary>
         /// 鍙戦�佺煭淇�
         /// </summary>
+        /// <param name="signName"></param>
         /// <param name="phoneNumber">鎵嬫満鍙风爜</param>
         /// <param name="templateCode">妯℃澘浠g爜</param>
         /// <param name="templateParam">妯℃澘鍙傛暟</param>
         /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
         /// <returns></returns>
         /// <exception cref="Oops"></exception>
-        Task<SmsResponse> SendAsync(string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken);
+        Task<SmsResponse> SendAsync(string signName, string phoneNumber, EnumSmsTemplateCode templateCode, object templateParam, CancellationToken cancellationToken);
     }
 }
diff --git a/ApiTools.Core/Utils/SmsUtils/SmsUtils.cs b/ApiTools.Core/Utils/SmsUtils/SmsUtils.cs
index 9c1aece..ead1784 100644
--- a/ApiTools.Core/Utils/SmsUtils/SmsUtils.cs
+++ b/ApiTools.Core/Utils/SmsUtils/SmsUtils.cs
@@ -165,18 +165,17 @@
         /// <param name="setting"></param>
         /// <param name="fromEntity"></param>
         /// <returns></returns>
-        private EnumSmsAccess? GetSmsAccess(SmsSetting setting, SmsLog fromEntity)
+        private SmsSettingAccess GetSmsAccess(SmsSetting setting, SmsLog fromEntity)
         {
             var accesses = setting.Accesses
                     .OrderBy(it => it.Sort)
                     .Where(it => !it.IsDisabled)
                     .ToList();
-            EnumSmsAccess? access = null;
+            SmsSettingAccess? access = null;
             if (fromEntity == null)
             {
                 access = accesses
-                    .FirstOrDefault()
-                    ?.Access;
+                    .FirstOrDefault();
             }
             else
             {
@@ -187,8 +186,7 @@
                 {
                     access = accesses
                         .Where(it => it.Sort > sort)
-                        .FirstOrDefault()
-                        ?.Access;
+                        .FirstOrDefault();
                 }
             }
             return access;
@@ -256,14 +254,14 @@
             else
             {
                 var access = GetSmsAccess(setting, fromEntity);
-                if (access.HasValue)
+                if (access != null)
                 {
-                    var smsService = GetSmsService(access.Value);
+                    var smsService = GetSmsService(access.Access);
                     var entity = new SmsLog
                     {
                         ChannelId = setting.ChannelId,
                         ChannelCreatedUserId = model.ChannelCreatedUserId,
-                        Access = access.Value,
+                        Access = access.Access,
                         PhoneNumber = model.PhoneNumber,
                         TemplateCode = model.TemplateCode.ToString(),
                         TemplateParam = templateParam.ToJson(),
@@ -271,7 +269,7 @@
                         Status = EnumSmsStatus.Wait
                     };
                     await rep.InsertNowAsync(entity);
-                    var response = await smsService.SendAsync(model.PhoneNumber, model.TemplateCode, templateParam, cancellationToken);
+                    var response = await smsService.SendAsync(access.SignName, model.PhoneNumber, model.TemplateCode, templateParam, cancellationToken);
                     if (response != null)
                     {
                         entity.Status = response.Status;
diff --git a/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.Designer.cs b/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.Designer.cs
new file mode 100644
index 0000000..4c9113f
--- /dev/null
+++ b/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.Designer.cs
@@ -0,0 +1,651 @@
+锘�// <auto-generated />
+using System;
+using ApiTools.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace ApiTools.Database.Migrations.Migrations
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20251009023927_UpdateSmsSetting1009")]
+    partial class UpdateSmsSetting1009
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.2")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("ApiTools.Core.Channel", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Code")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Channel");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.Resource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("ActionName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ActionSummary")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("AllowAnonymous")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("ApplicationName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ControllerName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ControllerSummary")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("CustomResponse")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("DynamicAssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("FileUpload")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsExpired")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsFromForm")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Method")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RequestTypeFullName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RequestTypeName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseTypeFullName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseTypeName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Route")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RouteArea")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ServiceName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Resource");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.ScheduleJobDetail", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("AssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("Concurrent")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("GroupName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IncludeAnnotations")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("JobId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("JobType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Properties")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ScheduleJobDetail");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.ScheduleJobTrigger", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Args")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("AssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<long>("ElapsedTime")
+                        .HasColumnType("bigint");
+
+                    b.Property<DateTime?>("EndTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("JobId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("LastRunTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("MaxNumberOfErrors")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("MaxNumberOfRuns")
+                        .HasColumnType("bigint");
+
+                    b.Property<DateTime?>("NextRunTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("NumRetries")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("NumberOfErrors")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("NumberOfRuns")
+                        .HasColumnType("bigint");
+
+                    b.Property<bool>("ResetOnlyOnce")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Result")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("RetryTimeout")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("RunOnStart")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("StartNow")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("StartTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("Status")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TriggerId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TriggerType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ScheduleJobTrigger");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsLog", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Access")
+                        .HasColumnType("int");
+
+                    b.Property<Guid?>("ChannelCreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("ChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Code")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTime?>("Expiry")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsUsed")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Message")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("PhoneNumber")
+                        .IsRequired()
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<string>("RequestId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TemplateCode")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("TemplateParam")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ChannelId");
+
+                    b.ToTable("SmsLog");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("ChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("DailyMaxCount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("HourlyMaxCount")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("MinutelyMaxCount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("WithoutParams")
+                        .HasColumnType("bit");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ChannelId");
+
+                    b.ToTable("SmsSetting");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsSettingAccess", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Access")
+                        .HasColumnType("int");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid>("SettingId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("SignName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SettingId");
+
+                    b.ToTable("SmsSettingAccess");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.User", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Avatar")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("ChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedChannelId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsCheckPhoneNumber")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("Password")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("UserName")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ChannelId");
+
+                    b.ToTable("User");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111111"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsCheckPhoneNumber = false,
+                            IsDeleted = false,
+                            Level = 999,
+                            Name = "绠$悊鍛�",
+                            Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=",
+                            Sort = 0,
+                            Status = 10,
+                            Type = 100,
+                            UserName = "system"
+                        });
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsLog", b =>
+                {
+                    b.HasOne("ApiTools.Core.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelId");
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
+                {
+                    b.HasOne("ApiTools.Core.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelId");
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsSettingAccess", b =>
+                {
+                    b.HasOne("ApiTools.Core.SmsSetting", "Setting")
+                        .WithMany("Accesses")
+                        .HasForeignKey("SettingId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Setting");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.User", b =>
+                {
+                    b.HasOne("ApiTools.Core.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelId");
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("ApiTools.Core.SmsSetting", b =>
+                {
+                    b.Navigation("Accesses");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.cs b/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.cs
new file mode 100644
index 0000000..532a20d
--- /dev/null
+++ b/ApiTools.Database.Migrations/Migrations/20251009023927_UpdateSmsSetting1009.cs
@@ -0,0 +1,59 @@
+锘縰sing System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace ApiTools.Database.Migrations.Migrations
+{
+    /// <inheritdoc />
+    public partial class UpdateSmsSetting1009 : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_SmsSettingAccess_Channel_ChannelId",
+                table: "SmsSettingAccess");
+
+            migrationBuilder.DropIndex(
+                name: "IX_SmsSettingAccess_ChannelId",
+                table: "SmsSettingAccess");
+
+            migrationBuilder.DropColumn(
+                name: "ChannelId",
+                table: "SmsSettingAccess");
+
+            migrationBuilder.AddColumn<string>(
+                name: "SignName",
+                table: "SmsSettingAccess",
+                type: "nvarchar(max)",
+                nullable: true);
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "SignName",
+                table: "SmsSettingAccess");
+
+            migrationBuilder.AddColumn<Guid>(
+                name: "ChannelId",
+                table: "SmsSettingAccess",
+                type: "uniqueidentifier",
+                nullable: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SmsSettingAccess_ChannelId",
+                table: "SmsSettingAccess",
+                column: "ChannelId");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_SmsSettingAccess_Channel_ChannelId",
+                table: "SmsSettingAccess",
+                column: "ChannelId",
+                principalTable: "Channel",
+                principalColumn: "Id");
+        }
+    }
+}
diff --git a/ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
index 95c7e64..09924a7 100644
--- a/ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/ApiTools.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -470,9 +470,6 @@
                     b.Property<int>("Access")
                         .HasColumnType("int");
 
-                    b.Property<Guid?>("ChannelId")
-                        .HasColumnType("uniqueidentifier");
-
                     b.Property<Guid?>("CreatedChannelId")
                         .HasColumnType("uniqueidentifier");
 
@@ -491,6 +488,9 @@
                     b.Property<Guid>("SettingId")
                         .HasColumnType("uniqueidentifier");
 
+                    b.Property<string>("SignName")
+                        .HasColumnType("nvarchar(max)");
+
                     b.Property<int>("Sort")
                         .HasColumnType("int");
 
@@ -504,8 +504,6 @@
                         .HasColumnType("uniqueidentifier");
 
                     b.HasKey("Id");
-
-                    b.HasIndex("ChannelId");
 
                     b.HasIndex("SettingId");
 
@@ -622,17 +620,11 @@
 
             modelBuilder.Entity("ApiTools.Core.SmsSettingAccess", b =>
                 {
-                    b.HasOne("ApiTools.Core.Channel", "Channel")
-                        .WithMany()
-                        .HasForeignKey("ChannelId");
-
                     b.HasOne("ApiTools.Core.SmsSetting", "Setting")
                         .WithMany("Accesses")
                         .HasForeignKey("SettingId")
                         .OnDelete(DeleteBehavior.Cascade)
                         .IsRequired();
-
-                    b.Navigation("Channel");
 
                     b.Navigation("Setting");
                 });
diff --git a/ApiTools.Database.Migrations/REDEME.MD b/ApiTools.Database.Migrations/REDEME.MD
index 6211999..c9a0fa9 100644
--- a/ApiTools.Database.Migrations/REDEME.MD
+++ b/ApiTools.Database.Migrations/REDEME.MD
@@ -1,7 +1,7 @@
 -------------------------------涓绘暟鎹簱---------------------------------------
 
 鏂板杩佺Щ鏂囦欢
-dotnet ef migrations add UpdateSmsLog -s "../ApiTools.Web.Entry" -c DefaultDbContext
+dotnet ef migrations add UpdateSmsSetting1009 -s "../ApiTools.Web.Entry" -c DefaultDbContext
 
 鍒犻櫎杩佺Щ鏂囦欢
 dotnet ef migrations remove -s "../ApiTools.Web.Entry" -c DefaultDbContext
diff --git a/ApiTools.Web.Entry/appsettings.json b/ApiTools.Web.Entry/appsettings.json
index 46a87d9..7d20f94 100644
--- a/ApiTools.Web.Entry/appsettings.json
+++ b/ApiTools.Web.Entry/appsettings.json
@@ -6,8 +6,8 @@
     "ApiTools": "Server=120.26.58.240; Database=Dev_ApiTools; User=bole;Password=Bole1472589;Encrypt=false;",
     "ApiToolsLog": "Server=120.26.58.240; Database=Dev_ApiToolsLog; User=bole;Password=Bole1472589;Encrypt=false;"
 
-    //"FlexJobApi": "Server=rm-bp1mt744021h1s6dg4o.sqlserver.rds.aliyuncs.com,2333; Database=Pro_FlexJobApi; User=bole;Password=Blcs20@%27;Encrypt=false;",
-    //"FlexJobApiLog": "Server=rm-bp1mt744021h1s6dg4o.sqlserver.rds.aliyuncs.com,2333; Database=Pro_FlexJobApiLog; User=bole;Password=Blcs20@%27;Encrypt=false;",
+    //"ApiTools": "Server=rm-bp1mt744021h1s6dg4o.sqlserver.rds.aliyuncs.com,2333; Database=Pro_ApiTools; User=bole;Password=Blcs20@%27;Encrypt=false;",
+    //"ApiToolsLog": "Server=rm-bp1mt744021h1s6dg4o.sqlserver.rds.aliyuncs.com,2333; Database=Pro_ApiToolsLog; User=bole;Password=Blcs20@%27;Encrypt=false;",
 
   },
   "Consul": {
@@ -81,7 +81,6 @@
     "MrChCode": "0040107980000NBCS000"
   },
   "ChengLiYeSms": {
-    "SignName": "818浜哄姏鏃犲咖1",
     "UserName": "nbcsxx",
     "Password": "8af9s7",
     "TemplateCodes": {
@@ -94,7 +93,31 @@
       //鐢靛瓙绛鹃個绾�
       "InviteElectronSign": "${name}璇锋偍鐐瑰嚮绛剧害http://testwww.81812333.com/sg/${code}",
       //绛剧害鍦板潃
-      "ElectronSignUrl": "${name}璇锋偍鐐瑰嚮绛剧害https://testwww.81812333.com/sgu/${code}"
+      "ElectronSignUrl": "${name}璇锋偍鐐瑰嚮绛剧害https://testwww.81812333.com/sgu/${code}",
+      //818骞冲彴鐭俊楠岃瘉鐮�
+      "VerifyCode": "楠岃瘉鐮侊細${code}锛岃浜�5鍒嗛挓鍐呭~鍐欙紝璇峰嬁娉勯湶锛岃嫢闈炴湰浜烘搷浣滆蹇界暐銆�",
+      //818璐﹀彿寮�閫氾紙绠$悊绔級
+      "CreateOperationAccount": "灏婃暚鐨勭敤鎴锋偍濂斤紝浜哄姏鏃犲咖璐﹀彿宸插紑閫氾紝璐﹀彿锛�${account}锛屽瘑鐮侊細${pwd}锛岃鐧诲綍缃戝潃 https://admin.81812333.com",
+      //818鎵嬫満鍙锋崲缁�
+      "UpdateUserPhoneNumberNotice": "灏婃暚鐨勭敤鎴锋偍濂斤紝818骞冲彴${code}鐨勮处鎴风粦瀹氭墜鏈哄彿鎴愬姛淇敼涓�${account}锛屼綘鍙互浣跨敤璇ユ墜鏈哄彿鐧诲綍锛岀櫥褰曠綉鍧� https://www.81812333.com",
+      //818閲嶇疆瀵嗙爜
+      "ResetUserPhoneNumber": "楠岃瘉鐮�${code}锛屾偍姝e湪杩涜閲嶇疆瀵嗙爜鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��",
+      //818骞冲彴瀵嗙爜閲嶇疆锛堥�氱煡锛�
+      "ResetPasswordNotice": "鎮ㄥソ锛屾偍鐨勫瘑鐮佸凡閲嶇疆锛岃处鍙凤細${account}锛屽瘑鐮侊細${password}锛岃濡ュ杽淇濆瓨",
+      //璐﹀彿淇敼
+      "ChangeUserName": "灏婃暚鐨勭敤鎴锋偍濂斤細 鎮ㄧ殑818骞冲彴璐﹀彿鎴愬姛淇敼涓�${account}鎮ㄥ彲浠ヤ娇鐢ㄨ璐﹀彿杩涜鐧诲綍锛岀櫥褰曠綉鍧�锛歨ttps://www.81812333.com",
+      //818璐﹀彿寮�閫�
+      "CreateAccountNotice": "灏婃暚鐨勭敤鎴锋偍濂斤紝鎮ㄧ殑璐﹀彿锛�${account}锛屽垵濮嬪瘑鐮侊細${password}锛岃濡ュ杽淇濆瓨锛屾偍鍙娇鐢ㄨ处鍙峰瘑鐮佺櫥褰曞苟淇敼瀵嗙爜锛岀櫥褰曠綉鍧� https://www.81812333.com",
+      //鎵嬫満鍙疯В缁�
+      "UnbindingUserPhoneNumber": "灏婃暚鐨勭敤鎴锋偍濂斤細818骞冲彴${account}鐨勮处鍙蜂笌${number}宸茶В缁戯紝浣犲彲浠ョ櫥褰曠綉鍧�锛歨ttps://www.81812333.com閲嶆柊缁戝畾鎵嬫満鍙枫��",
+      //瑙g粦閭
+      "UnbindingUserEmail": "灏婃暚鐨勭敤鎴锋偍濂斤細818骞冲彴${account}鐨勮处鍙蜂笌${mail}宸茶В缁戯紝浣犲彲浠ョ櫥褰曠綉鍧�锛歨ttps://www.81812333.com閲嶆柊缁戝畾閭銆�",
+      //818瀹炲悕璁よ瘉
+      "UserCertificationAudit": "楠岃瘉鐮�${code}锛屾偍姝e湪杩涜瀹炲悕璁よ瘉鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��",
+      //鐢宠鏁板瓧璇佷功
+      "ApplyUserCertificate": "楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄧ敵璇锋暟瀛楄瘉涔︼紝楠岃瘉鐮�10鍒嗛挓鍐呮湁鏁堛��",
+      //鐢靛瓙绛�
+      "UserElectronSign": "${unit_name}璇锋偍鐐瑰嚮绛剧害t.81812333.com/Inter/${code}"
     }
   },
   "Aliyun": {
@@ -128,19 +151,48 @@
       "AccessKeyId": "LTAI5tLzz2jnXrUAAiC2kduH",
       "AccessSecret": "do1XqrgHJ5gOuFHhO5eku0FyYzZvbQ",
       "Version": "2017-05-25",
-      "SignName": "818鏁板瓧浜哄姏璧勪骇骞冲彴",
       "RegionId": "cn-hangzhou",
       "TemplateCodes": {
-        //818骞冲彴鐧诲綍/娉ㄥ唽 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙扮櫥褰�/娉ㄥ唽锛岄獙璇佺爜10鍒嗛挓鍐呮湁鏁堛��
-        "LoginOrRegister": "SMS_472170005",
-        //818鎵嬫満鍙风爜淇敼 楠岃瘉鐮�${code}锛屾偍姝e湪杩涜淇敼鎵嬫満鍙风爜鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��
-        "UpdateUserPhoneNumber": "SMS_471100097",
-        //818閽卞寘寮�閫� 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙伴挶鍖呭紑閫氾紝璇ラ獙璇佺爜5鍒嗛挓鍐呮湁鏁堬紝璇峰嬁娉勯湶浜庝粬浜恒��
-        "BankWalletAccountOpen": "SMS_473860301",
         //鐢靛瓙绛鹃個绾� ${name}璇锋偍鐐瑰嚮绛剧害http://testwww.81812333.com/sg/${code}
         "InviteElectronSign": "SMS_493755029",
         //绛剧害鍦板潃 ${name}璇锋偍鐐瑰嚮绛剧害https://testwww.81812333.com/sgu/${code}
-        "ElectronSignUrl": "SMS_493715033"
+        "ElectronSignUrl": "SMS_493715033",
+
+        //818骞冲彴鐭俊楠岃瘉鐮� 楠岃瘉鐮侊細${code}锛岃浜�5鍒嗛挓鍐呭~鍐欙紝璇峰嬁娉勯湶锛岃嫢闈炴湰浜烘搷浣滆蹇界暐銆�
+        "VerifyCode": "SMS_471100021",
+
+        //818骞冲彴鐧诲綍/娉ㄥ唽 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙扮櫥褰�/娉ㄥ唽锛岄獙璇佺爜10鍒嗛挓鍐呮湁鏁堛��
+        "LoginOrRegister": "SMS_472170005",
+        //818璐﹀彿寮�閫氾紙绠$悊绔級灏婃暚鐨勭敤鎴锋偍濂斤紝浜哄姏鏃犲咖璐﹀彿宸插紑閫氾紝璐﹀彿锛�${account}锛屽瘑鐮侊細${pwd}锛岃鐧诲綍缃戝潃 https://admin.81812333.com
+        "CreateOperationAccount": "SMS_471970028",
+        //818鎵嬫満鍙风爜淇敼 楠岃瘉鐮�${code}锛屾偍姝e湪杩涜淇敼鎵嬫満鍙风爜鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��
+        "UpdateUserPhoneNumber": "SMS_471100097",
+        //818鎵嬫満鍙锋崲缁� 灏婃暚鐨勭敤鎴锋偍濂斤紝818骞冲彴${code}鐨勮处鎴风粦瀹氭墜鏈哄彿鎴愬姛淇敼涓�${account}锛屼綘鍙互浣跨敤璇ユ墜鏈哄彿鐧诲綍锛岀櫥褰曠綉鍧� https://www.81812333.com
+        "UpdateUserPhoneNumberNotice": "SMS_471925037",
+
+        //818閲嶇疆瀵嗙爜 楠岃瘉鐮�${code}锛屾偍姝e湪杩涜閲嶇疆瀵嗙爜鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��
+        "ResetUserPhoneNumber": "SMS_471240080",
+        //818骞冲彴瀵嗙爜閲嶇疆锛堥�氱煡锛� 鎮ㄥソ锛屾偍鐨勫瘑鐮佸凡閲嶇疆锛岃处鍙凤細${account}锛屽瘑鐮侊細${password}锛岃濡ュ杽淇濆瓨
+        "ResetPasswordNotice": "SMS_476790229",
+
+        //璐﹀彿淇敼 灏婃暚鐨勭敤鎴锋偍濂斤細 鎮ㄧ殑818骞冲彴璐﹀彿鎴愬姛淇敼涓�${account}鎮ㄥ彲浠ヤ娇鐢ㄨ璐﹀彿杩涜鐧诲綍锛岀櫥褰曠綉鍧�锛歨ttps://www.81812333.com
+        "ChangeUserName": "SMS_475895109",
+        //818璐﹀彿寮�閫� 灏婃暚鐨勭敤鎴锋偍濂斤紝鎮ㄧ殑璐﹀彿锛�${account}锛屽垵濮嬪瘑鐮侊細${password}锛岃濡ュ杽淇濆瓨锛屾偍鍙娇鐢ㄨ处鍙峰瘑鐮佺櫥褰曞苟淇敼瀵嗙爜锛岀櫥褰曠綉鍧� https://www.81812333.com
+        "CreateAccountNotice": "SMS_471980029",
+        //鎵嬫満鍙疯В缁� 灏婃暚鐨勭敤鎴锋偍濂斤細818骞冲彴${account}鐨勮处鍙蜂笌${number}宸茶В缁戯紝浣犲彲浠ョ櫥褰曠綉鍧�锛歨ttps://www.81812333.com閲嶆柊缁戝畾鎵嬫満鍙枫��
+        "UnbindingUserPhoneNumber": "SMS_475840188",
+        //瑙g粦閭 灏婃暚鐨勭敤鎴锋偍濂斤細818骞冲彴${account}鐨勮处鍙蜂笌${mail}宸茶В缁戯紝浣犲彲浠ョ櫥褰曠綉鍧�锛歨ttps://www.81812333.com閲嶆柊缁戝畾閭銆�
+        "UnbindingUserEmail": "SMS_475875117",
+
+        //818瀹炲悕璁よ瘉 楠岃瘉鐮�${code}锛屾偍姝e湪杩涜瀹炲悕璁よ瘉鎿嶄綔锛岃鍕挎硠闇诧紝鑻ラ潪鏈汉鎿嶄綔璇峰拷鐣ャ��
+        "UserCertificationAudit": "SMS_471230080",
+        //鐢宠鏁板瓧璇佷功 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄧ敵璇锋暟瀛楄瘉涔︼紝楠岃瘉鐮�10鍒嗛挓鍐呮湁鏁堛��
+        "ApplyUserCertificate": "SMS_475345383",
+        //鐢靛瓙绛� ${unit_name}璇锋偍鐐瑰嚮绛剧害t.81812333.com/Inter/${code}
+        "UserElectronSign": "SMS_476485061",
+
+        //818閽卞寘寮�閫� 楠岃瘉鐮�${code}锛岀敤鎴锋偍濂斤紝鎮ㄦ鍦ㄨ繘琛屽钩鍙伴挶鍖呭紑閫氾紝璇ラ獙璇佺爜5鍒嗛挓鍐呮湁鏁堬紝璇峰嬁娉勯湶浜庝粬浜恒��
+        "BankWalletAccountOpen": "SMS_473860301"
       }
     }
   },

--
Gitblit v1.9.1