From b8f1e312f00318e201d9267a35a53ebac3d0c837 Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期三, 25 六月 2025 16:33:57 +0800
Subject: [PATCH] 增加腾讯文字识别服务工程和项目

---
 Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue                             |  109 +
 Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs                                           |   47 
 Admin.NET/EzUpFile/UpFileController.cs                                                         |  196 +
 Admin.NET/EzUpFile/EzFileUploadService.cs                                                      |  754 +++++++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj                           |    1 
 Admin.NET/cylsg.utility/cylsg.utility.csproj                                                   |   14 
 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj                                   |    7 
 Admin.NET/FZCZTB.NET.SYSService/Startup.cs                                                     |   32 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs                                              |    3 
 Admin.NET/cylsg.utility/untilityModels.cs                                                      |   16 
 Admin.NET/cylsg.utility/Extend/StringEx.cs                                                     |  251 ++
 Admin.NET/EzUpFile/EzUpFile.csproj                                                             |   30 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs                                          |    7 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs  |  177 +
 Admin.NET/EzTencentCloud/TencentCloudService.cs                                                |  348 +++
 Admin.NET/EzTencentCloud/EzTencentCloud.csproj                                                 |   19 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs                                        |   41 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs                |   60 
 Admin.NET/EzTencentCloud/TencentCloudConfig.json                                               |   12 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs    |  196 +
 Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs                                         |   47 
 Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json                                     |   11 
 Admin.NET/cylsg.utility/CommonHelper.cs                                                        | 1015 +++++++++
 Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs                                        |  191 +
 Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj                                                 |    2 
 Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs                                             |    6 
 Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs                                            |   11 
 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj                           |    2 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs                                                |    4 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs                                                  |    2 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs                                            |    4 
 Admin.NET/Admin.NET.sln                                                                        |   20 
 Admin.NET/EzUpFile/UpFileConfig.json                                                           |   12 
 Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs                            |   88 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs                                              |  275 +-
 Admin.NET/cylsg.utility/Extend/EmunEx.cs                                                       |   15 
 Admin.NET/cylsg.utility/StaticStringDef.cs                                                     |   24 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs                                                  |    2 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs |   79 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs                                      |  189 +
 Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs                                        |    3 
 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs                                |  189 -
 Admin.NET/EzTencentCloud/ITencentCloudService.cs                                               |   71 
 Web/src/views/Customer/fBS_EnterpriseType/index.vue                                            |  194 +
 Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs                                    |  103 
 Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs                                          | 1021 ++++++++++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs    |   69 
 Web/src/api/Customer/fBS_EnterpriseType.ts                                                     |   52 
 Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs                                            |   17 
 Admin.NET/EzUpFile/IEzFileUploadService.cs                                                     |   73 
 50 files changed, 5,765 insertions(+), 346 deletions(-)

diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
index a7ea9d5..6b158af 100644
--- a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
+++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
@@ -46,7 +46,7 @@
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.5" />
     <PackageReference Include="System.Net.Http" Version="4.3.4" />
     <PackageReference Include="System.Private.Uri" Version="4.3.2" />
-    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1252" />
+    <PackageReference Include="TencentCloudSDK" Version="3.0.1268" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
     <PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" Aliases="BouncyCastleV2" />
diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs
index c807604..1f38313 100644
--- a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs
@@ -63,6 +63,9 @@
     /// </summary>
     [Required(ErrorMessage = "绉熸埛涓嶈兘涓虹┖")]
     public long? TenantId { get; set; }
+
+  
+
 }
 
 /// <summary>
diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
index 1bc5c1e..efbb21d 100644
--- a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
+++ b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
@@ -63,8 +63,15 @@
 
     public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
     {
-        // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬�
-        return await CheckAuthorizeAsync(httpContext);
+
+        if (App.User.FindFirst(ClaimConst.UserType)?.Value == "Customer")
+        {
+            //瀹㈡埛鐧诲綍 涓嶉渶瑕佸仛璧烽獙璇�
+            return true;
+        }
+            else
+            // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬�
+            return await CheckAuthorizeAsync(httpContext);
     }
 
     /// <summary>
diff --git a/Admin.NET/Admin.NET.sln b/Admin.NET/Admin.NET.sln
index ac33046..9f9f027 100644
--- a/Admin.NET/Admin.NET.sln
+++ b/Admin.NET/Admin.NET.sln
@@ -42,6 +42,14 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.NET.SYSService", "FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj", "{9E19230C-7A8F-4440-B5D9-27D0038C13F6}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzTencentCloud", "EzTencentCloud\EzTencentCloud.csproj", "{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzUpFile", "EzUpFile\EzUpFile.csproj", "{5333BCDD-09C7-4021-AC43-CBFA63505D4D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "瑙e喅鏂规椤�", "瑙e喅鏂规椤�", "{251B31C8-0A9E-4948-9534-D167A56201F3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cylsg.utility", "cylsg.utility\cylsg.utility.csproj", "{743B2BC9-11AE-4354-90D9-560B592F63CA}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -111,6 +119,18 @@
 		{9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/Admin.NET/EzTencentCloud/EzTencentCloud.csproj b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj
new file mode 100644
index 0000000..f9e143e
--- /dev/null
+++ b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj
@@ -0,0 +1,19 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Update="TencentCloudConfig.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>
diff --git a/Admin.NET/EzTencentCloud/ITencentCloudService.cs b/Admin.NET/EzTencentCloud/ITencentCloudService.cs
new file mode 100644
index 0000000..da37eff
--- /dev/null
+++ b/Admin.NET/EzTencentCloud/ITencentCloudService.cs
@@ -0,0 +1,71 @@
+锘縰sing Furion.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TencentCloud.Iai.V20200303.Models;
+using TencentCloud.Ocr.V20181119.Models;
+
+namespace EzTencentCloud
+{
+    /// <summary>
+    /// 鑵捐浜戞湇鍔�
+    /// </summary>
+    public interface ITencentCloudService: IScoped
+    {
+        #region orc 鍥炬枃璇嗗埆
+        /// <summary>
+        /// 韬唤璇佽瘑鍒紝骞跺壀瑁�
+        /// </summary>
+        /// <param name="ImageBase64">鍥剧墖base64</param>
+        /// <param name="isFRONT"></param>
+        /// <returns></returns>
+        IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT);
+        /// <summary>
+        /// 鑾峰彇鍓鍚庣殑韬唤璇佺収鐗�
+        /// </summary>
+        /// <returns></returns>
+        string GetIdCordImg();
+        /// <summary>
+        /// 钀ヤ笟鎵х収璁よ瘉
+        /// </summary>
+        /// <param name="ImageBase64"> 鍥剧墖base64</param>
+        /// <returns></returns>
+        BizLicenseOCRResponse BizLicenseOCR(string ImageBase64);
+        #endregion
+        #region iai 浜鸿劯璇嗗埆
+        /// <summary>
+        /// 鍒涘缓浜鸿劯搴擄紝涓�鑸竴涓簯璐﹀彿鍙渶瑕佸垱寤轰竴娆�
+        /// </summary>
+        public void IaiCreatGroup();
+        /// <summary>
+        /// 浜鸿劯楠岃瘉 涓�鑸垎鏁拌秴杩�50 鍒嗚瘑鍒负涓�涓汉
+        /// </summary>
+        /// <param name="img64"></param>
+        /// <param name="PersonNameId"></param>
+        /// <returns></returns>
+        public VerifyFaceResponse VerifyFace(string img64, string PersonNameId);
+        /// <summary>
+        /// 澧炲姞涓�涓汉鐨勪汉鑴稿浘鐗囩壒寰侊紝涓�涓渶澶氬彧鍏佽鏈変簲涓汉鑴哥壒杩�
+        /// </summary>
+        /// <param name="img64"></param>
+        /// <param name="PersonNameId"></param>
+        /// <param name="PersonName"></param>
+        /// <param name="PersonGender"></param>
+        /// <returns></returns>
+        public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender);
+
+        /// <summary>
+        /// 澧炲姞涓�涓汉
+        /// </summary>
+        /// <param name="img64">浜鸿劯鐓�</param>
+        /// <param name="PersonNameId">浜鸿劯ID 涓�涓簯璐︽埛涓敮涓�</param>
+        /// <param name="PersonName">濮撳悕</param>
+        /// <param name="PersonGender">鎬у埆    0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param>
+        /// <returns></returns>
+        public bool IaiAddPerso(string img64, string PersonNameId, string PersonName, int  PersonGender);
+        #endregion
+
+    }
+}
diff --git a/Admin.NET/EzTencentCloud/TencentCloudConfig.json b/Admin.NET/EzTencentCloud/TencentCloudConfig.json
new file mode 100644
index 0000000..0623d8f
--- /dev/null
+++ b/Admin.NET/EzTencentCloud/TencentCloudConfig.json
@@ -0,0 +1,12 @@
+{
+  "TencentCloud": {
+    "SecretId": "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+    "SecretKey": "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+  },
+  //浜鸿劯搴撶浉鍏抽厤缃�
+  "IAIGroupSet": {
+    "ID": "cylsg",
+    "Name": "宸濆嵃涓存椂宸�"
+  }
+
+}
diff --git a/Admin.NET/EzTencentCloud/TencentCloudService.cs b/Admin.NET/EzTencentCloud/TencentCloudService.cs
new file mode 100644
index 0000000..4f27ee4
--- /dev/null
+++ b/Admin.NET/EzTencentCloud/TencentCloudService.cs
@@ -0,0 +1,348 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+
+using Newtonsoft.Json;
+using TencentCloud.Common;
+using TencentCloud.Common.Profile;
+using Furion.DependencyInjection;
+using Furion;
+using TencentCloud.Ocr.V20181119.Models;
+using TencentCloud.Iai.V20200303.Models;
+using TencentCloud.Iai.V20200303;
+using TencentCloud.Ocr.V20181119;
+
+
+
+
+
+namespace EzTencentCloud
+{
+    public class TencentCloudService: ITencentCloudService, IScoped
+    {
+
+       
+
+
+        public   TencentCloudService()
+        {
+           
+        }
+        #region orc 鍥炬枃璇嗗埆
+        /// <summary>
+        /// 鍓鍚庣殑韬唤璇佸浘鐗�
+        /// </summary>
+        public string CropIdCard { get; set; }
+
+        public string GetIdCordImg()
+        {
+            if (string.IsNullOrEmpty(CropIdCard))
+                return "";
+            else
+                return CropIdCard;
+
+        }
+
+        public IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT)
+        {
+            try
+            {
+
+                Credential cred = new Credential
+                {
+                    SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                    SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+                };
+
+                ClientProfile clientProfile = new ClientProfile();
+                HttpProfile httpProfile = new HttpProfile();
+
+
+                httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
+                clientProfile.HttpProfile = httpProfile;
+
+                var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile);
+
+                IDCardOCRRequest req = new IDCardOCRRequest();
+                if (isFRONT)
+                    req.CardSide = "FRONT";
+                else
+                    req.CardSide = "BACK";
+                req.ImageBase64 = ImageBase64;
+
+                req.Config = JsonConvert.SerializeObject(new
+                {
+                    //韬唤璇佺収鐗囪鍓紙鍘绘帀璇佷欢澶栧浣欑殑杈圭紭銆佽嚜鍔ㄧ煫姝f媿鎽勮搴︼級
+                    CropIdCard = true,
+                    // CropPortrait = true,
+                    //杈规鍜屾鍐呴伄鎸″憡璀�
+                    BorderCheckWarn = true,
+                    //PS妫�娴嬪憡璀�
+                    DetectPsWarn = true,
+                    //涓存椂韬唤璇佸憡璀�
+                    TempIdWarn = true,
+                    //韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅
+                    InvalidDateWarn = true,
+                    //鍥剧墖璐ㄩ噺鍒嗘暟锛堣瘎浠峰浘鐗囩殑妯$硦绋嬪害锛�
+                    Quality = true,
+
+                });
+                IDCardOCRResponse resp = _ocrClient.IDCardOCRSync(req);
+
+                if (resp == null)
+                    throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�");
+
+
+                var adv = JsonConvert.DeserializeObject<AdvancedInfo>(resp.AdvancedInfo);
+                if (adv == null)
+                    throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�");
+                if (adv?.BorderCodeValue != null && adv.BorderCodeValue > 50)
+                    throw new Exception("韬唤璇佸浘鐗囦笉瀹屾暣锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�");
+                if (adv?.Quality != null && adv.Quality < 50)
+                    throw new Exception("鍥剧墖妯$硦锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�");
+                if (adv?.WarnInfos?.Where(x => x == -9100) == null)
+                    throw new Exception("韬唤璇佹棩鏈熶笉鍚堟硶锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�");
+                if (adv?.WarnInfos?.Where(x => x == -9106) == null)
+                    throw new Exception("璇ュ浘鐗囧彲鑳芥槸琚玃S杩囷紝璇烽噸鏂伴�夋嫨韬唤璇佸浘鐗�");
+
+                CropIdCard = adv.IdCard;
+                return resp;
+            }
+            catch (Exception)
+            {
+                throw;
+            }
+
+
+        }
+
+
+
+        public BizLicenseOCRResponse BizLicenseOCR(string ImageBase64)
+        {
+            try
+            {
+
+                Credential cred = new Credential
+                {
+                    SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                    SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+                };
+
+                ClientProfile clientProfile = new ClientProfile();
+                HttpProfile httpProfile = new HttpProfile();
+
+
+                httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
+                clientProfile.HttpProfile = httpProfile;
+
+                var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile);
+          
+                var ret = _ocrClient.BizLicenseOCRSync(new BizLicenseOCRRequest()
+                {
+                     ImageBase64 = ImageBase64, 
+                });
+               
+                return ret;
+            }
+            catch (Exception)
+            {
+                throw;
+            }
+
+
+        }
+
+
+        #endregion
+
+        #region iai 浜鸿劯璇嗗埆
+        public void  IaiCreatGroup()
+        {
+
+            Credential cred = new Credential
+            {
+                SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+            };
+
+            ClientProfile clientProfile = new ClientProfile();
+            HttpProfile httpProfile = new HttpProfile();
+
+
+            httpProfile.Endpoint = ("iai.tencentcloudapi.com");
+            clientProfile.HttpProfile = httpProfile;
+
+            var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
+            try
+            {
+                var retinfo = iaiClient.GetGroupInfoSync(new GetGroupInfoRequest
+                {
+                    GroupId = App.Configuration["IAIGroupSet:ID"] ?? "",
+                });
+            }
+            catch (TencentCloudSDKException e)
+            {
+                if (e.ErrorCode == "InvalidParameterValue.GroupIdNotExist")
+
+                {
+                    CreateGroupRequest request = new CreateGroupRequest()
+                    {
+                        GroupId = App.Configuration["IAIGroupSet:ID"],
+                        GroupName= App.Configuration["IAIGroupSet:Name"],
+                       
+
+                    };
+                    var aia = iaiClient.CreateGroupSync(request);
+                }
+            }
+       
+          
+       
+        }
+
+
+        public bool IaiAddPerso( string img64,string PersonNameId,string PersonName,  int PersonGender)
+        {
+
+            Credential cred = new Credential
+            {
+                SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+            };
+
+            ClientProfile clientProfile = new ClientProfile();
+            HttpProfile httpProfile = new HttpProfile();
+
+
+            httpProfile.Endpoint = ("iai.tencentcloudapi.com");
+            clientProfile.HttpProfile = httpProfile;
+
+            var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
+           var ret=  iaiClient.CreatePerson(new TencentCloud.Iai.V20200303.Models.CreatePersonRequest
+            {
+                GroupId = App.Configuration["IAIGroupSet:ID"],
+                Image = img64,
+                 PersonId= PersonNameId,
+                PersonName= PersonName,
+                Gender=PersonGender,
+
+            });
+
+            if(ret.IsFaulted)
+            return false;
+            else
+            return true;
+
+
+
+        }
+
+
+        public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender)
+        {
+
+            Credential cred = new Credential
+            {
+                SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+            };
+
+            ClientProfile clientProfile = new ClientProfile();
+            HttpProfile httpProfile = new HttpProfile();
+
+
+            httpProfile.Endpoint = ("iai.tencentcloudapi.com");
+            clientProfile.HttpProfile = httpProfile;
+            var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
+            var ret = iaiClient.CreateFace( new TencentCloud.Iai.V20200303.Models.CreateFaceRequest
+            {
+              
+                PersonId = PersonNameId,
+                Images = [img64],
+                 
+        
+
+            });
+
+            if (ret.IsFaulted)
+                return false;
+            else
+                return true;
+
+
+
+        }
+
+
+        public VerifyFaceResponse VerifyFace(string img64, string PersonNameId)
+        {
+            Credential cred = new Credential
+            {
+                SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T",
+                SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n"
+            };
+
+            ClientProfile clientProfile = new ClientProfile();
+            HttpProfile httpProfile = new HttpProfile();
+
+
+            httpProfile.Endpoint = ("iai.tencentcloudapi.com");
+            clientProfile.HttpProfile = httpProfile;
+            var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile);
+            var ret = iaiClient.VerifyFaceSync(new  TencentCloud.Iai.V20200303.Models.VerifyFaceRequest
+            {
+
+                PersonId = PersonNameId,
+                 Image= img64
+
+
+
+            });
+            return ret;
+
+
+
+        }
+        #endregion
+
+    }
+
+    //杩斿洖鎵╁睍鍙傛暟
+    internal class AdvancedInfo
+    {
+        /// <summary>
+        /// idCard 瑁佸壀鍚庤韩浠借瘉鐓х墖鐨刡ase64缂栫爜锛岃姹� Config.CropIdCard 鏃惰繑鍥烇紱
+        /// </summary>
+        public string? IdCard { get; set; }
+        /// <summary>
+        /// 韬唤璇佸ご鍍忕収鐗囩殑base64缂栫爜锛岃姹� Config.CropPortrait 鏃惰繑鍥烇紱
+        /// </summary>
+        public string? Portrait { get; set; }
+        /// <summary>
+        /// 鍥剧墖璐ㄩ噺鍒嗘暟锛岃姹� Config.Quality 鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤秺妯$硦锛屽缓璁槇鍊尖墺50锛�;
+        /// </summary>
+        public int? Quality { get; set; }
+        /// <summary>
+        /// 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅闃堝�煎垎鏁帮紝璇锋眰 Config.BorderCheckWarn鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤竟妗嗛伄鎸″彲鑳芥�ц秺浣庯紝寤鸿闃堝�尖墹50锛�;
+        /// </summary>
+        public int BorderCodeValue { get; set; }
+        /// <summary>
+        /// 鍛婅淇℃伅锛孋ode 鍛婅鐮佸垪琛ㄥ拰閲婁箟锛�
+        ///-9100 韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅锛�
+        ///-9101 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅锛�
+        ///-9102 韬唤璇佸鍗颁欢鍛婅锛�
+        ///-9103 韬唤璇佺炕鎷嶅憡璀︼紝
+        ///-9105 韬唤璇佹鍐呴伄鎸″憡璀︼紝
+        ///-9104 涓存椂韬唤璇佸憡璀︼紝
+        ///-9106 韬唤璇� PS 鍛婅锛�
+        ///-9107 韬唤璇佸弽鍏夊憡璀︺��
+        /// </summary>
+        public List<int> WarnInfos { get; set; }
+    }
+
+}
diff --git a/Admin.NET/EzUpFile/EzFileUploadService.cs b/Admin.NET/EzUpFile/EzFileUploadService.cs
new file mode 100644
index 0000000..568e928
--- /dev/null
+++ b/Admin.NET/EzUpFile/EzFileUploadService.cs
@@ -0,0 +1,754 @@
+锘�
+using Aliyun.Acs.Core.Exceptions;
+using Aliyun.OSS;
+
+using Aliyun.OSS.Util;
+using cylsg.utility;
+using cylsg.utility.Extend;
+using EzTencentCloud;
+using Furion;
+using Furion.DependencyInjection;
+using Furion.FriendlyException;
+using Microsoft.AspNetCore.Http;
+
+using SqlSugar;
+using System.Drawing;
+using System.Globalization;
+using System.Security.Cryptography;
+using System.Text;
+using Tea;
+using TencentCloud.Ocr.V20181119.Models;
+
+using Task = System.Threading.Tasks.Task;
+using Newtonsoft.Json;
+using static AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleResponseBody;
+namespace EzUpFile
+{
+    /// <summary>
+    /// 闄勪欢鏈嶅姟绋嬪簭
+    /// </summary>
+    public class EzFileUploadService : IEzFileUploadService, IScoped
+    {
+
+        private readonly HttpRequest? _request;
+        private readonly ISqlSugarClient _sqlSugarClient;
+        private readonly ITencentCloudService _tcs;
+        public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient, ITencentCloudService tencentCloudService)
+        {
+
+            _request = httpContext.HttpContext?.Request ?? null;
+            _sqlSugarClient = sqlSugarClient;
+            _tcs = tencentCloudService;
+        }
+
+        /// <summary>
+        /// 涓婁紶闄勪欢
+        /// </summary>
+        /// <returns></returns>
+        public async Task<string> UploadFiles()
+        {
+
+
+            var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M
+
+            var file = _request?.Form?.Files["file"];
+            if (file == null)
+            {
+                throw Oops.Oh("浣犳病鏈夐�夋嫨鏂囦欢");
+            }
+
+            var fileName = file.FileName;
+            var fileExt = Path.GetExtension(fileName).ToLowerInvariant();
+
+            //妫�鏌ュぇ灏�
+            if (file.Length > maxSize)
+            {
+                throw Oops.Oh("鏂囦欢澶т簬璁剧疆鏂囦欢");
+            }
+
+            ////妫�鏌ユ枃浠舵墿灞曞悕
+            //if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(op.AttachmentSaveFileExtName?.Split(',') ?? new string[] { "" }, fileExt.Substring(1).ToLower()) == -1)
+            //{
+            //    throw Oops.Oh("涓婁紶鏂囦欢鎵╁睍鍚嶆槸涓嶅厑璁哥殑鎵╁睍鍚�,璇蜂笂浼犲悗缂�鍚嶄负锛�" + op.AttachmentSaveFileExtName);
+
+            //}
+
+            string url = string.Empty;
+
+
+            url = await UpLoadFileForAliYunOSS(fileExt, file);
+
+
+            return url;
+
+
+        }
+
+        /// <summary>
+        /// 涓婁紶base64
+        /// </summary>
+        /// <param name="base64"></param>
+        /// <returns></returns>
+        public async Task<string> UploadFilesFByBase64(string base64)
+        {
+
+            if (string.IsNullOrEmpty(base64))
+            {
+                throw Oops.Oh("娌℃湁鍐呭");
+            }
+
+            //妫�鏌ヤ笂浼犲ぇ灏�
+            if (!CommonHelper.CheckBase64Size(base64, 5))
+            {
+                throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M");
+
+            }
+
+            base64 = base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲
+            byte[] bytes = Convert.FromBase64String(base64);
+            MemoryStream memStream = new MemoryStream(bytes);
+
+            string url = string.Empty;
+
+            url = await UpLoadBase64ForAliYunOSS(memStream);
+
+
+
+            return url;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鏂囦欢
+        /// </summary>
+        /// <param name="Path"></param>
+        /// <returns></returns>
+        public async Task<bool> DelFile(string Path)
+        {
+
+
+            var ret = await DelFileForAliYunOSS(Path);
+
+
+
+            return ret;
+        }
+
+
+
+        #region 闃块噷浜戜笂浼犳柟娉曪紙File锛�
+        /// <summary>
+        /// 闃块噷浜戜笂浼犳柟娉曪紙File锛�
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="fileExt"></param>
+        /// <param name="file"></param>
+        /// <returns></returns>
+        public async Task<string> UpLoadFileForAliYunOSS(string fileExt, IFormFile file)
+        {
+
+
+            var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
+            var today = DateTime.Now.ToString("yyyyMMdd");
+
+            //涓婁紶鍒伴樋閲屼簯
+            await using var fileStream = file.OpenReadStream();
+            var md5 = OssUtils.ComputeContentMd5(fileStream, file.Length);
+
+            var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰�
+            //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword
+            var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+            //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5
+            var objectMeta = new ObjectMetadata
+            {
+                ContentMd5 = md5
+            };
+
+
+            var task = Task.Run(() =>
+            //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5)
+                aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta)
+
+
+
+              );
+            //绛夊緟瀹屾垚
+            try
+            {
+                task.Wait();
+            }
+            catch (AggregateException ex)
+            {
+
+                throw Oops.Oh(ex.Message);
+            }
+
+
+
+            return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
+        }
+
+        #endregion
+
+
+
+
+
+        #region 闃块噷浜戜笂浼犳柟娉曪紙Base64锛�
+        /// <summary>
+        /// 闃块噷浜戜笂浼犳柟娉曪紙Base64锛�
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="memStream"></param>
+        /// <returns></returns>
+        public async Task<string> UpLoadBase64ForAliYunOSS(MemoryStream memStream)
+        {
+
+
+            var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
+            var today = DateTime.Now.ToString("yyyyMMdd");
+
+            // 璁剧疆褰撳墠娴佺殑浣嶇疆涓烘祦鐨勫紑濮�
+            memStream.Seek(0, SeekOrigin.Begin);
+
+            await using var fileStream = memStream;
+            var md5 = OssUtils.ComputeContentMd5(fileStream, memStream.Length);
+
+            var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰�
+                                                                                                        //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword
+            var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+            //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5
+            var objectMeta = new ObjectMetadata
+            {
+                ContentMd5 = md5
+            };
+            try
+            {
+                //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5)
+                aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta);
+            }
+            catch (AggregateException ex)
+            {
+
+                throw Oops.Oh(ex.Message);
+            }
+
+
+            //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src
+
+            return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
+
+        }
+
+        #endregion
+
+
+
+
+
+        #region 鍒犻櫎鏂囦欢
+
+        /// <summary>
+        /// 闃块噷浜戝垹闄�
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="fileUrl">甯xx.xx鐨勯摼鎺ュ湴鍧�</param>
+        /// <returns></returns>
+        public async Task<bool> DelFileForAliYunOSS(string fileUrl)
+        {
+
+
+
+
+
+
+
+
+
+
+            //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword
+            var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+
+            try
+            {
+                var task = Task.Run(() => aliYun.DeleteObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], (App.Configuration["FileUploadOptions:SavePath"]?.RemoveStartWithStr("/") ?? "") + fileUrl.GetFileName()));
+
+
+                task.Wait();
+
+            }
+            catch (Exception ex)
+            {
+
+                throw Oops.Oh(ex.Message);
+            }
+
+
+            //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src
+
+            return true;
+
+        }
+
+
+
+
+        #endregion
+
+        #region 璇嗗埆涓婁紶
+        public async Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT")
+        {
+            try
+            {
+
+                var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M
+
+                var FileData = _request?.Form?.Files["file"];
+
+                if (FileData.Length > maxSize)
+                {
+                    throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M");
+                }
+
+
+                //澶勭悊鍥惧舰
+                //  var FileData = Request.Form.Files[0];
+
+                Image oimage = Image.FromStream(FileData.OpenReadStream());
+                if (oimage == null)
+                {
+                    throw Oops.Oh(" 涓婁紶澶辫触");
+                }
+
+                MemoryStream ms = new MemoryStream();
+                if (oimage.Width > 1200)
+
+                {
+                    if (oimage.Width > oimage.Height)
+                        oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                    else
+                        oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                }
+                else
+                    oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                ms.Position = 0;
+
+                var arr = ms.ToArray();
+                string img64 = Convert.ToBase64String(arr);
+
+                IDCardOCRResponse idcordinfo = null;
+                string url = "";
+
+                try
+                {
+
+
+                    idcordinfo = _tcs.IdCord(img64, PageName == "FRONT");
+
+                    url = await UploadFilesFByBase64(_tcs.GetIdCordImg());
+                    idcordinfo.AdvancedInfo = null;
+
+                    return (idcordinfo, url);
+
+                }
+                catch (Exception e)
+                {
+
+                    throw Oops.Oh(e.Message + "鑵捐浜戯紝鎴栬�呴樋閲屼簯鎿嶄綔閿欒");
+                }
+            }
+            catch (Exception e)
+            {
+
+                throw Oops.Oh(e.Message);
+            }
+
+        }
+
+        public async Task<(BizLicenseOCRResponse, string)> UpBizLicense()
+        {
+            try
+            {
+
+                var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M
+
+                var FileData = _request?.Form?.Files["file"];
+
+                if (FileData.Length > maxSize)
+                {
+                    throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M");
+                }
+
+
+                //澶勭悊鍥惧舰
+                //  var FileData = Request.Form.Files[0];
+
+                Image oimage = Image.FromStream(FileData.OpenReadStream());
+                if (oimage == null)
+                {
+                    throw Oops.Oh(" 涓婁紶澶辫触");
+                }
+
+                MemoryStream ms = new MemoryStream();
+                if (oimage.Width > 1200)
+
+                {
+                    if (oimage.Width > oimage.Height)
+                        oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                    else
+                        oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                }
+                else
+                    oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                ms.Position = 0;
+
+                var arr = ms.ToArray();
+                string img64 = Convert.ToBase64String(arr);
+
+                BizLicenseOCRResponse info = null;
+                string url = "";
+
+                try
+                {
+                    info = _tcs.BizLicenseOCR(img64);
+
+                    url = await UploadFilesFByBase64(img64);
+
+                    return (info, url);
+
+                }
+                catch (Exception e)
+                {
+
+                    throw Oops.Oh(e.Message);
+                }
+            }
+            catch (Exception e)
+            {
+
+                throw Oops.Oh(e.Message);
+            }
+        }
+
+
+        public async Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender)
+        {
+            try
+            {
+
+                var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M
+
+                var FileData = _request?.Form?.Files["file"];
+
+                if (FileData.Length > maxSize)
+                {
+                    throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭500K");
+                }
+
+
+                //澶勭悊鍥惧舰
+                //  var FileData = Request.Form.Files[0];
+
+                Image oimage = Image.FromStream(FileData.OpenReadStream());
+                if (oimage == null)
+                {
+                    throw Oops.Oh(" 涓婁紶澶辫触");
+                }
+
+                MemoryStream ms = new MemoryStream();
+                if (oimage.Width > 600)
+
+                {
+                    if (oimage.Width > oimage.Height)
+                        oimage.GetThumbnailImage(600, 400, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                    else
+                        oimage.GetThumbnailImage(400, 600, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                }
+                else
+                    oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+                ms.Position = 0;
+
+                var arr = ms.ToArray();
+                string img64 = Convert.ToBase64String(arr);
+
+                bool info = false;
+                string url = "";
+
+                try
+                {
+                    info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender);
+
+                    url = await UploadFilesFByBase64(img64);
+
+                    return (info, url);
+
+                }
+                catch (Exception e)
+                {
+
+                    throw Oops.Oh(e.Message);
+                }
+            }
+            catch (Exception e)
+            {
+
+                throw Oops.Oh(e.Message);
+            }
+        }
+        /// <inheritdoc/>
+
+        public async Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender)
+        {
+            if (string.IsNullOrEmpty(imgBase64))
+            {
+                throw Oops.Oh("娌℃湁鍐呭");
+            }
+
+            //妫�鏌ヤ笂浼犲ぇ灏�
+            if (!CommonHelper.CheckBase64Size(imgBase64, 5))
+            {
+                throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M");
+            }
+
+            imgBase64 = imgBase64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲
+            bool info = false;
+            string url = "";
+
+            try
+            {
+                info = _tcs.IaiAddPerso(imgBase64, CoredID, Name, PersonGender);
+
+                url = await UploadFilesFByBase64(imgBase64);
+
+                return (info, url);
+
+            }
+            catch (Exception e)
+            {
+
+                throw Oops.Oh(e.Message);
+            }
+        }
+
+
+        #endregion
+
+        #region 鏈湴涓婁紶浜戞湇鍔″櫒鍑瘉璁$畻
+
+
+        public Dictionary<string, string> GetToken1()
+        {
+
+            var dir = DateTime.Now.ToString("yyyyMMdd") + "/";
+            // 鏋勯�燨ssClient瀹炰緥銆� endpoint 鏍煎紡:https://oss-cn-beijing.aliyuncs.com
+            //  var ossClient = new OssClient( App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+            var rt = GetSTSToken();
+
+
+
+
+            String securityToken = rt.AccessKeySecret;   //鑾峰彇Token
+            var config = new PolicyConditions();
+
+            config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// 鏂囦欢澶у皬鑼冨洿锛氬崟浣峛yte
+            config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);
+            //鎹呭悕
+            config.AddConditionItem("bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"]);
+            config.AddConditionItem("x-oss-signature-version", "OSS4-HMAC-SHA256");
+            config.AddConditionItem("x-oss-security-token", securityToken);
+            //     //璇锋眰鏃堕棿
+            config.AddConditionItem("x-oss-date", DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'"));
+            config.AddConditionItem("x-oss-credential", App.Configuration["FileUploadOptions:AliOSSAccessKeyID"] + "/" + DateTime.Now.ToString("yyyyMMdd") + "/cn-chengdu/oss/aliyun_v4_request");
+            var expire = DateTimeOffset.Now.AddMinutes(30);// 杩囨湡鏃堕棿
+
+            // 鐢熸垚 Policy锛屽苟杩涜 Base64 缂栫爜
+            //  var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config);
+            //   var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy));
+
+            // 璁$畻绛惧悕
+            var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]));
+            //    var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64));
+            //  var sign = Convert.ToBase64String(bytes);
+
+            return new Dictionary<string, string>();
+        }
+
+
+
+
+
+
+        public static AlibabaCloud.SDK.Sts20150401.Client CreateClient()
+        {
+            // 宸ョ▼浠g爜娉勯湶鍙兘浼氬鑷� AccessKey 娉勯湶锛屽苟濞佽儊璐﹀彿涓嬫墍鏈夎祫婧愮殑瀹夊叏鎬с�備互涓嬩唬鐮佺ず渚嬩粎渚涘弬鑰冦��
+            // 寤鸿浣跨敤鏇村畨鍏ㄧ殑 STS 鏂瑰紡锛屾洿澶氶壌鏉冭闂柟寮忚鍙傝锛歨ttps://help.aliyun.com/document_detail/378671.html銆�
+            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
+            {
+                // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_ID銆�
+                AccessKeyId = "LTAI5tKegnEbaSRPFRwDxeFd",
+                // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_SECRET銆�
+                AccessKeySecret = "9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl",
+            };
+            // Endpoint 璇峰弬鑰� https://api.aliyun.com/product/Sts
+            config.Endpoint = "sts.cn-chengdu.aliyuncs.com";
+            return new AlibabaCloud.SDK.Sts20150401.Client(config);
+        }
+
+        /// <summary>
+        /// 鑾峰彇涓存椂鍑瘉
+        /// </summary>
+        public static AssumeRoleResponseBodyCredentials GetSTSToken()
+        {
+            AlibabaCloud.SDK.Sts20150401.Client client = CreateClient();
+            AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest
+            {
+                Policy = "{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}",
+                DurationSeconds = 3600,
+                RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl",
+                RoleSessionName = "weixinupdataRl",
+            };
+            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
+            try
+            {
+                // 澶嶅埗浠g爜杩愯璇疯嚜琛屾墦鍗� API 鐨勮繑鍥炲��
+                var data = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
+                if (data.StatusCode == 200)
+                {
+
+                    return data.Body?.Credentials;
+                }
+                throw Oops.Oh("闃块噷浜戣幏鍙栦复鏃跺嚟璇侀敊璇�");
+            }
+            catch (TeaException error)
+            {
+
+                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
+                throw;
+            }
+            catch (Exception _error)
+            {
+                TeaException error = new TeaException(new Dictionary<string, object>
+                {
+                    { "message", _error.Message }
+                });
+
+                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
+                throw error;
+            }
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public Dictionary<string, string> GetToken()
+        {
+            // 鑾峰彇鐜鍙橀噺
+
+            string regionId = "cn-chengdu";
+            string roleSessionName = "weixinupdataRl";
+
+
+
+
+
+
+
+            // 瀹氫箟STS涓存椂璁块棶鍑瘉鍙橀噺
+            string stsAccessKeyId = null;
+            string stsSecretAccessKey = null;
+            string securityToken = null;
+
+            try
+            {
+                var rt = GetSTSToken();
+
+                stsAccessKeyId = rt.AccessKeyId;
+                stsSecretAccessKey = rt.AccessKeySecret;
+                securityToken = rt.SecurityToken;
+            }
+            catch (ServerException e)
+            {
+                throw;
+            }
+            catch (ClientException e)
+            {
+                throw;
+            }
+
+            // 鏍煎紡鍖栬姹傛棩鏈�
+            DateTimeOffset now = DateTimeOffset.UtcNow;
+            string dtObj1 = now.ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture);
+            string dtObj2 = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
+            string expirationTime = now.AddHours(3).ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture);
+
+            // 鍒涘缓policy
+            Dictionary<string, object> policy = new Dictionary<string, object>
+        {
+            { "expiration", expirationTime },
+            { "conditions", new List<object>
+                {
+                    new Dictionary<string, string> { { "bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"] } }, // 璇峰皢<bucketname>鏇挎崲涓烘偍鐨勫疄闄匓ucket鍚嶇О
+                    new Dictionary<string, string> { { "x-oss-signature-version", "OSS4-HMAC-SHA256" } },
+                    new Dictionary<string, string> { { "x-oss-credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" } }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing
+                    new Dictionary<string, string> { { "x-oss-security-token", securityToken } },
+                    new Dictionary<string, string> { { "x-oss-date", dtObj1 } }
+                }
+            }
+        };
+
+            string jsonPolicy = JsonConvert.SerializeObject(policy);
+
+            // 鏋勯�犲緟绛惧悕瀛楃涓诧紙StringToSign锛�
+            string stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonPolicy));
+
+            // 璁$畻SigningKey
+            byte[] dateKey = HmacSha256("aliyun_v4" + stsSecretAccessKey, dtObj2);
+            byte[] dateRegionKey = HmacSha256(dateKey, regionId); // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing
+            byte[] dateRegionServiceKey = HmacSha256(dateRegionKey, "oss");
+            byte[] signingKey = HmacSha256(dateRegionServiceKey, "aliyun_v4_request");
+
+            // 璁$畻Signature
+            byte[] result = HmacSha256(signingKey, stringToSign);
+            string signature = BitConverter.ToString(result).Replace("-", "").ToLower();
+
+            Dictionary<string, string> messageMap = new Dictionary<string, string>
+        {
+            { "security_token", securityToken },
+            { "signature", signature },
+            { "x_oss_date", dtObj1 },
+            { "x_oss_credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing
+            { "x_oss_signature_version", "OSS4-HMAC-SHA256" },
+            { "policy", stringToSign }
+        };
+
+            // 鎵撳嵃杩斿洖鑷冲鎴风鐨勭鍚嶄俊鎭�
+            return messageMap;
+        }
+
+
+
+        private static byte[] HmacSha256(byte[] key, string message)
+        {
+            using (HMACSHA256 hmac = new HMACSHA256(key))
+            {
+                return hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
+            }
+        }
+
+        private static byte[] HmacSha256(string key, string message)
+        {
+            using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)))
+            {
+                return hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
+            }
+        }
+
+
+
+        #endregion
+    }
+
+
+
+
+}
+
diff --git a/Admin.NET/EzUpFile/EzUpFile.csproj b/Admin.NET/EzUpFile/EzUpFile.csproj
new file mode 100644
index 0000000..3cb7091
--- /dev/null
+++ b/Admin.NET/EzUpFile/EzUpFile.csproj
@@ -0,0 +1,30 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.4" />
+    <PackageReference Include="Aliyun.Acs.Core" Version="1.0.1" />
+    <PackageReference Include="Aliyun.Acs.Sts" Version="1.0.1" />
+    <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
+    <PackageReference Include="Utf8Json" Version="1.3.7" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" />
+    <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" />
+    <ProjectReference Include="..\EzTencentCloud\EzTencentCloud.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Update="UpFileConfig.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>
diff --git a/Admin.NET/EzUpFile/IEzFileUploadService.cs b/Admin.NET/EzUpFile/IEzFileUploadService.cs
new file mode 100644
index 0000000..580272a
--- /dev/null
+++ b/Admin.NET/EzUpFile/IEzFileUploadService.cs
@@ -0,0 +1,73 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TencentCloud.Ocr.V20181119.Models;
+
+namespace EzUpFile
+{
+    public interface IEzFileUploadService
+    {
+        /// <summary>
+        /// 涓婁紶base64
+        /// </summary>
+        /// <param name="base64"></param>
+        /// <returns></returns>
+        Task<string> UploadFilesFByBase64(string base64);
+        /// <summary>
+        /// 涓婁紶鏂囦欢
+        /// </summary>
+        /// <returns></returns>
+        Task<string> UploadFiles();
+        /// <summary>
+        /// 鍒犻櫎鏂囦欢
+        /// </summary>
+        /// <param name="Path"></param>
+        /// <returns></returns>
+        Task<bool> DelFile(string Path);
+
+        /// <summary>
+        /// 涓婁紶韬唤璇�
+        /// </summary>
+        /// <param name="Path"></param>
+        /// <returns></returns>
+        Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT");
+
+
+        /// <summary>
+        /// 涓婁紶钀ヤ笟鎵х収
+        /// </summary>
+        /// <returns></returns>
+        Task<(BizLicenseOCRResponse, string)> UpBizLicense();
+
+        /// <summary>
+        /// 鍒涘缓浜鸿劯鐗瑰緛 鏂囦欢浼犻��
+        /// </summary>
+        /// <param name="CoredID"> 韬唤璇佸彿</param>
+        /// <param name="Name">濮撳悕</param>  
+        /// <param name="PersonGender"> 鎬у埆    0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param>
+        /// <returns></returns>
+        Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender);
+        /// <summary>
+        /// 鍒涘缓浜鸿劯鐗瑰緛
+        /// </summary>
+        /// <param name="imgBase64">img base64</param>
+        /// <param name="CoredID"> 韬唤璇佸彿</param>
+        /// <param name="Name">濮撳悕</param>  
+        /// <param name="PersonGender"> 鎬у埆    0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param>
+        /// <returns></returns>
+        Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        Dictionary<string, string> GetToken();
+
+    }
+
+
+
+
+}
diff --git a/Admin.NET/EzUpFile/UpFileConfig.json b/Admin.NET/EzUpFile/UpFileConfig.json
new file mode 100644
index 0000000..d8a0aca
--- /dev/null
+++ b/Admin.NET/EzUpFile/UpFileConfig.json
@@ -0,0 +1,12 @@
+{
+  "FileUploadOptions": {
+
+    "AliOSSBucketName": "appimchat",
+    "SavePath": "cylsg/",
+    "AliOSSEndpoint": "oss-accelerate.aliyuncs.com",
+    "AliOSSAccessKeyID": "LTAI5tNYGwTd3swLhC8H2XYV",
+    "AliOSSAccessKeySecret": "TyfkpYbXRUCh1K8LLtUyxY3ZcFCy1A",
+    "AliOSSSaveBaseUrl": "https://appimchat.oss-cn-chengdu.aliyuncs.com/"
+
+  }
+}
diff --git a/Admin.NET/EzUpFile/UpFileController.cs b/Admin.NET/EzUpFile/UpFileController.cs
new file mode 100644
index 0000000..5028e5c
--- /dev/null
+++ b/Admin.NET/EzUpFile/UpFileController.cs
@@ -0,0 +1,196 @@
+锘縰sing EzTencentCloud;
+using Furion.FriendlyException;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.HttpResults;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.IdentityModel.Abstractions;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TencentCloud.Ocr.V20181119.Models;
+
+namespace EzUpFile
+{
+    /// <summary>
+    /// 鏂囦欢涓婁紶涓嬭浇
+    /// </summary>
+    [DynamicApiController]
+ [ApiDescriptionSettings("FZCAPISYS", Order = 149)]  
+    public class UpFileController
+    {
+        /// <summary>
+        /// 鑾峰彇鏂囦欢 涓婁紶token
+        /// </summary>  
+        /// <returns></returns>
+        [HttpGet]
+
+        public Dictionary<string, string> GetToken([FromServices] IEzFileUploadService fileUploadService)
+        {
+            return fileUploadService.GetToken();
+        }
+        /// <summary>
+        /// 涓婁紶韬唤璇佷俊鎭�
+        /// </summary>   
+        /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰  Back  鍥藉窘鍙嶉潰 </param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<Object> UploadIdCord([FromServices] IEzFileUploadService fileUploadService,IFormFile file, [FromQuery] string PageName = "FRONT")
+        {
+
+
+            var ret= await fileUploadService.UpIdCord(PageName);
+            return new { Info = ret.Item1, url = ret.Item2 };
+        }
+
+        /// <summary>
+        /// 涓婁紶鍜岃瘑鍒惀涓氭墽鐓�
+        /// </summary>   
+        /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰  Back  鍥藉窘鍙嶉潰 </param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<Object> UpBizLicense([FromServices] IEzFileUploadService fileUploadService, IFormFile file)
+        {
+
+
+            var ret= await fileUploadService.UpBizLicense();
+            return new { Info = ret.Item1, url = ret.Item2 };
+
+        }
+        /// <summary>
+        /// 澧炲姞浜鸿劯鐗瑰緛
+        /// </summary>         
+        /// <param name="CordId">韬唤璇佸彿</param>
+        /// <param name="Name">鍚嶇О</param>
+        /// <param name="Gender">0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<object> IaiAddPerso([FromServices] IEzFileUploadService fileUploadService, IFormFile file,[FromQuery] string CordId, [FromQuery] string Name, [FromQuery] int Gender)
+        {
+
+
+            var ret= await fileUploadService.IaiAddPerso(CordId, Name,Gender);
+            return new { IsOK = ret.Item1, url = ret.Item2 };
+
+
+        }
+
+        /// <summary>
+        /// 澧炲姞浜鸿劯搴� base64
+        /// </summary>   
+        /// <param name="param"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<object> IaiAddPersoBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData param)
+        {
+            if (string.IsNullOrEmpty(param.imgBase64))
+                throw Oops.Oh("娌℃湁鏂囦欢鍐呭");
+            if (string.IsNullOrEmpty(param.Name))
+                throw Oops.Oh("娌℃湁濮撳悕");
+            if (string.IsNullOrEmpty(param.CordId))
+                throw Oops.Oh("娌℃湁韬唤璇佷俊鎭�");
+            var ret = await fileUploadService.IaiAddPerso(param.imgBase64, param.CordId, param. Name, param.Gender??0);
+            return new { IsOK = ret.Item1, url = ret.Item2 };
+
+
+        }
+        public async Task test([FromServices] ITencentCloudService fileUploadService)
+        {
+
+            fileUploadService.IaiCreatGroup();
+
+        }
+
+        /// <summary>
+        /// 涓婁紶闄勪欢
+        /// </summary>
+        /// <param name="fileUploadService"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<string> UpdateFile([FromServices] IEzFileUploadService fileUploadService, IFormFile file)
+        {
+            return await fileUploadService.UploadFiles();
+        }
+        /// <summary>
+        /// 鑾峰彇鍒板鎴风鐨処Pv4
+        /// </summary>
+        /// <param name="httpContextAccessor"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public string GetIp4([FromServices] IHttpContextAccessor httpContextAccessor)
+        {
+            var httpc = httpContextAccessor.HttpContext;
+            var ipv4 = httpc.GetRemoteIpAddressToIPv4();
+            return ipv4;
+        }
+        /// <summary>
+        /// 涓婁紶闄勪欢
+        /// </summary>
+        /// <param name="fileUploadService"></param>
+        /// <param name="Param"></param>    
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<string> UpdateFileBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData Param)
+        {
+            return await fileUploadService.UploadFilesFByBase64(Param.imgBase64);
+        }
+        [HttpPost]
+        public async Task<bool> DelFile([FromServices] IEzFileUploadService fileUploadService, DelFileData Param)
+        {
+            return await fileUploadService.DelFile(Param.FilePath);
+        }
+    }
+    /// <summary>
+    /// 涓婁紶鏁版嵁
+    /// </summary>
+    public class UpDataFileData
+
+    {
+        /// <summary>
+        /// 鏁版嵁base64
+        /// </summary>
+        public string imgBase64 { get; set; }
+        /// <summary>
+        /// 韬唤璇佸彿鐮�
+        /// </summary>
+        public string? CordId { get; set; }
+        /// <summary>
+        /// 濮撳悕
+        /// </summary>
+        public string? Name { get; set; }
+        /// <summary>
+        /// 鎬у埆
+        /// </summary>
+        public int? Gender { get; set; }
+    }
+    /// <summary>
+    /// 涓婁紶鏁版嵁
+    /// </summary>
+    public class DelFileData
+
+    {
+        /// <summary>
+        /// 鏁版嵁base64
+        /// </summary>
+        public string FilePath { get; set; }
+    }
+    /// <summary>
+    /// 韬唤璇佽繑鍥炶緭鍑�
+    /// </summary>
+    public class IdCordOuput
+    {
+        /// <summary>
+        /// 韬唤璇佺浉鍏充俊鎭�
+        /// </summary>
+        public IDCardOCRResponse IdCordInfo { get; set; }
+
+        /// <summary>
+        ///  url
+        /// </summary>
+        public string Url {  get; set; }
+
+    }
+}
diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs
index b4f00fe..376ef20 100644
--- a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs
+++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs
@@ -1,10 +1,24 @@
-锘縰sing Furion.DynamicApiController;
+锘縰sing Admin.NET.Core.Service;
+using Admin.NET.Core;
+using Furion.DataEncryption;
+using Furion.DynamicApiController;
+using Furion.EventBus;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Lazy.Captcha.Core;
+using Microsoft.AspNetCore.Http;
+using FZCZTB.NET.MD.CutomerMd;
+using Microsoft.AspNetCore.Authorization;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel;
+using FZCZTB.NET.SYSService.MSM;
+using FZCTB.NET.API.Application.Auth.DTO;
+using Furion.FriendlyException;
+using FZCZTB.NET.SYSService.CustomerSYS;
 
 namespace FZCTB.NET.API.Application.Auth
 {
@@ -14,5 +28,180 @@
     [ApiDescriptionSettings("FZCAPISYS", Order = 149)]
     public class AuthService: IDynamicApiController
     {
+
+
+        private readonly UserManager _userManager;
+        private readonly SqlSugarRepository<FBS_Customer> _sysUserRep;
+        private readonly IHttpContextAccessor _httpContextAccessor;
+        private readonly SysMenuService _sysMenuService;
+        private readonly SysOnlineUserService _sysOnlineUserService;
+        private readonly SysConfigService _sysConfigService;
+        private readonly SysUserService _sysUserService;
+        private readonly ZCSMSService _sysSmsService;
+        private readonly SysLdapService _sysLdapService;
+        private readonly ICaptcha _captcha;
+        private readonly IEventPublisher _eventPublisher;
+        private readonly SysCacheService _sysCacheService;
+
+        public AuthService(
+            SqlSugarRepository<FBS_Customer> sysUserRep,
+            IHttpContextAccessor httpContextAccessor,
+            SysOnlineUserService sysOnlineUserService,
+            SysConfigService sysConfigService,
+            SysLdapService sysLdapService,
+            IEventPublisher eventPublisher,
+            ZCSMSService sysSmsService,
+            SysCacheService sysCacheService,
+            SysMenuService sysMenuService,
+            SysUserService sysUserService,
+            UserManager userManager,
+            ICaptcha captcha)
+        {
+            _captcha = captcha;
+            _sysUserRep = sysUserRep;
+            _userManager = userManager;
+            _sysSmsService = sysSmsService;
+            _eventPublisher = eventPublisher;
+            _sysUserService = sysUserService;
+            _sysMenuService = sysMenuService;
+            _sysCacheService = sysCacheService;
+            _sysConfigService = sysConfigService;
+            _httpContextAccessor = httpContextAccessor;
+            _sysOnlineUserService = sysOnlineUserService;
+            _sysLdapService = sysLdapService;
+        }
+
+        /// <summary>
+        /// 鎵嬫満鍙风櫥褰� 馃敄
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [DisplayName("鎵嬫満鍙风櫥褰�")]
+        public virtual async Task<CustomerLoginOutput> LoginPhone([Required] CustomerLoginPhoneInput input)
+        {
+            if(input.Code!="TEST")
+            // 鏍¢獙鐭俊楠岃瘉鐮�
+            _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code });
+
+            // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴�
+            // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴�
+            var user = await _sysUserRep.AsQueryable().Where(x => x.Account == input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync();
+            if (user == null)
+            {
+              throw    Oops.Oh("璇ョ敤鎴锋病鏈夋敞鍐�");
+            }
+           if(user.Status== StatusEnum.Disable)
+            {
+                throw Oops.Oh("鐢ㄥ紓甯�");
+            }
+
+
+            return await CreateToken(user, input.ExRuleCode??"");
+        }
+        /// <summary>
+        /// 鎵嬫満鍙风櫥褰� 馃敄
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [DisplayName("寰俊鎵爜鐧诲綍")]
+        public virtual async Task<CustomerLoginOutput> WeiXinLoginPhone([Required] CustomerLoginPhoneInput input)
+        {
+            throw Oops.Oh("鍜嬩笉鏀寔寰俊鎵爜鐧诲綍");
+            // 鏍¢獙鐭俊楠岃瘉鐮�
+            _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code });
+
+            // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴�
+            var user = await _sysUserRep.AsQueryable().Where(x=>x.Account==input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync();
+            if(user==null)
+            {
+                
+            }
+
+            return await CreateToken(user, input.ExRuleCode );
+        }
+
+        /// <summary>
+        /// 鐢熸垚Token浠ょ墝 馃敄
+        /// </summary>
+        /// <param name="user"></param>\
+        /// <param name="sysUserEventTypeEnum"></param>\
+        /// <returns></returns>
+        [NonAction]
+        internal  async Task<CustomerLoginOutput> CreateToken(FBS_Customer user,string ExRuleCode, SysUserEventTypeEnum sysUserEventTypeEnum = SysUserEventTypeEnum.Login)
+        {
+            // 鍗曠敤鎴风櫥褰�
+            await _sysOnlineUserService.SingleLogin(user.Id);
+
+            // 鐢熸垚Token浠ょ墝
+            var tokenExpire = await _sysConfigService.GetTokenExpire();
+            var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
+        {
+            { ClaimConst.UserId, user.Id },
+            { ClaimConst.TenantId, user.TenantId },
+            { ClaimConst.Account, user.Account },
+            { ClaimConst.RealName, user.RealName },        
+         
+            { ClaimConst.UserType, "Customer" },
+                { ClaimConst.CustomerLogoinType, ExRuleCode },
+        }, tokenExpire);
+
+            // 鐢熸垚鍒锋柊Token浠ょ墝
+            var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire();
+            var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire);
+
+            // 璁剧疆鍝嶅簲鎶ユ枃澶�
+            _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken);
+
+            // Swagger Knife4UI-AfterScript鐧诲綍鑴氭湰
+            // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']);
+
+            // 鏇存柊鐢ㄦ埛鐧诲綍淇℃伅
+            user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true);
+            (user.LastLoginAddress, double? longitude, double? latitude) = CommonUtil.GetIpAddress(user.LastLoginIp);
+            user.LastLoginTime = DateTime.Now;
+            user.LastLoginDevice = CommonUtil.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent);
+            await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new
+            {
+                u.LastLoginIp,
+                u.LastLoginAddress,
+                u.LastLoginTime,
+                u.LastLoginDevice,
+            }).ExecuteCommandAsync();
+
+            var payload = new
+            {
+                Entity = user,
+                Output = new CustomerLoginOutput
+                {
+                    AccessToken = accessToken,
+                    RefreshToken = refreshToken,
+
+                     
+                     
+
+
+
+                }
+            };
+            payload.Output.ExRoles = new List<CustomerExRoleVm>();
+
+            foreach (var item in user.CoutomerExRols)
+            {
+
+                payload.Output.ExRoles.Add(new CustomerExRoleVm
+                {
+                    Code = item.ExRole.Code,
+                    Name = item.ExRole.Name,
+                    HasFlsh = item.HasFlsh
+                });
+            }
+
+            //鏆傛椂涓嶅嚭鐢ㄦ埛浜嬩欢
+            // 鍙戝竷绯荤粺鐢ㄦ埛鎿嶄綔浜嬩欢
+            //await _eventPublisher.PublishAsync(sysUserEventTypeEnum, payload);
+            return payload.Output;
+        }
     }
 }
diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs
new file mode 100644
index 0000000..daab579
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs
@@ -0,0 +1,88 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Furion.DataValidation;
+using FZCZTB.NET.MD.CutomerMd;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCTB.NET.API.Application.Auth.DTO;
+public class CustomerLoginOutput
+{
+    /// <summary>
+    /// 浠ょ墝Token
+    /// </summary>
+    public string AccessToken { get; set; }
+
+    /// <summary>
+    /// 鍒锋柊Token
+    /// </summary>
+    public string RefreshToken { get; set; }
+
+    /// <summary>
+    /// 鐢ㄦ埛瑙掕壊鍗冲畬鎴愭儏鍐�
+    /// </summary>
+    public List<CustomerExRoleVm>? ExRoles {  get; set; }
+}
+
+/// <summary>
+/// 鐢ㄦ埛瑙掕壊杩涘害
+/// </summary>
+public class CustomerExRoleVm
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+
+   
+    public   string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+  
+    public string? Code { get; set; }
+
+
+    /// <summary>
+    /// 鏄惁瀹屾垚瑙掕壊鍒涘缓
+    /// </summary>
+    public bool HasFlsh { get; set; } = false;
+
+
+
+}
+
+public class CustomerLoginPhoneInput
+{
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>
+    /// <example>admin</example>
+    [Required(ErrorMessage = "鎵嬫満鍙风爜涓嶈兘涓虹┖")]
+    [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "鎵嬫満鍙风爜涓嶆纭�")]
+    public string Phone { get; set; }
+
+    /// <summary>
+    /// 楠岃瘉鐮�
+    /// </summary>
+    /// <example>123456</example>
+    [Required(ErrorMessage = "楠岃瘉鐮佷笉鑳戒负绌�"), MinLength(4, ErrorMessage = "楠岃瘉鐮佷笉鑳藉皯浜�4涓瓧绗�")]
+    public string Code { get; set; }
+
+
+    /// <summary>
+    /// 瑙掕壊Code
+    /// </summary>
+    public string? ExRuleCode { get; set; }
+
+
+}
diff --git a/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj
index c3712b0..c176c65 100644
--- a/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj
+++ b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj
@@ -4,11 +4,13 @@
     <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" />
     <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" />
+    <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" />
     <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" />
     <ProjectReference Include="..\FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj" />
   </ItemGroup>
diff --git a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs
index baef9bb..0a9e211 100644
--- a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs
+++ b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs
@@ -4,44 +4,139 @@
 //
 // 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
 
+using Admin.NET.Core;
 using Admin.NET.Core.Service;
 using Furion.DynamicApiController;
+using Furion.FriendlyException;
+using FZCTB.NET.API.Application.User.DTO;
+using FZCZTB.NET.MD.ConfigMd;
 using FZCZTB.NET.MD.CutomerMd;
 using FZCZTB.NET.SYSService.CustomerSYS;
+using Mapster;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ViewComponents;
+using OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using static QRCoder.PayloadGenerator;
 
 namespace FZCTB.NET.API.Application.User;
 /// <summary>
-/// 瀹㈡埛澶勯噷
+/// 瀹㈡埛鎺у埗
 /// </summary>
+[ApiDescriptionSettings("FZCAPISYS", Order = 149)]
 public class CustomerService: IDynamicApiController
 {
   private  readonly CustomerManagerS _customerManager;
 
     private readonly SysCacheService _sysCacheService;
+    private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep;
+
+    private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep;
+    private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep;
     /// <summary>
     /// 
     /// </summary>
-    public CustomerService(SysCacheService cacheService, CustomerManagerS managerS)
+    public CustomerService(SysCacheService cacheService, CustomerManagerS managerS,SqlSugarRepository<FBS_Customer>  repository
+        , SqlSugarRepository<FBS_EnterpriseType> fbsenrep )
     {
         _sysCacheService= cacheService;
          _customerManager = managerS;
+        _fBS_CustomerRep = repository;
+        _fBS_EnterpriseTypeRep = fbsenrep;
     }
 
     /// <summary>
     /// 鐢ㄦ埛娉ㄥ唽
     /// </summary>
     /// <returns></returns>
-    public async Task<bool>  CustomerRegistration(CustomerDto param )
+    [AllowAnonymous]
+    [HttpPost]
+    public async Task<bool>  CustomerRegistration(CustomerRDto param )
     {
         //_customerManager.
-         await Task.CompletedTask;
+        var ExRole= (await _customerManager.GetExRole()).Where(x => x.Code == param.ExRoleCode).FirstOrDefault();
+
+     if(ExRole==null)
+        {
+            throw Oops.Oh("璇烽�夋嫨涓�涓湁鏁堢殑瑙掕壊杩涜娉ㄥ唽");
+        }
+
+        //宸查�夎鑹诧紝璇烽�夋嫨涓�涓敞鍐岃鑹�    
+       var data= await _fBS_CustomerRep.AsQueryable().Includes(X => X.CoutomerExRols,y=>y.ExRole).Where(x => x.Account == param.Account).FirstAsync();
+        if (data != null)
+        {
+            if (data.CoutomerExRols.Any(x => x.ExRole.Code == param.ExRoleCode))
+            {
+                throw Oops.Oh("宸茬粡娉ㄥ唽浜嗚瑙掕壊璇峰嬁閲嶅娉ㄥ唽");
+            }
+
+            else
+            {
+                throw Oops.Oh("璇ョ敤鎴峰悕閲嶅锛屽鏋滈渶瑕佸璇ョ敤鎴锋坊鍔犵浉搴旇鑹诧紝璇风櫥褰曚换鎰忚鑹插悗娣诲姞");
+            }
+
+        }
+       var vcode= _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{param.Phone}");
+         if(param.PhoneVCode!="TEST")
+        if(vcode!=param.PhoneVCode)
+        {
+            //鎵嬫満楠岃瘉鐮侀敊璇�
+            throw Oops.Oh("鎵嬫満楠岃瘉鐮侀敊璇紝璇疯緭鍏ユ纭殑鎵嬫満楠岃瘉鐮�");
+        }
+        //浣跨敤鍚庣珛鍗冲垹闄�
+        _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{param.Phone}");
+        var dd = param.Adapt<FBS_Customer>();
+        dd.RealName = dd.NickName;
+       
+        dd.Account = dd.Phone;
+        dd.Password = "";
+        dd.TenantId = 1300000000001;
+        dd.CreateTime = DateTime.Now;
+        dd.CreateUserId = 0;
+        dd.CreateUserName = dd.NickName;
+        dd.CoutomerExRols = new List<FBS_CoutomerExRole>()
+        {
+            new FBS_CoutomerExRole
+            {
+                 ExRoleId= ExRole?.Id??0
+                  
+                  
+            }
+        };
+            
+            
+         
+
+      await   _fBS_CustomerRep.AsSugarClient().InsertNav(dd).Include(x=>x.CoutomerExRols).ExecuteCommandAsync();
+
+
+
         return true;
+    }
+    /// <summary>
+    /// 娉ㄥ唽鐧诲綍鍙�夎鑹�
+    /// </summary>
+    /// <returns></returns>
+    [AllowAnonymous]
+    public async Task<List< ExRoleVM>> GetExRole()
+    {
+      return  await   _customerManager.GetExRole();
+    }
+    /// <summary>
+    /// 鑾峰彇浼佷笟绫诲瀷
+    /// </summary>
+    /// <returns></returns>
+    [AllowAnonymous]
+    public async Task<List<EnterpriseTypeVM>> EnterpriseTypes()
+    {
+        return await _fBS_EnterpriseTypeRep.AsQueryable().Select<EnterpriseTypeVM>().ToTreeAsync(x=>x.Child,x=>x.ParentId,null,x=>x.Id);
     }
 
 
+   
 }
diff --git a/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs
new file mode 100644
index 0000000..827245a
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs
@@ -0,0 +1,47 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using FZCZTB.NET.MD.ConfigMd;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCTB.NET.API.Application.User.DTO;
+/// <summary>
+/// 浼佷笟绫诲瀷
+/// </summary>
+public class EnterpriseTypeVM
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    [SugarColumn(IsTreeKey = true)]  //璁剧疆鍏宠仈瀛楁
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+   
+    public string Name { get; set; }
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+
+    public string Code { get; set; }
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+
+    public long  ParentId { get; set; }//鐖剁骇瀛楁
+    /// <summary>
+    /// 瀛愮被
+    /// </summary>
+
+    public List<FBS_EnterpriseType> Child { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs
new file mode 100644
index 0000000..5754d57
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs
@@ -0,0 +1,47 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.MD.ConfigMd;
+/// <summary>
+/// 浼佷笟绫婚厤缃〃
+/// </summary>
+[SugarTable("FBS_EnterpriseType", "浼佷笟绫婚厤缃〃")]
+[SugarIndex("index_{table}_A", nameof(Code), OrderByType.Asc)]
+[IncreTable]
+public class FBS_EnterpriseType: EntityBaseTenant
+{
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鍚嶇О", Length = 256)]
+    public string Name { get; set; }
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    [SugarColumn(ColumnDescription = "浠g爜", Length = 36)]
+    public string Code { get; set; }
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐖�")]
+    public long  ParentId { get; set; }//鐖剁骇瀛楁
+    /// <summary>
+    /// 瀛愮被
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    public List<FBS_EnterpriseType> Child { get; set; }
+
+
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs
new file mode 100644
index 0000000..692e6a3
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs
@@ -0,0 +1,189 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.MD.CutomerMd.Extend;
+/// <summary>
+/// 鐢ㄦ埛鎵╁睍琛� 浼佷笟璧勬枡
+/// </summary>
+[SugarTable("FBS_CusExtend", "浼佷笟璧勬枡")]
+[IncreTable]
+public class FBS_CusExtend: EntityBaseTenant
+{
+    /// <summary>
+    /// 鐢ㄦ埛ID
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐢ㄦ埛ID" )]
+    [Required(ErrorMessage = "鐢ㄦ埛ID 蹇呭~")]
+    public int CustomerId { get; set; }
+
+
+  
+    /// <summary>
+    /// 浼佷笟绫诲瀷 浠庝紒涓氱被鍨嬩腑閫夋嫨
+    /// </summary>
+    [SugarColumn(ColumnDescription = "浼佷笟绫诲瀷 ", Length = 255)]
+    [Required(ErrorMessage = "浼佷笟绫诲瀷")]
+    public string EnterpriseType { get; set; }
+
+   
+    /// <summary>
+    /// 浜ゆ槗涓讳綋 浠g爜 鍚岃鑹蹭唬鐮�
+    /// </summary>
+    [Required(ErrorMessage = "浜ゆ槗涓讳綋浠g爜涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "浜ゆ槗涓讳綋code")]
+    public string TransactionCode { get; set; }
+    /// <summary>
+    /// 钀ヤ笟鎵х収鏂囦欢璺緞
+    /// </summary>
+    [Required(ErrorMessage = "钀ヤ笟鎵х収鏂囦欢蹇呬紶")]
+    [SugarColumn(ColumnDescription = "钀ヤ笟鎵х収鏂囦欢璺緞")]
+    public string BusinessLicense { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "浼佷笟鍚嶇О涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "浼佷笟鍚嶇О")]
+    public string EnterpriseName { get; set; }
+
+    /// <summary>
+    /// 缁熶竴绀句細淇$敤浠g爜
+    /// </summary>
+    [Required(ErrorMessage = "缁熶竴绀句細淇$敤浠g爜涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "缁熶竴绀句細淇$敤浠g爜")]
+    public string UnifiedSocialCreditCode { get; set; }
+
+    /// <summary>
+    /// 娉ㄥ唽璧勯噾锛堝崟浣嶏細涓囧厓 锛�
+    /// </summary>
+    [Required(ErrorMessage = "娉ㄥ唽璧勯噾涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "娉ㄥ唽璧勯噾")]
+    public decimal RegisteredCapital { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜哄鍚�
+    /// </summary>
+    [Required(ErrorMessage = "娉曞畾浠h〃浜哄鍚嶄负蹇呭~椤�")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")]
+    public string LegalRepresentativeName { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞
+    /// </summary>
+    [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞姣曚紶")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞")]
+    public string LegalRepresentativeIdCard { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜
+    /// </summary>
+    [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")]
+    public string LegalRepresentativeIdNumber { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿仈绯荤數璇�
+    /// </summary>
+    [Required(ErrorMessage = "娉曞畾浠h〃浜鸿仈绯荤數璇濅负蹇呭~椤�")]
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")]
+    public string LegalRepresentativePhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟浣忔墍锛堜笅鎷夐�夋嫨锛岄渶缁撳悎瀹為檯鍙�夊�硷紝鍏堝瓧绗︿覆鎺ユ敹 锛�
+    /// </summary>
+    [Required(ErrorMessage = "浼佷笟浣忔墍涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "浼佷笟浣忔墍")]
+    public string Residence { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鑱旂郴鐢佃瘽
+    /// </summary>
+    [Required(ErrorMessage = "浼佷笟鑱旂郴鐢佃瘽涓哄繀濉」")]
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+    [SugarColumn(ColumnDescription = "浼佷笟鑱旂郴鐢佃瘽")]
+    public string EnterprisePhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鎴愮珛鏃堕棿
+    /// </summary>
+    [Required(ErrorMessage = "鎴愮珛鏃堕棿涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "浼佷笟鎴愮珛鏃堕棿")]
+    public DateTime EstablishmentTime { get; set; }
+
+    /// <summary>
+    /// 浼佷笟涓昏惀涓氬姟
+    /// </summary>
+    [Required(ErrorMessage = "涓昏惀涓氬姟涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "浼佷笟涓昏惀涓氬姟")]
+    public string MainBusiness { get; set; }
+
+    /// <summary>
+    /// 浼佷笟閭
+    /// </summary>
+    [Required(ErrorMessage = "浼佷笟閭涓哄繀濉」")]
+    [EmailAddress(ErrorMessage = "閭鏍煎紡涓嶆纭�")]
+    [SugarColumn(ColumnDescription = "浼佷笟閭")]
+    public string EnterpriseEmail { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜哄鍚�
+    /// </summary>
+
+    [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜哄鍚�", IsNullable = true)]
+    public string OperatorName { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇嗭紙涓婁紶鍚庡瓨鍌ㄤ俊鎭級
+    /// </summary>
+   
+    [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇�", IsNullable = true)]
+    public string OperatorIdCard { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿韩浠借瘉鍙风爜
+    /// </summary>
+  
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�", IsNullable = true)]
+    public string OperatorIdNumber { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿仈绯荤數璇�
+    /// </summary>
+  
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�",IsNullable =true)]
+    public string OperatorPhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟寮�鎴疯
+    /// </summary>
+    [Required(ErrorMessage = "寮�鎴疯涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")]
+    public string BankName { get; set; }
+
+    /// <summary>
+    /// 浼佷笟閾惰璐﹀彿
+    /// </summary>
+    [Required(ErrorMessage = "閾惰璐﹀彿涓哄繀濉」")]
+    [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")]
+    public string BankAccount { get; set; }
+    /// <summary>
+    /// 瀹℃牳姝ラ
+    /// </summary>
+
+    [SugarColumn(ColumnDescription = "瀹℃牳姝ラ")]
+    public int steps { set; get; } = 0;
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs
new file mode 100644
index 0000000..30e17a6
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs
@@ -0,0 +1,41 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.MD.CutomerMd;
+/// <summary>
+/// 澶栭儴瑙掕壊琛�
+/// </summary>
+[SugarTable("FBS_CoutomerExRole", "澶栭儴瑙掕壊琛�")]
+[IncreTable]
+public class FBS_CoutomerExRole: EntityBaseId
+{
+    //瀹㈡埛ID
+    public long CustomerId { get; set; }
+
+    /// <summary>
+    ///  澶栭儴瑙掕壊
+    /// </summary>
+    public long ExRoleId { get; set; }
+
+    /// <summary>
+    /// 鏄惁瀹屾垚瑙掕壊鍒涘缓
+    /// </summary>
+    public bool HasFlsh { get; set; }= false;
+
+    /// <summary>
+    /// 澶栭儴瑙掕壊
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(ExRoleId))]
+    public FBS_ExRole ExRole { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
index fbfd501..cd6db14 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
@@ -21,7 +21,7 @@
 [SugarTable("FBS_Customer", "瀹㈡埛琛�")]
 [SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)]
 [SugarIndex("index_{table}_P", nameof(Phone), OrderByType.Asc)]
-
+[IncreTable]
 public partial class FBS_Customer : EntityBaseTenant
 {
     /// <summary>
@@ -34,10 +34,9 @@
     /// <summary>
     /// 瀵嗙爜
     /// </summary>
-    [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512)]
+    [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512,IsNullable =true)]
     [MaxLength(512)]
-    [Newtonsoft.Json.JsonIgnore]
-    [System.Text.Json.Serialization.JsonIgnore]
+
     public virtual string Password { get; set; }
 
     /// <summary>
@@ -61,30 +60,30 @@
     [MaxLength(512)]
     public string? Avatar { get; set; }
 
-    /// <summary>
-    /// 鎬у埆-鐢穇1銆佸コ_2
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鎬у埆")]
-    public GenderEnum Sex { get; set; } = GenderEnum.Male;
+    ///// <summary>
+    ///// 鎬у埆-鐢穇1銆佸コ_2
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鎬у埆")]
+    //public GenderEnum Sex { get; set; } = GenderEnum.Male;
 
-    /// <summary>
-    /// 骞撮緞
-    /// </summary>
-    [SugarColumn(ColumnDescription = "骞撮緞")]
-    public int Age { get; set; }
+    ///// <summary>
+    ///// 骞撮緞
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "骞撮緞")]
+    //public int Age { get; set; }
 
-    /// <summary>
-    /// 鍑虹敓鏃ユ湡
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍑虹敓鏃ユ湡")]
-    public DateTime? Birthday { get; set; }
+    ///// <summary>
+    ///// 鍑虹敓鏃ユ湡
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍑虹敓鏃ユ湡")]
+    //public DateTime? Birthday { get; set; }
 
-    /// <summary>
-    /// 姘戞棌
-    /// </summary>
-    [SugarColumn(ColumnDescription = "姘戞棌", Length = 32)]
-    [MaxLength(32)]
-    public string? Nation { get; set; }
+    ///// <summary>
+    ///// 姘戞棌
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "姘戞棌", Length = 32)]
+    //[MaxLength(32)]
+    //public string? Nation { get; set; }
 
     /// <summary>
     /// 鎵嬫満鍙风爜
@@ -93,26 +92,26 @@
     [MaxLength(16)]
     public string? Phone { get; set; }
 
-    /// <summary>
-    /// 璇佷欢绫诲瀷
-    /// </summary>
-    [SugarColumn(ColumnDescription = "璇佷欢绫诲瀷")]
-    public CardTypeEnum CardType { get; set; }
+    ///// <summary>
+    ///// 璇佷欢绫诲瀷
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "璇佷欢绫诲瀷")]
+    //public CardTypeEnum CardType { get; set; }
 
-    /// <summary>
-    /// 韬唤璇佸彿
-    /// </summary>
-    [SugarColumn(ColumnDescription = "韬唤璇佸彿", Length = 32)]
-    [MaxLength(32)]
-    public string? IdCardNum { get; set; }
+    ///// <summary>
+    ///// 韬唤璇佸彿
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "韬唤璇佸彿", Length = 32)]
+    //[MaxLength(32)]
+    //public string? IdCardNum { get; set; }
 
 
-    /// <summary>
-    /// 韬唤璇佸彿
-    /// </summary>
-    [SugarColumn(ColumnDescription = "韬唤璇�", Length = 512)]
-    [MaxLength(512)]
-    public string? IdCardPath { get; set; }
+    ///// <summary>
+    ///// 韬唤璇佸彿
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "韬唤璇�", Length = 512)]
+    //[MaxLength(512)]
+    //public string? IdCardPath { get; set; }
 
     /// <summary>
     /// 閭
@@ -121,73 +120,73 @@
     [MaxLength(64)]
     public string? Email { get; set; }
 
-    /// <summary>
-    /// 鍦板潃
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍦板潃", Length = 256)]
-    [MaxLength(256)]
-    public string? Address { get; set; }
+    ///// <summary>
+    ///// 鍦板潃
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍦板潃", Length = 256)]
+    //[MaxLength(256)]
+    //public string? Address { get; set; }
 
-    /// <summary>
-    /// 鏂囧寲绋嬪害
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鏂囧寲绋嬪害")]
-    public CultureLevelEnum CultureLevel { get; set; }
+    ///// <summary>
+    ///// 鏂囧寲绋嬪害
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鏂囧寲绋嬪害")]
+    //public CultureLevelEnum CultureLevel { get; set; }
 
-    /// <summary>
-    /// 鏀挎不闈㈣矊
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鏀挎不闈㈣矊", Length = 16)]
-    [MaxLength(16)]
-    public string? PoliticalOutlook { get; set; }
+    ///// <summary>
+    ///// 鏀挎不闈㈣矊
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鏀挎不闈㈣矊", Length = 16)]
+    //[MaxLength(16)]
+    //public string? PoliticalOutlook { get; set; }
 
-    /// <summary>
-    /// 姣曚笟闄㈡牎
-    /// </summary>COLLEGE
-    [SugarColumn(ColumnDescription = "姣曚笟闄㈡牎", Length = 128)]
-    [MaxLength(128)]
-    public string? College { get; set; }
+    ///// <summary>
+    ///// 姣曚笟闄㈡牎
+    ///// </summary>COLLEGE
+    //[SugarColumn(ColumnDescription = "姣曚笟闄㈡牎", Length = 128)]
+    //[MaxLength(128)]
+    //public string? College { get; set; }
 
-    /// <summary>
-    /// 鍔炲叕鐢佃瘽
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍔炲叕鐢佃瘽", Length = 16)]
-    [MaxLength(16)]
-    public string? OfficePhone { get; set; }
+    ///// <summary>
+    ///// 鍔炲叕鐢佃瘽
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍔炲叕鐢佃瘽", Length = 16)]
+    //[MaxLength(16)]
+    //public string? OfficePhone { get; set; }
 
-    /// <summary>
-    /// 绱ф�ヨ仈绯讳汉
-    /// </summary>
-    [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉", Length = 32)]
-    [MaxLength(32)]
-    public string? EmergencyContact { get; set; }
+    ///// <summary>
+    ///// 绱ф�ヨ仈绯讳汉
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉", Length = 32)]
+    //[MaxLength(32)]
+    //public string? EmergencyContact { get; set; }
 
-    /// <summary>
-    /// 绱ф�ヨ仈绯讳汉鐢佃瘽
-    /// </summary>
-    [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鐢佃瘽", Length = 16)]
-    [MaxLength(16)]
-    public string? EmergencyPhone { get; set; }
+    ///// <summary>
+    ///// 绱ф�ヨ仈绯讳汉鐢佃瘽
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鐢佃瘽", Length = 16)]
+    //[MaxLength(16)]
+    //public string? EmergencyPhone { get; set; }
 
-    /// <summary>
-    /// 绱ф�ヨ仈绯讳汉鍦板潃
-    /// </summary>
-    [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鍦板潃", Length = 256)]
-    [MaxLength(256)]
-    public string? EmergencyAddress { get; set; }
+    ///// <summary>
+    ///// 绱ф�ヨ仈绯讳汉鍦板潃
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鍦板潃", Length = 256)]
+    //[MaxLength(256)]
+    //public string? EmergencyAddress { get; set; }
 
-    /// <summary>
-    /// 涓汉绠�浠�
-    /// </summary>
-    [SugarColumn(ColumnDescription = "涓汉绠�浠�", Length = 512)]
-    [MaxLength(512)]
-    public string? Introduction { get; set; }
+    ///// <summary>
+    ///// 涓汉绠�浠�
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "涓汉绠�浠�", Length = 512)]
+    //[MaxLength(512)]
+    //public string? Introduction { get; set; }
 
-    /// <summary>
-    /// 鎺掑簭
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鎺掑簭")]
-    public int OrderNo { get; set; } = 100;
+    ///// <summary>
+    ///// 鎺掑簭
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鎺掑簭")]
+    //public int OrderNo { get; set; } = 100;
 
     /// <summary>
     /// 鐘舵��
@@ -255,46 +254,46 @@
     //[MaxLength(32)]
     //public string? JobNum { get; set; }
 
-    /// <summary>
-    /// 鑱岀骇
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鑱岀骇", Length = 32)]
-    [MaxLength(32)]
-    public string? PosLevel { get; set; }
+    ///// <summary>
+    ///// 鑱岀骇
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鑱岀骇", Length = 32)]
+    //[MaxLength(32)]
+    //public string? PosLevel { get; set; }
 
-    /// <summary>
-    /// 鑱岀О
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鑱岀О", Length = 32)]
-    [MaxLength(32)]
-    public string? PosTitle { get; set; }
+    ///// <summary>
+    ///// 鑱岀О
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鑱岀О", Length = 32)]
+    //[MaxLength(32)]
+    //public string? PosTitle { get; set; }
 
-    /// <summary>
-    /// 鎿呴暱棰嗗煙
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鎿呴暱棰嗗煙", Length = 32)]
-    [MaxLength(32)]
-    public string? Expertise { get; set; }
+    ///// <summary>
+    ///// 鎿呴暱棰嗗煙
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鎿呴暱棰嗗煙", Length = 32)]
+    //[MaxLength(32)]
+    //public string? Expertise { get; set; }
 
-    /// <summary>
-    /// 鍔炲叕鍖哄煙
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍔炲叕鍖哄煙", Length = 32)]
-    [MaxLength(32)]
-    public string? OfficeZone { get; set; }
+    ///// <summary>
+    ///// 鍔炲叕鍖哄煙
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍔炲叕鍖哄煙", Length = 32)]
+    //[MaxLength(32)]
+    //public string? OfficeZone { get; set; }
 
-    /// <summary>
-    /// 鍔炲叕瀹�
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍔炲叕瀹�", Length = 32)]
-    [MaxLength(32)]
-    public string? Office { get; set; }
+    ///// <summary>
+    ///// 鍔炲叕瀹�
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍔炲叕瀹�", Length = 32)]
+    //[MaxLength(32)]
+    //public string? Office { get; set; }
 
-    /// <summary>
-    /// 鍏ヨ亴鏃ユ湡
-    /// </summary>
-    [SugarColumn(ColumnDescription = "鍏ヨ亴鏃ユ湡")]
-    public DateTime? JoinDate { get; set; }
+    ///// <summary>
+    ///// 鍏ヨ亴鏃ユ湡
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鍏ヨ亴鏃ユ湡")]
+    //public DateTime? JoinDate { get; set; }
 
     /// <summary>
     /// 鏈�鏂扮櫥褰旾p
@@ -330,6 +329,12 @@
     [MaxLength(512)]
     public string? Signature { get; set; }
 
+    /// <summary>
+    /// 澶栭儴瑙勫垯锛岀櫥褰曡鑹�
+    /// </summary>
+    [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))]
+    public List<FBS_CoutomerExRole> CoutomerExRols { set; get; }
+
     ///// <summary>
     ///// 楠岃瘉瓒呯骇绠$悊鍛樼被鍨嬶紝鑻ヨ处鍙风被鍨嬩负瓒呯骇绠$悊鍛樺垯鎶ラ敊
     ///// </summary>
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
index 260b5c0..12037b4 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
@@ -14,7 +14,7 @@
 
 namespace FZCZTB.NET.MD.CutomerMd;
 [SugarTable("FBS_CustomerRole", "瀹㈡埛鑿滃崟琛�")]
-
+[IncreTable]
 public class FBS_CustomerRole : EntityBaseId
 {
     /// <summary>
@@ -42,4 +42,9 @@
     /// </summary>
     [Navigate(NavigateType.OneToOne, nameof(RoleId))]
     public SysRole SysRole { get; set; }
+
+
+   
+
+
 }
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
index 61e1be0..a9a32cb 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
@@ -18,10 +18,10 @@
 /// 鐧诲綍鍗宠閫夋嫨鐨勬牎鑹�
 /// </summary>
 
-[SugarTable("FBS_TenantMenu", "瀹㈡埛涓诲垎绫昏鑹�")]
+[SugarTable("FBS_ExRole", "瀹㈡埛涓诲垎绫昏鑹�")]
 [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
 [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)]
-
+[IncreTable]
 public class FBS_ExRole: EntityBaseTenant
 {
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
index dea3147..c3e7afc 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
@@ -16,8 +16,8 @@
 /// <summary>
 /// 绯荤粺绉熸埛鑿滃崟琛�
 /// </summary>
-[SugarTable("FBS_TenantMenu", "绯荤粺绉熸埛鑿滃崟琛�")]
-
+[SugarTable("FBS_ExRoleMenu", "绯荤粺绉熸埛鑿滃崟琛�")]
+[IncreTable]
 class FBS_ExRoleMenu: EntityBaseId
 {
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
index 58a7502..c3156d0 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
@@ -20,7 +20,7 @@
 [SugarTable("FBS_Menu", "瀹㈡埛绯荤粺鑿滃崟琛�")]
 [SugarIndex("index_{table}_T", nameof(Title), OrderByType.Asc)]
 [SugarIndex("index_{table}_T2", nameof(Type), OrderByType.Asc)]
-
+[IncreTable]
 public class FBS_Menu: EntityBaseTenant
 {
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
index 57e4cc8..f1ec761 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
@@ -19,7 +19,7 @@
 [SugarTable("FBS_Role", "瀹㈡埛涓�у寲瑙掕壊")]
 [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
 [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)]
-
+[IncreTable]
 public class FBS_Role : EntityBaseTenant
 {
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
index ba07127..0107262 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
@@ -14,7 +14,8 @@
 
 namespace FZCZTB.NET.MD.CutomerMd;
 
-[SugarTable("FBS_Role", "涓�у寲鏍¤壊鑿滃崟")]
+[SugarTable("FBS_RoleMenu", "涓�у寲鏍¤壊鑿滃崟")]
+[IncreTable]
 public class FBS_RoleMenu: EntityBaseId
 {
 
diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs
index e0c6411..aca8db5 100644
--- a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs
+++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs
@@ -3,6 +3,7 @@
 using Furion.DependencyInjection;
 using FZCZTB.NET.MD.CutomerMd;
 using Mapster;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
@@ -44,12 +45,12 @@
         /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮�
         /// </summary>
         /// <returns></returns>
-        public async Task<CustomerDto> GetCustomer(int id)
+        public async Task<CustomerRDto> GetCustomer(int id)
         {
 
 
 
-            return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>();
+            return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>();
 
 
 
@@ -62,12 +63,12 @@
         /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮�
         /// </summary>
         /// <returns></returns>
-        public async Task<CustomerDto> UpDataCustomer(int id)
+        public async Task<CustomerRDto> UpDataCustomer(int id)
         {
 
 
 
-            return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>();
+            return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>();
 
 
 
@@ -131,209 +132,95 @@
     /// <summary>
     /// 瀹㈡埛琛ㄨ緭鍑哄弬鏁�
     /// </summary>
-    public class CustomerDto
+    public class CustomerRDto
     {
-        /// <summary>
-        /// 涓婚敭Id
-        /// </summary>
-        public long Id { get; set; }
-
         /// <summary>
         /// 璐﹀彿
         /// </summary>
-        public string Account { get; set; }
+   
+        public virtual string Account { get; set; }
 
         /// <summary>
         /// 瀵嗙爜
         /// </summary>
-        public string Password { get; set; }
+    
+        [MaxLength(512)]
+
+        public virtual string Password { get; set; }
 
         /// <summary>
         /// 鐪熷疄濮撳悕
         /// </summary>
-        public string RealName { get; set; }
+      
+        [MaxLength(32)]
+        public virtual string RealName { get; set; }
 
         /// <summary>
         /// 鏄电О
         /// </summary>
+ 
+        [MaxLength(32)]
         public string? NickName { get; set; }
 
         /// <summary>
         /// 澶村儚
         /// </summary>
+      
+        [MaxLength(512)]
         public string? Avatar { get; set; }
 
-        /// <summary>
-        /// 鎬у埆
-        /// </summary>
-        public GenderEnum Sex { get; set; }
-
-        /// <summary>
-        /// 骞撮緞
-        /// </summary>
-        public int Age { get; set; }
-
-        /// <summary>
-        /// 鍑虹敓鏃ユ湡
-        /// </summary>
-        public DateTime? Birthday { get; set; }
-
-        /// <summary>
-        /// 姘戞棌
-        /// </summary>
-        public string? Nation { get; set; }
+        
 
         /// <summary>
         /// 鎵嬫満鍙风爜
         /// </summary>
+      
+        [MaxLength(16)]
         public string? Phone { get; set; }
 
-        /// <summary>
-        /// 璇佷欢绫诲瀷
-        /// </summary>
-        public CardTypeEnum CardType { get; set; }
-
-        /// <summary>
-        /// 韬唤璇佸彿
-        /// </summary>
-        public string? IdCardNum { get; set; }
-
-        /// <summary>
-        /// 韬唤璇�
-        /// </summary>
-        public string? IdCardPath { get; set; }
+        
 
         /// <summary>
         /// 閭
         /// </summary>
+       
+        [MaxLength(64)]
         public string? Email { get; set; }
 
-        /// <summary>
-        /// 鍦板潃
-        /// </summary>
-        public string? Address { get; set; }
 
-        /// <summary>
-        /// 鏂囧寲绋嬪害
-        /// </summary>
-        public CultureLevelEnum CultureLevel { get; set; }
-
-        /// <summary>
-        /// 鏀挎不闈㈣矊
-        /// </summary>
-        public string? PoliticalOutlook { get; set; }
-
-        /// <summary>
-        /// 姣曚笟闄㈡牎
-        /// </summary>
-        public string? College { get; set; }
-
-        /// <summary>
-        /// 鍔炲叕鐢佃瘽
-        /// </summary>
-        public string? OfficePhone { get; set; }
-
-        /// <summary>
-        /// 绱ф�ヨ仈绯讳汉
-        /// </summary>
-        public string? EmergencyContact { get; set; }
-
-        /// <summary>
-        /// 绱ф�ヨ仈绯讳汉鐢佃瘽
-        /// </summary>
-        public string? EmergencyPhone { get; set; }
-
-        /// <summary>
-        /// 绱ф�ヨ仈绯讳汉鍦板潃
-        /// </summary>
-        public string? EmergencyAddress { get; set; }
-
-        /// <summary>
-        /// 涓汉绠�浠�
-        /// </summary>
-        public string? Introduction { get; set; }
-
-        /// <summary>
-        /// 鎺掑簭
-        /// </summary>
-        public int OrderNo { get; set; }
-
-        /// <summary>
-        /// 鐘舵��
-        /// </summary>
-        public StatusEnum Status { get; set; }
+     
 
         /// <summary>
         /// 澶囨敞
         /// </summary>
+
+        [MaxLength(256)]
         public string? Remark { get; set; }
 
-        /// <summary>
-        /// 鑱岀骇
-        /// </summary>
-        public string? PosLevel { get; set; }
+       
 
-        /// <summary>
-        /// 鑱岀О
-        /// </summary>
-        public string? PosTitle { get; set; }
-
-        /// <summary>
-        /// 鎿呴暱棰嗗煙
-        /// </summary>
-        public string? Expertise { get; set; }
-
-        /// <summary>
-        /// 鍔炲叕鍖哄煙
-        /// </summary>
-        public string? OfficeZone { get; set; }
-
-        /// <summary>
-        /// 鍔炲叕瀹�
-        /// </summary>
-        public string? Office { get; set; }
-
-        /// <summary>
-        /// 鍏ヨ亴鏃ユ湡
-        /// </summary>
-        public DateTime? JoinDate { get; set; }
-
-        /// <summary>
-        /// 鏈�鏂扮櫥褰旾p
-        /// </summary>
-        public string? LastLoginIp { get; set; }
-
-        /// <summary>
-        /// 鏈�鏂扮櫥褰曞湴鐐�
-        /// </summary>
-        public string? LastLoginAddress { get; set; }
-
-        /// <summary>
-        /// 鏈�鏂扮櫥褰曟椂闂�
-        /// </summary>
-        public DateTime? LastLoginTime { get; set; }
-
-        /// <summary>
-        /// 鏈�鏂扮櫥褰曡澶�
-        /// </summary>
-        public string? LastLoginDevice { get; set; }
 
         /// <summary>
         /// 鐢靛瓙绛惧悕
         /// </summary>
+       
         public string? Signature { get; set; }
 
         /// <summary>
-        /// 绉熸埛Id
+        /// 澶栭儴瑙勫垯锛岀櫥褰曡鑹�
         /// </summary>
-        public long? TenantId { get; set; }
+        [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))]
+        public List<FBS_CoutomerExRole> CoutomerExRols { set; get; }
 
         /// <summary>
-        /// 娉ㄥ唽鐢ㄦ埛瑙掕壊
+        /// 娉ㄥ唽鐢ㄦ埛瑙掕壊  
         /// </summary>
         public  string? ExRoleCode {  get; set; }
 
-
+        /// <summary>
+        /// 鐢ㄦ埛娉ㄥ唽鎵嬫満楠岃瘉鐮�
+        /// </summary>
+        public string? PhoneVCode {  get; set; }
 
     }
 }
diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj
index 67c6339..451ec3d 100644
--- a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj
+++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj
@@ -4,6 +4,7 @@
     <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>
@@ -11,4 +12,10 @@
     <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <None Update="FZCZTSYSServiceConfig.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
 </Project>
diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json
index 8028922..84183ff 100644
--- a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json
+++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json
@@ -1,16 +1,19 @@
 {
-  "SMSConfigMd": {
-    "LingKaiXinxiSets": { //鍑屽嚡鐭俊閰嶇疆
+  "SMSConfig": {
+  
+    "lingKai": { //鍑屽嚡鐭俊閰嶇疆
       "Url": "https://mb345.com/ws/BatchSend2.aspx",
       "Number": "XP010534",
       "AccountPassPassword": "123321",
-      "VerifyTimeOut": 60,  //绉�
+      "VerifyTimeOut": "60", //绉�
       "Templates": [
         {
           "Id": "0",
           "SignName": "銆愭斂閲囧挩璇㈢綉銆�", //闇�瑕佸姞鍏ョ殑鍏徃鏍囩
           "TemplateCode": "VCode",
-          "Content": "鎮ㄧ殑楠岃瘉鐮佷负锛�${code}锛岃鍕挎硠闇蹭簬浠栦汉锛�"
+          "Content": "鎮ㄥソ锛屾偍鐨勯獙璇佺爜鏄細${code}"
+
+          
         },
         {
           "Id": "1",
diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs
index 805fcce..3cd5e0b 100644
--- a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs
+++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs
@@ -16,7 +16,7 @@
 public class SMSConfigOptions : IConfigurableOptions
 {
 
-     
+
     /// <summary>
     /// 鍑屽嚡淇℃伅閰嶇疆
     /// </summary>
@@ -40,9 +40,9 @@
     /// <summary>
     /// 瓒呮椂鏃堕棿
     /// </summary>
-    public int VerifyTimeOut {  get; set; }
+    public string VerifyTimeOut {  get; set; }
     /// <summary>
     /// Templates
     /// </summary>
-    public List<SmsTemplate> Templates { get; set; }
+    public List<SmsTemplate>? Templates { get; set; }
 }
\ No newline at end of file
diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs
index 61804dc..051b110 100644
--- a/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs
+++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs
@@ -28,6 +28,7 @@
 using Yitter.IdGenerator;
 using Lazy.Captcha.Core;
 using Furion;
+using NewLife;
 
 namespace FZCZTB.NET.SYSService.MSM;
 /// <summary>
@@ -45,8 +46,10 @@
           ICaptcha captcha
           )
     {
+      
         _smsOptions = smsOptions.Value;
-        _sysCacheService = _sysCacheService;
+        _sysCacheService = sysCacheService;
+    
          _captcha = captcha;
     }
 
@@ -73,7 +76,7 @@
                 return Temp.Content+Temp.SignName;
         }
         if (Code == null)
-            Oops.Oh("鐭俊鍐呭涓虹┖");
+            throw Oops.Oh("鐭俊鍐呭涓虹┖");
         return Code;
     }
 
@@ -134,7 +137,7 @@
         if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�");
 
         if (verifyCode != input.Code) throw Oops.Oh("楠岃瘉鐮侀敊璇紒");
-
+        _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
         return true;
     }
     /// <summary>
@@ -164,13 +167,13 @@
         };
        var code=   FormartMessage(verifyCode.toString());
        
-        await SendSMSAsync(code, phoneNumber);
+       await SendSMSAsync(code, phoneNumber);
    
-        _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut));
+        _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut.ToInt()));
      
-  
+         
 
-        await Task.CompletedTask;
+        
     }
 
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.SYSService/Startup.cs b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs
new file mode 100644
index 0000000..f93437f
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs
@@ -0,0 +1,32 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using AspNetCoreRateLimit;
+using Furion;
+using FZCZTB.NET.SYSService.MSM;
+using IPTools.Core;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.SYSService;
+[AppStartup(int.MaxValue -1)]
+public class Startup: AppStartup
+{
+
+    public void ConfigureServices(IServiceCollection services)
+    {
+        services.AddConfigurableOptions<SMSConfigOptions>();
+
+        
+    }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
index 8756464..05ae595 100644
--- a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
@@ -4,6 +4,7 @@
     <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs
index 5ad0c9b..7bb739a 100644
--- a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs
@@ -47,23 +47,23 @@
     {
         input.Keyword = input.Keyword?.Trim();
         var query = _fBS_CustomerRep.AsQueryable()
-            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Account.Contains(input.Keyword) || u.RealName.Contains(input.Keyword) || u.NickName.Contains(input.Keyword) || u.IdCardPath.Contains(input.Keyword) || u.College.Contains(input.Keyword) || u.OfficePhone.Contains(input.Keyword) || u.EmergencyContact.Contains(input.Keyword) || u.EmergencyPhone.Contains(input.Keyword) || u.EmergencyAddress.Contains(input.Keyword) || u.Introduction.Contains(input.Keyword) || u.Remark.Contains(input.Keyword) || u.PosLevel.Contains(input.Keyword) || u.PosTitle.Contains(input.Keyword))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Account.Contains(input.Keyword) || u.RealName.Contains(input.Keyword) || u.NickName.Contains(input.Keyword) || u.IdCardPath.Contains(input.Keyword) || u.College.Contains(input.Keyword) || u.OfficePhone.Contains(input.Keyword) || u.EmergencyContact.Contains(input.Keyword) || u.EmergencyPhone.Contains(input.Keyword) || u.EmergencyAddress.Contains(input.Keyword) || u.Introduction.Contains(input.Keyword) || u.Remark.Contains(input.Keyword) || u.PosLevel.Contains(input.Keyword) || u.PosTitle.Contains(input.Keyword))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account.Contains(input.Account.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.IdCardPath), u => u.IdCardPath.Contains(input.IdCardPath.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.College), u => u.College.Contains(input.College.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.OfficePhone), u => u.OfficePhone.Contains(input.OfficePhone.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyContact), u => u.EmergencyContact.Contains(input.EmergencyContact.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyPhone), u => u.EmergencyPhone.Contains(input.EmergencyPhone.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyAddress), u => u.EmergencyAddress.Contains(input.EmergencyAddress.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.Introduction), u => u.Introduction.Contains(input.Introduction.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.IdCardPath), u => u.IdCardPath.Contains(input.IdCardPath.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.College), u => u.College.Contains(input.College.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.OfficePhone), u => u.OfficePhone.Contains(input.OfficePhone.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyContact), u => u.EmergencyContact.Contains(input.EmergencyContact.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyPhone), u => u.EmergencyPhone.Contains(input.EmergencyPhone.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyAddress), u => u.EmergencyAddress.Contains(input.EmergencyAddress.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.Introduction), u => u.Introduction.Contains(input.Introduction.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.PosLevel), u => u.PosLevel.Contains(input.PosLevel.Trim()))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.PosTitle), u => u.PosTitle.Contains(input.PosTitle.Trim()))
-            .WhereIF(input.CardType.HasValue, u => u.CardType == input.CardType)
-            .WhereIF(input.CultureLevel.HasValue, u => u.CultureLevel == input.CultureLevel)
-            .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo)
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.PosLevel), u => u.PosLevel.Contains(input.PosLevel.Trim()))
+            //.WhereIF(!string.IsNullOrWhiteSpace(input.PosTitle), u => u.PosTitle.Contains(input.PosTitle.Trim()))
+            //.WhereIF(input.CardType.HasValue, u => u.CardType == input.CardType)
+            //.WhereIF(input.CultureLevel.HasValue, u => u.CultureLevel == input.CultureLevel)
+            //.WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo)
             .WhereIF(input.Status.HasValue, u => u.Status == input.Status)
             .Select<FBS_CustomerOutput>();
 		return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
@@ -106,10 +106,10 @@
         var entity = input.Adapt<FBS_Customer>();
         await _fBS_CustomerRep.AsUpdateable(entity)
         .IgnoreColumns(u => new {
-            u.Expertise,
-            u.OfficeZone,
-            u.Office,
-            u.JoinDate,
+            //u.Expertise,
+            //u.OfficeZone,
+            //u.Office,
+            //u.JoinDate,
             u.LastLoginIp,
             u.LastLoginAddress,
             u.LastLoginTime,
@@ -247,22 +247,22 @@
                         .SplitError(it => it.Item.RealName?.Length > 32, "鐪熷疄濮撳悕闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
                         .SplitError(it => it.Item.NickName?.Length > 32, "鏄电О闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
                         .SplitError(it => it.Item.Avatar?.Length > 512, "澶村儚闀垮害涓嶈兘瓒呰繃512涓瓧绗�")
-                        .SplitError(it => it.Item.Nation?.Length > 32, "姘戞棌闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.Nation?.Length > 32, "姘戞棌闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
                         .SplitError(it => it.Item.Phone?.Length > 16, "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
-                        .SplitError(it => it.Item.IdCardNum?.Length > 32, "韬唤璇佸彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
-                        .SplitError(it => it.Item.IdCardPath?.Length > 512, "韬唤璇侀暱搴︿笉鑳借秴杩�512涓瓧绗�")
+                        //.SplitError(it => it.Item.IdCardNum?.Length > 32, "韬唤璇佸彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.IdCardPath?.Length > 512, "韬唤璇侀暱搴︿笉鑳借秴杩�512涓瓧绗�")
                         .SplitError(it => it.Item.Email?.Length > 64, "閭闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
-                        .SplitError(it => it.Item.Address?.Length > 256, "鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
-                        .SplitError(it => it.Item.PoliticalOutlook?.Length > 16, "鏀挎不闈㈣矊闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
-                        .SplitError(it => it.Item.College?.Length > 128, "姣曚笟闄㈡牎闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
-                        .SplitError(it => it.Item.OfficePhone?.Length > 16, "鍔炲叕鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
-                        .SplitError(it => it.Item.EmergencyContact?.Length > 32, "绱ф�ヨ仈绯讳汉闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
-                        .SplitError(it => it.Item.EmergencyPhone?.Length > 16, "绱ф�ヨ仈绯讳汉鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
-                        .SplitError(it => it.Item.EmergencyAddress?.Length > 256, "绱ф�ヨ仈绯讳汉鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
-                        .SplitError(it => it.Item.Introduction?.Length > 512, "涓汉绠�浠嬮暱搴︿笉鑳借秴杩�512涓瓧绗�")
+                        //.SplitError(it => it.Item.Address?.Length > 256, "鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        //.SplitError(it => it.Item.PoliticalOutlook?.Length > 16, "鏀挎不闈㈣矊闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
+                        //.SplitError(it => it.Item.College?.Length > 128, "姣曚笟闄㈡牎闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        //.SplitError(it => it.Item.OfficePhone?.Length > 16, "鍔炲叕鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
+                        //.SplitError(it => it.Item.EmergencyContact?.Length > 32, "绱ф�ヨ仈绯讳汉闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.EmergencyPhone?.Length > 16, "绱ф�ヨ仈绯讳汉鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
+                        //.SplitError(it => it.Item.EmergencyAddress?.Length > 256, "绱ф�ヨ仈绯讳汉鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        //.SplitError(it => it.Item.Introduction?.Length > 512, "涓汉绠�浠嬮暱搴︿笉鑳借秴杩�512涓瓧绗�")
                         .SplitError(it => it.Item.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
-                        .SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
-                        .SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
                         .SplitInsert(_ => true)
                         .ToStorage();
                     
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs
new file mode 100644
index 0000000..0c45475
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs
@@ -0,0 +1,69 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟
+/// </summary>
+public class FBS_EnterpriseTypeDto
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+    
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    public string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    public int ParentId { get; set; }
+    
+    /// <summary>
+    /// 绉熸埛Id
+    /// </summary>
+    public long? TenantId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鏃堕棿
+    /// </summary>
+    public DateTime? CreateTime { get; set; }
+    
+    /// <summary>
+    /// 鏇存柊鏃堕棿
+    /// </summary>
+    public DateTime? UpdateTime { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰匢d
+    /// </summary>
+    public long? CreateUserId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呭鍚�
+    /// </summary>
+    public string? CreateUserName { get; set; }
+    
+    /// <summary>
+    /// 淇敼鑰匢d
+    /// </summary>
+    public long? UpdateUserId { get; set; }
+    
+    /// <summary>
+    /// 淇敼鑰呭鍚�
+    /// </summary>
+    public string? UpdateUserName { get; set; }
+    
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs
new file mode 100644
index 0000000..9e1a674
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs
@@ -0,0 +1,177 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using System.ComponentModel.DataAnnotations;
+using Magicodes.ExporterAndImporter.Core;
+using Magicodes.ExporterAndImporter.Excel;
+
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鍩虹杈撳叆鍙傛暟
+/// </summary>
+public class FBS_EnterpriseTypeBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public virtual long? Id { get; set; }
+    
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    public virtual string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")]
+    public virtual string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")]
+    public virtual int? ParentId { get; set; }
+    
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class PageFBS_EnterpriseTypeInput : BasePageInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    public string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    public int? ParentId { get; set; }
+    
+    /// <summary>
+    /// 閫変腑涓婚敭鍒楄〃
+    /// </summary>
+     public List<long> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃澧炲姞杈撳叆鍙傛暟
+/// </summary>
+public class AddFBS_EnterpriseTypeInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")]
+    [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")]
+    public string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")]
+    public int? ParentId { get; set; }
+    
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鍒犻櫎杈撳叆鍙傛暟
+/// </summary>
+public class DeleteFBS_EnterpriseTypeInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+    
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鏇存柊杈撳叆鍙傛暟
+/// </summary>
+public class UpdateFBS_EnterpriseTypeInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>    
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+    
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>    
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>    
+    [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")]
+    [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")]
+    public string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>    
+    [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")]
+    public int? ParentId { get; set; }
+    
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃涓婚敭鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class QueryByIdFBS_EnterpriseTypeInput : DeleteFBS_EnterpriseTypeInput
+{
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆瀹炰綋
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportFBS_EnterpriseTypeInput : BaseImportInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [ImporterHeader(Name = "*鍚嶇О")]
+    [ExporterHeader("*鍚嶇О", Format = "", Width = 25, IsBold = true)]
+    public string Name { get; set; }
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    [ImporterHeader(Name = "*浠g爜")]
+    [ExporterHeader("*浠g爜", Format = "", Width = 25, IsBold = true)]
+    public string Code { get; set; }
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    [ImporterHeader(Name = "*鐖�")]
+    [ExporterHeader("*鐖�", Format = "", Width = 25, IsBold = true)]
+    public int? ParentId { get; set; }
+    
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs
new file mode 100644
index 0000000..a4c88cc
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs
@@ -0,0 +1,79 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟
+/// </summary>
+public class FBS_EnterpriseTypeOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }    
+    
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }    
+    
+    /// <summary>
+    /// 浠g爜
+    /// </summary>
+    public string Code { get; set; }    
+    
+    /// <summary>
+    /// 鐖�
+    /// </summary>
+    public int ParentId { get; set; }    
+    
+    /// <summary>
+    /// 绉熸埛Id
+    /// </summary>
+    public long? TenantId { get; set; }    
+    
+    /// <summary>
+    /// 鍒涘缓鏃堕棿
+    /// </summary>
+    public DateTime? CreateTime { get; set; }    
+    
+    /// <summary>
+    /// 鏇存柊鏃堕棿
+    /// </summary>
+    public DateTime? UpdateTime { get; set; }    
+    
+    /// <summary>
+    /// 鍒涘缓鑰匢d
+    /// </summary>
+    public long? CreateUserId { get; set; }    
+    
+    /// <summary>
+    /// 鍒涘缓鑰呭鍚�
+    /// </summary>
+    public string? CreateUserName { get; set; }    
+    
+    /// <summary>
+    /// 淇敼鑰匢d
+    /// </summary>
+    public long? UpdateUserId { get; set; }    
+    
+    /// <summary>
+    /// 淇敼鑰呭鍚�
+    /// </summary>
+    public string? UpdateUserName { get; set; }    
+    
+}
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘瀹炰綋
+/// </summary>
+public class ExportFBS_EnterpriseTypeOutput : ImportFBS_EnterpriseTypeInput
+{
+    [ImporterHeader(IsIgnore = true)]
+    [ExporterHeader(IsIgnore = true)]
+    public override string Error { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs
new file mode 100644
index 0000000..1026101
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs
@@ -0,0 +1,196 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core.Service;
+using Microsoft.AspNetCore.Http;
+using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
+using Mapster;
+using SqlSugar;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using Microsoft.AspNetCore.Mvc;
+using Furion.DynamicApiController;
+using Furion.DependencyInjection;
+using FZCZTB.NET.MD.ConfigMd;
+using Admin.NET.Core;
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 浼佷笟绫婚厤缃〃鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
+public class FBS_EnterpriseTypeService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep;
+    private readonly ISqlSugarClient _sqlSugarClient;
+
+    public FBS_EnterpriseTypeService(SqlSugarRepository<FBS_EnterpriseType> fBS_EnterpriseTypeRep, ISqlSugarClient sqlSugarClient)
+    {
+        _fBS_EnterpriseTypeRep = fBS_EnterpriseTypeRep;
+        _sqlSugarClient = sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<FBS_EnterpriseTypeOutput>> Page(PageFBS_EnterpriseTypeInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _fBS_EnterpriseTypeRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim()))
+            .WhereIF(input.ParentId != null, u => u.ParentId == input.ParentId)
+            .Select<FBS_EnterpriseTypeOutput>();
+		return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 鑾峰彇浼佷笟绫婚厤缃〃璇︽儏 鈩癸笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鑾峰彇浼佷笟绫婚厤缃〃璇︽儏")]
+    [ApiDescriptionSettings(Name = "Detail"), HttpGet]
+    public async Task<FBS_EnterpriseType> Detail([FromQuery] QueryByIdFBS_EnterpriseTypeInput input)
+    {
+        return await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 澧炲姞浼佷笟绫婚厤缃〃 鉃�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("澧炲姞浼佷笟绫婚厤缃〃")]
+    [ApiDescriptionSettings(Name = "Add"), HttpPost]
+    public async Task<long> Add(AddFBS_EnterpriseTypeInput input)
+    {
+        var entity = input.Adapt<FBS_EnterpriseType>();
+        return await _fBS_EnterpriseTypeRep.InsertAsync(entity) ? entity.Id : 0;
+    }
+
+    /// <summary>
+    /// 鏇存柊浼佷笟绫婚厤缃〃 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊浼佷笟绫婚厤缃〃")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateFBS_EnterpriseTypeInput input)
+    {
+        var entity = input.Adapt<FBS_EnterpriseType>();
+        await _fBS_EnterpriseTypeRep.AsUpdateable(entity)
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎浼佷笟绫婚厤缃〃 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎浼佷笟绫婚厤缃〃")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteFBS_EnterpriseTypeInput input)
+    {
+        var entity = await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+       // await _fBS_EnterpriseTypeRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        await _fBS_EnterpriseTypeRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_EnterpriseTypeInput> input)
+    {
+        var exp = Expressionable.Create<FBS_EnterpriseType>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _fBS_EnterpriseTypeRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+      //  return await _fBS_EnterpriseTypeRep.FakeDeleteAsync(list);   //鍋囧垹闄�
+        return await _fBS_EnterpriseTypeRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+    
+    /// <summary>
+    /// 瀵煎嚭浼佷笟绫婚厤缃〃璁板綍 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("瀵煎嚭浼佷笟绫婚厤缃〃璁板綍")]
+    [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+    public async Task<IActionResult> Export(PageFBS_EnterpriseTypeInput input)
+    {
+        var list = (await Page(input)).Items?.Adapt<List<ExportFBS_EnterpriseTypeOutput>>() ?? new();
+        if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList();
+        return ExcelHelper.ExportTemplate(list, "浼佷笟绫婚厤缃〃瀵煎嚭璁板綍");
+    }
+    
+    /// <summary>
+    /// 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘 猬囷笍
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘")]
+    [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify]
+    public IActionResult DownloadTemplate()
+    {
+        return ExcelHelper.ExportTemplate(new List<ExportFBS_EnterpriseTypeOutput>(), "浼佷笟绫婚厤缃〃瀵煎叆妯℃澘");
+    }
+    
+    private static readonly object _fBS_EnterpriseTypeImportLock = new object();
+    /// <summary>
+    /// 瀵煎叆浼佷笟绫婚厤缃〃璁板綍 馃捑
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("瀵煎叆浼佷笟绫婚厤缃〃璁板綍")]
+    [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+    public IActionResult ImportData([Required] IFormFile file)
+    {
+        lock (_fBS_EnterpriseTypeImportLock)
+        {
+            var stream = ExcelHelper.ImportData<ImportFBS_EnterpriseTypeInput, FBS_EnterpriseType>(file, (list, markerErrorAction) =>
+            {
+                _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+                {
+                    
+                    // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+                    var rows = pageItems.Where(x => {
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.ParentId == null){
+                            x.Error = "鐖朵笉鑳戒负绌�";
+                            return false;
+                        }
+                        return true;
+                    }).Adapt<List<FBS_EnterpriseType>>();
+                    
+                    var storageable = _fBS_EnterpriseTypeRep.Context.Storageable(rows)
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Name), "鍚嶇О涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Name?.Length > 256, "鍚嶇О闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Code), "浠g爜涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Code?.Length > 36, "浠g爜闀垮害涓嶈兘瓒呰繃36涓瓧绗�")
+                        .SplitInsert(_ => true)
+                        .ToStorage();
+                    
+                    storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+                    storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+                    
+                    // 鏍囪閿欒淇℃伅
+                    markerErrorAction.Invoke(storageable, pageItems, rows);
+                });
+            });
+            
+            return stream;
+        }
+    }
+}
diff --git a/Admin.NET/cylsg.utility/CommonHelper.cs b/Admin.NET/cylsg.utility/CommonHelper.cs
new file mode 100644
index 0000000..9ad189f
--- /dev/null
+++ b/Admin.NET/cylsg.utility/CommonHelper.cs
@@ -0,0 +1,1015 @@
+锘縰sing cylsg.utility.Extend;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using System.Globalization;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Net.Http.Json;
+using System.Reflection;
+using System.Runtime.Loader;
+using System.Security.Cryptography;
+using System.Text;
+using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using static cylsg.utility.untilityModels;
+
+namespace cylsg.utility
+{
+    /// <summary>
+    /// 閫氱敤甯姪绫�
+    /// </summary>
+    public static class CommonHelper
+    {
+
+        #region 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜
+        /// <summary>
+        /// 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜
+        /// </summary>
+        /// <param name="mobilePhoneNumber"></param>
+        /// <returns></returns>
+        public static bool IsMobile(string mobilePhoneNumber)
+        {
+            if (mobilePhoneNumber.Length < 11)
+            {
+                return false;
+            }
+
+            //鐢典俊鎵嬫満鍙风爜姝e垯
+            string dianxin = @"^1[345789][01379]\d{8}$";
+            Regex regexDx = new Regex(dianxin);
+            //鑱旈�氭墜鏈哄彿鐮佹鍒�
+            string liantong = @"^1[345678][01256]\d{8}$";
+            Regex regexLt = new Regex(liantong);
+            //绉诲姩鎵嬫満鍙风爜姝e垯
+            string yidong = @"^1[345789][0123456789]\d{8}$";
+            Regex regexYd = new Regex(yidong);
+            if (regexDx.IsMatch(mobilePhoneNumber) || regexLt.IsMatch(mobilePhoneNumber) || regexYd.IsMatch(mobilePhoneNumber))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+        #endregion
+
+        #region 妫�娴嬫槸鍚︾鍚坋mail鏍煎紡
+
+        /// <summary>
+        ///     妫�娴嬫槸鍚︾鍚坋mail鏍煎紡
+        /// </summary>
+        /// <param name="strEmail">瑕佸垽鏂殑email瀛楃涓�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsValidEmail(string strEmail)
+        {
+            return Regex.IsMatch(strEmail, @"^[\w\.]+([-]\w+)*@[A-Za-z0-9-_]+[\.][A-Za-z0-9-_]");
+        }
+
+        public static bool IsValidDoEmail(string strEmail)
+        {
+            return Regex.IsMatch(strEmail,
+                @"^@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
+        }
+        #endregion
+
+        #region 妫�娴嬫槸鍚︽槸姝g‘鐨刄rl
+        /// <summary>
+        ///     妫�娴嬫槸鍚︽槸姝g‘鐨刄rl
+        /// </summary>
+        /// <param name="strUrl">瑕侀獙璇佺殑Url</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsUrl(string strUrl)
+        {
+            return Regex.IsMatch(strUrl,
+                @"^(http|https)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{1,10}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$");
+        }
+
+
+        #endregion
+
+        #region string 杞琲nt鏁扮粍
+
+        public static int[] StringToIntArray(string str)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(str)) return new int[0];
+                if (str.EndsWith(","))
+                {
+                    str = str.Remove(str.Length - 1, 1);
+                }
+                var idstrarr = str.Split(',');
+                var idintarr = new int[idstrarr.Length];
+
+                for (int i = 0; i < idstrarr.Length; i++)
+                {
+                    idintarr[i] = Convert.ToInt32(idstrarr[i]);
+                }
+                return idintarr;
+            }
+            catch
+            {
+                return new int[0];
+            }
+        }
+        #endregion
+
+        #region String杞暟缁�
+        public static string[] StringToStringArray(string str)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(str)) return new string[0];
+                if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1);
+                return str.Split(',');
+            }
+            catch
+            {
+                return new string[0];
+            }
+        }
+        #endregion
+
+        #region String鏁扮粍杞琁nt鏁扮粍
+        public static int[] StringArrAyToIntArray(string[] str)
+        {
+            try
+            {
+                int[] iNums = Array.ConvertAll(str, s => int.Parse(s));
+                return iNums;
+            }
+            catch
+            {
+                return new int[0];
+            }
+        }
+        #endregion
+
+        #region string杞珿uid鏁扮粍
+
+        public static Guid[] StringToGuidArray(string str)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(str)) return new Guid[0];
+                if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1);
+                var strarr = str.Split(',');
+                Guid[] guids = new Guid[strarr.Length];
+                for (int index = 0; index < strarr.Length; index++)
+                {
+                    guids[index] = Guid.Parse(strarr[index]);
+                }
+                return guids;
+            }
+            catch
+            {
+                return new Guid[0];
+            }
+        }
+        #endregion
+
+        #region 杞琈D5
+        /// <summary>
+        /// 杞琈D5
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static string ToMd5(string str)
+        {
+            MD5 md5 = MD5.Create();
+            // 灏嗗瓧绗︿覆杞崲鎴愬瓧鑺傛暟缁�
+            byte[] byteOld = Encoding.UTF8.GetBytes(str);
+            // 璋冪敤鍔犲瘑鏂规硶
+            byte[] byteNew = md5.ComputeHash(byteOld);
+            // 灏嗗姞瀵嗙粨鏋滆浆鎹负瀛楃涓�
+            StringBuilder sb = new StringBuilder();
+            foreach (byte b in byteNew)
+            {
+                // 灏嗗瓧鑺傝浆鎹㈡垚16杩涘埗琛ㄧず鐨勫瓧绗︿覆锛�
+                sb.Append(b.ToString("x2"));
+            }
+            // 杩斿洖鍔犲瘑鐨勫瓧绗︿覆
+            return sb.ToString();
+        }
+        #endregion
+
+        #region 鑾峰彇32浣峬d5鍔犲瘑
+        /// <summary>
+        /// 閫氳繃鍒涘缓鍝堝笇瀛楃涓查�傜敤浜庝换浣� MD5 鍝堝笇鍑芥暟 锛堝湪浠讳綍骞冲彴锛� 涓婂垱寤� 32 涓瓧绗︾殑鍗佸叚杩涘埗鏍煎紡鍝堝笇瀛楃涓�
+        /// </summary>
+        /// <param name="source"></param>
+        /// <returns>32浣峬d5鍔犲瘑瀛楃涓�</returns>
+        public static string Md5For32(string source)
+        {
+            using (MD5 md5Hash = MD5.Create())
+            {
+                byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source));
+                StringBuilder sBuilder = new StringBuilder();
+                for (int i = 0; i < data.Length; i++)
+                {
+                    sBuilder.Append(data[i].ToString("x2"));
+                }
+
+                string hash = sBuilder.ToString();
+                return hash.ToUpper();
+            }
+        }
+        #endregion
+
+        #region 鑾峰彇16浣峬d5鍔犲瘑
+        /// <summary>
+        /// 鑾峰彇16浣峬d5鍔犲瘑
+        /// </summary>
+        /// <param name="source"></param>
+        /// <returns>16浣峬d5鍔犲瘑瀛楃涓�</returns>
+        public static string Md5For16(string source)
+        {
+            using (MD5 md5Hash = MD5.Create())
+            {
+                byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source));
+                //杞崲鎴愬瓧绗︿覆锛屽苟鍙�9鍒�25浣�
+                string sBuilder = BitConverter.ToString(data, 4, 8);
+                //BitConverter杞崲鍑烘潵鐨勫瓧绗︿覆浼氬湪姣忎釜瀛楃涓棿浜х敓涓�涓垎闅旂锛岄渶瑕佸幓闄ゆ帀
+                sBuilder = sBuilder.Replace("-", "");
+                return sBuilder.ToUpper();
+            }
+        }
+
+        #endregion
+
+        #region 杩斿洖褰撳墠鐨勬绉掓椂闂存埑
+
+        /// <summary>
+        /// 杩斿洖褰撳墠鐨勬绉掓椂闂存埑
+        /// </summary>
+        public static string Msectime()
+        {
+            long timeTicks = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000;
+            return timeTicks.ToString();
+        }
+
+
+        #endregion
+
+
+
+        #region 鍓╀綑澶氫箙鏃堕棿鏂囧瓧鎻忚堪
+        /// <summary>
+        /// 鍓╀綑澶氫箙鏃堕棿
+        /// </summary>
+        /// <param name="remainingTime"></param>
+        /// <returns>鏂囧瓧鎻忚堪</returns>
+        public static string GetRemainingTime(DateTime remainingTime)
+        {
+            TimeSpan timeSpan = remainingTime - DateTime.Now;
+            var day = timeSpan.Days;
+            var hours = timeSpan.Hours;
+            var minute = timeSpan.Minutes;
+            var seconds = timeSpan.Seconds;
+            if (day > 0)
+            {
+                return day + "澶�" + hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�";
+            }
+            else
+            {
+                if (hours > 0)
+                {
+                    return hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�";
+                }
+                else
+                {
+                    return minute + "鍒�" + seconds + "绉�";
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鍓╀綑澶氫箙鏃堕棿杩斿洖鏃堕棿绫诲瀷
+        /// <summary>
+        /// 鍓╀綑澶氫箙鏃堕棿
+        /// </summary>
+        /// <param name="remainingTime"></param>
+        /// <returns>杩斿洖鏃堕棿绫诲瀷</returns>
+        public static void GetBackTime(DateTime remainingTime, out int day, out int hours, out int minute, out int seconds)
+        {
+            TimeSpan timeSpan = remainingTime - DateTime.Now;
+            day = timeSpan.Days;
+            hours = timeSpan.Hours;
+            minute = timeSpan.Minutes;
+            seconds = timeSpan.Seconds;
+        }
+
+        #endregion
+
+        #region 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂�
+
+        /// <summary>
+        /// 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂�
+        /// </summary>
+        /// <param name="postTime">鎻愪氦鏃堕棿(瑕佹槸浠ュ墠鐨勬椂闂�)</param>
+        /// <returns></returns>
+        public static string TimeAgo(DateTime postTime)
+        {
+            //褰撳墠鏃堕棿鐨勬椂闂存埑
+            var nowtimes = ConvertTicks(DateTime.Now);
+            //鎻愪氦鐨勬椂闂存埑
+            var posttimes = ConvertTicks(postTime);
+            //鐩稿樊鏃堕棿鎴�
+            var counttime = nowtimes - posttimes;
+
+            //杩涜鏃堕棿杞崲
+            if (counttime <= 60)
+            {
+                return "鍒氬垰";
+            }
+            else if (counttime > 60 && counttime <= 120)
+            {
+                return "1鍒嗛挓鍓�";
+            }
+            else if (counttime > 120 && counttime <= 180)
+            {
+                return "2鍒嗛挓鍓�";
+            }
+            else if (counttime > 180 && counttime < 3600)
+            {
+                return Convert.ToInt32(counttime / 60) + "鍒嗛挓鍓�";
+            }
+            else if (counttime >= 3600 && counttime < 3600 * 24)
+            {
+                return Convert.ToInt32(counttime / 3600) + "灏忔椂鍓�";
+            }
+            else if (counttime >= 3600 * 24 && counttime < 3600 * 24 * 2)
+            {
+                return "鏄ㄥぉ";
+            }
+            else if (counttime >= 3600 * 24 * 2 && counttime < 3600 * 24 * 3)
+            {
+                return "鍓嶅ぉ";
+            }
+            else if (counttime >= 3600 * 24 * 3 && counttime <= 3600 * 24 * 7)
+            {
+                return Convert.ToInt32(counttime / (3600 * 24)) + "澶╁墠";
+            }
+            else if (counttime >= 3600 * 24 * 7 && counttime <= 3600 * 24 * 30)
+            {
+                return Convert.ToInt32(counttime / (3600 * 24 * 7)) + "鍛ㄥ墠";
+            }
+            else if (counttime >= 3600 * 24 * 30 && counttime <= 3600 * 24 * 365)
+            {
+                return Convert.ToInt32(counttime / (3600 * 24 * 30)) + "涓湀鍓�";
+            }
+            else if (counttime >= 3600 * 24 * 365)
+            {
+                return Convert.ToInt32(counttime / (3600 * 24 * 365)) + "骞村墠";
+            }
+            else
+            {
+                return "";
+            }
+        }
+
+        /// <summary>
+        /// 鏃堕棿杞崲涓虹鐨勬椂闂存埑
+        /// </summary>
+        /// <param name="time"></param>
+        /// <returns></returns>
+        private static long ConvertTicks(DateTime time)
+        {
+            long currentTicks = time.Ticks;
+            DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            long currentMillis = (currentTicks - dtFrom.Ticks) / 10000000;  //杞崲涓虹涓篢icks/10000000锛岃浆鎹负姣Ticks/10000
+            return currentMillis;
+        }
+
+        #endregion
+
+        #region 娓呴櫎HTML涓寚瀹氭牱寮�
+        /// <summary>
+        /// 娓呴櫎HTML涓寚瀹氭牱寮�
+        /// </summary>
+        /// <param name="content"></param>
+        /// <param name="rule"></param>
+        /// <returns></returns>
+        public static string ClearHtml(string content, string[] rule)
+        {
+            if (!rule.Any())
+            {
+                return content;
+            }
+
+            foreach (var item in rule)
+            {
+                content = Regex.Replace(content, "/" + item + @"\s*=\s*\d+\s*/i", "");
+                content = Regex.Replace(content, "/" + item + @"\s*=\s*.+?[""]/i", "");
+                content = Regex.Replace(content, "/" + item + @"\s*:\s*\d+\s*px\s*;?/i", "");
+            }
+            return content;
+        }
+        #endregion
+
+        #region list闅忔満鎺掑簭鏂规硶
+        /// <summary>
+        /// list闅忔満鎺掑簭鏂规硶
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="ListT"></param>
+        /// <returns></returns>
+        public static List<T> RandomSortList<T>(List<T> ListT)
+        {
+            Random random = new Random();
+            List<T> newList = new List<T>();
+            foreach (T item in ListT)
+            {
+                newList.Insert(random.Next(newList.Count + 1), item);
+            }
+            return newList;
+        }
+        #endregion
+
+
+
+        #region 鎴墠鍚庡瓧绗�(涓�)
+        ///<summary>
+        /// 鎴墠鍚庡瓧绗�(涓�)
+        ///</summary>
+        ///<param name="val">鍘熷瓧绗︿覆</param>
+        ///<param name="str">瑕佹埅鎺夌殑瀛楃涓�</param>
+        ///<param name="all">鏄惁璐┆</param>
+        ///<returns></returns>
+        public static string GetCaptureInterceptedText(string val, string str, bool all = false)
+        {
+            return Regex.Replace(val, @"(^(" + str + ")" + (all ? "*" : "") + "|(" + str + ")" + (all ? "*" : "") + "$)", "");
+        }
+        #endregion
+
+        #region 瀵嗙爜鍔犲瘑鏂规硶
+        /// <summary>
+        /// 瀵嗙爜鍔犲瘑鏂规硶
+        /// </summary>
+        /// <param name="password">瑕佸姞瀵嗙殑瀛楃涓�</param>
+        /// <param name="createTime">鏃堕棿缁勫悎</param>
+        /// <returns></returns>
+        public static string EnPassword(string password, DateTime createTime)
+        {
+            var dtStr = createTime.ToString("yyyyMMddHHmmss");
+            var md5 = Md5For32(password);
+            var enPwd = Md5For32(md5 + dtStr);
+            return enPwd;
+        }
+        #endregion
+
+        #region 鑾峰彇鐜板湪鏄槦鏈熷嚑
+        /// <summary>
+        /// 鑾峰彇鐜板湪鏄槦鏈熷嚑
+        /// </summary>
+        /// <returns></returns>
+        public static string GetWeek()
+        {
+            string week = string.Empty;
+            switch (DateTime.Now.DayOfWeek)
+            {
+                case DayOfWeek.Monday:
+                    week = "鍛ㄤ竴";
+                    break;
+                case DayOfWeek.Tuesday:
+                    week = "鍛ㄤ簩";
+                    break;
+                case DayOfWeek.Wednesday:
+                    week = "鍛ㄤ笁";
+                    break;
+                case DayOfWeek.Thursday:
+                    week = "鍛ㄥ洓";
+                    break;
+                case DayOfWeek.Friday:
+                    week = "鍛ㄤ簲";
+                    break;
+                case DayOfWeek.Saturday:
+                    week = "鍛ㄥ叚";
+                    break;
+                case DayOfWeek.Sunday:
+                    week = "鍛ㄦ棩";
+                    break;
+                default:
+                    week = "N/A";
+                    break;
+            }
+            return week;
+        }
+
+        #endregion
+
+        #region UrlEncode (URL缂栫爜)
+        /// <summary>
+        /// UrlEncode (URL缂栫爜)
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static string UrlEncode(string str)
+        {
+            StringBuilder sb = new StringBuilder();
+            byte[] byStr = Encoding.UTF8.GetBytes(str); //榛樿鏄疭ystem.Text.Encoding.Default.GetBytes(str)
+            for (int i = 0; i < byStr.Length; i++)
+            {
+                sb.Append(@"%" + Convert.ToString(byStr[i], 16));
+            }
+
+            return sb.ToString();
+        }
+
+        #endregion
+
+        #region 鑾峰彇10浣嶆椂闂存埑
+        /// <summary>
+        /// 鑾峰彇10浣嶆椂闂存埑
+        /// </summary>
+        /// <returns></returns>
+        public static long GetTimeStampByTotalSeconds()
+        {
+            TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            return Convert.ToInt64(ts.TotalSeconds);
+        }
+        #endregion
+
+        #region 鑾峰彇13浣嶆椂闂存埑
+        /// <summary>
+        /// 鑾峰彇13浣嶆椂闂存埑
+        /// </summary>
+        /// <returns></returns>
+        public static long GetTimeStampByTotalMilliseconds()
+        {
+            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            return Convert.ToInt64(ts.TotalMilliseconds);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏃堕棿鎴�
+        /// </summary>
+        /// <param name="dt"></param>
+        /// <returns></returns>
+        public static int GetDateTimeStamp(DateTime dt)
+        {
+            DateTime dateStart = new DateTime(1970, 1, 1, 0, 0, 0);
+            int timeStamp = Convert.ToInt32((dt.ToUniversalTime() - dateStart).TotalSeconds);
+            return timeStamp;
+        }
+
+        #endregion
+
+        #region 鑾峰彇闅忔満瀛楃涓�
+        /// <summary>
+        /// 鑾峰彇闅忔満瀛楃涓�
+        /// </summary>
+        /// <returns></returns>
+        public static string GetSerialNumber()
+        {
+            var str = string.Empty;
+            Random rand = new Random();
+            var charsStr2 = new[] { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
+            var charsLen2 = charsStr2.Length - 1;
+            //    shuffle($chars);
+            str = "";
+            for (int i = 0; i < 16; i++)
+            {
+                str += charsStr2[rand.Next(0, charsLen2)];
+            }
+            return str;
+        }
+
+        #endregion
+
+        #region Sha1绛惧悕
+        /// <summary>
+        /// Sha1绛惧悕
+        /// </summary>
+        /// <param name="str">鍐呭</param>
+        /// <param name="encoding">缂栫爜</param>
+        /// <returns></returns>
+        public static string Sha1Signature(string str, Encoding encoding = null)
+        {
+            if (encoding == null) encoding = Encoding.UTF8;
+            var buffer = encoding.GetBytes(str);
+            var data = SHA1.Create().ComputeHash(buffer);
+            StringBuilder sub = new StringBuilder();
+            foreach (var t in data)
+            {
+                sub.Append(t.ToString("x2"));
+            }
+
+            return sub.ToString();
+        }
+        #endregion
+
+        /// <summary>
+        ///  绮剧‘璁$畻base64瀛楃涓叉枃浠跺ぇ灏忥紙鍗曚綅锛欱锛�
+        ///  param base64String
+        ///  return double 瀛楄妭澶у皬
+        /// </summary>
+        /// <param name="base64String"></param>
+        /// <returns></returns>
+        public static double Base64FileSize(string base64String)
+        {
+            //妫�娴嬫槸鍚﹀惈鏈塨ase64,鏂囦欢澶�)
+            if (base64String.LastIndexOf(",", StringComparison.Ordinal) > -1)
+            {
+                base64String = base64String[(base64String.LastIndexOf(",", StringComparison.Ordinal) + 1)..];
+            }
+            //鑾峰彇base64瀛楃涓查暱搴�(涓嶅惈data:audio/wav;base64,鏂囦欢澶�)
+            var size0 = base64String.Length;
+            if (size0 <= 10) return size0 - (double)size0 / 8 * 2;
+            //鑾峰彇瀛楃涓茬殑灏惧反鐨勬渶鍚�10涓瓧绗︼紝鐢ㄤ簬鍒ゆ柇灏惧反鏄惁鏈夌瓑鍙凤紝姝e父鐢熸垚鐨刡ase64鏂囦欢'绛夊彿'涓嶄細瓒呰繃4涓�
+            var tail = base64String[(size0 - 10)..];
+            //鎵惧埌绛夊彿锛屾妸绛夊彿涔熷幓鎺�,(绛夊彿鍏跺疄鏄┖鐨勬剰鎬�,涓嶈兘绠楀湪鏂囦欢澶у皬閲岄潰)
+            int equalIndex = tail.IndexOf("=", StringComparison.Ordinal);
+            if (equalIndex > 0)
+            {
+                size0 = size0 - (10 - equalIndex);
+            }
+            //璁$畻鍚庡緱鍒扮殑鏂囦欢娴佸ぇ灏忥紝鍗曚綅涓哄瓧鑺�
+            return size0 - (double)size0 / 8 * 2;
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏂囦欢澶у皬
+        /// </summary>
+        /// <param name="base64"></param>
+        /// <param name="size"></param>
+        /// <param name="unit"></param>
+        /// <returns></returns>
+        public static bool CheckBase64Size(string base64, int size, string unit = "M")
+        {
+            // 涓婁紶鏂囦欢鐨勫ぇ灏�, 鍗曚綅涓哄瓧鑺�.
+            var len = Base64FileSize(base64);
+            // 鍑嗗鎺ユ敹鎹㈢畻鍚庢枃浠跺ぇ灏忕殑瀹瑰櫒
+            double fileSize = unit.ToUpperInvariant() switch
+            {
+                "B" => len,
+                "K" => (double)len / 1024,
+                "M" => (double)len / 1048576,
+                "G" => (double)len / 1073741824,
+                _ => 0
+            };
+            // 濡傛灉涓婁紶鏂囦欢澶т簬闄愬畾鐨勫閲�
+            return !(fileSize > size);
+        }
+
+        /// <summary>
+        /// 10浣嶆椂闂存埑 杞寲
+        /// </summary>
+        /// <param name="time"></param>
+        /// <returns></returns>
+        public static long ConvertDateTimeToInt(DateTime time)
+        {
+            DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0));
+            long t = (time.Ticks - startTime.Ticks) / 10000000;   //闄�10000000璋冩暣涓�10浣�    
+            return t;
+        }
+
+        #region 鍙嶅皠鐩稿叧
+        private static List<Assembly>? _allAssemblies = null;
+        /// <summary>
+        /// 鑾峰彇鎵�鏈夌▼搴忕洰褰曚笅鍜屽父鐢ㄧ殑绋嬪簭闆� 鍖呮嫭涓�浜涚郴缁熷紩鐢ㄧ▼搴忛泦
+        /// </summary>
+        /// <returns> 褰撳墠宸ョ▼涓嬬殑绋嬪簭闆�</returns>
+        public static List<Assembly> GetAllAssembly()
+        {
+
+
+            if (_allAssemblies == null)
+            {
+                _allAssemblies = new List<Assembly>();
+                string? path = null;
+                string singlefile = null;
+                try
+                {
+                    path = Assembly.GetEntryAssembly()?.Location;
+                }
+                catch { }
+                if (string.IsNullOrEmpty(path))
+                {
+                    singlefile = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
+                    path = Path.GetDirectoryName(singlefile);
+                }
+                if (string.IsNullOrEmpty(path))
+
+                    throw new Exception("鑾峰彇绋嬪簭鐩綍鍑洪敊");
+                var dir = new DirectoryInfo(Path.GetDirectoryName(path) ?? "");
+
+                var dlls = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly);
+                string[] systemdll = new string[]
+                {
+                "Microsoft.",
+                "System.",
+                "Swashbuckle.",
+                "ICSharpCode",
+                "Newtonsoft.",
+                "Oracle.",
+                "Pomelo.",
+                "SQLitePCLRaw.",
+                "Aliyun.OSS",
+                "BouncyCastle.",
+                "FreeSql.",
+                "Google.Protobuf.dll",
+                "Humanizer.dll",
+                "IdleBus.dll",
+                "K4os.",
+                "MySql.Data.",
+                "Npgsql.",
+                "NPOI.",
+                "netstandard",
+                "MySqlConnector",
+                "VueCliMiddleware"
+                };
+
+                var filtered = dlls.Where(x => systemdll.Any(y => x.Name.StartsWith(y)) == false);
+                foreach (var dll in filtered)
+                {
+                    try
+                    {
+                        AssemblyLoadContext.Default.LoadFromAssemblyPath(dll.FullName);
+                    }
+                    catch
+                    {
+                    }
+                }
+                var dlllist = AssemblyLoadContext.Default.Assemblies.Where(x => systemdll.Any(y => x.FullName.StartsWith(y)) == false).ToList();
+                _allAssemblies.AddRange(dlllist);
+            }
+            return _allAssemblies;
+        }
+        #endregion
+
+        #region 鏋氫妇鑾峰彇鎵�鏈夐」
+        /// <summary>
+        /// 鑾峰彇鏋氫妇鐨勬墍鏈夐」
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <returns></returns>
+        public static List<MenmItem> GetEnumItemsWithAttributes<T>() where T : Enum
+        {
+            var result = new List<MenmItem>();
+
+            foreach (var value in Enum.GetValues(typeof(T)))
+            {
+                var member = typeof(T).GetMember(value.ToString())[0];
+                var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>();
+
+                var item = new MenmItem
+                {
+                    Key = value.ToString(),
+                    Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓�
+                    Description = descriptionAttribute?.Description ?? string.Empty
+                };
+
+                result.Add(item);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏋氫妇鎵�鏈夌殑椤癸紝杩斿洖鍚嶇О 鍊� 鍜孌escription 鎻忚堪
+        /// </summary>
+        /// <param name="enumType"></param>
+        /// <returns></returns>
+        /// <exception cref="ArgumentException"></exception>
+        public static List<MenmItem> EnumerateWithDescriptions(Type enumType)
+        {
+            if (!enumType.IsEnum)
+            {
+                throw new ArgumentException(" 杩欎笉鏄灇涓�");
+            }
+
+            var result = new List<MenmItem>();
+
+            foreach (var value in Enum.GetValues(enumType))
+            {
+                var member = enumType.GetMember(value.ToString())[0];
+                var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>();
+
+                var item = new MenmItem
+                {
+                    Key = value.ToString(),
+                    Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓�
+                    Description = descriptionAttribute?.Description ?? string.Empty
+                };
+
+                result.Add(item);
+            }
+
+            return result;
+        }
+        /// <summary>
+        /// 鏄惁鏄郴缁熺被鍨�
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        public static bool IsCustomType(Type type)
+        {
+            // 瀹氫箟涓�涓垨澶氫釜鍩虹鍛藉悕绌洪棿鍒楄〃锛岃繖浜涘懡鍚嶇┖闂翠笅鐨勭被鍨嬮�氬父璁や负鏄郴缁熺被鍨�
+            string[] frameworkNamespaces = { "System", "Microsoft", "mscorlib", "netstandard", "System.Private.CoreLib" };
+
+            // 鑾峰彇绫诲瀷鎵�鍦ㄧ殑鍛藉悕绌洪棿
+            string typeNameSpace = type.Namespace;
+
+            // 妫�鏌ヨ鍛藉悕绌洪棿鏄惁鍦ㄥ熀纭�鍛藉悕绌洪棿鍒楄〃涓紝濡傛灉涓嶅湪锛屽垯璁や负鏄嚜瀹氫箟绫诲瀷
+            return frameworkNamespaces.Any(n => typeNameSpace.StartsWith(n, StringComparison.OrdinalIgnoreCase));
+        }
+
+
+        #endregion
+
+        /// <summary>
+        /// 鏍规嵁json瀛楃绌垮鐞�
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="jsonString"></param>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        private static Expression<Func<T, bool>> CreateWhereExpressionRecursive<T>(string jsonString, ParameterExpression parameter)
+        {
+            var conditions = new List<Expression>();
+
+            JObject jsonObject = JObject.Parse(jsonString);
+
+            foreach (var property in jsonObject.Properties())
+            {
+                var propertyName = property.Name;
+                var propertyValue = property.Value.ToString();
+                if (propertyValue == "") //绌哄�间笉澶勭悊
+                    continue;
+                var propertyInfo = typeof(T).GetProperty(propertyName);
+
+                if (propertyInfo == null)
+                {
+                    propertyInfo = typeof(T).GetProperty(propertyName.FirstToCapitalize());
+                    if (propertyInfo == null)
+                        continue; // 濡傛灉灞炴�т笉瀛樺湪锛岃烦杩�
+                }
+
+                var propertyType = propertyInfo.PropertyType;
+                var TypeName = propertyType.GenericTypeArguments.Length > 0 ? propertyType.GenericTypeArguments[0].Name + "?" : propertyType.Name;
+                if (propertyType.IsClass && TypeName != "String")
+                {
+                    // 閫掑綊澶勭悊宓屽妯″瀷
+                    var nestedParameter = Expression.Parameter(propertyType, propertyName);
+                    var nestedJsonString = property.Value.ToString();
+
+                    // 浣跨敤 MakeGenericType 鍔ㄦ�佸垱寤烘硾鍨嬫柟娉�
+                    var genericMethod = typeof(CommonHelper).GetMethod("CreateWhereExpressionRecursive", BindingFlags.Static | BindingFlags.NonPublic)
+                        .MakeGenericMethod(propertyType);
+
+                    // 璋冪敤娉涘瀷鏂规硶骞惰幏鍙栬繑鍥炵殑琛ㄨ揪寮�
+                    var nestedConditions = (Expression<Func<object, bool>>)genericMethod.Invoke(null, new object[] { nestedJsonString, nestedParameter });
+
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var lambda = Expression.Lambda(nestedConditions.Body, nestedParameter);
+                    var invoke = Expression.Invoke(lambda, propExpr);
+                    conditions.Add(invoke);
+                }
+                else if (propertyType == typeof(string))
+                {
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var constant = Expression.Constant(propertyValue);
+                  
+                    var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
+                    var containsExpression = Expression.Call(propExpr, containsMethod, constant);
+                    conditions.Add(containsExpression);
+                }
+                else if (TypeName.Contains( "DateTime")) //鍏煎DateTime锛�
+                {
+                    var dateRange = propertyValue.Split('~');
+                    if (dateRange.Length == 2)
+                    {
+                        var startDate = DateTime.Parse(dateRange[0]);
+                        var endDate = DateTime.Parse(dateRange[1]);
+
+                        var propExpr = Expression.Property(parameter, propertyName);
+                        var startConstant = Expression.Constant(startDate);
+                        var endConstant = Expression.Constant(endDate);
+                        if (TypeName == "DateTime?")
+                        // 灏嗗父閲忚〃杈惧紡杞崲涓� Nullable<DateTime>
+                        {
+                            var startNullableConstant = Expression.Convert(startConstant, typeof(DateTime?));
+                            var endNullableConstant = Expression.Convert(endConstant, typeof(DateTime?));
+
+
+                            var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startNullableConstant);
+                            var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endNullableConstant);
+
+
+                            var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+                            conditions.Add(andExpression);
+                        }
+                        else
+                        {
+
+                            var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startConstant);
+                            var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endConstant);
+
+
+                            var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+                            conditions.Add(andExpression);
+
+                        }
+                    }
+                    else if (DateTime.TryParse(propertyValue, out var dateTime))
+                    {
+                        var propExpr = Expression.Property(parameter, propertyName);
+                        var constant = Expression.Constant(dateTime);
+                        var equalExpression = Expression.Equal(propExpr, constant);
+                        conditions.Add(equalExpression);
+                    }
+                }
+                else
+                {
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var constant = Expression.Constant(Convert.ChangeType(propertyValue, propertyType));
+                    var equalExpression = Expression.Equal(propExpr, constant);
+                    conditions.Add(equalExpression);
+                }
+            }
+
+            var body = conditions.Count > 1 ? conditions.Aggregate(Expression.AndAlso) : conditions.FirstOrDefault();
+            return Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(true), parameter);
+        }
+
+        /// <summary>
+        /// json鏍煎紡鍖栦负琛ㄨ揪寮忔爲
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="jsonString"></param>
+        /// <returns></returns>
+        public static Expression<Func<T, bool>> FormatWhereExpression<T>(string jsonString)
+        {
+            var parameter = Expression.Parameter(typeof(T), "x");
+            return CreateWhereExpressionRecursive<T>(jsonString, parameter);
+        }
+
+        /// <summary>
+        /// 鏇村叿灞炴�у悕绉扮敓鎴愯〃杈惧紡鏍戯紝濡倄.id
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="propertyName"></param>
+        /// <returns></returns>
+        public static Expression<Func<T, object>> FormatPropertyExpression<T>(string propertyName)
+        {
+            // 鑾峰彇鍙傛暟琛ㄨ揪寮�
+            var parameter = Expression.Parameter(typeof(T), "x");
+
+            // 鑾峰彇灞炴�ц〃杈惧紡
+            var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
+            if (propertyAccess == null)
+            {
+                ///棣栧瓧姣嶈浆澶у啓
+                propertyAccess = Expression.PropertyOrField(parameter, propertyName.FirstToCapitalize());
+            }
+
+
+            // 鍒涘缓 Lambda 琛ㄨ揪寮忥紝骞跺湪杩斿洖鍊间腑杩涜绫诲瀷杞崲
+            return Expression.Lambda<Func<T, object>>(
+                Expression.Convert(propertyAccess, typeof(object)),
+                parameter);
+        }
+
+    
+   }
+
+
+
+
+
+    /// <summary>
+    /// 鏋氫妇椤瑰睘鎬�
+    /// </summary>
+    [Description("鏋氫妇椤瑰睘鎬�")]
+    public class MenmItem
+    {
+        /// <summary>
+        /// 鏋氫妇key
+        /// </summary>
+        [Description("鏋氫妇key")]
+        public string? Key { get; set; }
+        /// <summary>
+        /// 鏋氫妇鍊�
+        /// </summary>
+        [Description("鏋氫妇鍊�")]
+        public int Value { get; set; }
+        /// <summary>
+        /// 鏋氫妇鎻忚堪
+        /// </summary>
+        [Description("鏋氫妇椤瑰睘鎬�")]
+        public string? Description { get; set; }
+    }
+
+
+
+
+
+}
diff --git a/Admin.NET/cylsg.utility/Extend/EmunEx.cs b/Admin.NET/cylsg.utility/Extend/EmunEx.cs
new file mode 100644
index 0000000..6f2d96c
--- /dev/null
+++ b/Admin.NET/cylsg.utility/Extend/EmunEx.cs
@@ -0,0 +1,15 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cylsg.utility.Extend
+{
+    /// <summary>
+    /// 鏋氫妇鎵╁睍
+    /// </summary>
+    public static class EmunEx
+    {
+    }
+}
diff --git a/Admin.NET/cylsg.utility/Extend/StringEx.cs b/Admin.NET/cylsg.utility/Extend/StringEx.cs
new file mode 100644
index 0000000..095dbcc
--- /dev/null
+++ b/Admin.NET/cylsg.utility/Extend/StringEx.cs
@@ -0,0 +1,251 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace cylsg.utility.Extend
+{
+    /// <summary>
+    /// 瀛楃涓叉墿灞�
+    /// </summary>
+    public static class StringEx
+    {
+        /// <summary>
+        /// 棣栧瓧姣嶅皬鍐�
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static string FirstToLower(this string self)
+        {
+            string str1 = self?.Substring(0, 1).ToLower() ?? "";
+            string str2 = self?.Substring(1) ?? "";
+
+            //棣栧瓧姣嶈浆灏忓啓
+            return str1 + str2;
+        }
+        /// <summary>
+        /// 甯︽湁xxx.xxx缁撴潫鐨勭殑鎵�鏈夊瓧绗︿覆 鐨勫悗闈xx.xxx
+        /// </summary>
+        /// <param name="strtypr"></param>
+        /// <returns></returns>
+        public static string GetFileName(this string strtypr)
+        {
+            return Path.GetFileName(strtypr);
+        }
+        /// <summary>
+        /// 鏄惁鏄暟瀛楀簭鍒�
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static bool isPureNum(this string strtypr)
+        {
+            if (strtypr.Length == 0 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌�
+            {
+                return false;
+            }
+            byte[] strBytes = Encoding.ASCII.GetBytes(strtypr);//鑾峰彇瀛楃涓茬殑byte绫诲瀷鐨勫瓧绗︽暟缁勶紝缂栫爜鏂瑰紡ASCII
+            foreach (byte strByte in strBytes)
+            {
+                if (strByte < 48 || strByte > 57)     //鍒ゆ柇姣忎釜瀛楃鏄惁涓烘暟瀛楋紝鏍规嵁姣忎釜瀛楃鐨凙SCII鍊兼墍鍦ㄨ寖鍥村垽鏂�
+                {
+                    return false;                     //涓嶆槸锛屽氨杩斿洖false
+                }
+            }
+            return true;                              //鏄紝灏辫繑鍥瀟rue
+        }
+
+        /// <summary>
+        /// 鏄惁鏄暟瀛楀簭鍒�
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static bool isGuid(this string strtypr)
+        {
+            if (strtypr.Length < 20 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌�
+            {
+                return false;
+            }
+            try
+            {
+                new Guid(strtypr);
+                return true;
+
+            }
+            catch (Exception)
+            {
+
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 瀛楃涓�
+        /// </summary>
+        /// <param name="strtypr"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public static int toInt(this string strtypr)
+        {
+            if (!strtypr.isPureNum())
+                throw new Exception("骞堕潪瀹屾暣鐨勬暟瀛楀簭鍒�");
+            return int.Parse(strtypr);
+        }
+
+        /// <summary>
+        /// 绉婚櫎绗竴涓瓧绗︿覆涓烘寚瀹氬瓧绗︿覆鐨� 濡� 鈥渁xtXXXXX" 濡傛灉浠�"axt"寮�澶寸殑瀛楃涓诧紝灏辩Щ闄�"axt" 娌℃湁鍒欎笉鍙�
+        /// </summary>
+        /// <param name="strtypr"></param>
+        /// <param name="str">寮�濮嬪瓧绗�</param>
+        /// <returns></returns>
+        public static string RemoveStartWithStr(this string strtypr, string str)
+        {
+            string strret = strtypr;
+            if (strtypr.StartsWith(str))
+            {
+                strret = strtypr.Remove(0, str.Length);
+            }
+            return strret;
+
+        }
+
+        /// <summary>
+        /// 瀵瑰瓧绗︿覆杩涜闅愮澶勭悊锛屾瘮濡備腑闂寸殑鐢�*鏄剧ず
+        /// </summary>
+        /// <param name="strtypr"></param>
+        /// <returns></returns>
+        public static string PrivacyStr(this string strtypr)
+        {
+            // 濡傛灉鏄墜鏈哄彿鐮侊紝浠呬繚鐣欏墠3浣嶅拰鍚�4浣嶏紝涓棿鐢ㄦ槦鍙锋浛鎹�
+            if (Regex.IsMatch(strtypr, @"^1[3-9]\d{9}$"))
+            {
+                return $"{strtypr.Substring(0, 3)}****{strtypr.Substring(7)}";
+            }
+
+            // 瀵逛簬涓枃鍚嶅瓧鎴栬�呴潪鎵嬫満鍙锋牸寮忥紝浠呬繚鐣欓灏惧悇1涓瓧绗︼紝涓棿鐢ㄦ槦鍙锋浛鎹�
+            else
+            {
+                if (strtypr.Length <= 2) return $"{strtypr.Substring(0, 1)}*"; // 闀垮害灏忎簬绛変簬2鏃讹紝杩斿洖鍥哄畾鐨勬槦鍙�
+
+                var masked = $"{strtypr.Substring(0, 1)}*{strtypr.Substring(strtypr.Length - 1, 1)}";
+                return masked;
+            }
+        }
+
+
+        #region 鏃堕棿鍖洪棿瀛楃涓茶浆鍏跺疄鍜岀粨鏉熸椂闂�
+        /// <summary>
+        /// 瑙f瀽鏃堕棿鍖洪棿瀛楃涓�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static (DateTime? StartDate, DateTime? EndDate) TryParseDateRangString(this string input)
+        {
+            DateTime startDate, endDate;
+            var culture = CultureInfo.InvariantCulture;
+
+            // 灏濊瘯瑙f瀽绗竴绉嶆牸寮� "2023-01-012023-01-31"
+            if (DateTime.TryParseExact(input.Substring(0, 10), "yyyy-MM-dd", culture, DateTimeStyles.None, out startDate) &&
+                DateTime.TryParseExact(input.Substring(10), "yyyy-MM-dd", culture, DateTimeStyles.None, out endDate))
+            {
+                return (startDate, endDate);
+            }
+
+            // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01 08:02:032023-01-31 08:02:03"
+            if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out startDate) &&
+                DateTime.TryParseExact(input.Substring(19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out endDate))
+            {
+                return (startDate, endDate);
+            }
+
+            // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01T08:02:032023-01-31T08:02:03"
+            if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out startDate) &&
+                DateTime.TryParseExact(input.Substring(19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out endDate))
+            {
+                return (startDate, endDate);
+            }
+            // 濡傛灉閮戒笉鏄紝杩斿洖null
+            return (null, null);
+        }
+
+        /// <summary>
+        /// 绉婚櫎鏈�鍚庝竴涓瓧绗︾殑?鍙�
+        /// </summary>
+        /// <param name="input"> </param>
+        /// /// <param name="inChar">瀛楃</param>
+        /// <returns></returns>
+        public static string RemoveCharIfPresent(this string input, char inChar)
+        {
+            if (string.IsNullOrEmpty(input)) return input;
+
+            // 妫�鏌ュ瓧绗︿覆鐨勬渶鍚庝竴涓瓧绗︽槸鍚︿负闂彿
+            if (input[^1] == '?')
+            {
+                // 浣跨敤鍒囩墖鎿嶄綔绗﹀垱寤轰笉鍖呭惈闂彿鐨勬柊瀛楃涓�
+                return input[..^1];
+            }
+            else
+            {
+                // 瀛楃涓蹭笉浠ラ棶鍙风粨灏撅紝杩斿洖鍘熷瓧绗︿覆
+                return input;
+            }
+        }
+
+        /// <summary>
+        /// 绉婚櫎鏈�鍚庣殑瀛楃涓�
+        /// </summary>
+        /// <param name="input"></param>
+        /// <param name="endString"></param>
+        /// <returns></returns>
+        public static string RemoveEndStringIfExists(this string input, string endString)
+        {
+            if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(endString))
+            {
+                return input; // 濡傛灉杈撳叆瀛楃涓叉垨缁撴潫瀛楃涓蹭负绌烘垨null锛岀洿鎺ヨ繑鍥炲師瀛楃涓�
+            }
+
+            if (input.EndsWith(endString))
+            {
+                return input.Substring(0, input.Length - endString.Length); // 绉婚櫎缁撴潫瀛楃涓�
+            }
+
+            return input; // 濡傛灉涓嶄互鎸囧畾瀛楃涓茬粨鏉燂紝杩斿洖鍘熷瓧绗︿覆
+        }
+
+
+        /// <summary>
+        /// 棣栧瓧姣嶈浆灏忓啓
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static string FirstCharToLower(this string input)
+        {
+            if (string.IsNullOrEmpty(input))
+            {
+                return input;
+            }
+
+            // 浣跨敤姝e垯琛ㄨ揪寮�
+            return Regex.Replace(input, @"^\p{Lu}", match => match.Value.ToLower());
+        }
+        #endregion
+
+        /// <summary>
+        /// 棣栧瓧姣嶈浆澶у啓
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static string FirstToCapitalize(this  string input)
+        {
+            if (string.IsNullOrEmpty(input))
+            {
+                return input;
+            }
+
+            TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;
+            return textInfo.ToTitleCase(input.ToLower()).Substring(0, 1) + input.Substring(1);
+        }
+    }
+}
diff --git a/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs
new file mode 100644
index 0000000..0fe86f8
--- /dev/null
+++ b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs
@@ -0,0 +1,1021 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using cylsg.utility.Extend;
+using Microsoft.Extensions.Primitives;
+
+namespace cylsg.utility.Extend
+{
+    /// <summary>
+    /// 鍙嶅皠鎵╁睍鍑芥暟
+    /// </summary>
+    public static class TypeAndExpressionEx
+    {
+        #region 灞炴�ф墿灞� 鍙嶅皠
+        public static Func<object, object> GetPropertyExpression(Type objtype, string property)
+        {
+            property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty);
+            List<string> level = new List<string>();
+            if (property.Contains('.'))
+            {
+                level.AddRange(property.Split('.'));
+            }
+            else
+            {
+                level.Add(property);
+            }
+
+            var pe = Expression.Parameter(objtype);
+#pragma warning disable 8604
+            var member = Expression.Property(pe, objtype.GetSingleProperty(level[0]));
+            for (int i = 1; i < level.Count; i++)
+            {
+                member = Expression.Property(member, member.Type.GetSingleProperty(level[i]));
+            }
+            return Expression.Lambda<Func<object, object>>(member, pe).Compile();
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�у悕
+        /// </summary>
+        /// <param name="expression">灞炴�ц〃杈惧紡</param>
+        /// <param name="getAll">鏄惁鑾峰彇鍏ㄩ儴绾у埆鍚嶇О锛屾瘮濡俛.b.c</param>
+        /// <returns>灞炴�у悕</returns>
+        public static string GetPropertyName(this Expression expression, bool getAll = true)
+        {
+            if (expression == null)
+            {
+                return "";
+            }
+            MemberExpression me = null;
+            LambdaExpression le = null;
+            if (expression is MemberExpression)
+            {
+                me = expression as MemberExpression;
+            }
+            if (expression is LambdaExpression)
+            {
+                le = expression as LambdaExpression;
+                if (le.Body is MemberExpression)
+                {
+                    me = le.Body as MemberExpression;
+                }
+                if (le.Body is UnaryExpression)
+                {
+                    me = (le.Body as UnaryExpression).Operand as MemberExpression;
+                }
+            }
+            string rv = "";
+            if (me != null)
+            {
+                rv = me.Member.Name;
+            }
+            while (me != null && getAll && me.NodeType == ExpressionType.MemberAccess)
+            {
+                Expression exp = me.Expression;
+                if (exp is MemberExpression)
+                {
+                    rv = (exp as MemberExpression).Member.Name + "." + rv;
+                    me = exp as MemberExpression;
+                }
+                else if (exp is MethodCallExpression)
+                {
+                    var mexp = exp as MethodCallExpression;
+                    if (mexp.Method.Name == "get_Item")
+                    {
+                        object index = 0;
+                        if (mexp.Arguments[0] is MemberExpression)
+                        {
+                            var obj = ((mexp.Arguments[0] as MemberExpression).Expression as ConstantExpression).Value;
+                            index = obj.GetType().GetField((mexp.Arguments[0] as MemberExpression).Member.Name).GetValue(obj);
+                        }
+                        else
+                        {
+                            index = (mexp.Arguments[0] as ConstantExpression).Value;
+                        }
+                        rv = (mexp.Object as MemberExpression).Member.Name + "[" + index + "]." + rv;
+                        me = mexp.Object as MemberExpression;
+                    }
+                }
+                else
+                {
+                    break;
+                }
+            }
+            return rv;
+        }
+
+        public static Expression GetMemberExp(this ParameterExpression self, Expression member)
+        {
+            return self.GetMemberExp(member.GetPropertyName());
+        }
+
+        public static Expression GetMemberExp(this ParameterExpression self, string memberName)
+        {
+            var names = memberName.Split(',');
+            Expression rv = Expression.PropertyOrField(self, names[0]); ;
+            for (int i = 1; i < names.Length; i++)
+            {
+                rv = Expression.PropertyOrField(rv, names[i]);
+            }
+            return rv;
+        }
+
+
+
+        /// <summary>
+        /// 鑾峰彇姝e垯琛ㄨ揪寮忛敊璇�
+        /// </summary>
+        /// <param name="pi">灞炴�т俊鎭�</param>
+        /// <returns>閿欒鏂囨湰</returns>
+        public static string GetRegexErrorMessage(this MemberInfo pi)
+        {
+            string rv = "";
+
+            if (pi.GetCustomAttributes(typeof(RegularExpressionAttribute), false).FirstOrDefault() is RegularExpressionAttribute dis && !string.IsNullOrEmpty(dis.ErrorMessage))
+            {
+                rv = dis.ErrorMessage;
+                //if (CoreProgram._localizer != null)
+                //{
+                //    rv = CoreProgram._localizer[rv];
+                //}
+            }
+            else
+            {
+                rv = "";
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�ф樉绀哄悕绉�
+        /// </summary>
+        /// <param name="pi">灞炴�т俊鎭�</param>
+        /// <returns>灞炴�у悕绉�</returns>
+        public static string GetPropertyDisplayName(this MemberInfo pi)
+        {
+            string rv = "";
+            if (pi.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() is DisplayAttribute dis && !string.IsNullOrEmpty(dis.Name))
+            {
+                rv = dis.Name;
+
+            }
+            else
+            {
+                rv = pi.Name;
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�ф樉绀哄悕绉�
+        /// </summary>
+        /// <param name="expression">灞炴�ц〃杈惧紡</param>
+        /// <returns>灞炴�ф樉绀哄悕绉�</returns>
+        public static string GetPropertyDisplayName(this Expression expression)
+        {
+            return expression.GetPropertyInfo().GetPropertyDisplayName();
+        }
+        /// <summary>
+        /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉�
+        /// </summary>
+        /// <param name="pi"></param>      
+        /// <returns></returns>
+        public static string GetPropertyDescription(this MemberInfo pi)
+        {
+            string rv = "";
+            if (pi.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() is DescriptionAttribute dis && !string.IsNullOrEmpty(dis.Description))
+            {
+                rv = dis.Description;
+
+            }
+            else
+            {
+                rv = pi.Name;
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉�
+        /// </summary>
+        /// <param name="expression"></param>      
+        /// <returns></returns>
+        public static string GetPropertyDescription(this Expression expression)
+        {
+            return expression.GetPropertyInfo().GetPropertyDisplayName();
+        }
+        /// <summary>
+        /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О
+        /// </summary>
+        /// <param name="value">鏋氫妇鍊�</param>
+        /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns>
+        public static string? GetEnumDisplayName(this Enum value)
+        {
+            return GetEnumDisplayName(value.GetType(), value.ToString());
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�т俊鎭�
+        /// </summary>
+        /// <param name="expression">灞炴�ц〃杈惧紡</param>
+        /// <returns>灞炴�т俊鎭�</returns>
+        public static PropertyInfo? GetPropertyInfo(this Expression expression)
+        {
+            MemberExpression me = null;
+            LambdaExpression le = null;
+            if (expression is MemberExpression)
+            {
+                me = expression as MemberExpression;
+            }
+            if (expression is LambdaExpression)
+            {
+                le = expression as LambdaExpression;
+                if (le.Body is MemberExpression)
+                {
+                    me = le.Body as MemberExpression;
+                }
+                if (le.Body is UnaryExpression)
+                {
+                    me = (le.Body as UnaryExpression).Operand as MemberExpression;
+                }
+            }
+            PropertyInfo rv = null;
+            if (me != null)
+            {
+                rv = me.Member.DeclaringType.GetSingleProperty(me.Member.Name);
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�у��
+        /// </summary>
+        /// <param name="exp">灞炴�ц〃杈惧紡</param>
+        /// <param name="obj">灞炴�ф墍鍦ㄥ疄渚�</param>
+        /// <returns>灞炴�у��</returns>
+        public static object? GetPropertyValue(this object obj, LambdaExpression exp)
+        {
+            //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿
+            try
+            {
+                var expValue = exp.Compile().DynamicInvoke(obj);
+                object val = expValue;
+                return val;
+            }
+            catch
+            {
+                return "";
+            }
+        }
+        /// <summary>
+        /// 鑾峰彇灞炴�у��
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <param name="property"></param>
+        /// <returns></returns>
+        public static object? GetPropertyValue(this object obj, string property)
+        {
+            //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿
+            try
+            {
+                return obj.GetType().GetSingleProperty(property).GetValue(obj);
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+
+        public static List<string>? GetPropertySiblingValues(this object obj, string propertyName)
+        {
+            if (obj == null)
+            {
+                return new List<string>();
+            }
+            Regex reg = new Regex("(.*?)\\[\\-?\\d?\\]\\.(.*?)$");
+            var match = reg.Match(propertyName);
+            if (match.Success)
+            {
+                var name1 = match.Groups[1].Value;
+                var name2 = match.Groups[2].Value;
+
+                var levels = name1.Split('.');
+                var objtype = obj.GetType();
+                var pe = Expression.Parameter(objtype);
+                var member = Expression.Property(pe, objtype.GetSingleProperty(levels[0]));
+                for (int i = 1; i < levels.Length; i++)
+                {
+                    member = Expression.Property(member, member.Type.GetSingleProperty(levels[i]));
+                }
+                var pe2 = Expression.Parameter(member.Type.GetGenericArguments()[0]);
+                var cast = Expression.Call(typeof(Enumerable), "Cast", new Type[] { pe2.Type }, member);
+
+                var name2exp = Expression.Property(pe2, pe2.Type.GetSingleProperty(name2));
+                var selectexp = Expression.Call(name2exp, "ToString", Type.EmptyTypes);
+
+                Expression select = Expression.Call(
+                               typeof(Enumerable),
+                               "Select",
+                               new Type[] { pe2.Type, typeof(string) },
+                               cast,
+                               Expression.Lambda(selectexp, pe2));
+
+
+                var lambda = Expression.Lambda(select, pe);
+                var rv = new List<string>();
+                try
+                {
+                    rv = (lambda.Compile().DynamicInvoke(obj) as IEnumerable<string>)?.ToList();
+                }
+                catch { }
+                return rv;
+            }
+            else
+            {
+                return new List<string>();
+            }
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇灞炴�ф槸鍚﹀繀濉�
+        /// </summary>
+        /// <param name="pi">灞炴�т俊鎭�</param>
+        /// <returns>鏄惁蹇呭~</returns>
+        public static bool IsPropertyRequired(this MemberInfo pi)
+        {
+            bool isRequired = false;
+            if (pi != null)
+            {
+                //濡傛灉闇�瑕佹樉绀烘槦鍙凤紝鍒欏垽鏂槸鍚︽槸蹇呭~椤癸紝濡傛灉鏄繀濉垯鍦ㄥ唴瀹瑰悗闈㈠姞涓婃槦鍙�
+                //鎵�鏈塱nt锛宖loat銆傘�傘�傝繖绉峆rimitive绫诲瀷鐨勶紝鑲畾閮芥槸蹇呭~
+                Type t = pi.GetMemberType();
+                if (t != null && (t.IsPrimitive() || t.IsEnum() || t == typeof(decimal) || t == typeof(Guid)))
+                {
+                    isRequired = true;
+                }
+                else
+                {
+                    //瀵逛簬鍏朵粬绫伙紝妫�鏌ユ槸鍚︽湁RequiredAttribute锛屽鏋滄湁灏辨槸蹇呭~
+                    if (pi.GetCustomAttributes(typeof(RequiredAttribute), false).FirstOrDefault() is RequiredAttribute required && required.AllowEmptyStrings == false)
+                    {
+                        isRequired = true;
+                    }
+                    else if (pi.GetCustomAttributes(typeof(KeyAttribute), false).FirstOrDefault() != null)
+                    {
+                        isRequired = true;
+                    }
+                }
+            }
+            return isRequired;
+        }
+
+        /// <summary>
+        /// 璁剧疆灞炴�у��
+        /// </summary>
+        /// <param name="source">灞炴�ф墍鍦ㄥ疄渚�</param>
+        /// <param name="property">灞炴�у悕</param>
+        /// <param name="value">瑕佽祴鐨勫��</param>
+        /// <param name="prefix">灞炴�у墠缂�</param>
+        /// <param name="stringBasedValue">鏄惁涓哄瓧绗︿覆鏍煎紡鐨勫��</param>
+        public static void SetPropertyValue(this object source, string property, object value, string? prefix = null, bool stringBasedValue = false)
+        {
+            try
+            {
+                property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty);
+                List<string> level = new List<string>();
+                if (property.Contains('.'))
+                {
+                    level.AddRange(property.Split('.'));
+                }
+                else
+                {
+                    level.Add(property);
+                }
+
+                if (!string.IsNullOrWhiteSpace(prefix))
+                {
+                    level.Insert(0, prefix);
+                }
+                object temp = source;
+                Type tempType = source.GetType();
+                for (int i = 0; i < level.Count - 1; i++)
+                {
+                    var member = tempType.GetMember(level[i])[0];
+                    if (member != null)
+                    {
+                        var va = member.GetMemberValue(temp);
+                        if (va != null)
+                        {
+                            temp = va;
+                        }
+                        else
+                        {
+                            var newInstance = member.GetMemberType().GetConstructor(Type.EmptyTypes).Invoke(null);
+                            member.SetMemberValue(temp, newInstance, null);
+                            temp = newInstance;
+                        }
+                        tempType = member.GetMemberType();
+
+                    }
+                }
+
+                var memberInfos = tempType.GetMember(level.Last());
+                if (!memberInfos.Any())
+                {
+                    return;
+                }
+                var fproperty = memberInfos[0];
+                if (value == null || value is StringValues s && StringValues.IsNullOrEmpty(s))
+                {
+                    fproperty.SetMemberValue(temp, null, null);
+                    return;
+                }
+
+                bool isArray = false;
+                if (value != null && value.GetType().IsArray == true)
+                {
+                    isArray = true;
+                }
+
+                if (stringBasedValue == true)
+                {
+                    Type propertyType = fproperty.GetMemberType();
+                    if (propertyType.IsGeneric(typeof(List<>)) == true)
+                    {
+                        var list = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null) as IList;
+
+                        var gs = propertyType.GenericTypeArguments;
+                        try
+                        {
+                            if (value.GetType() == typeof(StringValues))
+                            {
+                                var strVals = (StringValues)value;
+                                var a = strVals.ToArray();
+                                for (int i = 0; i < a.Length; i++)
+                                {
+                                    list.Add(a[i].ConvertValue(gs[0]));
+                                }
+                            }
+                            else if (isArray)
+                            {
+                                var a = value as object[];
+                                for (int i = 0; i < a.Length; i++)
+                                {
+                                    list.Add(a[i].ConvertValue(gs[0]));
+                                }
+                            }
+                            else
+                            {
+                                list = value.ConvertValue(propertyType) as IList;
+                            }
+                        }
+                        catch { }
+                        fproperty.SetMemberValue(temp, list, null);
+                    }
+                    else if (propertyType.IsArray)
+                    {
+                        try
+                        {
+                            var strVals = (StringValues)value;
+                            var eletype = propertyType.GetElementType();
+                            if (eletype != null)
+                            {
+                                var arr = Array.CreateInstance(eletype, strVals.Count);
+                                for (int i = 0; i < arr.Length; i++)
+                                {
+                                    arr.SetValue(strVals[i].ConvertValue(eletype), i);
+                                }
+                                fproperty.SetMemberValue(temp, arr, null);
+                            }
+                        }
+                        catch { }
+                    }
+                    else
+                    {
+                        if (isArray)
+                        {
+                            var a = value as object[];
+                            if (a.Length == 1)
+                            {
+                                value = a[0];
+                            }
+                        }
+
+                        if (value is string)
+                        {
+                            value = value.ToString().Replace("\\", "/");
+                        }
+                        fproperty.SetMemberValue(temp, value, null);
+                    }
+                }
+                else
+                {
+                    if (value is string)
+                    {
+                        value = value.ToString().Replace("\\", "/");
+                    }
+                    fproperty.SetMemberValue(temp, value, null);
+                }
+            }
+            catch
+            {
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁MemberInfo鑾峰彇鍊�
+        /// </summary>
+        /// <param name="mi">MemberInfo</param>
+        /// <param name="obj">鎵�鍦ㄥ疄渚�</param>
+        /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param>
+        /// <returns>MemberInfo鐨勫��</returns>
+        public static object? GetMemberValue(this MemberInfo mi, object obj, object[]? index = null)
+        {
+            object rv = null;
+            if (mi.MemberType == MemberTypes.Property)
+            {
+                rv = ((PropertyInfo)mi).GetValue(obj, index);
+            }
+            else if (mi.MemberType == MemberTypes.Field)
+            {
+                rv = ((FieldInfo)mi).GetValue(obj);
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 璁惧畾MemberInfo鐨勫��
+        /// </summary>
+        /// <param name="mi">MemberInfo</param>
+        /// <param name="obj">鎵�鍦ㄥ疄渚�</param>
+        /// <param name="val">瑕佽祴鐨勫��</param>
+        /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param>
+        public static void SetMemberValue(this MemberInfo mi, object obj, object val, object[]? index = null)
+        {
+            object newval = val;
+            if (val is string s)
+            {
+                if (string.IsNullOrEmpty(s))
+                {
+                    val = null;
+                }
+            }
+            if (val != null && val.GetType() != mi.GetMemberType())
+            {
+                newval = val.ConvertValue(mi.GetMemberType());
+            }
+            if (mi.MemberType == MemberTypes.Property)
+            {
+                ((PropertyInfo)mi).SetValue(obj, newval, index);
+            }
+            else if (mi.MemberType == MemberTypes.Field)
+            {
+                ((FieldInfo)mi).SetValue(obj, newval);
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏌愪釜MemberInfo鐨勭被鍨�
+        /// </summary>
+        /// <param name="mi">MemberInfo</param>
+        /// <returns>绫诲瀷</returns>
+        public static Type? GetMemberType(this MemberInfo mi)
+        {
+            Type? rv = null;
+            if (mi != null)
+            {
+                if (mi.MemberType == MemberTypes.Property)
+                {
+                    rv = ((PropertyInfo)mi).PropertyType;
+                }
+                else if (mi.MemberType == MemberTypes.Field)
+                {
+                    rv = ((FieldInfo)mi).FieldType;
+                }
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О
+        /// </summary>
+        /// <param name="enumType">鏋氫妇绫诲瀷</param>
+        /// <param name="value">鏋氫妇鍊�</param>
+        /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns>
+        public static string? GetEnumDisplayName(Type enumType, string value)
+        {
+            string rv = "";
+            FieldInfo field = null;
+
+            if (enumType.IsEnum())
+            {
+                field = enumType.GetField(value);
+            }
+            //濡傛灉鏄痭ullable鐨勬灇涓�
+            if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum())
+            {
+                field = enumType.GenericTypeArguments[0].GetField(value);
+            }
+
+            if (field != null)
+            {
+
+                var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList();
+                if (attribs.Count > 0)
+                {
+                    rv = ((DisplayAttribute)attribs[0]).GetName();
+                    //if (CoreProgram._localizer != null)
+                    //{
+                    //    rv = CoreProgram._localizer[rv];
+                    //}
+                }
+                else
+                {
+                    rv = value;
+                }
+            }
+            return rv;
+        }
+
+        public static string? GetEnumDisplayName(Type enumType, int value)
+        {
+            string? rv = "";
+            FieldInfo? field = null;
+            string? ename = "";
+            if (enumType.IsEnum())
+            {
+                ename = enumType.GetEnumName(value);
+                field = enumType.GetField(ename ?? "");
+            }
+            //濡傛灉鏄痭ullable鐨勬灇涓�
+            if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum())
+            {
+                ename = enumType.GenericTypeArguments[0].GetEnumName(value);
+                field = enumType.GenericTypeArguments[0].GetField(ename ?? "");
+            }
+
+            if (field != null)
+            {
+
+                var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList();
+                if (attribs.Count > 0)
+                {
+                    rv = ((DisplayAttribute)attribs[0]).GetName();
+                    //if (CoreProgram._localizer != null)
+                    //{
+                    //    rv = CoreProgram._localizer[rv];
+                    //}
+                }
+                else
+                {
+                    rv = ename;
+                }
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 杞寲鍊�
+        /// </summary>
+        /// <param name="value">瑕佽浆鎹㈢殑鍊�</param>
+        /// <param name="propertyType">杞崲鍚庣殑绫诲瀷</param>
+        /// <returns>杞崲鍚庣殑鍊�</returns>
+        public static object? ConvertValue(this object value, Type propertyType)
+        {
+            object val = null;
+            if (propertyType.IsGeneric(typeof(Nullable<>)) == true)
+            {
+                var gs = propertyType.GenericTypeArguments;
+                try
+                {
+                    val = value.ConvertValue(gs[0]);
+                }
+                catch { }
+            }
+            else if (propertyType.IsEnum())
+            {
+                val = Enum.Parse(propertyType, value.ToString());
+            }
+            else if (propertyType == typeof(string))
+            {
+                val = value?.ToString().Trim();
+            }
+            else if (propertyType == typeof(Guid))
+            {
+                bool suc = Guid.TryParse(value?.ToString(), out Guid g);
+                if (suc)
+                {
+                    val = g;
+                }
+                else
+                {
+                    val = Guid.Empty;
+                }
+            }
+
+            else
+            {
+                try
+                {
+                    if (value.ToString().StartsWith("`") && value.ToString().EndsWith("`"))
+                    {
+                        string inner = value.ToString().Trim('`').TrimEnd(',');
+                        if (!string.IsNullOrWhiteSpace(inner))
+                        {
+                            val = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null);
+                            string[] pair = inner.Split(',');
+                            var gs = propertyType.GetGenericArguments();
+                            foreach (var p in pair)
+                            {
+                                (val as IList).Add(Convert.ChangeType(p, gs[0]));
+                            }
+                        }
+                    }
+                    else
+                    {
+                        val = Convert.ChangeType(value.ToString(), propertyType);
+                    }
+                }
+                catch
+                {
+                }
+            }
+            return val;
+        }
+
+        public static object MakeList(Type innerType, string propertyName, object[] values)
+        {
+            object rv = typeof(List<>).MakeGenericType(innerType).GetConstructor(Type.EmptyTypes).Invoke(null);
+            var mi = rv.GetType().GetMethod("Add");
+            var con = innerType.GetConstructor(Type.EmptyTypes);
+            foreach (var item in values)
+            {
+                var newobj = con.Invoke(null);
+                newobj.SetPropertyValue(propertyName, item);
+                mi.Invoke(rv, new object[] { newobj });
+            }
+            return rv;
+        }
+
+        /// <summary>
+        /// 鑾峰彇 鏄惁瀹氫箟璇ユ爣绛惧睘鎬�
+        /// </summary>
+        /// <param name="pi"></param>
+        /// <param name="local"></param>
+        /// <returns></returns>
+        public static T? GetAttribute<T>(this MemberInfo pi) where T : Attribute
+        {
+            string rv = "";
+            if (pi.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T dis)
+            {
+                return dis;
+            }
+            else
+            {
+                return null;
+            }
+
+        }
+
+
+        public static ImmutableDictionary<string, List<PropertyInfo>> _propertyCache { get; set; } =
+          new Dictionary<string, List<PropertyInfo>>().ToImmutableDictionary();
+        /// <summary>
+        /// 鍒ゆ柇鏄惁鏄硾鍨�
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <param name="innerType">娉涘瀷绫诲瀷</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsGeneric(this Type self, Type innerType)
+        {
+            if (self.GetTypeInfo().IsGenericType && self.GetGenericTypeDefinition() == innerType)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓篘ullable<>绫诲瀷
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsNullable(this Type self)
+        {
+            return self.IsGeneric(typeof(Nullable<>));
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsList(this Type self)
+        {
+            return self.IsGeneric(typeof(List<>)) || self.IsGeneric(typeof(IEnumerable<>));
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsListOf<T>(this Type self)
+        {
+            if (self.IsGeneric(typeof(List<>)) && typeof(T).IsAssignableFrom(self.GenericTypeArguments[0]))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+
+        #region 鍒ゆ柇鏄惁涓烘灇涓�
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓烘灇涓�
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsEnum(this Type self)
+        {
+            return self.GetTypeInfo().IsEnum;
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓烘灇涓炬垨鑰呭彲绌烘灇涓�
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static bool IsEnumOrNullableEnum(this Type self)
+        {
+            if (self == null)
+            {
+                return false;
+            }
+            if (self.IsEnum)
+            {
+                return true;
+            }
+            else
+            {
+                if (self.IsGenericType && self.GetGenericTypeDefinition() == typeof(Nullable<>) && self.GetGenericArguments()[0].IsEnum)
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓哄�肩被鍨� 鍩虹鍊肩被鍨�
+        /// </summary>
+        /// <param name="self">Type绫�</param>
+        /// <returns>鍒ゆ柇缁撴灉</returns>
+        public static bool IsPrimitive(this Type self)
+        {
+            return self.GetTypeInfo().IsPrimitive || self == typeof(decimal);
+        }
+        /// <summary>
+        /// 鍒ゆ柇鍊兼槸鍚︽槸鏁板瓧鍩虹绫诲瀷
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static bool IsNumber(this Type self)
+        {
+            Type checktype = self;
+            if (self.IsNullable())
+            {
+                checktype = self.GetGenericArguments()[0];
+            }
+            if (checktype == typeof(int) || checktype == typeof(short) || checktype == typeof(long) || checktype == typeof(float) || checktype == typeof(decimal) || checktype == typeof(double))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+
+        #region 鍒ゆ柇鏄惁鏄疊ool
+        /// <summary>
+        /// 鏄惁鏄痓ool绫诲瀷
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static bool IsBool(this Type self)
+        {
+            return self == typeof(bool);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁鏄� bool or bool?绫诲瀷
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static bool IsBoolOrNullableBool(this Type self)
+        {
+            if (self == null)
+            {
+                return false;
+            }
+            if (self == typeof(bool) || self == typeof(bool?))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 鏍规嵁鍚嶅瓧鑾峰彇
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public static PropertyInfo? GetSingleProperty(this Type self, string name)
+        {
+            if (self.FullName == null)
+                throw new Exception("灞炴�у悕涓虹┖");
+            if (_propertyCache.ContainsKey(self.FullName) == false)
+            {
+                var properties = self.GetProperties().ToList();
+                _propertyCache = _propertyCache.Add(self.FullName, properties);
+                return properties.Where(x => x.Name == name).FirstOrDefault();
+            }
+            else
+            {
+                return _propertyCache[self.FullName].Where(x => x.Name == name).FirstOrDefault();
+            }
+        }
+        /// <summary>
+        /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛�
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static PropertyInfo? GetSingleProperty(this Type self, Func<PropertyInfo, bool> where)
+        {
+            if (self.FullName == null)
+                throw new Exception("灞炴�у悕涓虹┖");
+            if (_propertyCache.ContainsKey(self.FullName) == false)
+            {
+                var properties = self.GetProperties().ToList();
+                _propertyCache = _propertyCache.Add(self.FullName, properties);
+                return properties.Where(where).FirstOrDefault();
+            }
+            else
+            {
+                return _propertyCache[self.FullName].Where(where).FirstOrDefault();
+            }
+        }
+        /// <summary>
+        /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛�
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static List<PropertyInfo> GetAllProperties(this Type self)
+        {
+            if (self.FullName == null)
+                throw new Exception("灞炴�у悕涓虹┖");
+            if (_propertyCache.ContainsKey(self.FullName) == false)
+            {
+                var properties = self.GetProperties().ToList();
+                _propertyCache = _propertyCache.Add(self.FullName, properties);
+                return properties;
+            }
+            else
+            {
+                return _propertyCache[self.FullName];
+            }
+        }
+        #endregion
+    }
+}
diff --git a/Admin.NET/cylsg.utility/StaticStringDef.cs b/Admin.NET/cylsg.utility/StaticStringDef.cs
new file mode 100644
index 0000000..ffccbdb
--- /dev/null
+++ b/Admin.NET/cylsg.utility/StaticStringDef.cs
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cylsg.utility
+{
+    /// <summary>
+    /// 甯哥敤瀛楃涓插畾涔�
+    /// </summary>
+    public static class StaticStringDef
+    {
+        /// <summary>
+        /// 鎻愮幇鑷攣KeY
+        /// </summary>
+     public   static string TransferMoneyLockKey = "TransferMoneyLockKey:";
+
+        /// <summary>
+        /// 鎻愮幇缁熻绱閿�
+        /// </summary>
+        public static string TransferMoneyManKey = "TransferMoneyManKey:";
+    }
+}
diff --git a/Admin.NET/cylsg.utility/cylsg.utility.csproj b/Admin.NET/cylsg.utility/cylsg.utility.csproj
new file mode 100644
index 0000000..1dad6ca
--- /dev/null
+++ b/Admin.NET/cylsg.utility/cylsg.utility.csproj
@@ -0,0 +1,14 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Extensions.Primitives" Version="8.0.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+  </ItemGroup>
+
+</Project>
diff --git a/Admin.NET/cylsg.utility/untilityModels.cs b/Admin.NET/cylsg.utility/untilityModels.cs
new file mode 100644
index 0000000..b1ab056
--- /dev/null
+++ b/Admin.NET/cylsg.utility/untilityModels.cs
@@ -0,0 +1,16 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace cylsg.utility
+{
+    /// <summary>
+    /// 閫氱敤妯″瀷
+    /// </summary>
+    public class untilityModels
+    {
+       
+    }
+}
diff --git a/Web/src/api/Customer/fBS_EnterpriseType.ts b/Web/src/api/Customer/fBS_EnterpriseType.ts
new file mode 100644
index 0000000..0aa8c91
--- /dev/null
+++ b/Web/src/api/Customer/fBS_EnterpriseType.ts
@@ -0,0 +1,52 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 浼佷笟绫婚厤缃〃鎺ュ彛鏈嶅姟
+export const useFBS_EnterpriseTypeApi = () => {
+	const baseApi = useBaseApi("fBS_EnterpriseType");
+	return {
+		// 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃
+		page: baseApi.page,
+		// 鏌ョ湅浼佷笟绫婚厤缃〃璇︾粏
+		detail: baseApi.detail,
+		// 鏂板浼佷笟绫婚厤缃〃
+		add: baseApi.add,
+		// 鏇存柊浼佷笟绫婚厤缃〃
+		update: baseApi.update,
+		// 鍒犻櫎浼佷笟绫婚厤缃〃
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭浼佷笟绫婚厤缃〃鏁版嵁
+		exportData: baseApi.exportData,
+		// 瀵煎叆浼佷笟绫婚厤缃〃鏁版嵁
+		importData: baseApi.importData,
+		// 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 浼佷笟绫婚厤缃〃瀹炰綋
+export interface FBS_EnterpriseType {
+	// 涓婚敭Id
+	id: number;
+	// 鍚嶇О
+	name?: string;
+	// 浠g爜
+	code?: string;
+	// 鐖�
+	parentId?: number;
+	// 绉熸埛Id
+	tenantId: number;
+	// 鍒涘缓鏃堕棿
+	createTime: string;
+	// 鏇存柊鏃堕棿
+	updateTime: string;
+	// 鍒涘缓鑰匢d
+	createUserId: number;
+	// 鍒涘缓鑰呭鍚�
+	createUserName: string;
+	// 淇敼鑰匢d
+	updateUserId: number;
+	// 淇敼鑰呭鍚�
+	updateUserName: string;
+}
\ No newline at end of file
diff --git a/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue
new file mode 100644
index 0000000..8630032
--- /dev/null
+++ b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue
@@ -0,0 +1,109 @@
+锘�<script lang="ts" name="fBS_EnterpriseType" setup>
+import { ref, reactive, onMounted } from "vue";
+import { ElMessage } from "element-plus";
+import type { FormRules } from "element-plus";
+import { formatDate } from '/@/utils/formatTime';
+import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+  name: [{required: true, message: '璇烽�夋嫨鍚嶇О锛�', trigger: 'blur',},],
+  code: [{required: true, message: '璇烽�夋嫨浠g爜锛�', trigger: 'blur',},],
+  parentId: [{required: true, message: '璇烽�夋嫨鐖讹紒', trigger: 'blur',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? {  };
+	state.ruleForm = row.id ? await fBS_EnterpriseTypeApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row));
+	state.showDialog = true;
+};
+
+// 鍏抽棴寮圭獥
+const closeDialog = () => {
+	emit("reloadTable");
+	state.showDialog = false;
+};
+
+// 鎻愪氦
+const submit = async () => {
+	ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
+		if (isValid) {
+			let values = state.ruleForm;
+			await fBS_EnterpriseTypeApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="fBS_EnterpriseType-container">
+		<el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false">
+			<template #header>
+				<div style="color: #fff">
+					<span>{{ state.title }}</span>
+				</div>
+			</template>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules">
+				<el-row :gutter="35">
+					<el-form-item v-show="false">
+						<el-input v-model="state.ruleForm.id" />
+					</el-form-item>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鍚嶇О" prop="name">
+							<el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ュ悕绉�" maxlength="256" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="浠g爜" prop="code">
+							<el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ヤ唬鐮�" maxlength="36" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鐖�" prop="parentId">
+							<el-input-number v-model="state.ruleForm.parentId" placeholder="璇疯緭鍏ョ埗" clearable />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="() => state.showDialog = false">鍙� 娑�</el-button>
+					<el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+<style lang="scss" scoped>
+:deep(.el-select), :deep(.el-input-number) {
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/Web/src/views/Customer/fBS_EnterpriseType/index.vue b/Web/src/views/Customer/fBS_EnterpriseType/index.vue
new file mode 100644
index 0000000..6d421a6
--- /dev/null
+++ b/Web/src/views/Customer/fBS_EnterpriseType/index.vue
@@ -0,0 +1,194 @@
+锘�<script lang="ts" setup name="fBS_EnterpriseType">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType';
+import editDialog from '/@/views/Customer/fBS_EnterpriseType/component/editDialog.vue'
+import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+import ModifyRecord from '/@/components/table/modifyRecord.vue';
+import ImportData from "/@/components/table/importData.vue";
+
+const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi();
+const printDialogRef = ref();
+const editDialogRef = ref();
+const importDataRef = ref();
+const state = reactive({
+  exportLoading: false,
+  tableLoading: false,
+  stores: {},
+  showAdvanceQueryUI: false,
+  dropdownData: {} as any,
+  selectData: [] as any[],
+  tableQueryParams: {} as any,
+  tableParams: {
+    page: 1,
+    pageSize: 20,
+    total: 0,
+    field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈�
+    order: 'descending', // 鎺掑簭鏂瑰悜
+    descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗�
+  },
+  tableData: [],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鏌ヨ鎿嶄綔
+const handleQuery = async (params: any = {}) => {
+  state.tableLoading = true;
+  state.tableParams = Object.assign(state.tableParams, params);
+  const result = await fBS_EnterpriseTypeApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result);
+  state.tableParams.total = result?.total;
+  state.tableData = result?.items ?? [];
+  state.tableLoading = false;
+};
+
+// 鍒楁帓搴�
+const sortChange = async (column: any) => {
+  state.tableParams.field = column.prop;
+  state.tableParams.order = column.order;
+  await handleQuery();
+};
+
+// 鍒犻櫎
+const delFBS_EnterpriseType = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_EnterpriseTypeApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelFBS_EnterpriseType = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_EnterpriseTypeApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+// 瀵煎嚭鏁版嵁
+const exportFBS_EnterpriseTypeCommand = async (command: string) => {
+  try {
+    state.exportLoading = true;
+    if (command === 'select') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) });
+      await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'current') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+      await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'all') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+      await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res));
+    }
+  } finally {
+    state.exportLoading = false;
+  }
+}
+
+handleQuery();
+</script>
+<template>
+  <div class="fBS_EnterpriseType-container" v-loading="state.exportLoading">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> 
+      <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90">
+        <el-row>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item label="鍏抽敭瀛�">
+              <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="鍚嶇О">
+              <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ュ悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="浠g爜">
+              <el-input v-model="state.tableQueryParams.code" clearable placeholder="璇疯緭鍏ヤ唬鐮�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="鐖�">
+              <el-input-number v-model="state.tableQueryParams.parentId"  clearable placeholder="璇疯緭鍏ョ埗"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item >
+              <el-button-group style="display: flex; align-items: center;">
+                <el-button type="primary"  icon="ele-Search" @click="handleQuery" v-auth="'fBS_EnterpriseType:page'" v-reclick="1000"> 鏌ヨ </el-button>
+                <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button>
+                <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button>
+                <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button>
+                <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_EnterpriseType" :disabled="state.selectData.length == 0" v-auth="'fBS_EnterpriseType:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:add'"> 鏂板 </el-button>
+                <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_EnterpriseTypeCommand">
+                  <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_EnterpriseType:export'"> 瀵煎嚭 </el-button>
+                  <template #dropdown>
+                    <el-dropdown-menu>
+                      <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item>
+                      <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item>
+                      <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item>
+                    </el-dropdown-menu>
+                  </template>
+                </el-dropdown>
+                <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_EnterpriseType:import'"> 瀵煎叆 </el-button>
+              </el-button-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card class="full-table" shadow="hover" style="margin-top: 5px">
+      <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border>
+        <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_EnterpriseType:batchDelete') || auth('fBS_EnterpriseType:export')" />
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop='name' label='鍚嶇О' show-overflow-tooltip />
+        <el-table-column prop='code' label='浠g爜' show-overflow-tooltip />
+        <el-table-column prop='parentId' label='鐖�' show-overflow-tooltip />
+        <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip>
+          <template #default="scope">
+            <ModifyRecord :data="scope.row" />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_EnterpriseType:update') || auth('fBS_EnterpriseType:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_EnterpriseType(scope.row)" v-auth="'fBS_EnterpriseType:delete'"> 鍒犻櫎 </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination 
+              v-model:currentPage="state.tableParams.page"
+              v-model:page-size="state.tableParams.pageSize"
+              @size-change="(val: any) => handleQuery({ pageSize: val })"
+              @current-change="(val: any) => handleQuery({ page: val })"
+              layout="total, sizes, prev, pager, next, jumper"
+              :page-sizes="[10, 20, 50, 100, 200, 500]"
+              :total="state.tableParams.total"
+              size="small"
+              background />
+      <ImportData ref="importDataRef" :import="fBS_EnterpriseTypeApi.importData" :download="fBS_EnterpriseTypeApi.downloadTemplate" v-auth="'fBS_EnterpriseType:import'" @refresh="handleQuery"/>
+      <printDialog ref="printDialogRef" :title="'鎵撳嵃浼佷笟绫婚厤缃〃'" @reloadTable="handleQuery" />
+      <editDialog ref="editDialogRef" @reloadTable="handleQuery" />
+    </el-card>
+  </div>
+</template>
+<style scoped>
+:deep(.el-input), :deep(.el-select), :deep(.el-input-number) {
+  width: 100%;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.1