From 4008c7e22c9c01eb653b04f934990486df622654 Mon Sep 17 00:00:00 2001
From: username@email.com <yzy2002yzy@163.com>
Date: 星期一, 14 七月 2025 12:21:35 +0800
Subject: [PATCH] Merge branch 'master' of http://47.108.235.38:8080/r/FZCZTB

---
 Web/src/views/Customer/fBS_ExRole/index.vue                                                      |  225 
 Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue                               |  109 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs                    |  278 +
 Admin.NET/EzUpFile/UpFileController.cs                                                           |  196 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs                          |  209 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs                          |  141 
 Admin.NET/EzUpFile/EzFileUploadService.cs                                                        |  754 +++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj                             |   16 
 Admin.NET/FZCZTB.NET.MD/ADPenalty.cs                                                             |   62 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs                      |  223 
 Web/src/assets/background.jpeg                                                                   |    0 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs                                                |   41 
 Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj                       |    2 
 Admin.NET/EzUpFile/EzUpFile.csproj                                                               |   30 
 Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs                                          |    2 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs                        |  191 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs                |  875 +++
 Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj                 |    2 
 Web/src/views/Customer/fBS_Customer/index.vue                                                    |  310 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs                  |  280 +
 Admin.NET/EzTencentCloud/TencentCloudConfig.json                                                 |   12 
 Web/src/views/ADPenalty/aDPenalty/index.vue                                                      |  185 
 Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs                                                  |    6 
 Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs                                           |   47 
 Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json                                       |   27 
 Admin.NET/cylsg.utility/CommonHelper.cs                                                          | 1015 ++++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs                  |  241 
 Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj                     |    2 
 Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs                                          |  240 
 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj                             |   18 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs                          |  129 
 Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj             |    2 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs                       |   79 
 Admin.NET/Admin.NET.sln                                                                          |   38 
 Web/src/api/Customer/fBS_Customer.ts                                                             |  122 
 Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs  |    7 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs                      |   86 
 Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue                                       |  122 
 Admin.NET/EzUpFile/UpFileConfig.json                                                             |   12 
 Web/src/views/Customer/fBS_Role/index.vue                                                        |  225 
 Web/src/api/Customer/fBS_ExRole.ts                                                               |   60 
 Admin.NET/cylsg.utility/StaticStringDef.cs                                                       |   24 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs                                        |  216 
 Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj                                           |    3 
 Web/src/views/Customer/fBS_EnterpriseType/index.vue                                              |  194 
 Web/src/views/Customer/fBS_ExRole/component/editDialog.vue                                       |  125 
 Web/src/api/Customer/fBS_EnterpriseType.ts                                                       |   52 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs                          |   86 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs                          |   79 
 Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs                                             |  200 
 Web/src/api/Customer/fB_Customer.ts                                                              |  122 
 Web/src/api/Customer/fB_CustomerRole.ts                                                          |   36 
 Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj                         |    2 
 Web/src/views/Customer/fBS_Menu/component/editDialog.vue                                         |  185 
 Web/src/api/ADPenalty/aDPenalty.ts                                                               |   50 
 Admin.NET/cylsg.utility/cylsg.utility.csproj                                                     |   14 
 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj                                     |   21 
 Admin.NET/FZCZTB.NET.SYSService/Startup.cs                                                       |   32 
 Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj                                     |    4 
 Admin.NET/cylsg.utility/untilityModels.cs                                                        |   16 
 Admin.NET/cylsg.utility/Extend/StringEx.cs                                                       |  251 +
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs                                            |   50 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs    |  177 
 Admin.NET/EzTencentCloud/TencentCloudService.cs                                                  |  348 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs                       |   95 
 Admin.NET/EzTencentCloud/EzTencentCloud.csproj                                                   |   19 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs                                          |   41 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs      |  196 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs                        |  602 ++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs                   |   95 
 Web/src/views/Customer/fBS_Menu/index.vue                                                        |  311 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs                          |  261 +
 Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj                                                   |    2 
 Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs                                               |   48 
 Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs                                              |   12 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs                                                  |   65 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs                                                    |   63 
 Web/src/api/Customer/fBS_Role.ts                                                                 |   60 
 Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs |   11 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs                                              |   34 
 Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj                         |    2 
 Admin.NET/Admin.NET.Application/Configuration/Database.json                                      |    9 
 Web/src/views/Customer/fBS_Customer/component/editDialog.vue                                     |  240 
 Web/src/views/fb_p_complaints/procurementComplaint/index.vue                                     |    9 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs                                       |   17 
 Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs                              |   88 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs                                                |  362 +
 Admin.NET/cylsg.utility/Extend/EmunEx.cs                                                         |   15 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs                        |  266 +
 Admin.NET/Admin.NET.Core/Const/ClaimConst.cs                                                     |   12 
 Admin.NET/Admin.NET.Web.Core/Startup.cs                                                          |    2 
 Admin.NET/Admin.NET.Application/Configuration/Swagger.json                                       |   12 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs                                                    |  142 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs   |   79 
 Web/src/views/Customer/fBS_Role/component/editDialog.vue                                         |  121 
 Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs                                          |    3 
 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs                                  |  229 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs                       |  150 
 Admin.NET/Admin.NET.Application/Configuration/CodeGen.json                                       |    2 
 Admin.NET/EzTencentCloud/ITencentCloudService.cs                                                 |   71 
 Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs                                      |  326 +
 Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs                                            | 1021 ++++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs      |   69 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs               |  250 +
 Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs    |   21 
 Web/src/api/Customer/fBS_Menu.ts                                                                 |   82 
 Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs                                              |  216 
 Admin.NET/EzUpFile/IEzFileUploadService.cs                                                       |   73 
 108 files changed, 14,683 insertions(+), 29 deletions(-)

diff --git a/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
index 9220ef8..3e7fb09 100644
--- a/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
+++ b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
@@ -31,4 +31,8 @@
     <ProjectReference Include="..\Plugins\Admin.NET.Plugin.GoView\Admin.NET.Plugin.GoView.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Service\" />
+  </ItemGroup>
+
 </Project>
diff --git a/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json
index fd7c18d..917bb0c 100644
--- a/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json
+++ b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json
@@ -6,6 +6,6 @@
     "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application", "FZCZTB.NET.MD" ], // 瀹炰綋鎵�鍦ㄧ▼搴忛泦锛堣嚜琛屾坊鍔犳柊寤虹▼搴忛泦鍚嶇О锛�
     "BaseEntityNames": [ "EntityBaseId", "EntityBase", "EntityBaseDel", "EntityBaseOrg", "EntityBaseOrgDel", "EntityBaseTenant", "EntityBaseTenantDel", "EntityBaseTenantId", "EntityBaseTenantOrg", "EntityBaseTenantOrgDel" ], // 瀹炰綋鍩虹被鍚嶇О
     "FrontRootPath": "Web", // 鍓嶇椤圭洰鏍圭洰褰�
-    "BackendApplicationNamespaces": [ "Admin.NET.Application", "FZCZTB.TSCL.Application" ] // 鍚庣鐢熸垚鍒扮殑椤圭洰锛堣嚜琛屾坊鍔犳柊寤哄懡鍚嶇┖闂达級
+    "BackendApplicationNamespaces": [ "Admin.NET.Application", "FZCZTB.TSCL.Application", "FZCZTB.Net.CustomerSYSTem" ] // 鍚庣鐢熸垚鍒扮殑椤圭洰锛堣嚜琛屾坊鍔犳柊寤哄懡鍚嶇┖闂达級
   }
 }
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Application/Configuration/Database.json b/Admin.NET/Admin.NET.Application/Configuration/Database.json
index 21fe2e4..a34209f 100644
--- a/Admin.NET/Admin.NET.Application/Configuration/Database.json
+++ b/Admin.NET/Admin.NET.Application/Configuration/Database.json
@@ -14,8 +14,9 @@
         //"ConnectionString": "PORT=5432;DATABASE=xxx;HOST=localhost;PASSWORD=xxx;USER ID=xxx", // PostgreSQL
         //"ConnectionString": "Server=localhost;Database=xxx;Uid=xxx;Pwd=xxx;SslMode=None;AllowLoadLocalInfile=true;AllowUserVariables=true;", // MySql,
         //"ConnectionString": "User Id=xxx; Password=xxx; Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))", // Oracle
-        "ConnectionString": "Server=192.168.0.31;Database=FZCZTB;User Id=SA;Password=123456;Encrypt=True;TrustServerCertificate=True;", // SqlServer
-
+        //"ConnectionString": "Server=192.168.0.31;Database=FZCZTB;User Id=SA;Password=123456;Encrypt=True;TrustServerCertificate=True;", // SqlServer
+        "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=FZCZTB;Encrypt=True;TrustServerCertificate=True;Integrated Security=true;", // SqlServer
+        //"ConnectionString": "Server=localhost;Database=FZCZTB;Trusted_Connection=True;", // SqlServer
         //"SlaveConnectionConfigs": [ // 璇诲啓鍒嗙/涓讳粠
         //	{
         //		"HitRate": 10,
@@ -27,14 +28,14 @@
         //	}
         //],
         "DbSettings": {
-          "EnableInitDb": false, // 鍚敤搴撳垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛�
+          "EnableInitDb": true, // 鍚敤搴撳垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛�
           "EnableInitView": false, // 鍚敤瑙嗗浘鍒濆鍖栵紙鑻ュ疄浣撳拰瑙嗗浘娌℃湁鍙樺寲寤鸿鍏抽棴锛�
           "EnableDiffLog": false, // 鍚敤搴撹〃宸紓鏃ュ織
           "EnableUnderLine": false, // 鍚敤椹煎嘲杞笅鍒掔嚎
           "EnableConnEncrypt": false // 鍚敤鏁版嵁搴撹繛鎺ヤ覆鍔犲瘑锛堝浗瀵哠M2鍔犺В瀵嗭級
         },
         "TableSettings": {
-          "EnableInitTable": false, // 鍚敤琛ㄥ垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛�
+          "EnableInitTable": true, // 鍚敤琛ㄥ垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛�
           "EnableIncreTable": true // 鍚敤琛ㄥ閲忔洿鏂帮紙鍙洿鏂拌创浜嗙壒鎬IncreTable]鐨勫疄浣撹〃锛�
         },
         "SeedSettings": {
diff --git a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
index 4a90cee..fddb767 100644
--- a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
+++ b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
@@ -31,6 +31,18 @@
         "Description": "闈炴斂搴滈噰璐鍗�",
         "Version": "1.0.0",
         "Order": 10001
+        "Group": "FZCCustomerGroupName",
+        "Title": "鍓嶇瀹㈡埛鍜岀郴缁熻缃�",
+        "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�",
+        "Version": "1.0.0",
+        "Order": 10000
+      },
+      {
+        "Group": "FZCAPISYS",
+        "Title": "鍓嶇绯荤粺",
+        "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�",
+        "Version": "1.0.0",
+        "Order": 10000
       }
     ],
     "DefaultGroupName": "Default", // 榛樿鍒嗙粍鍚�
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/Const/ClaimConst.cs b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs
index 7fdf85f..18f48bb 100644
--- a/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs
+++ b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs
@@ -65,4 +65,16 @@
     /// 鐧诲綍妯″紡PC銆丄PP
     /// </summary>
     public const string LoginMode = "LoginMode";
+
+
+    /// <summary>
+    /// 鐢ㄦ埛绫诲瀷
+    /// </summary>
+    public const string UserType = "UserType";
+
+
+    /// <summary>
+    /// 瀹㈡埛鐧诲綍绫诲瀷
+    /// </summary>
+    public const string CustomerLogoinType = "CustomerLogoinType";
 }
\ No newline at end of file
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.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
index 9be2d3a..55c0fa2 100644
--- a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
@@ -394,7 +394,7 @@
     {
         var codeId = YitIdHelper.NextId().ToString();
         var captcha = _captcha.Generate(codeId);
-        var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60;
+        var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ??60 ;
         return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds };
     }
 
diff --git a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj
index f193e56..ab988d2 100644
--- a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj
+++ b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj
@@ -16,6 +16,9 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" />
+    <ProjectReference Include="..\FZCTB.NET.API.Application\FZCTB.NET.API.Application.csproj" />
+    <ProjectReference Include="..\FZCZTB.Net.CustomerSYSTem\FZCZTB.Net.CustomerSYSTem.csproj" />
+    <ProjectReference Include="..\FZCZTB.TSCL.Application\FZCZTB.TSCL.Application.csproj" />
   </ItemGroup>
 
 </Project>
diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
index 7899823..efbb21d 100644
--- a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
+++ b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
@@ -9,6 +9,7 @@
 using Furion;
 using Furion.Authorization;
 using Furion.DataEncryption;
+
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using System;
@@ -62,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.Web.Core/Startup.cs b/Admin.NET/Admin.NET.Web.Core/Startup.cs
index 78d0277..75e7aac 100644
--- a/Admin.NET/Admin.NET.Web.Core/Startup.cs
+++ b/Admin.NET/Admin.NET.Web.Core/Startup.cs
@@ -351,7 +351,7 @@
         {
             foreach (var groupInfo in SpecificationDocumentBuilder.GetOpenApiGroups())
             {
-                groupInfo.Description += "<br/><u><b><font color='FF0000'> 馃懏涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�</font></b></u>";
+                groupInfo.Description += "<br/><u><b><font color='FF0000'> 娆㈣繋娆㈣繋</font></b></u>";
             }
         });
 
diff --git a/Admin.NET/Admin.NET.sln b/Admin.NET/Admin.NET.sln
index 9eadaa1..b4cc41d 100644
--- a/Admin.NET/Admin.NET.sln
+++ b/Admin.NET/Admin.NET.sln
@@ -38,6 +38,20 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FZFCGDD.ORDER.Application", "FZFCGDD.ORDER.Application\FZFCGDD.ORDER.Application.csproj", "{B3F43995-30FA-47AF-83A0-B37A2669C6A8}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.Net.CustomerSYSTem", "FZCZTB.Net.CustomerSYSTem\FZCZTB.Net.CustomerSYSTem.csproj", "{72CBCF69-83C4-44DF-B066-7618D5672B03}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCTB.NET.API.Application", "FZCTB.NET.API.Application\FZCTB.NET.API.Application.csproj", "{D72E858B-FFBE-4055-8473-B4AAF6F18F30}"
+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
@@ -99,6 +113,30 @@
 		{B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{72CBCF69-83C4-44DF-B066-7618D5672B03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{72CBCF69-83C4-44DF-B066-7618D5672B03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{72CBCF69-83C4-44DF-B066-7618D5672B03}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{72CBCF69-83C4-44DF-B066-7618D5672B03}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{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
new file mode 100644
index 0000000..4c6b98e
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs
@@ -0,0 +1,240 @@
+锘縰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;
+using Furion;
+using NewLife;
+
+namespace FZCTB.NET.API.Application.Auth
+{
+    /// <summary>
+    /// 閴存潈鏈嶅姟
+    /// </summary>
+    [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>
+        ///  鍒囨崲瑙掕壊 宸茬櫥褰曡繘鍘昏鑹叉垨鑰呭垏鎹㈣鑹叉槸璋冪敤锛岄渶瑕佹浛鎹oken,鐩稿綋浜庣櫥褰�
+        /// </summary>
+        [DisplayName("鍒囨崲瑙掕壊")]
+        public async Task<CustomerLoginOutput> ChangeLogoInExRule(string RuleCode)
+        {
+            var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0;
+            if (id == 0)
+            {
+                throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒");
+
+            }
+            //
+      
+            // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴�
+            // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴�
+            var user = await _sysUserRep.AsQueryable().Where(x => x.Id == id).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, RuleCode);
+
+        }
+
+        /// <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
new file mode 100644
index 0000000..c176c65
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj
@@ -0,0 +1,18 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <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>
+
+</Project>
diff --git a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs
new file mode 100644
index 0000000..de4747c
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs
@@ -0,0 +1,326 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using Admin.NET.Core.Service;
+using Furion;
+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.MD.CutomerMd.Extend;
+using FZCZTB.NET.SYSService.CustomerSYS;
+using Mapster;
+using MapsterMapper;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ViewComponents;
+using NewLife;
+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>
+    private readonly SqlSugarRepository<FBS_CusExtend> _fBS_CusExtendRep;
+    private IMapper _mapper;
+    /// <summary>
+    /// 
+    /// </summary>
+    public CustomerService(SysCacheService cacheService, CustomerManagerS managerS,SqlSugarRepository<FBS_Customer>  repository
+        , SqlSugarRepository<FBS_EnterpriseType> fbsenrep,IMapper mapper )
+    {
+        _sysCacheService= cacheService;
+         _customerManager = managerS;
+        _fBS_CustomerRep = repository;
+        _fBS_EnterpriseTypeRep = fbsenrep;
+        _mapper = mapper;
+    }
+
+    /// <summary>
+    /// 鐢ㄦ埛娉ㄥ唽
+    /// </summary>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [HttpPost]
+    public async Task<bool>  CustomerRegistration(CustomerRDto param )
+    {
+        //_customerManager.
+        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);
+    }
+
+    /// <summary>
+    /// 娉ㄥ唽瑙掕壊鐢ㄦ埛璧勬枡
+    /// </summary>
+    /// <returns></returns>
+    [HttpPost]
+    public async Task<bool> CreaterExRolsInformation(CusExtendDto cusExtend )
+    {
+
+        var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0;
+        if (id == 0)
+        {
+            throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒");
+
+        }
+        var user=await _customerManager.GetCustomer(id);
+        if(user==null)
+        {
+            throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+       var rols= await  _fBS_ExRoleRep.GetFirstAsync(x => x.Code == cusExtend.TransactionCode && x.Status == StatusEnum.Enable);
+        if(rols==null)
+        {
+            throw Oops.Oh("浜ゆ槗涓讳綋涓嶅瓨鍦�");
+        }
+
+        if(user.CoutomerExRols.Any(x=>x.ExRole.Code==cusExtend.TransactionCode&& x.HasFlsh==true))
+        {
+            throw Oops.Oh("鐢ㄦ埛宸茬粡娉ㄥ唽浜嗚涓讳綋");
+        }
+     
+
+        var data= cusExtend.Adapt<FBS_CusExtend>();
+
+        data.steps = CusExtendStep.UNExamine;
+        data.CustomerId = id;
+        data.CreateTime = DateTime.Now;
+        
+        data.CreateUserName = user.NickName;
+        data.TransactionCode = rols.Code;
+
+        
+      return   await _fBS_CusExtendRep.InsertAsync(data);
+
+
+
+
+    }
+    /// <summary>
+    /// 鑾峰彇 涓汉涓績鏁版嵁锛�
+    /// </summary>
+    [HttpPost]
+    public async Task<CusExtendDto> GetCusExtendInfo()
+    {
+        var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0;
+        if (id == 0)
+        {
+            throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒");
+
+        }
+        //
+        var typeCode = App.User.FindFirst(ClaimConst.CustomerLogoinType)?.Value ;
+        if (typeCode == null)
+        {
+            throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋閿欒");
+
+        }
+        var user = await _customerManager.GetCustomer(id);
+        if (user == null)
+        {
+            throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+        var rols = await _fBS_ExRoleRep.GetFirstAsync(x => x.Code == typeCode && x.Status == StatusEnum.Enable);
+        if (rols == null)
+        {
+            throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋鏃犳晥");
+        }
+       var tab= (await _fBS_CusExtendRep.GetFirstAsync(x => x.CustomerId == id && x.TransactionCode == typeCode)).Adapt<CusExtendDto>();
+        if(tab==null)
+        {
+            throw Oops.Oh("娌℃湁瀹屾垚淇℃伅褰曞叆");
+        }
+        return tab;
+        
+       
+    }
+
+    /// <summary>
+    /// 淇敼涓汉涓績鏁版嵁
+    /// </summary>
+    [HttpPost]
+    public async Task<bool> ChangeCusExtend(CusExtendDto InParam)
+    {
+        var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0;
+        if (id == 0)
+        {
+            throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒");
+
+        }
+        //
+        var typeCode = App.User.FindFirst(ClaimConst.CustomerLogoinType)?.Value;
+        if (typeCode == null)
+        {
+            throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋閿欒");
+
+        }
+        var user = await _customerManager.GetCustomer(id);
+        if (user == null)
+        {
+            throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+        var rols = await _fBS_ExRoleRep.GetFirstAsync(x => x.Code == typeCode && x.Status == StatusEnum.Enable);
+        if (rols == null)
+        {
+            throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋鏃犳晥");
+        }
+        var tab = await _fBS_CusExtendRep.GetFirstAsync(x => x.CustomerId == id && x.TransactionCode == typeCode);
+        if (tab == null)
+        {
+            throw Oops.Oh("娌℃湁瀹屾垚淇℃伅褰曞叆");
+        }
+
+
+
+
+
+        //娉曚汉
+        if (tab.LegalRepresentativeIdCard != InParam.LegalRepresentativeIdCard)
+        {
+            tab.LegalRepresentativeIdCard = InParam.LegalRepresentativeIdCard;
+            tab.LegalRepresentativeIdNumber = InParam.LegalRepresentativeIdNumber;
+            tab.LegalRepresentativeName = InParam.LegalRepresentativeName;
+            tab.LegalRepresentativePhone = InParam.LegalRepresentativePhone;
+            //閲嶆柊瀹℃牳?
+            tab.steps = CusExtendStep.Change;
+        }
+
+
+        //浼佷笟淇℃伅
+        if (tab.BusinessLicense != InParam.BusinessLicense)
+        {
+            tab.EstablishmentTime = tab.EstablishmentTime;
+            tab.RegisteredCapital = tab.RegisteredCapital;
+            tab.Residence = tab.Residence;
+            tab.MainBusiness = InParam.MainBusiness;
+            tab.EnterpriseType = InParam.EnterpriseType;
+            tab.EnterpriseName = InParam.EnterpriseName;
+            tab.BusinessLicense = InParam.BusinessLicense;
+            //閲嶆柊瀹℃牳?
+            tab.steps = CusExtendStep.Change;
+        }
+      
+
+        //鑱旂郴鐢佃瘽
+        tab.EnterprisePhone = InParam.EnterprisePhone;
+        tab.EnterpriseEmail = InParam.EnterpriseEmail;
+        //閾惰鏄惁闇�瑕佷慨鏀�
+        tab.BankAccount = InParam.BankAccount;
+        tab.BankName = InParam.BankName;
+
+        // 缁忓姙浜�
+        if (tab.OperatorIdCard != InParam.OperatorIdCard)
+        {
+            tab.OperatorIdCard = InParam.OperatorIdCard;
+
+            tab.OperatorIdNumber = InParam.OperatorIdNumber;
+            tab.OperatorName = InParam.OperatorName;
+            tab.OperatorPhone = InParam.OperatorPhone;
+        }
+
+        return await _fBS_CusExtendRep.UpdateAsync(tab);
+
+    }
+
+
+
+
+}
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..952a56b
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs
@@ -0,0 +1,200 @@
+锘�// 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.ComponentModel.DataAnnotations;
+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; }
+}
+
+/// <summary>
+/// 鐢ㄦ埛瑙掕壊璧勬枡
+/// </summary>
+public  class CusExtendDto
+{
+
+    /// <summary>
+    /// 涓婚敭
+    /// </summary>
+
+    public long ? Id { get; set; }
+
+    /// <summary>
+    /// 浼佷笟绫诲瀷 浠庝紒涓氱被鍨嬩腑閫夋嫨 鏉ユ簮浼佷笟绫诲瀷
+    /// </summary>
+
+    public string? EnterpriseType { get; set; }
+
+
+    /// <summary>
+    /// 浜ゆ槗涓讳綋 浠g爜 鍚岃鑹蹭唬鐮�
+    /// </summary>
+    [Required(ErrorMessage = "浜ゆ槗涓讳綋浠g爜涓哄繀濉」")] 
+    public string? TransactionCode { get; set; }
+
+    /// <summary>
+    /// 浜ゆ槗涓讳綋鍚嶇О 
+    /// </summary>
+    public string TransactionName { get; set; }
+
+    /// <summary>
+    /// 钀ヤ笟鎵х収鏂囦欢璺緞
+    /// </summary>
+
+    public string BusinessLicense { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鍚嶇О
+    /// </summary>
+
+    public string EnterpriseName { get; set; }
+
+    /// <summary>
+    /// 缁熶竴绀句細淇$敤浠g爜
+    /// </summary>
+
+    public string UnifiedSocialCreditCode { get; set; }
+
+    /// <summary>
+    /// 娉ㄥ唽璧勯噾锛堝崟浣嶏細涓囧厓 锛�
+    /// </summary>
+
+    public decimal RegisteredCapital { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜哄鍚�
+    /// </summary>
+
+    public string LegalRepresentativeName { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞
+    /// </summary>
+
+    public string LegalRepresentativeIdCard { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜
+    /// </summary>
+ 
+    public string LegalRepresentativeIdNumber { get; set; }
+
+    /// <summary>
+    /// 娉曞畾浠h〃浜鸿仈绯荤數璇�
+    /// </summary>
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+
+    public string? LegalRepresentativePhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟浣忔墍锛堜笅鎷夐�夋嫨锛岄渶缁撳悎瀹為檯鍙�夊�硷紝鍏堝瓧绗︿覆鎺ユ敹 锛�
+    /// </summary>
+
+    public string Residence { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鑱旂郴鐢佃瘽
+    /// </summary>
+
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+    public string? EnterprisePhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟鎴愮珛鏃堕棿
+    /// </summary>
+
+    public DateTime EstablishmentTime { get; set; }
+
+    /// <summary>
+    /// 浼佷笟涓昏惀涓氬姟
+    /// </summary>
+
+    public string MainBusiness { get; set; }
+
+    /// <summary>
+    /// 浼佷笟閭
+    /// </summary>
+ 
+    [SugarColumn(ColumnDescription = "浼佷笟閭")]
+    public string EnterpriseEmail { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜哄鍚�
+    /// </summary>
+
+    public string OperatorName { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇嗭紙涓婁紶鍚庡瓨鍌ㄤ俊鎭級
+    /// </summary>
+
+ 
+    public string OperatorIdCard { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿韩浠借瘉鍙风爜
+    /// </summary>
+
+
+    public string OperatorIdNumber { get; set; }
+
+    /// <summary>
+    /// 涓氬姟缁忓姙浜鸿仈绯荤數璇�
+    /// </summary>
+
+    [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")]
+    public string OperatorPhone { get; set; }
+
+    /// <summary>
+    /// 浼佷笟寮�鎴疯
+    /// </summary>
+
+
+    public string BankName { get; set; }
+
+    /// <summary>
+    /// 浼佷笟閾惰璐﹀彿
+    /// </summary>
+    public string BankAccount { get; set; }
+}
+  
\ No newline at end of file
diff --git a/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs b/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs
new file mode 100644
index 0000000..2bd0a91
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs
@@ -0,0 +1,62 @@
+锘�//琛屾斂澶勭綒
+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;
+
+/// <summary>
+/// 琛屾斂澶勭綒
+/// </summary>
+[SugarTable("FBD_ADPenalty","琛屾斂澶勭綒")]
+[IncreTable]
+public class ADPenalty: basemodelNoId
+{
+
+    /// <summary>
+    /// 鎶曡瘔ID锛屼富閿�
+    /// </summary>
+    [SugarColumn(IsPrimaryKey = true)]
+    public Guid Id { get; set; }
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鍐冲畾鏃ユ湡")]
+    public DateTime DecisionDate { get; set; }
+
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭紝鍙兘鍖呭惈澶氫釜褰撲簨浜猴紝鐢ㄩ�楀彿鍒嗛殧
+    /// </summary>
+    [SugarColumn(ColumnDescription = "褰撲簨浜轰俊鎭�", IsNullable =true, Length = 255)]
+    public string? Parties { get; set; }
+
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    [SugarColumn(ColumnDescription = "妗堢敱鎻忚堪", IsNullable = true, Length = int.MaxValue)]
+    public string? CaseReason { get; set; }
+
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶勭悊鍐冲畾鍐呭", IsNullable = true, Length = int.MaxValue)]
+    public string? DisposalDecision { get; set; }
+
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О", IsNullable = true ,Length=255)]
+    public string? SupervisionDepartment { get; set; }
+
+
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    [SugarColumn(Length = 255, IsNullable = true, ColumnDescription = "绾夸笂鍦板潃")]
+    public string Url { 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..17e3204
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs
@@ -0,0 +1,216 @@
+锘�// 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 long  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 CusExtendStep steps { set; get; } = CusExtendStep.UNExamine;
+}
+
+/// <summary>
+/// 瑙掕壊璧勬枡瀹℃牳杩涘害
+/// </summary>
+public enum CusExtendStep
+{
+    /// <summary>
+    /// 鏈鏍�
+    /// </summary>
+    UNExamine=0,
+    /// <summary>
+    /// 鏇存敼
+    /// </summary>
+    Change,
+    
+    /// <summary>
+    /// 閫氳繃
+    /// </summary>
+    Pass,
+    /// <summary>
+    /// 鏈�氳繃
+    /// </summary>
+    UnPass
+
+    
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..cd6db14
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
@@ -0,0 +1,362 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using Furion.FriendlyException;
+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;
+/// <summary>
+/// 瀹㈡埛琛�
+/// </summary>
+[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>
+    /// 璐﹀彿
+    /// </summary>
+    [SugarColumn(ColumnDescription = "璐﹀彿", Length = 32)]
+    [Required, MaxLength(32)]
+    public virtual string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512,IsNullable =true)]
+    [MaxLength(512)]
+
+    public virtual string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐪熷疄濮撳悕", Length = 32)]
+    [MaxLength(32)]
+    public virtual string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏄电О", Length = 32)]
+    [MaxLength(32)]
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶村儚", Length = 512)]
+    [MaxLength(512)]
+    public string? Avatar { get; set; }
+
+    ///// <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 DateTime? Birthday { get; set; }
+
+    ///// <summary>
+    ///// 姘戞棌
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "姘戞棌", Length = 32)]
+    //[MaxLength(32)]
+    //public string? Nation { get; set; }
+
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鎵嬫満鍙风爜", Length = 16)]
+    [MaxLength(16)]
+    public string? Phone { 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 = 512)]
+    //[MaxLength(512)]
+    //public string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 閭
+    /// </summary>
+    [SugarColumn(ColumnDescription = "閭", Length = 64)]
+    [MaxLength(64)]
+    public string? Email { 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 = "鏀挎不闈㈣矊", 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>
+    //[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 = 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 = 512)]
+    //[MaxLength(512)]
+    //public string? Introduction { get; set; }
+
+    ///// <summary>
+    ///// 鎺掑簭
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鎺掑簭")]
+    //public int OrderNo { get; set; } = 100;
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐘舵��")]
+    public StatusEnum Status { get; set; } = StatusEnum.Enable;
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶囨敞", Length = 256)]
+    [MaxLength(256)]
+    public string? Remark { get; set; }
+
+    ///// <summary>
+    ///// 璐﹀彿绫诲瀷
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "璐﹀彿绫诲瀷")]
+    //public AccountTypeEnum AccountType { get; set; } = AccountTypeEnum.NormalUser;
+
+    ///// <summary>
+    ///// 鐩村睘鏈烘瀯Id
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鐩村睘鏈烘瀯Id")]
+    //public long OrgId { get; set; }
+
+    /// <summary>
+    /// 鐩村睘鏈烘瀯
+    /// </summary>
+    //[Navigate(NavigateType.OneToOne, nameof(OrgId))]
+    //public SysOrg SysOrg { get; set; }
+
+    /// <summary>
+    /// 鐩村睘涓荤Id
+    /// </summary>
+    //[SugarColumn(ColumnDescription = "鐩村睘涓荤Id")]
+    //public long? ManagerUserId { get; set; }
+
+    /// <summary>
+    /// 鐩村睘涓荤
+    /// </summary>
+    //[Newtonsoft.Json.JsonIgnore]
+    //[System.Text.Json.Serialization.JsonIgnore]
+    //[Navigate(NavigateType.OneToOne, nameof(ManagerUserId))]
+    //public SysUser ManagerUser { get; set; }
+
+    ///// <summary>
+    ///// 鑱屼綅Id
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "鑱屼綅Id")]
+    //public long PosId { get; set; }
+
+    ///// <summary>
+    ///// 鑱屼綅
+    ///// </summary>
+    //[Newtonsoft.Json.JsonIgnore]
+    //[System.Text.Json.Serialization.JsonIgnore]
+    //[Navigate(NavigateType.OneToOne, nameof(PosId))]
+    //public SysPos SysPos { get; set; }
+
+    ///// <summary>
+    ///// 宸ュ彿
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "宸ュ彿", Length = 32)]
+    //[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? 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? OfficeZone { 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>
+    /// 鏈�鏂扮櫥褰旾p
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰旾p", Length = 256)]
+    [MaxLength(256)]
+    public string? LastLoginIp { get; set; }
+
+    /// <summary>
+    /// 鏈�鏂扮櫥褰曞湴鐐�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曞湴鐐�", Length = 128)]
+    [MaxLength(128)]
+    public string? LastLoginAddress { get; set; }
+
+    /// <summary>
+    /// 鏈�鏂扮櫥褰曟椂闂�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曟椂闂�")]
+    public DateTime? LastLoginTime { get; set; }
+
+    /// <summary>
+    /// 鏈�鏂扮櫥褰曡澶�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曡澶�", Length = 128)]
+    [MaxLength(128)]
+    public string? LastLoginDevice { get; set; }
+
+    /// <summary>
+    /// 鐢靛瓙绛惧悕
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐢靛瓙绛惧悕", Length = 512)]
+    [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>
+    ///// <param name="errorMsg">鑷畾涔夐敊璇秷鎭�</param>
+    //public void ValidateIsSuperAdminAccountType(ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1014)
+    //{
+    //    if (AccountType == AccountTypeEnum.SuperAdmin)
+    //    {
+    //        throw Oops.Oh(errorMsg);
+    //    }
+    //}
+
+    /// <summary>
+    /// 楠岃瘉鐢ㄦ埛Id鏄惁鐩稿悓锛岃嫢鐢ㄦ埛Id鐩稿悓鍒欐姤閿�
+    /// </summary>
+    /// <param name="userId">鐢ㄦ埛Id</param>
+    /// <param name="errorMsg">鑷畾涔夐敊璇秷鎭�</param>
+    public void ValidateIsUserId(long userId, ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1001)
+    {
+        if (Id == userId)
+        {
+            throw Oops.Oh(errorMsg);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
new file mode 100644
index 0000000..12037b4
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
@@ -0,0 +1,50 @@
+锘�// 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;
+[SugarTable("FBS_CustomerRole", "瀹㈡埛鑿滃崟琛�")]
+[IncreTable]
+public class FBS_CustomerRole : EntityBaseId
+{
+    /// <summary>
+    /// 鐢ㄦ埛Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐢ㄦ埛Id")]
+    public long CutomerId { get; set; }
+
+    /// <summary>
+    /// 鐢ㄦ埛
+    /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
+    [Navigate(NavigateType.OneToOne, nameof(CutomerId))]
+    public SysUser SysUser { get; set; }
+
+    /// <summary>
+    /// 瑙掕壊Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "瑙掕壊Id")]
+    public long RoleId { get; set; }
+
+    /// <summary>
+    /// 瑙掕壊
+    /// </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
new file mode 100644
index 0000000..a9a32cb
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
@@ -0,0 +1,65 @@
+锘�// 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;
+/// <summary>
+/// 鐧诲綍鍗宠閫夋嫨鐨勬牎鑹�
+/// </summary>
+
+[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>
+    /// 鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鍚嶇О", Length = 64)]
+    [Required, MaxLength(64)]
+    public virtual string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [SugarColumn(ColumnDescription = "缂栫爜", Length = 64)]
+    [MaxLength(64)]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鎺掑簭")]
+    public int OrderNo { get; set; } = 100;
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿锛�1鍏ㄩ儴鏁版嵁 2鏈儴闂ㄥ強浠ヤ笅鏁版嵁 3鏈儴闂ㄦ暟鎹� 4浠呮湰浜烘暟鎹� 5鑷畾涔夋暟鎹級
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏁版嵁鑼冨洿")]
+    public DataScopeEnum DataScope { get; set; } = DataScopeEnum.All;
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶囨敞", Length = 128)]
+    [MaxLength(128)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐘舵��")]
+    public StatusEnum Status { get; set; } = StatusEnum.Enable;
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
new file mode 100644
index 0000000..c3e7afc
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
@@ -0,0 +1,34 @@
+锘�// 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_ExRoleMenu", "绯荤粺绉熸埛鑿滃崟琛�")]
+[IncreTable]
+class FBS_ExRoleMenu: EntityBaseId
+{
+    /// <summary>
+    /// 绉熸埛Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "绉熸埛Id")]
+    public long ExRoleId { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鑿滃崟Id")]
+    public long MenuId { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
new file mode 100644
index 0000000..c3156d0
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
@@ -0,0 +1,142 @@
+锘�// 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;
+/// <summary>
+/// 
+/// </summary>
+[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>
+    /// 鐖禝d
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐖禝d")]
+    public long Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷锛�1鐩綍 2鑿滃崟 3鎸夐挳锛�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鑿滃崟绫诲瀷")]
+    public MenuTypeEnum Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "璺敱鍚嶇О", Length = 64)]
+    [MaxLength(64)]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    [SugarColumn(ColumnDescription = "璺敱鍦板潃", Length = 128)]
+    [MaxLength(128)]
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    [SugarColumn(ColumnDescription = "缁勪欢璺緞", Length = 128)]
+    [MaxLength(128)]
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    [SugarColumn(ColumnDescription = "閲嶅畾鍚�", Length = 128)]
+    [MaxLength(128)]
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏉冮檺鏍囪瘑", Length = 128)]
+    [MaxLength(128)]
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鑿滃崟鍚嶇О", Length = 64)]
+    [Required, MaxLength(64)]
+    public virtual string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鍥炬爣", Length = 128)]
+    [MaxLength(128)]
+    public string? Icon { get; set; } = "ele-Menu";
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏄惁鍐呭祵")]
+    public bool IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶栭摼閾炬帴", Length = 256)]
+    [MaxLength(256)]
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏄惁闅愯棌")]
+    public bool IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏄惁缂撳瓨")]
+    public bool IsKeepAlive { get; set; } = true;
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏄惁鍥哄畾")]
+    public bool IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鎺掑簭")]
+    public int OrderNo { get; set; } = 100;
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐘舵��")]
+    public StatusEnum Status { get; set; } = StatusEnum.Enable;
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶囨敞", Length = 256)]
+    [MaxLength(256)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟瀛愰」
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    public List<SysMenu> Children { get; set; } = new();
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
new file mode 100644
index 0000000..f1ec761
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
@@ -0,0 +1,63 @@
+锘�// 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;
+using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionRequest.Types;
+
+namespace FZCZTB.NET.MD.CutomerMd;
+
+[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>
+    /// 鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鍚嶇О", Length = 64)]
+    [Required, MaxLength(64)]
+    public virtual string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [SugarColumn(ColumnDescription = "缂栫爜", Length = 64)]
+    [MaxLength(64)]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鎺掑簭")]
+    public int OrderNo { get; set; } = 100;
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿锛�1鍏ㄩ儴鏁版嵁 2鏈儴闂ㄥ強浠ヤ笅鏁版嵁 3鏈儴闂ㄦ暟鎹� 4浠呮湰浜烘暟鎹� 5鑷畾涔夋暟鎹級
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鏁版嵁鑼冨洿")]
+    public DataScopeEnum DataScope { get; set; } = DataScopeEnum.Self;
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [SugarColumn(ColumnDescription = "澶囨敞", Length = 128)]
+    [MaxLength(128)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鐘舵��")]
+    public StatusEnum Status { get; set; } = StatusEnum.Enable;
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
new file mode 100644
index 0000000..0107262
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.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;
+
+[SugarTable("FBS_RoleMenu", "涓�у寲鏍¤壊鑿滃崟")]
+[IncreTable]
+public class FBS_RoleMenu: EntityBaseId
+{
+
+    /// <summary>
+    /// 瑙掕壊Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "瑙掕壊Id")]
+    public long RoleId { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "鑿滃崟Id")]
+    public long MenuId { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟
+    /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
+    [Navigate(NavigateType.OneToOne, nameof(MenuId))]
+    public SysMenu SysMenu { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs
index c566b19..e47e76c 100644
--- a/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs
+++ b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs
@@ -76,7 +76,7 @@
         /// <summary>
         /// 鎶曡瘔浜嬮」
         /// </summary>
-        [Navigate(NavigateType.OneToMany,nameof(ProcurementComplaintItems.ComplaintId), nameof(ProcurementComplaint.Id))]
+        [Navigate(NavigateType.OneToMany,nameof(ProcurementComplaintItems.ComplaintId))]
         public  List<ProcurementComplaintItems>? Complaints { get; set; }
     }
 
@@ -109,7 +109,7 @@
             /// 澶勭悊缁撴灉
             /// </summary>
             [SugarColumn(IsNullable = true, ColumnDescription = "澶勭悊缁撴灉")]
-            public PComplaintStatus HandlingStatus { get; set; }
+            public PComplaintStatus? HandlingStatus { get; set; }
         /// <summary>
         /// 澶勭悊鎻忚堪
         /// </summary>
@@ -148,7 +148,7 @@
         [Description("閮ㄥ垎鎴愮珛")]
         PartiallyValid = 3
 
-     
+
     }
 
     public class basemodelNoId
diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs
new file mode 100644
index 0000000..ab8c7ca
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs
@@ -0,0 +1,229 @@
+锘縰sing Admin.NET.Core;
+using Admin.NET.Core.Service;
+using Furion.DependencyInjection;
+using Furion.FriendlyException;
+using FZCZTB.NET.MD.CutomerMd;
+using Mapster;
+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.SYSService.CustomerSYS
+{
+    /// <summary>
+    /// customermanger 鏈嶅姟
+    /// </summary>
+    public class CustomerManagerS: IScoped
+    {
+        private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep;
+        private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep;
+        private readonly SysCacheService _sysCacheService;
+
+        public CustomerManagerS(SysCacheService sysCacheService,
+            SqlSugarRepository<FBS_ExRole> fBS_ExRoleRep,
+            SqlSugarRepository<FBS_Customer> fBS_CustomerRep)
+        {
+            _sysCacheService = sysCacheService;
+            _fBS_ExRoleRep = fBS_ExRoleRep;
+            _fBS_CustomerRep = fBS_CustomerRep;
+        }
+        /// <summary>
+        /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮�
+        /// </summary>
+        /// <returns></returns>
+        public async Task< List<ExRoleVM>> GetExRole()
+        {
+           return await _fBS_ExRoleRep.AsQueryable().Where(x=>x.Status== StatusEnum.Enable)        
+            .Select<ExRoleVM>().WithCache(20).ToListAsync();
+
+        }
+
+        /// <summary>
+        /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<CustomerRDto> GetCustomer(long  id)
+        {
+
+   
+            return await _fBS_CustomerRep.AsQueryable().Where(x=>x.Id==id&&x.Status== StatusEnum.Enable).Includes(x=>x.CoutomerExRols,y=>y.ExRole)
+           .Select<CustomerRDto>().WithCache(20).FirstAsync();
+            //return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>();
+
+
+
+
+
+        }
+
+
+        /// <summary>
+        /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<CustomerRDto> UpDataCustomer(int id)
+        {
+
+
+
+            return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>();
+
+
+
+
+
+        }
+
+
+     
+    }
+
+
+    /// <summary>
+    /// 瀹㈡埛涓诲垎绫昏鑹插熀纭�杈撳叆鍙傛暟
+    /// </summary>
+    public class ExRoleVM
+    {
+        /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        public virtual long? Id { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+        public virtual string Name { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public virtual string? Code { get; set; }
+
+        /// <summary>
+        /// 鎺掑簭
+        /// </summary>
+        [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+        public virtual int? OrderNo { get; set; }
+
+        /// <summary>
+        /// 鏁版嵁鑼冨洿
+        /// </summary>
+        [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+        [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")]
+        public virtual DataScopeEnum? DataScope { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public virtual string? Remark { get; set; }
+
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        [Dict(nameof(StatusEnum), AllowNullValue = true)]
+        [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+        public virtual StatusEnum? Status { get; set; }
+
+    }
+
+
+    /// <summary>
+    /// 瀹㈡埛琛ㄨ緭鍑哄弬鏁�
+    /// </summary>
+    public class CustomerRDto
+    {
+        /// <summary>
+        /// 璐﹀彿
+        /// </summary>
+   
+        public virtual string Account { get; set; }
+
+        /// <summary>
+        /// 瀵嗙爜
+        /// </summary>
+    
+        [MaxLength(512)]
+
+        public virtual string Password { get; set; }
+
+        /// <summary>
+        /// 鐪熷疄濮撳悕
+        /// </summary>
+      
+        [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>
+      
+        [MaxLength(16)]
+        public string? Phone { get; set; }
+
+        
+
+        /// <summary>
+        /// 閭
+        /// </summary>
+       
+        [MaxLength(64)]
+        public string? Email { get; set; }
+
+
+     
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+
+        [MaxLength(256)]
+        public string? Remark { get; set; }
+
+       
+
+
+        /// <summary>
+        /// 鐢靛瓙绛惧悕
+        /// </summary>
+       
+        public string? Signature { get; set; }
+
+        /// <summary>
+        /// 鐧诲綍瑙掕壊
+        /// </summary>
+        [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
new file mode 100644
index 0000000..451ec3d
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj
@@ -0,0 +1,21 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" />
+    <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
new file mode 100644
index 0000000..84183ff
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json
@@ -0,0 +1,27 @@
+{
+  "SMSConfig": {
+  
+    "lingKai": { //鍑屽嚡鐭俊閰嶇疆
+      "Url": "https://mb345.com/ws/BatchSend2.aspx",
+      "Number": "XP010534",
+      "AccountPassPassword": "123321",
+      "VerifyTimeOut": "60", //绉�
+      "Templates": [
+        {
+          "Id": "0",
+          "SignName": "銆愭斂閲囧挩璇㈢綉銆�", //闇�瑕佸姞鍏ョ殑鍏徃鏍囩
+          "TemplateCode": "VCode",
+          "Content": "鎮ㄥソ锛屾偍鐨勯獙璇佺爜鏄細${code}"
+
+          
+        },
+        {
+          "Id": "1",
+          "SignName": "銆愭斂閲囧挩璇㈢綉銆�",
+          "TemplateCode": "RegistrationOK   ",
+          "Content": "娉ㄥ唽鎴愬姛锛屾劅璋㈡偍鐨勬敞鍐岋紝璇峰Ε鍠勪繚绠℃偍鐨勮处鎴蜂俊鎭�"
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs
new file mode 100644
index 0000000..3cd5e0b
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs
@@ -0,0 +1,48 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using Furion.ConfigurableOptions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.SYSService.MSM;
+public class SMSConfigOptions : IConfigurableOptions
+{
+
+
+    /// <summary>
+    /// 鍑屽嚡淇℃伅閰嶇疆
+    /// </summary>
+    public LingKaiXinxiSets lingKai {  get; set; }
+}
+
+public class LingKaiXinxiSets
+{
+   /// <summary>
+   /// d鍦板潃
+   /// </summary>
+    public string Url { get; set; }
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    public string Number { get; set; }
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    public string AccountPassPassword { get; set; }
+    /// <summary>
+    /// 瓒呮椂鏃堕棿
+    /// </summary>
+    public string VerifyTimeOut {  get; set; }
+    /// <summary>
+    /// Templates
+    /// </summary>
+    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
new file mode 100644
index 0000000..051b110
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs
@@ -0,0 +1,216 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core.Service;
+using Admin.NET.Core;
+using Furion.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Options;
+using Dm.util;
+using Aop.Api.Domain;
+using Furion.FriendlyException;
+using Furion.DataValidation;
+using static QRCoder.PayloadGenerator;
+using System.Net;
+using Org.BouncyCastle.Asn1.Ocsp;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Authorization;
+using Furion.DynamicApiController;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using Yitter.IdGenerator;
+using Lazy.Captcha.Core;
+using Furion;
+using NewLife;
+
+namespace FZCZTB.NET.SYSService.MSM;
+/// <summary>
+/// 鏀块噰鐭俊鏈嶅姟
+/// </summary>
+[AllowAnonymous]
+[ApiDescriptionSettings("FZCAPISYS",Order = 149)]
+public class ZCSMSService : IDynamicApiController,ITransient
+{
+    private readonly SMSConfigOptions _smsOptions;
+    private readonly SysCacheService _sysCacheService;
+    private readonly ICaptcha _captcha;
+    public ZCSMSService(IOptions<SMSConfigOptions> smsOptions,
+          SysCacheService sysCacheService,
+          ICaptcha captcha
+          )
+    {
+      
+        _smsOptions = smsOptions.Value;
+        _sysCacheService = sysCacheService;
+    
+         _captcha = captcha;
+    }
+
+
+    /// <summary>
+    /// 鏍规嵁钘忕敤妯$増鏍煎紡鍖栫煭淇″唴瀹� 浼氳嚜鍔ㄨ创涓婃爣绛�
+    /// </summary>
+    /// <param name="Code"> 闇�瑕佹浛鎹㈢殑鍐呭锛岀敤浜庢浛鎹㈡湯鐝唴瀹圭殑code閮ㄥ垎</param>
+    /// <param name="Key"></param>
+    [NonAction]
+    public string FormartMessage(string? Code, string Key = "VCode")
+    {
+     var Temp=     _smsOptions.lingKai.Templates.Where(x => x.TemplateCode == Key).FirstOrDefault();
+        if ( Temp != null )
+        {
+            if(Code != null)
+            {
+             
+                    return Temp.Content.replace("${code}", Code) + Temp.SignName;
+             
+            }
+           
+            else
+                return Temp.Content+Temp.SignName;
+        }
+        if (Code == null)
+            throw Oops.Oh("鐭俊鍐呭涓虹┖");
+        return Code;
+    }
+
+
+    /// <summary>
+    /// 鍙戦�佺煭淇�
+    /// </summary>
+    /// <param name="Content">瑕佹浛鎹㈢殑鍐呭</param>   
+    [NonAction]
+    public async Task SendSMSAsync(string Content,string Phone)
+    {
+        if (!Phone.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�");
+
+       if( string.IsNullOrEmpty(Content)) throw Oops.Oh("璇峰~鍐欐纭殑鎵嬫満鍙风爜");
+
+        string postdata1 = "CorpID=" + _smsOptions.lingKai.Number + "&Pwd=" + _smsOptions.lingKai.AccountPassPassword + "&Mobile=" + Phone + "&Content="+ Content + "&SendTime=";
+        string code = (string)await HttpPost(_smsOptions.lingKai.Url, postdata1);
+
+        var data = Convert.ToInt64(code);
+        if (data > 0)
+        {
+             return ;
+        }
+        Oops.Oh($"鍙戦�佺煭淇″け璐ワ紝閿欒鐮亄data}");
+   
+
+    }
+
+  
+
+
+    /// <summary>
+    /// 鑾峰彇楠岃瘉鐮� 馃敄
+    /// </summary>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [SuppressMonitor]
+    [DisplayName("鑾峰彇楠岃瘉鐮�")]
+    public dynamic GetCaptcha()
+    {
+        var codeId = YitIdHelper.NextId().ToString();
+        var captcha = _captcha.Generate(codeId);
+        var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60;
+        return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds };
+    }
+
+    /// <summary>
+    /// 鏍¢獙鐭俊楠岃瘉鐮�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("鏍¢獙鐭俊楠岃瘉鐮�")]
+    public bool VerifyCode(SmsVerifyCodeInput input)
+    {
+        var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
+
+        if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�");
+
+        if (verifyCode != input.Code) throw Oops.Oh("楠岃瘉鐮侀敊璇紒");
+        _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
+        return true;
+    }
+    /// <summary>
+    /// 鍙戦�侀獙璇佺煭淇★紝瑕佽楠岃瘉鐮� 闇�瑕佽緭鍏ユ牎楠岋紝閬垮厤鐢佃剳鏀诲嚮
+    /// </summary>
+    /// <param name="phoneNumber"> 鐢佃瘽鍙风爜</param>
+    /// <param name="VerifyCode">鍥剧墖鏍¢獙鏁版嵁</param>
+    ///   <param name="VerifyCodeId">妫�楠岀殑ID</param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("鍙戦�侀獙璇佺爜")]
+    public async Task SendSMS([Required] string phoneNumber , [Required] string  VerifyCode, [Required] string  VerifyCodeId)
+    {
+        if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�");
+
+        // 鏍¢獙楠岃瘉鐮�
+        if (!_captcha.Validate(VerifyCodeId, VerifyCode)) throw Oops.Oh(ErrorCodeEnum.D0008);
+        _captcha.Generate(VerifyCodeId);
+
+        // 鐢熸垚闅忔満楠岃瘉鐮�
+        var random = new Random();
+        var verifyCode = random.Next(100000, 999999);
+
+        var templateParam = new
+        {
+            code = verifyCode
+        };
+       var code=   FormartMessage(verifyCode.toString());
+       
+       await SendSMSAsync(code, phoneNumber);
+   
+        _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut.ToInt()));
+     
+         
+
+        
+    }
+
+    /// <summary>
+    /// 鍙戦�侀獙璇佺爜
+    /// </summary>
+    /// <param name="Url"> 閾炬帴</param>
+    /// <param name="postDataStr"> 楠岃瘉鐮�</param>
+    /// <returns></returns>
+    private  async Task<string> HttpPost(string Url, string postDataStr)
+    {
+        //HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
+        //request.Method = "POST";
+        //request.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
+
+        //byte[] postData = Encoding.GetEncoding("gb2312").GetBytes(postDataStr);
+        //request.ContentLength = postData.Length;
+        //Stream myRequestStream = request.GetRequestStream();
+        //myRequestStream.Write(postData, 0, postData.Length);
+        //myRequestStream.Close();
+        //HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
+        //Stream myResponseStream = response.GetResponseStream();
+        //StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
+        //string retString = myStreamReader.ReadToEnd();
+        //myStreamReader.Close();
+        //myResponseStream.Close();
+
+        //return retString;
+        // 鍒涘缓 HttpClient 瀹炰緥
+        using var httpClient = new HttpClient();
+        // 鍑嗗瑕佸彂閫佺殑鍐呭锛岃缃紪鐮佸拰鍐呭绫诲瀷
+        var content = new StringContent(postDataStr, Encoding.GetEncoding("gb2312"), "application/x-www-form-urlencoded");
+        // 鍙戦�� POST 璇锋眰
+        var response = await httpClient.PostAsync(Url, content);
+        // 纭繚璇锋眰鎴愬姛锛岃嫢澶辫触鍒欐姏鍑哄紓甯�
+        response.EnsureSuccessStatusCode();
+        // 璇诲彇鍝嶅簲鍐呭
+        return await response.Content.ReadAsStringAsync();
+    }
+
+}
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/CustomerSYSTemConst.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs
new file mode 100644
index 0000000..971a6a7
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs
@@ -0,0 +1,17 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.Net.CustomerSYSTem;
+public class CustomerSYSTemConst
+{
+    public const string GroupName = "FZCCustomerGroupName";
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
new file mode 100644
index 0000000..05ae595
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
@@ -0,0 +1,16 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <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="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs
new file mode 100644
index 0000000..1fca754
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs
@@ -0,0 +1,241 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto;
+
+/// <summary>
+/// 瀹㈡埛琛ㄨ緭鍑哄弬鏁�
+/// </summary>
+public class FBS_CustomerDto
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    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>
+    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>
+    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>
+    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; }
+
+    /// <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_Customer/Dto/FBS_CustomerInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs
new file mode 100644
index 0000000..dff9f10
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs
@@ -0,0 +1,875 @@
+锘�// 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.Service.FBS_Customer.Dto;
+
+/// <summary>
+/// 瀹㈡埛琛ㄥ熀纭�杈撳叆鍙傛暟
+/// </summary>
+public class FBS_CustomerBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public virtual long? Id { get; set; }
+
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")]
+    public virtual string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")]
+    public virtual string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")]
+    public virtual string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    public virtual string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    public virtual string? Avatar { get; set; }
+
+    /// <summary>
+    /// 鎬у埆
+    /// </summary>
+    [Dict(nameof(GenderEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")]
+    public virtual GenderEnum? Sex { get; set; }
+
+    /// <summary>
+    /// 骞撮緞
+    /// </summary>
+    [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")]
+    public virtual int? Age { get; set; }
+
+    /// <summary>
+    /// 鍑虹敓鏃ユ湡
+    /// </summary>
+    public virtual DateTime? Birthday { get; set; }
+
+    /// <summary>
+    /// 姘戞棌
+    /// </summary>
+    public virtual string? Nation { get; set; }
+
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>
+    public virtual string? Phone { get; set; }
+
+    /// <summary>
+    /// 璇佷欢绫诲瀷
+    /// </summary>
+    [Dict(nameof(CardTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")]
+    public virtual CardTypeEnum? CardType { get; set; }
+
+    /// <summary>
+    /// 韬唤璇佸彿
+    /// </summary>
+    public virtual string? IdCardNum { get; set; }
+
+    /// <summary>
+    /// 韬唤璇�
+    /// </summary>
+    public virtual string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 閭
+    /// </summary>
+    public virtual string? Email { get; set; }
+
+    /// <summary>
+    /// 鍦板潃
+    /// </summary>
+    public virtual string? Address { get; set; }
+
+    /// <summary>
+    /// 鏂囧寲绋嬪害
+    /// </summary>
+    [Dict(nameof(CultureLevelEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")]
+    public virtual CultureLevelEnum? CultureLevel { get; set; }
+
+    /// <summary>
+    /// 鏀挎不闈㈣矊
+    /// </summary>
+    public virtual string? PoliticalOutlook { get; set; }
+
+    /// <summary>
+    /// 姣曚笟闄㈡牎
+    /// </summary>
+    public virtual string? College { get; set; }
+
+    /// <summary>
+    /// 鍔炲叕鐢佃瘽
+    /// </summary>
+    public virtual string? OfficePhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉
+    /// </summary>
+    public virtual string? EmergencyContact { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鐢佃瘽
+    /// </summary>
+    public virtual string? EmergencyPhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鍦板潃
+    /// </summary>
+    public virtual string? EmergencyAddress { get; set; }
+
+    /// <summary>
+    /// 涓汉绠�浠�
+    /// </summary>
+    public virtual string? Introduction { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public virtual int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public virtual StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public virtual string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑱岀骇
+    /// </summary>
+    public virtual string? PosLevel { get; set; }
+
+    /// <summary>
+    /// 鑱岀О
+    /// </summary>
+    public virtual string? PosTitle { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄥ垎椤垫煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class PageFBS_CustomerInput : BasePageInput
+{
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 璇佷欢绫诲瀷
+    /// </summary>
+    [Dict(nameof(CardTypeEnum), AllowNullValue = true)]
+    public CardTypeEnum? CardType { get; set; }
+
+    /// <summary>
+    /// 韬唤璇�
+    /// </summary>
+    public string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 鏂囧寲绋嬪害
+    /// </summary>
+    [Dict(nameof(CultureLevelEnum), AllowNullValue = true)]
+    public CultureLevelEnum? CultureLevel { 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>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑱岀骇
+    /// </summary>
+    public string? PosLevel { get; set; }
+
+    /// <summary>
+    /// 鑱岀О
+    /// </summary>
+    public string? PosTitle { get; set; }
+
+    /// <summary>
+    /// 閫変腑涓婚敭鍒楄〃
+    /// </summary>
+    public List<long> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄥ鍔犺緭鍏ュ弬鏁�
+/// </summary>
+public class AddFBS_CustomerInput
+{
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")]
+    [MaxLength(32, ErrorMessage = "璐﹀彿瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")]
+    [MaxLength(512, ErrorMessage = "瀵嗙爜瀛楃闀垮害涓嶈兘瓒呰繃512")]
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")]
+    [MaxLength(32, ErrorMessage = "鐪熷疄濮撳悕瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "鏄电О瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    [MaxLength(512, ErrorMessage = "澶村儚瀛楃闀垮害涓嶈兘瓒呰繃512")]
+    public string? Avatar { get; set; }
+
+    /// <summary>
+    /// 鎬у埆
+    /// </summary>
+    [Dict(nameof(GenderEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")]
+    public GenderEnum? Sex { get; set; }
+
+    /// <summary>
+    /// 骞撮緞
+    /// </summary>
+    [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")]
+    public int? Age { get; set; }
+
+    /// <summary>
+    /// 鍑虹敓鏃ユ湡
+    /// </summary>
+    public DateTime? Birthday { get; set; }
+
+    /// <summary>
+    /// 姘戞棌
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "姘戞棌瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? Nation { get; set; }
+
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>
+    [MaxLength(16, ErrorMessage = "鎵嬫満鍙风爜瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? Phone { get; set; }
+
+    /// <summary>
+    /// 璇佷欢绫诲瀷
+    /// </summary>
+    [Dict(nameof(CardTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")]
+    public CardTypeEnum? CardType { get; set; }
+
+    /// <summary>
+    /// 韬唤璇佸彿
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "韬唤璇佸彿瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? IdCardNum { get; set; }
+
+    /// <summary>
+    /// 韬唤璇�
+    /// </summary>
+    [MaxLength(512, ErrorMessage = "韬唤璇佸瓧绗﹂暱搴︿笉鑳借秴杩�512")]
+    public string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 閭
+    /// </summary>
+    [MaxLength(64, ErrorMessage = "閭瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Email { get; set; }
+
+    /// <summary>
+    /// 鍦板潃
+    /// </summary>
+    [MaxLength(256, ErrorMessage = "鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Address { get; set; }
+
+    /// <summary>
+    /// 鏂囧寲绋嬪害
+    /// </summary>
+    [Dict(nameof(CultureLevelEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")]
+    public CultureLevelEnum? CultureLevel { get; set; }
+
+    /// <summary>
+    /// 鏀挎不闈㈣矊
+    /// </summary>
+    [MaxLength(16, ErrorMessage = "鏀挎不闈㈣矊瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? PoliticalOutlook { get; set; }
+
+    /// <summary>
+    /// 姣曚笟闄㈡牎
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "姣曚笟闄㈡牎瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? College { get; set; }
+
+    /// <summary>
+    /// 鍔炲叕鐢佃瘽
+    /// </summary>
+    [MaxLength(16, ErrorMessage = "鍔炲叕鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? OfficePhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "绱ф�ヨ仈绯讳汉瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? EmergencyContact { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鐢佃瘽
+    /// </summary>
+    [MaxLength(16, ErrorMessage = "绱ф�ヨ仈绯讳汉鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? EmergencyPhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鍦板潃
+    /// </summary>
+    [MaxLength(256, ErrorMessage = "绱ф�ヨ仈绯讳汉鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? EmergencyAddress { get; set; }
+
+    /// <summary>
+    /// 涓汉绠�浠�
+    /// </summary>
+    [MaxLength(512, ErrorMessage = "涓汉绠�浠嬪瓧绗﹂暱搴︿笉鑳借秴杩�512")]
+    public string? Introduction { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑱岀骇
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "鑱岀骇瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? PosLevel { get; set; }
+
+    /// <summary>
+    /// 鑱岀О
+    /// </summary>
+    [MaxLength(32, ErrorMessage = "鑱岀О瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? PosTitle { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄥ垹闄よ緭鍏ュ弬鏁�
+/// </summary>
+public class DeleteFBS_CustomerInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄦ洿鏂拌緭鍏ュ弬鏁�
+/// </summary>
+public class UpdateFBS_CustomerInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>    
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>    
+    [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")]
+    [MaxLength(32, ErrorMessage = "璐﹀彿瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>    
+    [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")]
+    [MaxLength(512, ErrorMessage = "瀵嗙爜瀛楃闀垮害涓嶈兘瓒呰繃512")]
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>    
+    [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")]
+    [MaxLength(32, ErrorMessage = "鐪熷疄濮撳悕瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "鏄电О瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>    
+    [MaxLength(512, ErrorMessage = "澶村儚瀛楃闀垮害涓嶈兘瓒呰繃512")]
+    public string? Avatar { get; set; }
+
+    /// <summary>
+    /// 鎬у埆
+    /// </summary>    
+    [Dict(nameof(GenderEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")]
+    public GenderEnum? Sex { get; set; }
+
+    /// <summary>
+    /// 骞撮緞
+    /// </summary>    
+    [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")]
+    public int? Age { get; set; }
+
+    /// <summary>
+    /// 鍑虹敓鏃ユ湡
+    /// </summary>    
+    public DateTime? Birthday { get; set; }
+
+    /// <summary>
+    /// 姘戞棌
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "姘戞棌瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? Nation { get; set; }
+
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>    
+    [MaxLength(16, ErrorMessage = "鎵嬫満鍙风爜瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? Phone { get; set; }
+
+    /// <summary>
+    /// 璇佷欢绫诲瀷
+    /// </summary>    
+    [Dict(nameof(CardTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")]
+    public CardTypeEnum? CardType { get; set; }
+
+    /// <summary>
+    /// 韬唤璇佸彿
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "韬唤璇佸彿瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? IdCardNum { get; set; }
+
+    /// <summary>
+    /// 韬唤璇�
+    /// </summary>    
+    [MaxLength(512, ErrorMessage = "韬唤璇佸瓧绗﹂暱搴︿笉鑳借秴杩�512")]
+    public string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 閭
+    /// </summary>    
+    [MaxLength(64, ErrorMessage = "閭瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Email { get; set; }
+
+    /// <summary>
+    /// 鍦板潃
+    /// </summary>    
+    [MaxLength(256, ErrorMessage = "鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Address { get; set; }
+
+    /// <summary>
+    /// 鏂囧寲绋嬪害
+    /// </summary>    
+    [Dict(nameof(CultureLevelEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")]
+    public CultureLevelEnum? CultureLevel { get; set; }
+
+    /// <summary>
+    /// 鏀挎不闈㈣矊
+    /// </summary>    
+    [MaxLength(16, ErrorMessage = "鏀挎不闈㈣矊瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? PoliticalOutlook { get; set; }
+
+    /// <summary>
+    /// 姣曚笟闄㈡牎
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "姣曚笟闄㈡牎瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? College { get; set; }
+
+    /// <summary>
+    /// 鍔炲叕鐢佃瘽
+    /// </summary>    
+    [MaxLength(16, ErrorMessage = "鍔炲叕鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? OfficePhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "绱ф�ヨ仈绯讳汉瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? EmergencyContact { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鐢佃瘽
+    /// </summary>    
+    [MaxLength(16, ErrorMessage = "绱ф�ヨ仈绯讳汉鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")]
+    public string? EmergencyPhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鍦板潃
+    /// </summary>    
+    [MaxLength(256, ErrorMessage = "绱ф�ヨ仈绯讳汉鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? EmergencyAddress { get; set; }
+
+    /// <summary>
+    /// 涓汉绠�浠�
+    /// </summary>    
+    [MaxLength(512, ErrorMessage = "涓汉绠�浠嬪瓧绗﹂暱搴︿笉鑳借秴杩�512")]
+    public string? Introduction { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>    
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>    
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>    
+    [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑱岀骇
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "鑱岀骇瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? PosLevel { get; set; }
+
+    /// <summary>
+    /// 鑱岀О
+    /// </summary>    
+    [MaxLength(32, ErrorMessage = "鑱岀О瀛楃闀垮害涓嶈兘瓒呰繃32")]
+    public string? PosTitle { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄤ富閿煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class QueryByIdFBS_CustomerInput : DeleteFBS_CustomerInput
+{
+}
+
+/// <summary>
+/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁�
+/// </summary>
+public class SetFBS_CustomerStatusInput : BaseStatusInput
+{
+}
+
+/// <summary>
+/// 瀹㈡埛琛ㄦ暟鎹鍏ュ疄浣�
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportFBS_CustomerInput : BaseImportInput
+{
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    [ImporterHeader(Name = "*璐﹀彿")]
+    [ExporterHeader("*璐﹀彿", Format = "", Width = 25, IsBold = true)]
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    [ImporterHeader(Name = "*瀵嗙爜")]
+    [ExporterHeader("*瀵嗙爜", Format = "", Width = 25, IsBold = true)]
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    [ImporterHeader(Name = "*鐪熷疄濮撳悕")]
+    [ExporterHeader("*鐪熷疄濮撳悕", Format = "", Width = 25, IsBold = true)]
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    [ImporterHeader(Name = "鏄电О")]
+    [ExporterHeader("鏄电О", Format = "", Width = 25, IsBold = true)]
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    [ImporterHeader(Name = "澶村儚")]
+    [ExporterHeader("澶村儚", Format = "", Width = 25, IsBold = true)]
+    public string? Avatar { get; set; }
+
+    /// <summary>
+    /// 鎬у埆
+    /// </summary>
+    [ImporterHeader(Name = "*鎬у埆")]
+    [ExporterHeader("*鎬у埆", Format = "", Width = 25, IsBold = true)]
+    public GenderEnum? Sex { get; set; }
+
+    /// <summary>
+    /// 骞撮緞
+    /// </summary>
+    [ImporterHeader(Name = "*骞撮緞")]
+    [ExporterHeader("*骞撮緞", Format = "", Width = 25, IsBold = true)]
+    public int? Age { get; set; }
+
+    /// <summary>
+    /// 鍑虹敓鏃ユ湡
+    /// </summary>
+    [ImporterHeader(Name = "鍑虹敓鏃ユ湡")]
+    [ExporterHeader("鍑虹敓鏃ユ湡", Format = "", Width = 25, IsBold = true)]
+    public DateTime? Birthday { get; set; }
+
+    /// <summary>
+    /// 姘戞棌
+    /// </summary>
+    [ImporterHeader(Name = "姘戞棌")]
+    [ExporterHeader("姘戞棌", Format = "", Width = 25, IsBold = true)]
+    public string? Nation { get; set; }
+
+    /// <summary>
+    /// 鎵嬫満鍙风爜
+    /// </summary>
+    [ImporterHeader(Name = "鎵嬫満鍙风爜")]
+    [ExporterHeader("鎵嬫満鍙风爜", Format = "", Width = 25, IsBold = true)]
+    public string? Phone { get; set; }
+
+    /// <summary>
+    /// 璇佷欢绫诲瀷
+    /// </summary>
+    [ImporterHeader(Name = "*璇佷欢绫诲瀷")]
+    [ExporterHeader("*璇佷欢绫诲瀷", Format = "", Width = 25, IsBold = true)]
+    public CardTypeEnum? CardType { get; set; }
+
+    /// <summary>
+    /// 韬唤璇佸彿
+    /// </summary>
+    [ImporterHeader(Name = "韬唤璇佸彿")]
+    [ExporterHeader("韬唤璇佸彿", Format = "", Width = 25, IsBold = true)]
+    public string? IdCardNum { get; set; }
+
+    /// <summary>
+    /// 韬唤璇�
+    /// </summary>
+    [ImporterHeader(Name = "韬唤璇�")]
+    [ExporterHeader("韬唤璇�", Format = "", Width = 25, IsBold = true)]
+    public string? IdCardPath { get; set; }
+
+    /// <summary>
+    /// 閭
+    /// </summary>
+    [ImporterHeader(Name = "閭")]
+    [ExporterHeader("閭", Format = "", Width = 25, IsBold = true)]
+    public string? Email { get; set; }
+
+    /// <summary>
+    /// 鍦板潃
+    /// </summary>
+    [ImporterHeader(Name = "鍦板潃")]
+    [ExporterHeader("鍦板潃", Format = "", Width = 25, IsBold = true)]
+    public string? Address { get; set; }
+
+    /// <summary>
+    /// 鏂囧寲绋嬪害
+    /// </summary>
+    [ImporterHeader(Name = "*鏂囧寲绋嬪害")]
+    [ExporterHeader("*鏂囧寲绋嬪害", Format = "", Width = 25, IsBold = true)]
+    public CultureLevelEnum? CultureLevel { get; set; }
+
+    /// <summary>
+    /// 鏀挎不闈㈣矊
+    /// </summary>
+    [ImporterHeader(Name = "鏀挎不闈㈣矊")]
+    [ExporterHeader("鏀挎不闈㈣矊", Format = "", Width = 25, IsBold = true)]
+    public string? PoliticalOutlook { get; set; }
+
+    /// <summary>
+    /// 姣曚笟闄㈡牎
+    /// </summary>
+    [ImporterHeader(Name = "姣曚笟闄㈡牎")]
+    [ExporterHeader("姣曚笟闄㈡牎", Format = "", Width = 25, IsBold = true)]
+    public string? College { get; set; }
+
+    /// <summary>
+    /// 鍔炲叕鐢佃瘽
+    /// </summary>
+    [ImporterHeader(Name = "鍔炲叕鐢佃瘽")]
+    [ExporterHeader("鍔炲叕鐢佃瘽", Format = "", Width = 25, IsBold = true)]
+    public string? OfficePhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉
+    /// </summary>
+    [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉")]
+    [ExporterHeader("绱ф�ヨ仈绯讳汉", Format = "", Width = 25, IsBold = true)]
+    public string? EmergencyContact { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鐢佃瘽
+    /// </summary>
+    [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉鐢佃瘽")]
+    [ExporterHeader("绱ф�ヨ仈绯讳汉鐢佃瘽", Format = "", Width = 25, IsBold = true)]
+    public string? EmergencyPhone { get; set; }
+
+    /// <summary>
+    /// 绱ф�ヨ仈绯讳汉鍦板潃
+    /// </summary>
+    [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉鍦板潃")]
+    [ExporterHeader("绱ф�ヨ仈绯讳汉鍦板潃", Format = "", Width = 25, IsBold = true)]
+    public string? EmergencyAddress { get; set; }
+
+    /// <summary>
+    /// 涓汉绠�浠�
+    /// </summary>
+    [ImporterHeader(Name = "涓汉绠�浠�")]
+    [ExporterHeader("涓汉绠�浠�", Format = "", Width = 25, IsBold = true)]
+    public string? Introduction { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [ImporterHeader(Name = "*鎺掑簭")]
+    [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [ImporterHeader(Name = "*鐘舵��")]
+    [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [ImporterHeader(Name = "澶囨敞")]
+    [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鑱岀骇
+    /// </summary>
+    [ImporterHeader(Name = "鑱岀骇")]
+    [ExporterHeader("鑱岀骇", Format = "", Width = 25, IsBold = true)]
+    public string? PosLevel { get; set; }
+
+    /// <summary>
+    /// 鑱岀О
+    /// </summary>
+    [ImporterHeader(Name = "鑱岀О")]
+    [ExporterHeader("鑱岀О", Format = "", Width = 25, IsBold = true)]
+    public string? PosTitle { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs
new file mode 100644
index 0000000..c3a5172
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs
@@ -0,0 +1,250 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Admin.NET.Core;
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto;
+
+/// <summary>
+/// 瀹㈡埛琛ㄨ緭鍑哄弬鏁�
+/// </summary>
+public class FBS_CustomerOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 璐﹀彿
+    /// </summary>
+    public string Account { get; set; }
+
+    /// <summary>
+    /// 瀵嗙爜
+    /// </summary>
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 鐪熷疄濮撳悕
+    /// </summary>
+    public string RealName { get; set; }
+
+    /// <summary>
+    /// 鏄电О
+    /// </summary>
+    public string? NickName { get; set; }
+
+    /// <summary>
+    /// 澶村儚
+    /// </summary>
+    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>
+    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>
+    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>
+    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; }
+
+    /// <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_CustomerOutput : ImportFBS_CustomerInput
+{
+    [ImporterHeader(IsIgnore = true)]
+    [ExporterHeader(IsIgnore = true)]
+    public override string Error { get; set; }
+}
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
new file mode 100644
index 0000000..7bb739a
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs
@@ -0,0 +1,280 @@
+锘�// 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 Admin.NET.Core;
+using FZCZTB.NET.MD.CutomerMd;
+using Furion.DependencyInjection;
+using FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto;
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 瀹㈡埛琛ㄦ湇鍔� 馃З
+/// </summary>
+[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
+public class FBS_CustomerService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep;
+    private readonly ISqlSugarClient _sqlSugarClient;
+
+    public FBS_CustomerService(SqlSugarRepository<FBS_Customer> fBS_CustomerRep, ISqlSugarClient sqlSugarClient)
+    {
+        _fBS_CustomerRep = fBS_CustomerRep;
+        _sqlSugarClient = sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ瀹㈡埛琛� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛琛�")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<FBS_CustomerOutput>> Page(PageFBS_CustomerInput input)
+    {
+        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.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.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(input.Status.HasValue, u => u.Status == input.Status)
+            .Select<FBS_CustomerOutput>();
+		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_Customer> Detail([FromQuery] QueryByIdFBS_CustomerInput input)
+    {
+        return await _fBS_CustomerRep.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_CustomerInput input)
+    {
+        var entity = input.Adapt<FBS_Customer>();
+        return await _fBS_CustomerRep.InsertAsync(entity) ? entity.Id : 0;
+    }
+
+    /// <summary>
+    /// 鏇存柊瀹㈡埛琛� 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊瀹㈡埛琛�")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateFBS_CustomerInput input)
+    {
+        var entity = input.Adapt<FBS_Customer>();
+        await _fBS_CustomerRep.AsUpdateable(entity)
+        .IgnoreColumns(u => new {
+            //u.Expertise,
+            //u.OfficeZone,
+            //u.Office,
+            //u.JoinDate,
+            u.LastLoginIp,
+            u.LastLoginAddress,
+            u.LastLoginTime,
+            u.LastLoginDevice,
+            u.Signature,
+        })
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎瀹㈡埛琛� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎瀹㈡埛琛�")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteFBS_CustomerInput input)
+    {
+        var entity = await _fBS_CustomerRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+       // await _fBS_CustomerRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        await _fBS_CustomerRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎瀹㈡埛琛� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎瀹㈡埛琛�")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_CustomerInput> input)
+    {
+        var exp = Expressionable.Create<FBS_Customer>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _fBS_CustomerRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+       // return await _fBS_CustomerRep.FakeDeleteAsync(list);   //鍋囧垹闄�
+        return await _fBS_CustomerRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+    
+    /// <summary>
+    /// 璁剧疆瀹㈡埛琛ㄧ姸鎬� 馃毇
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("璁剧疆瀹㈡埛琛ㄧ姸鎬�")]
+    [ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
+    public async Task SetFBS_CustomerStatus(SetFBS_CustomerStatusInput input)
+    {
+        await _fBS_CustomerRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync();
+    }
+    
+    /// <summary>
+    /// 瀵煎嚭瀹㈡埛琛ㄨ褰� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("瀵煎嚭瀹㈡埛琛ㄨ褰�")]
+    [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+    public async Task<IActionResult> Export(PageFBS_CustomerInput input)
+    {
+        var list = (await Page(input)).Items?.Adapt<List<ExportFBS_CustomerOutput>>() ?? 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_CustomerOutput>(), "瀹㈡埛琛ㄥ鍏ユā鏉�");
+    }
+    
+    private static readonly object _fBS_CustomerImportLock = new object();
+    /// <summary>
+    /// 瀵煎叆瀹㈡埛琛ㄨ褰� 馃捑
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("瀵煎叆瀹㈡埛琛ㄨ褰�")]
+    [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+    public IActionResult ImportData([Required] IFormFile file)
+    {
+        lock (_fBS_CustomerImportLock)
+        {
+            var stream = ExcelHelper.ImportData<ImportFBS_CustomerInput, FBS_Customer>(file, (list, markerErrorAction) =>
+            {
+                _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+                {
+                    
+                    // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+                    var rows = pageItems.Where(x => {
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Sex == null){
+                            x.Error = "鎬у埆涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Age == null){
+                            x.Error = "骞撮緞涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.CardType == null){
+                            x.Error = "璇佷欢绫诲瀷涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.CultureLevel == null){
+                            x.Error = "鏂囧寲绋嬪害涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.OrderNo == null){
+                            x.Error = "鎺掑簭涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Status == null){
+                            x.Error = "鐘舵�佷笉鑳戒负绌�";
+                            return false;
+                        }
+                        return true;
+                    }).Adapt<List<FBS_Customer>>();
+                    
+                    var storageable = _fBS_CustomerRep.Context.Storageable(rows)
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Account), "璐﹀彿涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Account?.Length > 32, "璐﹀彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Password), "瀵嗙爜涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Password?.Length > 512, "瀵嗙爜闀垮害涓嶈兘瓒呰繃512涓瓧绗�")
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.RealName), "鐪熷疄濮撳悕涓嶈兘涓虹┖")
+                        .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.Phone?.Length > 16, "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃16涓瓧绗�")
+                        //.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.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        //.SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        //.SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�")
+                        .SplitInsert(_ => true)
+                        .ToStorage();
+                    
+                    storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+                    storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+                    
+                    // 鏍囪閿欒淇℃伅
+                    markerErrorAction.Invoke(storageable, pageItems, rows);
+                });
+            });
+            
+            return stream;
+        }
+    }
+}
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/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs
new file mode 100644
index 0000000..495dca3
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs
@@ -0,0 +1,86 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto;
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹茶緭鍑哄弬鏁�
+/// </summary>
+public class FBS_ExRoleDto
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    public DataScopeEnum DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { 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_ExRole/Dto/FBS_ExRoleInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs
new file mode 100644
index 0000000..df4d51e
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs
@@ -0,0 +1,278 @@
+锘�// 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.Service.FBS_ExRole.Dto;
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹插熀纭�杈撳叆鍙傛暟
+/// </summary>
+public class FBS_ExRoleBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public virtual long? Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    public virtual string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public virtual string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public virtual int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")]
+    public virtual DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public virtual string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public virtual StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹插垎椤垫煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class PageFBS_ExRoleInput : BasePageInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 閫変腑涓婚敭鍒楄〃
+    /// </summary>
+    public List<long> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹插鍔犺緭鍏ュ弬鏁�
+/// </summary>
+public class AddFBS_ExRoleInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹插垹闄よ緭鍏ュ弬鏁�
+/// </summary>
+public class DeleteFBS_ExRoleInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹叉洿鏂拌緭鍏ュ弬鏁�
+/// </summary>
+public class UpdateFBS_ExRoleInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>    
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>    
+    [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>    
+    [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>    
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>    
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>    
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹蹭富閿煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class QueryByIdFBS_ExRoleInput : DeleteFBS_ExRoleInput
+{
+}
+
+/// <summary>
+/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁�
+/// </summary>
+public class SetFBS_ExRoleStatusInput : BaseStatusInput
+{
+}
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ュ疄浣�
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportFBS_ExRoleInput : BaseImportInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [ImporterHeader(Name = "*鍚嶇О")]
+    [ExporterHeader("*鍚嶇О", Format = "", Width = 25, IsBold = true)]
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [ImporterHeader(Name = "缂栫爜")]
+    [ExporterHeader("缂栫爜", Format = "", Width = 25, IsBold = true)]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [ImporterHeader(Name = "*鎺掑簭")]
+    [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [ImporterHeader(Name = "*鏁版嵁鑼冨洿")]
+    [ExporterHeader("*鏁版嵁鑼冨洿", Format = "", Width = 25, IsBold = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [ImporterHeader(Name = "澶囨敞")]
+    [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [ImporterHeader(Name = "*鐘舵��")]
+    [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)]
+    public StatusEnum? Status { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs
new file mode 100644
index 0000000..f8d6280
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs
@@ -0,0 +1,95 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Admin.NET.Core;
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto;
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹茶緭鍑哄弬鏁�
+/// </summary>
+public class FBS_ExRoleOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    public DataScopeEnum DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { 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_ExRoleOutput : ImportFBS_ExRoleInput
+{
+    [ImporterHeader(IsIgnore = true)]
+    [ExporterHeader(IsIgnore = true)]
+    public override string Error { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs
new file mode 100644
index 0000000..74171d9
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs
@@ -0,0 +1,223 @@
+锘�// 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 Admin.NET.Core;
+using FZCZTB.NET.MD.CutomerMd;
+using FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto;
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 瀹㈡埛涓诲垎绫昏鑹叉湇鍔� 馃З
+/// </summary>
+[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
+public class FBS_ExRoleService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep;
+    private readonly ISqlSugarClient _sqlSugarClient;
+
+    public FBS_ExRoleService(SqlSugarRepository<FBS_ExRole> fBS_ExRoleRep, ISqlSugarClient sqlSugarClient)
+    {
+        _fBS_ExRoleRep = fBS_ExRoleRep;
+        _sqlSugarClient = sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹�")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<FBS_ExRoleOutput>> Page(PageFBS_ExRoleInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _fBS_ExRoleRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword) || u.Remark.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(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim()))
+            .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo)
+            .WhereIF(input.DataScope.HasValue, u => u.DataScope == input.DataScope)
+            .WhereIF(input.Status.HasValue, u => u.Status == input.Status)
+            .Select<FBS_ExRoleOutput>();
+		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_ExRole> Detail([FromQuery] QueryByIdFBS_ExRoleInput input)
+    {
+        return await _fBS_ExRoleRep.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_ExRoleInput input)
+    {
+        var entity = input.Adapt<FBS_ExRole>();
+        return await _fBS_ExRoleRep.InsertAsync(entity) ? entity.Id : 0;
+    }
+
+    /// <summary>
+    /// 鏇存柊瀹㈡埛涓诲垎绫昏鑹� 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊瀹㈡埛涓诲垎绫昏鑹�")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateFBS_ExRoleInput input)
+    {
+        var entity = input.Adapt<FBS_ExRole>();
+        await _fBS_ExRoleRep.AsUpdateable(entity)
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteFBS_ExRoleInput input)
+    {
+        var entity = await _fBS_ExRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+       // await _fBS_ExRoleRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        await _fBS_ExRoleRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_ExRoleInput> input)
+    {
+        var exp = Expressionable.Create<FBS_ExRole>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _fBS_ExRoleRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+      //  return await _fBS_ExRoleRep.FakeDeleteAsync(list);   //鍋囧垹闄�
+        return await _fBS_ExRoleRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+    
+    /// <summary>
+    /// 璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬� 馃毇
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬�")]
+    [ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
+    public async Task SetFBS_ExRoleStatus(SetFBS_ExRoleStatusInput input)
+    {
+        await _fBS_ExRoleRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync();
+    }
+    
+    /// <summary>
+    /// 瀵煎嚭瀹㈡埛涓诲垎绫昏鑹茶褰� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("瀵煎嚭瀹㈡埛涓诲垎绫昏鑹茶褰�")]
+    [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+    public async Task<IActionResult> Export(PageFBS_ExRoleInput input)
+    {
+        var list = (await Page(input)).Items?.Adapt<List<ExportFBS_ExRoleOutput>>() ?? 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_ExRoleOutput>(), "瀹㈡埛涓诲垎绫昏鑹插鍏ユā鏉�");
+    }
+    
+    private static readonly object _fBS_ExRoleImportLock = new object();
+    /// <summary>
+    /// 瀵煎叆瀹㈡埛涓诲垎绫昏鑹茶褰� 馃捑
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("瀵煎叆瀹㈡埛涓诲垎绫昏鑹茶褰�")]
+    [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+    public IActionResult ImportData([Required] IFormFile file)
+    {
+        lock (_fBS_ExRoleImportLock)
+        {
+            var stream = ExcelHelper.ImportData<ImportFBS_ExRoleInput, FBS_ExRole>(file, (list, markerErrorAction) =>
+            {
+                _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+                {
+                    
+                    // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+                    var rows = pageItems.Where(x => {
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.OrderNo == null){
+                            x.Error = "鎺掑簭涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.DataScope == null){
+                            x.Error = "鏁版嵁鑼冨洿涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Status == null){
+                            x.Error = "鐘舵�佷笉鑳戒负绌�";
+                            return false;
+                        }
+                        return true;
+                    }).Adapt<List<FBS_ExRole>>();
+                    
+                    var storageable = _fBS_ExRoleRep.Context.Storageable(rows)
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Name), "鍚嶇О涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Name?.Length > 64, "鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Code?.Length > 64, "缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Remark?.Length > 128, "澶囨敞闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitInsert(_ => true)
+                        .ToStorage();
+                    
+                    storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+                    storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+                    
+                    // 鏍囪閿欒淇℃伅
+                    markerErrorAction.Invoke(storageable, pageItems, rows);
+                });
+            });
+            
+            return stream;
+        }
+    }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs
new file mode 100644
index 0000000..4875501
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs
@@ -0,0 +1,141 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto;
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄨ緭鍑哄弬鏁�
+/// </summary>
+public class FBS_MenuDto
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    public long Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    public MenuTypeEnum Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    public bool IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    public bool IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    public bool IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    public bool IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { 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_Menu/Dto/FBS_MenuInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs
new file mode 100644
index 0000000..1702a8c
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs
@@ -0,0 +1,602 @@
+锘�// 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.Service.FBS_Menu.Dto;
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ熀纭�杈撳叆鍙傛暟
+/// </summary>
+public class FBS_MenuBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public virtual long? Id { get; set; }
+
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")]
+    public virtual long? Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    [Dict(nameof(MenuTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")]
+    public virtual MenuTypeEnum? Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    public virtual string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    public virtual string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    public virtual string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    public virtual string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    public virtual string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")]
+    public virtual string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    public virtual string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")]
+    public virtual bool? IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    public virtual string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")]
+    public virtual bool? IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")]
+    public virtual bool? IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")]
+    public virtual bool? IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public virtual int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public virtual StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public virtual string? Remark { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ垎椤垫煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class PageFBS_MenuInput : BasePageInput
+{
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    public long? Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    [Dict(nameof(MenuTypeEnum), AllowNullValue = true)]
+    public MenuTypeEnum? Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    public bool? IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    public bool? IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    public bool? IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    public bool? IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 閫変腑涓婚敭鍒楄〃
+    /// </summary>
+    public List<long> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ鍔犺緭鍏ュ弬鏁�
+/// </summary>
+public class AddFBS_MenuInput
+{
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")]
+    public long? Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    [Dict(nameof(MenuTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")]
+    public MenuTypeEnum? Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    [MaxLength(64, ErrorMessage = "璺敱鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "璺敱鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "缁勪欢璺緞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "閲嶅畾鍚戝瓧绗﹂暱搴︿笉鑳借秴杩�128")]
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "鏉冮檺鏍囪瘑瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(64, ErrorMessage = "鑿滃崟鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "鍥炬爣瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")]
+    public bool? IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    [MaxLength(256, ErrorMessage = "澶栭摼閾炬帴瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")]
+    public bool? IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")]
+    public bool? IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")]
+    public bool? IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Remark { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ垹闄よ緭鍏ュ弬鏁�
+/// </summary>
+public class DeleteFBS_MenuInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ洿鏂拌緭鍏ュ弬鏁�
+/// </summary>
+public class UpdateFBS_MenuInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>    
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>    
+    [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")]
+    public long? Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>    
+    [Dict(nameof(MenuTypeEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")]
+    public MenuTypeEnum? Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>    
+    [MaxLength(64, ErrorMessage = "璺敱鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "璺敱鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "缁勪欢璺緞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "閲嶅畾鍚戝瓧绗﹂暱搴︿笉鑳借秴杩�128")]
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "鏉冮檺鏍囪瘑瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>    
+    [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")]
+    [MaxLength(64, ErrorMessage = "鑿滃崟鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "鍥炬爣瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>    
+    [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")]
+    public bool? IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>    
+    [MaxLength(256, ErrorMessage = "澶栭摼閾炬帴瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>    
+    [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")]
+    public bool? IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>    
+    [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")]
+    public bool? IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>    
+    [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")]
+    public bool? IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>    
+    [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>    
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>    
+    [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")]
+    public string? Remark { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄤ富閿煡璇㈣緭鍏ュ弬鏁�
+/// </summary>
+public class QueryByIdFBS_MenuInput : DeleteFBS_MenuInput
+{
+}
+
+/// <summary>
+/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁�
+/// </summary>
+public class SetFBS_MenuStatusInput : BaseStatusInput
+{
+}
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ュ疄浣�
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportFBS_MenuInput : BaseImportInput
+{
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    [ImporterHeader(Name = "*鐖禝d")]
+    [ExporterHeader("*鐖禝d", Format = "", Width = 25, IsBold = true)]
+    public long? Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    [ImporterHeader(Name = "*鑿滃崟绫诲瀷")]
+    [ExporterHeader("*鑿滃崟绫诲瀷", Format = "", Width = 25, IsBold = true)]
+    public MenuTypeEnum? Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    [ImporterHeader(Name = "璺敱鍚嶇О")]
+    [ExporterHeader("璺敱鍚嶇О", Format = "", Width = 25, IsBold = true)]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    [ImporterHeader(Name = "璺敱鍦板潃")]
+    [ExporterHeader("璺敱鍦板潃", Format = "", Width = 25, IsBold = true)]
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    [ImporterHeader(Name = "缁勪欢璺緞")]
+    [ExporterHeader("缁勪欢璺緞", Format = "", Width = 25, IsBold = true)]
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    [ImporterHeader(Name = "閲嶅畾鍚�")]
+    [ExporterHeader("閲嶅畾鍚�", Format = "", Width = 25, IsBold = true)]
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    [ImporterHeader(Name = "鏉冮檺鏍囪瘑")]
+    [ExporterHeader("鏉冮檺鏍囪瘑", Format = "", Width = 25, IsBold = true)]
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    [ImporterHeader(Name = "*鑿滃崟鍚嶇О")]
+    [ExporterHeader("*鑿滃崟鍚嶇О", Format = "", Width = 25, IsBold = true)]
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    [ImporterHeader(Name = "鍥炬爣")]
+    [ExporterHeader("鍥炬爣", Format = "", Width = 25, IsBold = true)]
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    [ImporterHeader(Name = "*鏄惁鍐呭祵")]
+    [ExporterHeader("*鏄惁鍐呭祵", Format = "", Width = 25, IsBold = true)]
+    public bool? IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    [ImporterHeader(Name = "澶栭摼閾炬帴")]
+    [ExporterHeader("澶栭摼閾炬帴", Format = "", Width = 25, IsBold = true)]
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    [ImporterHeader(Name = "*鏄惁闅愯棌")]
+    [ExporterHeader("*鏄惁闅愯棌", Format = "", Width = 25, IsBold = true)]
+    public bool? IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    [ImporterHeader(Name = "*鏄惁缂撳瓨")]
+    [ExporterHeader("*鏄惁缂撳瓨", Format = "", Width = 25, IsBold = true)]
+    public bool? IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    [ImporterHeader(Name = "*鏄惁鍥哄畾")]
+    [ExporterHeader("*鏄惁鍥哄畾", Format = "", Width = 25, IsBold = true)]
+    public bool? IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [ImporterHeader(Name = "*鎺掑簭")]
+    [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [ImporterHeader(Name = "*鐘舵��")]
+    [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [ImporterHeader(Name = "澶囨敞")]
+    [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)]
+    public string? Remark { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs
new file mode 100644
index 0000000..31b6bbb
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs
@@ -0,0 +1,150 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Admin.NET.Core;
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto;
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄨ緭鍑哄弬鏁�
+/// </summary>
+public class FBS_MenuOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鐖禝d
+    /// </summary>
+    public long Pid { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟绫诲瀷
+    /// </summary>
+    public MenuTypeEnum Type { get; set; }
+
+    /// <summary>
+    /// 璺敱鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 璺敱鍦板潃
+    /// </summary>
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 缁勪欢璺緞
+    /// </summary>
+    public string? Component { get; set; }
+
+    /// <summary>
+    /// 閲嶅畾鍚�
+    /// </summary>
+    public string? Redirect { get; set; }
+
+    /// <summary>
+    /// 鏉冮檺鏍囪瘑
+    /// </summary>
+    public string? Permission { get; set; }
+
+    /// <summary>
+    /// 鑿滃崟鍚嶇О
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 鍥炬爣
+    /// </summary>
+    public string? Icon { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍐呭祵
+    /// </summary>
+    public bool IsIframe { get; set; }
+
+    /// <summary>
+    /// 澶栭摼閾炬帴
+    /// </summary>
+    public string? OutLink { get; set; }
+
+    /// <summary>
+    /// 鏄惁闅愯棌
+    /// </summary>
+    public bool IsHide { get; set; }
+
+    /// <summary>
+    /// 鏄惁缂撳瓨
+    /// </summary>
+    public bool IsKeepAlive { get; set; }
+
+    /// <summary>
+    /// 鏄惁鍥哄畾
+    /// </summary>
+    public bool IsAffix { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int OrderNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { 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_MenuOutput : ImportFBS_MenuInput
+{
+    [ImporterHeader(IsIgnore = true)]
+    [ExporterHeader(IsIgnore = true)]
+    public override string Error { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs
new file mode 100644
index 0000000..aaab197
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs
@@ -0,0 +1,261 @@
+锘�// 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 Admin.NET.Core;
+using FZCZTB.NET.MD.CutomerMd;
+using FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto;
+namespace FZCZTB.Net.CustomerSYSTem;
+
+/// <summary>
+/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ湇鍔� 馃З
+/// </summary>
+[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
+public class FBS_MenuService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<FBS_Menu> _fBS_MenuRep;
+    private readonly ISqlSugarClient _sqlSugarClient;
+
+    public FBS_MenuService(SqlSugarRepository<FBS_Menu> fBS_MenuRep, ISqlSugarClient sqlSugarClient)
+    {
+        _fBS_MenuRep = fBS_MenuRep;
+        _sqlSugarClient = sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛�")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<FBS_MenuOutput>> Page(PageFBS_MenuInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _fBS_MenuRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Path.Contains(input.Keyword) || u.Component.Contains(input.Keyword) || u.Redirect.Contains(input.Keyword) || u.Permission.Contains(input.Keyword) || u.Title.Contains(input.Keyword) || u.Icon.Contains(input.Keyword) || u.OutLink.Contains(input.Keyword) || u.Remark.Contains(input.Keyword))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Path), u => u.Path.Contains(input.Path.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Component), u => u.Component.Contains(input.Component.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Redirect), u => u.Redirect.Contains(input.Redirect.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Permission), u => u.Permission.Contains(input.Permission.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Icon), u => u.Icon.Contains(input.Icon.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.OutLink), u => u.OutLink.Contains(input.OutLink.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim()))
+            .WhereIF(input.Pid != null, u => u.Pid == input.Pid)
+            .WhereIF(input.Type.HasValue, u => u.Type == input.Type)
+            .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo)
+            .WhereIF(input.Status.HasValue, u => u.Status == input.Status)
+            .Select<FBS_MenuOutput>();
+		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_Menu> Detail([FromQuery] QueryByIdFBS_MenuInput input)
+    {
+        return await _fBS_MenuRep.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_MenuInput input)
+    {
+        var entity = input.Adapt<FBS_Menu>();
+        return await _fBS_MenuRep.InsertAsync(entity) ? entity.Id : 0;
+    }
+
+    /// <summary>
+    /// 鏇存柊瀹㈡埛绯荤粺鑿滃崟琛� 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊瀹㈡埛绯荤粺鑿滃崟琛�")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateFBS_MenuInput input)
+    {
+        var entity = input.Adapt<FBS_Menu>();
+        await _fBS_MenuRep.AsUpdateable(entity)
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteFBS_MenuInput input)
+    {
+        var entity = await _fBS_MenuRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+       // await _fBS_MenuRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        await _fBS_MenuRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_MenuInput> input)
+    {
+        var exp = Expressionable.Create<FBS_Menu>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _fBS_MenuRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+       // return await _fBS_MenuRep.FakeDeleteAsync(list);   //鍋囧垹闄�
+        return await _fBS_MenuRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+    
+    /// <summary>
+    /// 璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬� 馃毇
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬�")]
+    [ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
+    public async Task SetFBS_MenuStatus(SetFBS_MenuStatusInput input)
+    {
+        await _fBS_MenuRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync();
+    }
+    
+    /// <summary>
+    /// 瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰� 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰�")]
+    [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+    public async Task<IActionResult> Export(PageFBS_MenuInput input)
+    {
+        var list = (await Page(input)).Items?.Adapt<List<ExportFBS_MenuOutput>>() ?? 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_MenuOutput>(), "瀹㈡埛绯荤粺鑿滃崟琛ㄥ鍏ユā鏉�");
+    }
+    
+    private static readonly object _fBS_MenuImportLock = new object();
+    /// <summary>
+    /// 瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰� 馃捑
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰�")]
+    [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+    public IActionResult ImportData([Required] IFormFile file)
+    {
+        lock (_fBS_MenuImportLock)
+        {
+            var stream = ExcelHelper.ImportData<ImportFBS_MenuInput, FBS_Menu>(file, (list, markerErrorAction) =>
+            {
+                _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+                {
+                    
+                    // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+                    var rows = pageItems.Where(x => {
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Pid == null){
+                            x.Error = "鐖禝d涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Type == null){
+                            x.Error = "鑿滃崟绫诲瀷涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.IsIframe == null){
+                            x.Error = "鏄惁鍐呭祵涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.IsHide == null){
+                            x.Error = "鏄惁闅愯棌涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.IsKeepAlive == null){
+                            x.Error = "鏄惁缂撳瓨涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.IsAffix == null){
+                            x.Error = "鏄惁鍥哄畾涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.OrderNo == null){
+                            x.Error = "鎺掑簭涓嶈兘涓虹┖";
+                            return false;
+                        }
+                        if (!string.IsNullOrWhiteSpace(x.Error)) return false;
+                        if (x.Status == null){
+                            x.Error = "鐘舵�佷笉鑳戒负绌�";
+                            return false;
+                        }
+                        return true;
+                    }).Adapt<List<FBS_Menu>>();
+                    
+                    var storageable = _fBS_MenuRep.Context.Storageable(rows)
+                        .SplitError(it => it.Item.Name?.Length > 64, "璺敱鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Path?.Length > 128, "璺敱鍦板潃闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitError(it => it.Item.Component?.Length > 128, "缁勪欢璺緞闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitError(it => it.Item.Redirect?.Length > 128, "閲嶅畾鍚戦暱搴︿笉鑳借秴杩�128涓瓧绗�")
+                        .SplitError(it => it.Item.Permission?.Length > 128, "鏉冮檺鏍囪瘑闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Title), "鑿滃崟鍚嶇О涓嶈兘涓虹┖")
+                        .SplitError(it => it.Item.Title?.Length > 64, "鑿滃崟鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Icon?.Length > 128, "鍥炬爣闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitError(it => it.Item.OutLink?.Length > 256, "澶栭摼閾炬帴闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        .SplitError(it => it.Item.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�")
+                        .SplitInsert(_ => true)
+                        .ToStorage();
+                    
+                    storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+                    storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+                    
+                    // 鏍囪閿欒淇℃伅
+                    markerErrorAction.Invoke(storageable, pageItems, rows);
+                });
+            });
+            
+            return stream;
+        }
+    }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs
new file mode 100644
index 0000000..f65eefc
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs
@@ -0,0 +1,86 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto;
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊杈撳嚭鍙傛暟
+/// </summary>
+public class FBS_RoleDto
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    public DataScopeEnum DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { 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_Role/Dto/FBS_RoleInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs
new file mode 100644
index 0000000..0b8a25f
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs
@@ -0,0 +1,266 @@
+锘�// 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.Service.FBS_Role.Dto;
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鍩虹杈撳叆鍙傛暟
+/// </summary>
+public class FBS_RoleBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public virtual long? Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public virtual string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public virtual string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public virtual int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    public virtual DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public virtual string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public virtual StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class PageFBS_RoleInput : BasePageInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+    /// <summary>
+    /// 閫変腑涓婚敭鍒楄〃
+    /// </summary>
+    public List<long> SelectKeyList { get; set; }
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊澧炲姞杈撳叆鍙傛暟
+/// </summary>
+public class AddFBS_RoleInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鍒犻櫎杈撳叆鍙傛暟
+/// </summary>
+public class DeleteFBS_RoleInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鏇存柊杈撳叆鍙傛暟
+/// </summary>
+public class UpdateFBS_RoleInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>    
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long? Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>    
+    [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>    
+    [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>    
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>    
+    [Dict(nameof(DataScopeEnum), AllowNullValue = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>    
+    [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>    
+    [Dict(nameof(StatusEnum), AllowNullValue = true)]
+    public StatusEnum? Status { get; set; }
+
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊涓婚敭鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class QueryByIdFBS_RoleInput : DeleteFBS_RoleInput
+{
+}
+
+/// <summary>
+/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁�
+/// </summary>
+public class SetFBS_RoleStatusInput : BaseStatusInput
+{
+}
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鏁版嵁瀵煎叆瀹炰綋
+/// </summary>
+[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)]
+public class ImportFBS_RoleInput : BaseImportInput
+{
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    [ImporterHeader(Name = "鍚嶇О")]
+    [ExporterHeader("鍚嶇О", Format = "", Width = 25, IsBold = true)]
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    [ImporterHeader(Name = "缂栫爜")]
+    [ExporterHeader("缂栫爜", Format = "", Width = 25, IsBold = true)]
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    [ImporterHeader(Name = "鎺掑簭")]
+    [ExporterHeader("鎺掑簭", Format = "", Width = 25, IsBold = true)]
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    [ImporterHeader(Name = "鏁版嵁鑼冨洿")]
+    [ExporterHeader("鏁版嵁鑼冨洿", Format = "", Width = 25, IsBold = true)]
+    public DataScopeEnum? DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    [ImporterHeader(Name = "澶囨敞")]
+    [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)]
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [ImporterHeader(Name = "鐘舵��")]
+    [ExporterHeader("鐘舵��", Format = "", Width = 25, IsBold = true)]
+    public StatusEnum? Status { get; set; }
+
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs
new file mode 100644
index 0000000..900ad32
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs
@@ -0,0 +1,95 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Admin.NET.Core;
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto;
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊杈撳嚭鍙傛暟
+/// </summary>
+public class FBS_RoleOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 鍚嶇О
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 缂栫爜
+    /// </summary>
+    public string? Code { get; set; }
+
+    /// <summary>
+    /// 鎺掑簭
+    /// </summary>
+    public int? OrderNo { get; set; }
+
+    /// <summary>
+    /// 鏁版嵁鑼冨洿
+    /// </summary>
+    public DataScopeEnum DataScope { get; set; }
+
+    /// <summary>
+    /// 澶囨敞
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public StatusEnum Status { 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_RoleOutput : ImportFBS_RoleInput
+{
+    [ImporterHeader(IsIgnore = true)]
+    [ExporterHeader(IsIgnore = true)]
+    public override string Error { get; set; }
+}
diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs
new file mode 100644
index 0000000..0eebaa9
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs
@@ -0,0 +1,209 @@
+锘�// 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 Admin.NET.Core;
+using FZCZTB.NET.MD.CutomerMd;
+using FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto;
+using FZCZTB.Net.CustomerSYSTem;
+
+
+/// <summary>
+/// 瀹㈡埛瑙掕壊鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)]
+public class FBS_RoleService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<FBS_Role> _fBS_RoleRep;
+    private readonly ISqlSugarClient _sqlSugarClient;
+
+    public FBS_RoleService(SqlSugarRepository<FBS_Role> fBS_RoleRep, ISqlSugarClient sqlSugarClient)
+    {
+        _fBS_RoleRep = fBS_RoleRep;
+        _sqlSugarClient = sqlSugarClient;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<FBS_RoleOutput>> Page(PageFBS_RoleInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _fBS_RoleRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword) || u.Remark.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(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim()))
+            .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo)
+            .WhereIF(input.DataScope.HasValue, u => u.DataScope == input.DataScope)
+            .WhereIF(input.Status.HasValue, u => u.Status == input.Status)
+            .Select<FBS_RoleOutput>();
+        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_Role> Detail([FromQuery] QueryByIdFBS_RoleInput input)
+    {
+        return await _fBS_RoleRep.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_RoleInput input)
+    {
+        var entity = input.Adapt<FBS_Role>();
+        return await _fBS_RoleRep.InsertAsync(entity) ? entity.Id : 0;
+    }
+
+    /// <summary>
+    /// 鏇存柊瀹㈡埛瑙掕壊 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊瀹㈡埛瑙掕壊")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateFBS_RoleInput input)
+    {
+        var entity = input.Adapt<FBS_Role>();
+        await _fBS_RoleRep.AsUpdateable(entity)
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎瀹㈡埛瑙掕壊 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎瀹㈡埛瑙掕壊")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteFBS_RoleInput input)
+    {
+        var entity = await _fBS_RoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        // await _fBS_RoleRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        await _fBS_RoleRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎瀹㈡埛瑙掕壊 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎瀹㈡埛瑙掕壊")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")] List<DeleteFBS_RoleInput> input)
+    {
+        var exp = Expressionable.Create<FBS_Role>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _fBS_RoleRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+
+        // return await _fBS_RoleRep.FakeDeleteAsync(list);   //鍋囧垹闄�
+        return await _fBS_RoleRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 璁剧疆瀹㈡埛瑙掕壊鐘舵�� 馃毇
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("璁剧疆瀹㈡埛瑙掕壊鐘舵��")]
+    [ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
+    public async Task SetFBS_RoleStatus(SetFBS_RoleStatusInput input)
+    {
+        await _fBS_RoleRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 瀵煎嚭瀹㈡埛瑙掕壊璁板綍 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("瀵煎嚭瀹㈡埛瑙掕壊璁板綍")]
+    [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify]
+    public async Task<IActionResult> Export(PageFBS_RoleInput input)
+    {
+        var list = (await Page(input)).Items?.Adapt<List<ExportFBS_RoleOutput>>() ?? 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_RoleOutput>(), "瀹㈡埛瑙掕壊瀵煎叆妯℃澘");
+    }
+
+    private static readonly object _fBS_RoleImportLock = new object();
+    /// <summary>
+    /// 瀵煎叆瀹㈡埛瑙掕壊璁板綍 馃捑
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("瀵煎叆瀹㈡埛瑙掕壊璁板綍")]
+    [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork]
+    public IActionResult ImportData([Required] IFormFile file)
+    {
+        lock (_fBS_RoleImportLock)
+        {
+            var stream = ExcelHelper.ImportData<ImportFBS_RoleInput, FBS_Role>(file, (list, markerErrorAction) =>
+            {
+                _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems =>
+                {
+
+                    // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈�
+                    var rows = pageItems.Where(x =>
+                    {
+                        return true;
+                    }).Adapt<List<FBS_Role>>();
+
+                    var storageable = _fBS_RoleRep.Context.Storageable(rows)
+                        .SplitError(it => it.Item.Name?.Length > 64, "鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Code?.Length > 64, "缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+                        .SplitError(it => it.Item.Remark?.Length > 128, "澶囨敞闀垮害涓嶈兘瓒呰繃128涓瓧绗�")
+                        .SplitInsert(_ => true)
+                        .ToStorage();
+
+                    storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏�
+                    storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊
+
+                    // 鏍囪閿欒淇℃伅
+                    markerErrorAction.Invoke(storageable, pageItems, rows);
+                });
+            });
+
+            return stream;
+        }
+    }
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
new file mode 100644
index 0000000..4300b44
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
@@ -0,0 +1,129 @@
+锘�// 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 Admin.NET.Core;
+using Admin.NET.Application;
+using Furion.DynamicApiController;
+using FZCZTB.NET.MD;
+using Furion.DependencyInjection;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒鏈嶅姟 馃З
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class ADPenaltyService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<ADPenalty> _aDPenaltyRep;
+
+    public ADPenaltyService(SqlSugarRepository<ADPenalty> aDPenaltyRep)
+    {
+        _aDPenaltyRep = aDPenaltyRep;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ琛屾斂澶勭綒 馃敄
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒嗛〉鏌ヨ琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Page"), HttpPost]
+    public async Task<SqlSugarPagedList<ADPenaltyOutput>> Page(PageADPenaltyInput input)
+    {
+        input.Keyword = input.Keyword?.Trim();
+        var query = _aDPenaltyRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Parties.Contains(input.Keyword) || u.CaseReason.Contains(input.Keyword) || u.DisposalDecision.Contains(input.Keyword) || u.SupervisionDepartment.Contains(input.Keyword))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Parties), u => u.Parties.Contains(input.Parties.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.CaseReason), u => u.CaseReason.Contains(input.CaseReason.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.DisposalDecision), u => u.DisposalDecision.Contains(input.DisposalDecision.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.SupervisionDepartment), u => u.SupervisionDepartment.Contains(input.SupervisionDepartment.Trim()))
+            .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1])
+            .Select<ADPenaltyOutput>();
+		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<ADPenalty> Detail([FromQuery] QueryByIdADPenaltyInput input)
+    {
+        return await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 澧炲姞琛屾斂澶勭綒 鉃�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("澧炲姞琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Add"), HttpPost]
+    public async Task<bool> Add(AddADPenaltyInput input)
+    {
+        var entity = input.Adapt<ADPenalty>();
+        entity.Id = Guid.NewGuid();
+        return await _aDPenaltyRep.InsertAsync(entity) ;
+    }
+
+    /// <summary>
+    /// 鏇存柊琛屾斂澶勭綒 鉁忥笍
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鏇存柊琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Update"), HttpPost]
+    public async Task Update(UpdateADPenaltyInput input)
+    {
+        var entity = input.Adapt<ADPenalty>();
+        await _aDPenaltyRep.AsUpdateable(entity)
+      
+        .ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鍒犻櫎琛屾斂澶勭綒 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鍒犻櫎琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task Delete(DeleteADPenaltyInput input)
+    {
+        var entity = await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        await _aDPenaltyRep.DeleteAsync(entity);   //鍋囧垹闄�
+        //await _aDPenaltyRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鎵归噺鍒犻櫎琛屾斂澶勭綒 鉂�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("鎵归噺鍒犻櫎琛屾斂澶勭綒")]
+    [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
+    public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteADPenaltyInput> input)
+    {
+        var exp = Expressionable.Create<ADPenalty>();
+        foreach (var row in input) exp = exp.Or(it => it.Id == row.Id);
+        var list = await _aDPenaltyRep.AsQueryable().Where(exp.ToExpression()).ToListAsync();
+   
+        return await _aDPenaltyRep.DeleteAsync(list);   //鍋囧垹闄�
+        //return await _aDPenaltyRep.DeleteAsync(list);   //鐪熷垹闄�
+    }
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs
new file mode 100644
index 0000000..a12a866
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs
@@ -0,0 +1,79 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒杈撳嚭鍙傛暟
+/// </summary>
+public class ADPenaltyDto
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { 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 string? Url { get; set; }
+    
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
new file mode 100644
index 0000000..bb23e15
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
@@ -0,0 +1,191 @@
+锘�// 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.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒鍩虹杈撳叆鍙傛暟
+/// </summary>
+public class ADPenaltyBaseInput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public virtual Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public virtual DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public virtual string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public virtual string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public virtual string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public virtual string? SupervisionDepartment { get; set; }
+
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
+
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class PageADPenaltyInput : BasePageInput
+{
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡鑼冨洿
+    /// </summary>
+     public DateTime?[] DecisionDateRange { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒澧炲姞杈撳叆鍙傛暟
+/// </summary>
+public class AddADPenaltyInput
+{
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")]
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
+    public string? SupervisionDepartment { get; set; }
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
+
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鍒犻櫎杈撳叆鍙傛暟
+/// </summary>
+public class DeleteADPenaltyInput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    [Required(ErrorMessage = "id涓嶈兘涓虹┖")]
+    public Guid Id { get; set; }
+    
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒鏇存柊杈撳叆鍙傛暟
+/// </summary>
+public class UpdateADPenaltyInput
+{
+    /// <summary>
+    /// id
+    /// </summary>    
+    [Required(ErrorMessage = "id涓嶈兘涓虹┖")]
+    public Guid Id { get; set; }
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>    
+    [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")]
+    public DateTime DecisionDate { get; set; }
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>    
+    [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")]
+    public string? Parties { get; set; }
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>    
+    public string? CaseReason { get; set; }
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>    
+    public string? DisposalDecision { get; set; }
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>    
+    [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
+    public string? SupervisionDepartment { get; set; }
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
+}
+
+/// <summary>
+/// 琛屾斂澶勭綒涓婚敭鏌ヨ杈撳叆鍙傛暟
+/// </summary>
+public class QueryByIdADPenaltyInput : DeleteADPenaltyInput
+{
+}
+
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs
new file mode 100644
index 0000000..1f40bb3
--- /dev/null
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs
@@ -0,0 +1,79 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using Magicodes.ExporterAndImporter.Core;
+namespace FZCZTB.TSCL.Application;
+
+/// <summary>
+/// 琛屾斂澶勭綒杈撳嚭鍙傛暟
+/// </summary>
+public class ADPenaltyOutput
+{
+    /// <summary>
+    /// id
+    /// </summary>
+    public Guid Id { get; set; }    
+    
+    /// <summary>
+    /// 鍐冲畾鏃ユ湡
+    /// </summary>
+    public DateTime DecisionDate { get; set; }    
+    
+    /// <summary>
+    /// 褰撲簨浜轰俊鎭�
+    /// </summary>
+    public string? Parties { get; set; }    
+    
+    /// <summary>
+    /// 妗堢敱鎻忚堪
+    /// </summary>
+    public string? CaseReason { get; set; }    
+    
+    /// <summary>
+    /// 澶勭悊鍐冲畾鍐呭
+    /// </summary>
+    public string? DisposalDecision { get; set; }    
+    
+    /// <summary>
+    /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+    /// </summary>
+    public string? SupervisionDepartment { 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 string? Url { get; set; }    
+    
+}
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs
index 750251b..30fdd6a 100644
--- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs
@@ -122,6 +122,13 @@
     /// 閫変腑涓婚敭鍒楄〃
     /// </summary>
     public List<Guid> SelectKeyList { get; set; }
+
+    /// <summary>
+    /// 鏄惁鎴愮珛
+    /// </summary>
+    public PComplaintStatus? Status { get; set; }
+
+
 }
 
 /// <summary>
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs
index 956dbe8..9bcc917 100644
--- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs
@@ -3,6 +3,7 @@
 // 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
 //
 // 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+using FZCZTB.NET.MD;
 using Magicodes.ExporterAndImporter.Core;
 namespace FZCZTB.TSCL.Application;
 
@@ -84,10 +85,14 @@
     /// <summary>
     /// 淇敼鑰呭鍚�
     /// </summary>
-    public string? UpdateUserName { get; set; }    
+    public string? UpdateUserName { get; set; }
 
-    
-    
+    public List<ProcurementComplaintItems>? Complaints { get; set; }
+
+    /// <summary>
+    /// 鏄惁鎴愮珛
+    /// </summary>
+    public PComplaintStatus Status { get; set; }
 }
 
 /// <summary>
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs
index a9dec84..4d107d0 100644
--- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs
@@ -23,6 +23,7 @@
 using System.Linq;
 using NewLife.Xml;
 using AngleSharp.Dom;
+using static Elastic.Clients.Elasticsearch.JoinField;
 namespace FZCZTB.TSCL.Application;
 
 /// <summary>
@@ -50,8 +51,8 @@
     public async Task<SqlSugarPagedList<ProcurementComplaintOutput>> Page(PageProcurementComplaintInput input)
     {
         input.Keyword = input.Keyword?.Trim();
-        var query = _procurementComplaintRep.AsQueryable().Includes(x=>x.Complaints)
-            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Complaints.Any(uu=>uu.ItemDescription.Contains(input.Keyword)))
+        var query = _procurementComplaintRep.AsQueryable().Includes(u => u.Complaints)
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Complaints.Any(uu => uu.ItemDescription.Contains(input.Keyword)))
             .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectCode), u => u.ProjectCode.Contains(input.ProjectCode.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectName), u => u.ProjectName.Contains(input.ProjectName.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Purchaser), u => u.Purchaser.Contains(input.Purchaser.Trim()))
@@ -60,7 +61,21 @@
             .WhereIF(!string.IsNullOrWhiteSpace(input.ProcurementSupervisionDepartment), u => u.ProcurementSupervisionDepartment.Contains(input.ProcurementSupervisionDepartment.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Url), u => u.Url.Contains(input.Url.Trim()))
             .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1])
-            .Select<ProcurementComplaintOutput>();
+            .WhereIF(input.Status != null && input.Status == PComplaintStatus.Valid, u =>( u.Complaints.Any(uu => uu.HandlingStatus == PComplaintStatus.Valid)))
+            .WhereIF(input.Status != null && input.Status == PComplaintStatus.Rejected, u => ( !u.Complaints.Any(uu=>uu.HandlingStatus== PComplaintStatus.Other||uu.HandlingStatus== PComplaintStatus.Valid||uu.HandlingStatus==null)))
+            .WhereIF(input.Status != null && input.Status == PComplaintStatus.Other, u =>!( u.Complaints.Any(uu=>uu.HandlingStatus== PComplaintStatus.Valid)|| (!u.Complaints.Any(uu => uu.HandlingStatus == PComplaintStatus.Other || uu.HandlingStatus == PComplaintStatus.Valid || uu.HandlingStatus == null))))
+            .Select(n => new ProcurementComplaintOutput
+            {
+                Complaints = n.Complaints
+            },true)
+            .Mapper(n =>
+             {
+                 n.Status =n.Complaints==null?  PComplaintStatus.Other:n.Complaints.Any(x => x.HandlingStatus == PComplaintStatus.Valid) ? PComplaintStatus.Valid :
+                 n.Complaints.All(x => x.HandlingStatus == PComplaintStatus.Rejected) ? PComplaintStatus.Rejected : PComplaintStatus.Other ;
+                 n.Complaints = null;
+            }
+            );
+          
 		return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
     }
 
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj
index 95ed3af..5524a31 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj
@@ -1,7 +1,7 @@
 锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj
index ff2c7ba..a73595f 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj
@@ -1,7 +1,7 @@
 锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj
index ff2c7ba..a73595f 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj
@@ -1,7 +1,7 @@
 锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj
index 238c651..9e739ba 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj
index b0912b6..2fb4dd9 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj
index ff2c7ba..a73595f 100644
--- a/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj
+++ b/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj
@@ -1,7 +1,7 @@
 锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
+    <TargetFrameworks>net8.0</TargetFrameworks>
     <NoWarn>1701;1702;1591;8632</NoWarn>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
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/ADPenalty/aDPenalty.ts b/Web/src/api/ADPenalty/aDPenalty.ts
new file mode 100644
index 0000000..3a5ca94
--- /dev/null
+++ b/Web/src/api/ADPenalty/aDPenalty.ts
@@ -0,0 +1,50 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 琛屾斂澶勭綒鎺ュ彛鏈嶅姟
+export const useADPenaltyApi = () => {
+	const baseApi = useBaseApi("aDPenalty");
+	return {
+		// 鍒嗛〉鏌ヨ琛屾斂澶勭綒
+		page: baseApi.page,
+		// 鏌ョ湅琛屾斂澶勭綒璇︾粏
+		detail: baseApi.detail,
+		// 鏂板琛屾斂澶勭綒
+		add: baseApi.add,
+		// 鏇存柊琛屾斂澶勭綒
+		update: baseApi.update,
+		// 鍒犻櫎琛屾斂澶勭綒
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎琛屾斂澶勭綒
+		batchDelete: baseApi.batchDelete,
+	}
+}
+
+// 琛屾斂澶勭綒瀹炰綋
+export interface ADPenalty {
+	// id
+	id: string;
+	// 鍐冲畾鏃ユ湡
+	decisionDate?: string;
+	// 褰撲簨浜轰俊鎭�
+	parties: string;
+	// 妗堢敱鎻忚堪
+	caseReason: string;
+	// 澶勭悊鍐冲畾鍐呭
+	disposalDecision: string;
+	// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
+	supervisionDepartment: string;
+	// 鍒涘缓鏃堕棿
+	createTime: string;
+	// 鏇存柊鏃堕棿
+	updateTime: string;
+	// 鍒涘缓鑰匢d
+	createUserId: number;
+	// 鍒涘缓鑰呭鍚�
+	createUserName: string;
+	// 淇敼鑰匢d
+	updateUserId: number;
+	// 淇敼鑰呭鍚�
+	updateUserName: string;
+	// 绾夸笂鍦板潃
+	url: string;
+}
\ No newline at end of file
diff --git a/Web/src/api/Customer/fBS_Customer.ts b/Web/src/api/Customer/fBS_Customer.ts
new file mode 100644
index 0000000..dba7ac6
--- /dev/null
+++ b/Web/src/api/Customer/fBS_Customer.ts
@@ -0,0 +1,122 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛琛ㄦ帴鍙f湇鍔�
+export const useFBS_CustomerApi = () => {
+	const baseApi = useBaseApi("fBS_Customer");
+	return {
+		// 鍒嗛〉鏌ヨ瀹㈡埛琛�
+		page: baseApi.page,
+		// 鏌ョ湅瀹㈡埛琛ㄨ缁�
+		detail: baseApi.detail,
+		// 鏂板瀹㈡埛琛�
+		add: baseApi.add,
+		// 鏇存柊瀹㈡埛琛�
+		update: baseApi.update,
+		// 璁剧疆瀹㈡埛琛ㄧ姸鎬�
+		setStatus: baseApi.setStatus,
+		// 鍒犻櫎瀹㈡埛琛�
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎瀹㈡埛琛�
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭瀹㈡埛琛ㄦ暟鎹�
+		exportData: baseApi.exportData,
+		// 瀵煎叆瀹㈡埛琛ㄦ暟鎹�
+		importData: baseApi.importData,
+		// 涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉�
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 瀹㈡埛琛ㄥ疄浣�
+export interface FBS_Customer {
+	// 涓婚敭Id
+	id: number;
+	// 璐﹀彿
+	account?: string;
+	// 瀵嗙爜
+	password?: string;
+	// 鐪熷疄濮撳悕
+	realName?: string;
+	// 鏄电О
+	nickName: string;
+	// 澶村儚
+	avatar: string;
+	// 鎬у埆
+	sex?: number;
+	// 骞撮緞
+	age?: number;
+	// 鍑虹敓鏃ユ湡
+	birthday: string;
+	// 姘戞棌
+	nation: string;
+	// 鎵嬫満鍙风爜
+	phone: string;
+	// 璇佷欢绫诲瀷
+	cardType?: number;
+	// 韬唤璇佸彿
+	idCardNum: string;
+	// 韬唤璇�
+	idCardPath: string;
+	// 閭
+	email: string;
+	// 鍦板潃
+	address: string;
+	// 鏂囧寲绋嬪害
+	cultureLevel?: number;
+	// 鏀挎不闈㈣矊
+	politicalOutlook: string;
+	// 姣曚笟闄㈡牎
+	college: string;
+	// 鍔炲叕鐢佃瘽
+	officePhone: string;
+	// 绱ф�ヨ仈绯讳汉
+	emergencyContact: string;
+	// 绱ф�ヨ仈绯讳汉鐢佃瘽
+	emergencyPhone: string;
+	// 绱ф�ヨ仈绯讳汉鍦板潃
+	emergencyAddress: string;
+	// 涓汉绠�浠�
+	introduction: string;
+	// 鎺掑簭
+	orderNo?: number;
+	// 鐘舵��
+	status?: number;
+	// 澶囨敞
+	remark: string;
+	// 鑱岀骇
+	posLevel: string;
+	// 鑱岀О
+	posTitle: string;
+	// 鎿呴暱棰嗗煙
+	expertise: string;
+	// 鍔炲叕鍖哄煙
+	officeZone: string;
+	// 鍔炲叕瀹�
+	office: string;
+	// 鍏ヨ亴鏃ユ湡
+	joinDate: string;
+	// 鏈�鏂扮櫥褰旾p
+	lastLoginIp: string;
+	// 鏈�鏂扮櫥褰曞湴鐐�
+	lastLoginAddress: string;
+	// 鏈�鏂扮櫥褰曟椂闂�
+	lastLoginTime: string;
+	// 鏈�鏂扮櫥褰曡澶�
+	lastLoginDevice: string;
+	// 鐢靛瓙绛惧悕
+	signature: string;
+	// 绉熸埛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/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/api/Customer/fBS_ExRole.ts b/Web/src/api/Customer/fBS_ExRole.ts
new file mode 100644
index 0000000..676adef
--- /dev/null
+++ b/Web/src/api/Customer/fBS_ExRole.ts
@@ -0,0 +1,60 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛涓诲垎绫昏鑹叉帴鍙f湇鍔�
+export const useFBS_ExRoleApi = () => {
+	const baseApi = useBaseApi("fBS_ExRole");
+	return {
+		// 鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹�
+		page: baseApi.page,
+		// 鏌ョ湅瀹㈡埛涓诲垎绫昏鑹茶缁�
+		detail: baseApi.detail,
+		// 鏂板瀹㈡埛涓诲垎绫昏鑹�
+		add: baseApi.add,
+		// 鏇存柊瀹㈡埛涓诲垎绫昏鑹�
+		update: baseApi.update,
+		// 璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬�
+		setStatus: baseApi.setStatus,
+		// 鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭瀹㈡埛涓诲垎绫昏鑹叉暟鎹�
+		exportData: baseApi.exportData,
+		// 瀵煎叆瀹㈡埛涓诲垎绫昏鑹叉暟鎹�
+		importData: baseApi.importData,
+		// 涓嬭浇瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ユā鏉�
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 瀹㈡埛涓诲垎绫昏鑹插疄浣�
+export interface FBS_ExRole {
+	// 涓婚敭Id
+	id: number;
+	// 鍚嶇О
+	name?: string;
+	// 缂栫爜
+	code: string;
+	// 鎺掑簭
+	orderNo?: number;
+	// 鏁版嵁鑼冨洿
+	dataScope?: number;
+	// 澶囨敞
+	remark: string;
+	// 鐘舵��
+	status?: 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/api/Customer/fBS_Menu.ts b/Web/src/api/Customer/fBS_Menu.ts
new file mode 100644
index 0000000..49db218
--- /dev/null
+++ b/Web/src/api/Customer/fBS_Menu.ts
@@ -0,0 +1,82 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ帴鍙f湇鍔�
+export const useFBS_MenuApi = () => {
+	const baseApi = useBaseApi("fBS_Menu");
+	return {
+		// 鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛�
+		page: baseApi.page,
+		// 鏌ョ湅瀹㈡埛绯荤粺鑿滃崟琛ㄨ缁�
+		detail: baseApi.detail,
+		// 鏂板瀹㈡埛绯荤粺鑿滃崟琛�
+		add: baseApi.add,
+		// 鏇存柊瀹㈡埛绯荤粺鑿滃崟琛�
+		update: baseApi.update,
+		// 璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬�
+		setStatus: baseApi.setStatus,
+		// 鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹�
+		exportData: baseApi.exportData,
+		// 瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹�
+		importData: baseApi.importData,
+		// 涓嬭浇瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ユā鏉�
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ疄浣�
+export interface FBS_Menu {
+	// 涓婚敭Id
+	id: number;
+	// 鐖禝d
+	pid?: number;
+	// 鑿滃崟绫诲瀷
+	type?: number;
+	// 璺敱鍚嶇О
+	name: string;
+	// 璺敱鍦板潃
+	path: string;
+	// 缁勪欢璺緞
+	component: string;
+	// 閲嶅畾鍚�
+	redirect: string;
+	// 鏉冮檺鏍囪瘑
+	permission: string;
+	// 鑿滃崟鍚嶇О
+	title?: string;
+	// 鍥炬爣
+	icon: string;
+	// 鏄惁鍐呭祵
+	isIframe?: boolean;
+	// 澶栭摼閾炬帴
+	outLink: string;
+	// 鏄惁闅愯棌
+	isHide?: boolean;
+	// 鏄惁缂撳瓨
+	isKeepAlive?: boolean;
+	// 鏄惁鍥哄畾
+	isAffix?: boolean;
+	// 鎺掑簭
+	orderNo?: number;
+	// 鐘舵��
+	status?: number;
+	// 澶囨敞
+	remark: string;
+	// 绉熸埛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/api/Customer/fBS_Role.ts b/Web/src/api/Customer/fBS_Role.ts
new file mode 100644
index 0000000..cf7d987
--- /dev/null
+++ b/Web/src/api/Customer/fBS_Role.ts
@@ -0,0 +1,60 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛瑙掕壊鎺ュ彛鏈嶅姟
+export const useFBS_RoleApi = () => {
+	const baseApi = useBaseApi("fBS_Role");
+	return {
+		// 鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊
+		page: baseApi.page,
+		// 鏌ョ湅瀹㈡埛瑙掕壊璇︾粏
+		detail: baseApi.detail,
+		// 鏂板瀹㈡埛瑙掕壊
+		add: baseApi.add,
+		// 鏇存柊瀹㈡埛瑙掕壊
+		update: baseApi.update,
+		// 璁剧疆瀹㈡埛瑙掕壊鐘舵��
+		setStatus: baseApi.setStatus,
+		// 鍒犻櫎瀹㈡埛瑙掕壊
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎瀹㈡埛瑙掕壊
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭瀹㈡埛瑙掕壊鏁版嵁
+		exportData: baseApi.exportData,
+		// 瀵煎叆瀹㈡埛瑙掕壊鏁版嵁
+		importData: baseApi.importData,
+		// 涓嬭浇瀹㈡埛瑙掕壊鏁版嵁瀵煎叆妯℃澘
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 瀹㈡埛瑙掕壊瀹炰綋
+export interface FBS_Role {
+	// 涓婚敭Id
+	id: number;
+	// 鍚嶇О
+	name: string;
+	// 缂栫爜
+	code: string;
+	// 鎺掑簭
+	orderNo: number;
+	// 鏁版嵁鑼冨洿
+	dataScope: number;
+	// 澶囨敞
+	remark: string;
+	// 鐘舵��
+	status: 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/api/Customer/fB_Customer.ts b/Web/src/api/Customer/fB_Customer.ts
new file mode 100644
index 0000000..38ebc9d
--- /dev/null
+++ b/Web/src/api/Customer/fB_Customer.ts
@@ -0,0 +1,122 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛琛ㄦ帴鍙f湇鍔�
+export const useFB_CustomerApi = () => {
+	const baseApi = useBaseApi("fB_Customer");
+	return {
+		// 鍒嗛〉鏌ヨ瀹㈡埛琛�
+		page: baseApi.page,
+		// 鏌ョ湅瀹㈡埛琛ㄨ缁�
+		detail: baseApi.detail,
+		// 鏂板瀹㈡埛琛�
+		add: baseApi.add,
+		// 鏇存柊瀹㈡埛琛�
+		update: baseApi.update,
+		// 璁剧疆瀹㈡埛琛ㄧ姸鎬�
+		setStatus: baseApi.setStatus,
+		// 鍒犻櫎瀹㈡埛琛�
+		delete: baseApi.delete,
+		// 鎵归噺鍒犻櫎瀹㈡埛琛�
+		batchDelete: baseApi.batchDelete,
+		// 瀵煎嚭瀹㈡埛琛ㄦ暟鎹�
+		exportData: baseApi.exportData,
+		// 瀵煎叆瀹㈡埛琛ㄦ暟鎹�
+		importData: baseApi.importData,
+		// 涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉�
+		downloadTemplate: baseApi.downloadTemplate,
+	}
+}
+
+// 瀹㈡埛琛ㄥ疄浣�
+export interface FB_Customer {
+	// 涓婚敭Id
+	id: number;
+	// 璐﹀彿
+	account?: string;
+	// 瀵嗙爜
+	password?: string;
+	// 鐪熷疄濮撳悕
+	realName?: string;
+	// 鏄电О
+	nickName: string;
+	// 澶村儚
+	avatar: string;
+	// 鎬у埆
+	sex?: number;
+	// 骞撮緞
+	age?: number;
+	// 鍑虹敓鏃ユ湡
+	birthday: string;
+	// 姘戞棌
+	nation: string;
+	// 鎵嬫満鍙风爜
+	phone: string;
+	// 璇佷欢绫诲瀷
+	cardType?: number;
+	// 韬唤璇佸彿
+	idCardNum: string;
+	// 韬唤璇�
+	idCardPath: string;
+	// 閭
+	email: string;
+	// 鍦板潃
+	address: string;
+	// 鏂囧寲绋嬪害
+	cultureLevel?: number;
+	// 鏀挎不闈㈣矊
+	politicalOutlook: string;
+	// 姣曚笟闄㈡牎
+	college: string;
+	// 鍔炲叕鐢佃瘽
+	officePhone: string;
+	// 绱ф�ヨ仈绯讳汉
+	emergencyContact: string;
+	// 绱ф�ヨ仈绯讳汉鐢佃瘽
+	emergencyPhone: string;
+	// 绱ф�ヨ仈绯讳汉鍦板潃
+	emergencyAddress: string;
+	// 涓汉绠�浠�
+	introduction: string;
+	// 鎺掑簭
+	orderNo?: number;
+	// 鐘舵��
+	status?: number;
+	// 澶囨敞
+	remark: string;
+	// 鑱岀骇
+	posLevel: string;
+	// 鑱岀О
+	posTitle: string;
+	// 鎿呴暱棰嗗煙
+	expertise: string;
+	// 鍔炲叕鍖哄煙
+	officeZone: string;
+	// 鍔炲叕瀹�
+	office: string;
+	// 鍏ヨ亴鏃ユ湡
+	joinDate: string;
+	// 鏈�鏂扮櫥褰旾p
+	lastLoginIp: string;
+	// 鏈�鏂扮櫥褰曞湴鐐�
+	lastLoginAddress: string;
+	// 鏈�鏂扮櫥褰曟椂闂�
+	lastLoginTime: string;
+	// 鏈�鏂扮櫥褰曡澶�
+	lastLoginDevice: string;
+	// 鐢靛瓙绛惧悕
+	signature: string;
+	// 绉熸埛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/api/Customer/fB_CustomerRole.ts b/Web/src/api/Customer/fB_CustomerRole.ts
new file mode 100644
index 0000000..278771e
--- /dev/null
+++ b/Web/src/api/Customer/fB_CustomerRole.ts
@@ -0,0 +1,36 @@
+锘縤mport {useBaseApi} from '/@/api/base';
+
+// 瀹㈡埛鑿滃崟琛ㄦ帴鍙f湇鍔�
+export const useFB_CustomerRoleApi = () => {
+	const baseApi = useBaseApi("fB_CustomerRole");
+	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 FB_CustomerRole {
+	// 涓婚敭Id
+	id: number;
+	// 鐢ㄦ埛Id
+	cutomerId?: number;
+	// 瑙掕壊Id
+	roleId?: number;
+}
\ No newline at end of file
diff --git a/Web/src/assets/background.jpeg b/Web/src/assets/background.jpeg
index 9478437..640bfee 100644
--- a/Web/src/assets/background.jpeg
+++ b/Web/src/assets/background.jpeg
Binary files differ
diff --git a/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue
new file mode 100644
index 0000000..a2ba6f6
--- /dev/null
+++ b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue
@@ -0,0 +1,122 @@
+锘�<script lang="ts" name="aDPenalty" setup>
+import { ref, reactive, onMounted } from "vue";
+import { ElMessage } from "element-plus";
+import type { FormRules } from "element-plus";
+import { formatDate } from '/@/utils/formatTime';
+import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const aDPenaltyApi = useADPenaltyApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+  decisionDate: [{required: true, message: '璇烽�夋嫨鍐冲畾鏃ユ湡锛�', trigger: 'change',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? {  };
+	state.ruleForm = row.id ? await aDPenaltyApi.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 aDPenaltyApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="aDPenalty-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="decisionDate">
+							<el-date-picker v-model="state.ruleForm.decisionDate" type="date" placeholder="鍐冲畾鏃ユ湡" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="褰撲簨浜�" prop="parties">
+							<el-input v-model="state.ruleForm.parties" placeholder="璇疯緭鍏ュ綋浜嬩汉" maxlength="255" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" >
+						<el-form-item label="妗堢敱" prop="caseReason">
+							<el-input v-model="state.ruleForm.caseReason" placeholder="璇疯緭鍏ユ鐢�" type="textarea" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" >
+						<el-form-item label="澶勭悊鍐冲畾" prop="disposalDecision">
+							<el-input v-model="state.ruleForm.disposalDecision" type="textarea" placeholder="璇疯緭鍏ュ鐞嗗喅瀹�" 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="supervisionDepartment">
+							<el-input v-model="state.ruleForm.supervisionDepartment" placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�" maxlength="255" 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="url">
+							<el-input v-model="state.ruleForm.url" placeholder="璇疯緭鍏ョ嚎涓婂湴鍧�" maxlength="255" show-word-limit 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/ADPenalty/aDPenalty/index.vue b/Web/src/views/ADPenalty/aDPenalty/index.vue
new file mode 100644
index 0000000..e414120
--- /dev/null
+++ b/Web/src/views/ADPenalty/aDPenalty/index.vue
@@ -0,0 +1,185 @@
+锘�<script lang="ts" setup name="aDPenalty">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty';
+import editDialog from '/@/views/ADPenalty/aDPenalty/component/editDialog.vue'
+import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+import ModifyRecord from '/@/components/table/modifyRecord.vue';
+import commonFunction from "/@/utils/commonFunction";
+
+const { dateFormatYMD } = commonFunction();
+const aDPenaltyApi = useADPenaltyApi();
+const printDialogRef = ref();
+const editDialogRef = 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: 'decisionDate', // 榛樿鐨勬帓搴忓瓧娈�
+		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 aDPenaltyApi.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 delADPenalty = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await aDPenaltyApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelADPenalty = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await aDPenaltyApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+handleQuery();
+</script>
+<template>
+  <div class="aDPenalty-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="4" :xl="4" class="mb10">
+            <el-form-item label="鍐冲畾鏃ユ湡">
+              <el-date-picker type="daterange" v-model="state.tableQueryParams.decisionDateRange"  value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="褰撲簨浜�">
+              <el-input v-model="state.tableQueryParams.parties" clearable placeholder="璇疯緭鍏ュ綋浜嬩汉"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="閲囪喘鐩戠潱閮ㄩ棬">
+              <el-input v-model="state.tableQueryParams.supervisionDepartment" clearable placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="妗堢敱">
+              <el-input v-model="state.tableQueryParams.caseReason" clearable placeholder="璇疯緭鍏ユ鐢�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+            <el-form-item label="澶勭悊鍐冲畾">
+              <el-input v-model="state.tableQueryParams.disposalDecision" clearable placeholder="璇疯緭鍏ュ鐞嗗喅瀹�"/>
+            </el-form-item>
+          </el-col>
+          
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" 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="'aDPenalty: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="batchDelADPenalty" :disabled="state.selectData.length == 0" v-auth="'aDPenalty:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板琛屾斂澶勭綒')" v-auth="'aDPenalty:add'"> 鏂板 </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" :default-sort="{ prop: 'decisionDate', order: 'descending' }" tooltip-effect="light" row-key="id" @sort-change="sortChange" border>
+        <el-table-column type="selection" width="40" align="center" v-if="auth('aDPenalty:batchDelete') || auth('aDPenalty:export')" />
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+         <el-table-column prop='decisionDate' label='鍐冲畾鏃ユ湡' width="90" show-overflow-tooltip sortable >
+          <template #default="{ row }">
+            <span>{{dateFormatYMD(null,null,row.decisionDate)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop='parties' label='褰撲簨浜�' show-overflow-tooltip />
+        <el-table-column prop='caseReason' label='妗堢敱' show-overflow-tooltip />
+        <el-table-column prop='disposalDecision' label='澶勭悊鍐冲畾' show-overflow-tooltip />
+        <el-table-column prop='supervisionDepartment' width="130" label='閲囪喘鐩戠潱閮ㄩ棬' show-overflow-tooltip />
+        <el-table-column prop='url' label='绾夸笂鍦板潃' show-overflow-tooltip >
+          <template #default="{ row }">
+            <el-link underline :href='row.url' target='_blank'>{{row.url}}</el-link>
+          </template>
+        </el-table-column>
+        <!-- <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="80" align="center" fixed="right" show-overflow-tooltip v-if="auth('aDPenalty:update') || auth('aDPenalty:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫琛屾斂澶勭綒')" v-auth="'aDPenalty:update'">  </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delADPenalty(scope.row)" v-auth="'aDPenalty: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 />
+      <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
diff --git a/Web/src/views/Customer/fBS_Customer/component/editDialog.vue b/Web/src/views/Customer/fBS_Customer/component/editDialog.vue
new file mode 100644
index 0000000..6fba3ff
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Customer/component/editDialog.vue
@@ -0,0 +1,240 @@
+锘�<script lang="ts" name="fBS_Customer" 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_CustomerApi } from '/@/api/Customer/fBS_Customer';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const fBS_CustomerApi = useFBS_CustomerApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+  account: [{required: true, message: '璇烽�夋嫨璐﹀彿锛�', trigger: 'blur',},],
+  password: [{required: true, message: '璇烽�夋嫨瀵嗙爜锛�', trigger: 'blur',},],
+  realName: [{required: true, message: '璇烽�夋嫨鐪熷疄濮撳悕锛�', trigger: 'blur',},],
+  sex: [{required: true, message: '璇烽�夋嫨鎬у埆锛�', trigger: 'change',},],
+  age: [{required: true, message: '璇烽�夋嫨骞撮緞锛�', trigger: 'blur',},],
+  cardType: [{required: true, message: '璇烽�夋嫨璇佷欢绫诲瀷锛�', trigger: 'change',},],
+  cultureLevel: [{required: true, message: '璇烽�夋嫨鏂囧寲绋嬪害锛�', trigger: 'change',},],
+  orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},],
+  status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? { status: 1,orderNo: 100, };
+	state.ruleForm = row.id ? await fBS_CustomerApi.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_CustomerApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="fBS_Customer-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="account">
+							<el-input v-model="state.ruleForm.account" placeholder="璇疯緭鍏ヨ处鍙�" maxlength="32" 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="password">
+							<el-input v-model="state.ruleForm.password" placeholder="璇疯緭鍏ュ瘑鐮�" maxlength="512" 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="realName">
+							<el-input v-model="state.ruleForm.realName" placeholder="璇疯緭鍏ョ湡瀹炲鍚�" maxlength="32" 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="nickName">
+							<el-input v-model="state.ruleForm.nickName" placeholder="璇疯緭鍏ユ樀绉�" maxlength="32" 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="avatar">
+							<el-input v-model="state.ruleForm.avatar" placeholder="璇疯緭鍏ュご鍍�" maxlength="512" 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="sex">
+							<g-sys-dict v-model="state.ruleForm.sex" code="GenderEnum" render-as="select" placeholder="璇烽�夋嫨鎬у埆" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="骞撮緞" prop="age">
+							<el-input-number v-model="state.ruleForm.age" placeholder="璇疯緭鍏ュ勾榫�" 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="birthday">
+							<el-date-picker v-model="state.ruleForm.birthday" type="date" placeholder="鍑虹敓鏃ユ湡" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="姘戞棌" prop="nation">
+							<el-input v-model="state.ruleForm.nation" placeholder="璇疯緭鍏ユ皯鏃�" maxlength="32" 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="phone">
+							<el-input v-model="state.ruleForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="16" 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="cardType">
+							<g-sys-dict v-model="state.ruleForm.cardType" code="CardTypeEnum" render-as="select" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="韬唤璇佸彿" prop="idCardNum">
+							<el-input v-model="state.ruleForm.idCardNum" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" maxlength="32" 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="idCardPath">
+							<el-input v-model="state.ruleForm.idCardPath" placeholder="璇疯緭鍏ヨ韩浠借瘉" maxlength="512" 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="email">
+							<el-input v-model="state.ruleForm.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="64" 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="address">
+							<el-input v-model="state.ruleForm.address" 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="鏂囧寲绋嬪害" prop="cultureLevel">
+							<g-sys-dict v-model="state.ruleForm.cultureLevel" code="CultureLevelEnum" render-as="select" placeholder="璇烽�夋嫨鏂囧寲绋嬪害" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鏀挎不闈㈣矊" prop="politicalOutlook">
+							<el-input v-model="state.ruleForm.politicalOutlook" placeholder="璇疯緭鍏ユ斂娌婚潰璨�" maxlength="16" 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="college">
+							<el-input v-model="state.ruleForm.college" placeholder="璇疯緭鍏ユ瘯涓氶櫌鏍�" maxlength="128" 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="officePhone">
+							<el-input v-model="state.ruleForm.officePhone" placeholder="璇疯緭鍏ュ姙鍏數璇�" maxlength="16" 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="emergencyContact">
+							<el-input v-model="state.ruleForm.emergencyContact" placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉" maxlength="32" 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="emergencyPhone">
+							<el-input v-model="state.ruleForm.emergencyPhone" placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉鐢佃瘽" maxlength="16" 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="emergencyAddress">
+							<el-input v-model="state.ruleForm.emergencyAddress" 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="涓汉绠�浠�" prop="introduction">
+							<el-input v-model="state.ruleForm.introduction" placeholder="璇疯緭鍏ヤ釜浜虹畝浠�" maxlength="512" 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="orderNo">
+							<el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" >
+						<el-form-item label="鐘舵��" prop="status">
+							<g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="澶囨敞" prop="remark">
+							<el-input v-model="state.ruleForm.remark" 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="鑱岀骇" prop="posLevel">
+							<el-input v-model="state.ruleForm.posLevel" placeholder="璇疯緭鍏ヨ亴绾�" maxlength="32" 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="posTitle">
+							<el-input v-model="state.ruleForm.posTitle" placeholder="璇疯緭鍏ヨ亴绉�" maxlength="32" show-word-limit 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_Customer/index.vue b/Web/src/views/Customer/fBS_Customer/index.vue
new file mode 100644
index 0000000..f1eda49
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Customer/index.vue
@@ -0,0 +1,310 @@
+锘�<script lang="ts" setup name="fBS_Customer">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useFBS_CustomerApi } from '/@/api/Customer/fBS_Customer';
+import editDialog from '/@/views/Customer/fBS_Customer/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_CustomerApi = useFBS_CustomerApi();
+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_CustomerApi.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_Customer = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_CustomerApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelFBS_Customer = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_CustomerApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+// 璁剧疆鐘舵��
+const changeFBS_CustomerStatus = async (row: any) => {
+  await fBS_CustomerApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�'));
+};
+
+// 瀵煎嚭鏁版嵁
+const exportFBS_CustomerCommand = 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_CustomerApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'current') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+      await fBS_CustomerApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'all') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+      await fBS_CustomerApi.exportData(params).then(res => downloadStreamFile(res));
+    }
+  } finally {
+    state.exportLoading = false;
+  }
+}
+
+handleQuery();
+</script>
+<template>
+  <div class="fBS_Customer-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.account" 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.realName" 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.nickName" 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-sys-dict v-model="state.tableQueryParams.cardType" code="CardTypeEnum" render-as="select" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" clearable filterable />
+            </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.idCardPath" 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-sys-dict v-model="state.tableQueryParams.cultureLevel" code="CultureLevelEnum" render-as="select" placeholder="璇烽�夋嫨鏂囧寲绋嬪害" clearable filterable />
+            </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.college" 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.officePhone" 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.emergencyContact" 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.emergencyPhone" 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.emergencyAddress" 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.introduction" 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.orderNo"  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-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+            </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.remark" 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.posLevel" 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.posTitle" 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_Customer: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_Customer" :disabled="state.selectData.length == 0" v-auth="'fBS_Customer:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛琛�')" v-auth="'fBS_Customer:add'"> 鏂板 </el-button>
+                <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_CustomerCommand">
+                  <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Customer: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_Customer: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_Customer:batchDelete') || auth('fBS_Customer:export')" />
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop='account' label='璐﹀彿' sortable='custom' show-overflow-tooltip />
+        <el-table-column prop='password' label='瀵嗙爜' show-overflow-tooltip />
+        <el-table-column prop='realName' label='鐪熷疄濮撳悕' sortable='custom' show-overflow-tooltip />
+        <el-table-column prop='nickName' label='鏄电О' sortable='custom' show-overflow-tooltip />
+        <el-table-column prop='avatar' label='澶村儚' show-overflow-tooltip />
+        <el-table-column prop='sex' label='鎬у埆' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.sex" code="GenderEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='age' label='骞撮緞' show-overflow-tooltip />
+        <el-table-column prop='birthday' label='鍑虹敓鏃ユ湡' show-overflow-tooltip />
+        <el-table-column prop='nation' label='姘戞棌' show-overflow-tooltip />
+        <el-table-column prop='phone' label='鎵嬫満鍙风爜' show-overflow-tooltip />
+        <el-table-column prop='cardType' label='璇佷欢绫诲瀷' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.cardType" code="CardTypeEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='idCardNum' label='韬唤璇佸彿' show-overflow-tooltip />
+        <el-table-column prop='idCardPath' label='韬唤璇�' show-overflow-tooltip />
+        <el-table-column prop='email' label='閭' show-overflow-tooltip />
+        <el-table-column prop='address' label='鍦板潃' show-overflow-tooltip />
+        <el-table-column prop='cultureLevel' label='鏂囧寲绋嬪害' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.cultureLevel" code="CultureLevelEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='politicalOutlook' label='鏀挎不闈㈣矊' show-overflow-tooltip />
+        <el-table-column prop='college' label='姣曚笟闄㈡牎' show-overflow-tooltip />
+        <el-table-column prop='officePhone' label='鍔炲叕鐢佃瘽' show-overflow-tooltip />
+        <el-table-column prop='emergencyContact' label='绱ф�ヨ仈绯讳汉' show-overflow-tooltip />
+        <el-table-column prop='emergencyPhone' label='绱ф�ヨ仈绯讳汉鐢佃瘽' show-overflow-tooltip />
+        <el-table-column prop='emergencyAddress' label='绱ф�ヨ仈绯讳汉鍦板潃' show-overflow-tooltip />
+        <el-table-column prop='introduction' label='涓汉绠�浠�' show-overflow-tooltip />
+        <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip />
+        <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Customer:setStatus'" show-overflow-tooltip>
+          <template #default="scope">
+            <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_CustomerStatus(scope.row)" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip />
+        <el-table-column prop='posLevel' label='鑱岀骇' show-overflow-tooltip />
+        <el-table-column prop='posTitle' 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_Customer:update') || auth('fBS_Customer:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛琛�')" v-auth="'fBS_Customer:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Customer(scope.row)" v-auth="'fBS_Customer: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_CustomerApi.importData" :download="fBS_CustomerApi.downloadTemplate" v-auth="'fBS_Customer: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
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
diff --git a/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue b/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue
new file mode 100644
index 0000000..86446b3
--- /dev/null
+++ b/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue
@@ -0,0 +1,125 @@
+锘�<script lang="ts" name="fBS_ExRole" 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_ExRoleApi } from '/@/api/Customer/fBS_ExRole';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const fBS_ExRoleApi = useFBS_ExRoleApi();
+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',},],
+  orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},],
+  dataScope: [{required: true, message: '璇烽�夋嫨鏁版嵁鑼冨洿锛�', trigger: 'change',},],
+  status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? { status: 1,orderNo: 100, };
+	state.ruleForm = row.id ? await fBS_ExRoleApi.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_ExRoleApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="fBS_ExRole-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="64" 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="code">
+							<el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ョ紪鐮�" maxlength="64" 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="orderNo">
+							<el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" 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="dataScope">
+							<g-sys-dict v-model="state.ruleForm.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="澶囨敞" prop="remark">
+							<el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="128" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" >
+						<el-form-item label="鐘舵��" prop="status">
+							<g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+						</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_ExRole/index.vue b/Web/src/views/Customer/fBS_ExRole/index.vue
new file mode 100644
index 0000000..be291b4
--- /dev/null
+++ b/Web/src/views/Customer/fBS_ExRole/index.vue
@@ -0,0 +1,225 @@
+锘�<script lang="ts" setup name="fBS_ExRole">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useFBS_ExRoleApi } from '/@/api/Customer/fBS_ExRole';
+import editDialog from '/@/views/Customer/fBS_ExRole/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_ExRoleApi = useFBS_ExRoleApi();
+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_ExRoleApi.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_ExRole = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_ExRoleApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelFBS_ExRole = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_ExRoleApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+// 璁剧疆鐘舵��
+const changeFBS_ExRoleStatus = async (row: any) => {
+  await fBS_ExRoleApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�'));
+};
+
+// 瀵煎嚭鏁版嵁
+const exportFBS_ExRoleCommand = 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_ExRoleApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'current') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+      await fBS_ExRoleApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'all') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+      await fBS_ExRoleApi.exportData(params).then(res => downloadStreamFile(res));
+    }
+  } finally {
+    state.exportLoading = false;
+  }
+}
+
+handleQuery();
+</script>
+<template>
+  <div class="fBS_ExRole-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="缂栫爜">
+              <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.orderNo"  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-sys-dict v-model="state.tableQueryParams.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable />
+            </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.remark" 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-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+            </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_ExRole: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_ExRole" :disabled="state.selectData.length == 0" v-auth="'fBS_ExRole:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛涓诲垎绫昏鑹�')" v-auth="'fBS_ExRole:add'"> 鏂板 </el-button>
+                <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_ExRoleCommand">
+                  <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_ExRole: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_ExRole: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_ExRole:batchDelete') || auth('fBS_ExRole: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='缂栫爜' show-overflow-tooltip />
+        <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip />
+        <el-table-column prop='dataScope' label='鏁版嵁鑼冨洿' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.dataScope" code="DataScopeEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip />
+        <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_ExRole:setStatus'" show-overflow-tooltip>
+          <template #default="scope">
+            <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_ExRoleStatus(scope.row)" />
+          </template>
+        </el-table-column>
+        <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_ExRole:update') || auth('fBS_ExRole:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛涓诲垎绫昏鑹�')" v-auth="'fBS_ExRole:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_ExRole(scope.row)" v-auth="'fBS_ExRole: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_ExRoleApi.importData" :download="fBS_ExRoleApi.downloadTemplate" v-auth="'fBS_ExRole: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
diff --git a/Web/src/views/Customer/fBS_Menu/component/editDialog.vue b/Web/src/views/Customer/fBS_Menu/component/editDialog.vue
new file mode 100644
index 0000000..bc19617
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Menu/component/editDialog.vue
@@ -0,0 +1,185 @@
+锘�<script lang="ts" name="fBS_Menu" 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_MenuApi } from '/@/api/Customer/fBS_Menu';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const fBS_MenuApi = useFBS_MenuApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+  pid: [{required: true, message: '璇烽�夋嫨鐖禝d锛�', trigger: 'blur',},],
+  type: [{required: true, message: '璇烽�夋嫨鑿滃崟绫诲瀷锛�', trigger: 'change',},],
+  title: [{required: true, message: '璇烽�夋嫨鑿滃崟鍚嶇О锛�', trigger: 'blur',},],
+  isIframe: [{required: true, message: '璇烽�夋嫨鏄惁鍐呭祵锛�', trigger: 'blur',},],
+  isHide: [{required: true, message: '璇烽�夋嫨鏄惁闅愯棌锛�', trigger: 'blur',},],
+  isKeepAlive: [{required: true, message: '璇烽�夋嫨鏄惁缂撳瓨锛�', trigger: 'blur',},],
+  isAffix: [{required: true, message: '璇烽�夋嫨鏄惁鍥哄畾锛�', trigger: 'blur',},],
+  orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},],
+  status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},],
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? { status: 1,orderNo: 100, };
+	state.ruleForm = row.id ? await fBS_MenuApi.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_MenuApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="fBS_Menu-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="鐖禝d" prop="pid">
+							<el-input v-model="state.ruleForm.pid" placeholder="璇疯緭鍏ョ埗Id" maxlength="19" 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="type">
+							<g-sys-dict v-model="state.ruleForm.type" code="MenuTypeEnum" render-as="select" placeholder="璇烽�夋嫨鑿滃崟绫诲瀷" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<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="64" 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="path">
+							<el-input v-model="state.ruleForm.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�" maxlength="128" 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="component">
+							<el-input v-model="state.ruleForm.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�" maxlength="128" 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="redirect">
+							<el-input v-model="state.ruleForm.redirect" placeholder="璇疯緭鍏ラ噸瀹氬悜" maxlength="128" 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="permission">
+							<el-input v-model="state.ruleForm.permission" placeholder="璇疯緭鍏ユ潈闄愭爣璇�" maxlength="128" 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="title">
+							<el-input v-model="state.ruleForm.title" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" maxlength="64" 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="icon">
+							<el-input v-model="state.ruleForm.icon" placeholder="璇疯緭鍏ュ浘鏍�" maxlength="128" 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="isIframe">
+							<el-switch v-model="state.ruleForm.isIframe" active-text="鏄�" inactive-text="鍚�" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="澶栭摼閾炬帴" prop="outLink">
+							<el-input v-model="state.ruleForm.outLink" 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="鏄惁闅愯棌" prop="isHide">
+							<el-switch v-model="state.ruleForm.isHide" active-text="鏄�" inactive-text="鍚�" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鏄惁缂撳瓨" prop="isKeepAlive">
+							<el-switch v-model="state.ruleForm.isKeepAlive" active-text="鏄�" inactive-text="鍚�" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鏄惁鍥哄畾" prop="isAffix">
+							<el-switch v-model="state.ruleForm.isAffix" active-text="鏄�" inactive-text="鍚�" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="鎺掑簭" prop="orderNo">
+							<el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" >
+						<el-form-item label="鐘舵��" prop="status">
+							<g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="澶囨敞" prop="remark">
+							<el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="256" show-word-limit 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_Menu/index.vue b/Web/src/views/Customer/fBS_Menu/index.vue
new file mode 100644
index 0000000..abb6e1a
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Menu/index.vue
@@ -0,0 +1,311 @@
+锘�<script lang="ts" setup name="fBS_Menu">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useFBS_MenuApi } from '/@/api/Customer/fBS_Menu';
+import editDialog from '/@/views/Customer/fBS_Menu/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_MenuApi = useFBS_MenuApi();
+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_MenuApi.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_Menu = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_MenuApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelFBS_Menu = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_MenuApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+// 璁剧疆鐘舵��
+const changeFBS_MenuStatus = async (row: any) => {
+  await fBS_MenuApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�'));
+};
+
+// 瀵煎嚭鏁版嵁
+const exportFBS_MenuCommand = 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_MenuApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'current') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+      await fBS_MenuApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'all') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+      await fBS_MenuApi.exportData(params).then(res => downloadStreamFile(res));
+    }
+  } finally {
+    state.exportLoading = false;
+  }
+}
+
+handleQuery();
+</script>
+<template>
+  <div class="fBS_Menu-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="鐖禝d">
+              <el-input v-model="state.tableQueryParams.pid" clearable placeholder="璇疯緭鍏ョ埗Id"/>
+            </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-sys-dict v-model="state.tableQueryParams.type" code="MenuTypeEnum" render-as="select" placeholder="璇烽�夋嫨鑿滃崟绫诲瀷" clearable filterable />
+            </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="璺敱鍦板潃">
+              <el-input v-model="state.tableQueryParams.path" 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.component" 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.redirect" 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.permission" 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.title" 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.icon" 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.isIframe" 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.outLink" 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.isHide" 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.isKeepAlive" 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.isAffix" 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.orderNo"  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-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+            </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.remark" 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_Menu: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_Menu" :disabled="state.selectData.length == 0" v-auth="'fBS_Menu:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛绯荤粺鑿滃崟琛�')" v-auth="'fBS_Menu:add'"> 鏂板 </el-button>
+                <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_MenuCommand">
+                  <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Menu: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_Menu: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_Menu:batchDelete') || auth('fBS_Menu:export')" />
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop='pid' label='鐖禝d' show-overflow-tooltip />
+        <el-table-column prop='type' label='鑿滃崟绫诲瀷' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.type" code="MenuTypeEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='name' label='璺敱鍚嶇О' show-overflow-tooltip />
+        <el-table-column prop='path' label='璺敱鍦板潃' show-overflow-tooltip />
+        <el-table-column prop='component' label='缁勪欢璺緞' show-overflow-tooltip />
+        <el-table-column prop='redirect' label='閲嶅畾鍚�' show-overflow-tooltip />
+        <el-table-column prop='permission' label='鏉冮檺鏍囪瘑' show-overflow-tooltip />
+        <el-table-column prop='title' label='鑿滃崟鍚嶇О' show-overflow-tooltip />
+        <el-table-column prop='icon' label='鍥炬爣' show-overflow-tooltip />
+        <el-table-column prop='isIframe' label='鏄惁鍐呭祵' show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag v-if="scope.row.isIframe"> 鏄� </el-tag>
+            <el-tag type="danger" v-else> 鍚� </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop='outLink' label='澶栭摼閾炬帴' show-overflow-tooltip />
+        <el-table-column prop='isHide' label='鏄惁闅愯棌' show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag v-if="scope.row.isHide"> 鏄� </el-tag>
+            <el-tag type="danger" v-else> 鍚� </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop='isKeepAlive' label='鏄惁缂撳瓨' show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag v-if="scope.row.isKeepAlive"> 鏄� </el-tag>
+            <el-tag type="danger" v-else> 鍚� </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop='isAffix' label='鏄惁鍥哄畾' show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag v-if="scope.row.isAffix"> 鏄� </el-tag>
+            <el-tag type="danger" v-else> 鍚� </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip />
+        <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Menu:setStatus'" show-overflow-tooltip>
+          <template #default="scope">
+            <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_MenuStatus(scope.row)" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='remark' 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_Menu:update') || auth('fBS_Menu:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛绯荤粺鑿滃崟琛�')" v-auth="'fBS_Menu:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Menu(scope.row)" v-auth="'fBS_Menu: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_MenuApi.importData" :download="fBS_MenuApi.downloadTemplate" v-auth="'fBS_Menu: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
diff --git a/Web/src/views/Customer/fBS_Role/component/editDialog.vue b/Web/src/views/Customer/fBS_Role/component/editDialog.vue
new file mode 100644
index 0000000..97a308b
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Role/component/editDialog.vue
@@ -0,0 +1,121 @@
+锘�<script lang="ts" name="fBS_Role" 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_RoleApi } from '/@/api/Customer/fBS_Role';
+
+//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+const emit = defineEmits(["reloadTable"]);
+const fBS_RoleApi = useFBS_RoleApi();
+const ruleFormRef = ref();
+
+const state = reactive({
+	title: '',
+	loading: false,
+	showDialog: false,
+	ruleForm: {} as any,
+	stores: {},
+	dropdownData: {} as any,
+});
+
+// 鑷娣诲姞鍏朵粬瑙勫垯
+const rules = ref<FormRules>({
+});
+
+// 椤甸潰鍔犺浇鏃�
+onMounted(async () => {
+});
+
+// 鎵撳紑寮圭獥
+const openDialog = async (row: any, title: string) => {
+	state.title = title;
+	row = row ?? { status: 1,orderNo: 100, };
+	state.ruleForm = row.id ? await fBS_RoleApi.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_RoleApi[state.ruleForm.id ? 'update' : 'add'](values);
+			closeDialog();
+		} else {
+			ElMessage({
+				message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+				type: "error",
+			});
+		}
+	});
+};
+
+//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+defineExpose({ openDialog });
+</script>
+<template>
+	<div class="fBS_Role-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="64" 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="code">
+							<el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ョ紪鐮�" maxlength="64" 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="orderNo">
+							<el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" 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="dataScope">
+							<g-sys-dict v-model="state.ruleForm.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" >
+						<el-form-item label="澶囨敞" prop="remark">
+							<el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="128" show-word-limit clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" >
+						<el-form-item label="鐘舵��" prop="status">
+							<g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+						</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_Role/index.vue b/Web/src/views/Customer/fBS_Role/index.vue
new file mode 100644
index 0000000..84a36d6
--- /dev/null
+++ b/Web/src/views/Customer/fBS_Role/index.vue
@@ -0,0 +1,225 @@
+锘�<script lang="ts" setup name="fBS_Role">
+import { ref, reactive, onMounted } from "vue";
+import { auth } from '/@/utils/authFunction';
+import { ElMessageBox, ElMessage } from "element-plus";
+import { downloadStreamFile } from "/@/utils/download";
+import { useFBS_RoleApi } from '/@/api/Customer/fBS_Role';
+import editDialog from '/@/views/Customer/fBS_Role/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_RoleApi = useFBS_RoleApi();
+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_RoleApi.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_Role = (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_RoleApi.delete({ id: row.id });
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+};
+
+// 鎵归噺鍒犻櫎
+const batchDelFBS_Role = () => {
+  ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(async () => {
+    await fBS_RoleApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => {
+      ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤);
+      handleQuery();
+    });
+  }).catch(() => {});
+};
+
+// 璁剧疆鐘舵��
+const changeFBS_RoleStatus = async (row: any) => {
+  await fBS_RoleApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�'));
+};
+
+// 瀵煎嚭鏁版嵁
+const exportFBS_RoleCommand = 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_RoleApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'current') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams);
+      await fBS_RoleApi.exportData(params).then(res => downloadStreamFile(res));
+    } else if (command === 'all') {
+      const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 });
+      await fBS_RoleApi.exportData(params).then(res => downloadStreamFile(res));
+    }
+  } finally {
+    state.exportLoading = false;
+  }
+}
+
+handleQuery();
+</script>
+<template>
+  <div class="fBS_Role-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="缂栫爜">
+              <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.orderNo"  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-sys-dict v-model="state.tableQueryParams.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable />
+            </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.remark" 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-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable />
+            </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_Role: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_Role" :disabled="state.selectData.length == 0" v-auth="'fBS_Role:batchDelete'"> 鍒犻櫎 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛瑙掕壊')" v-auth="'fBS_Role:add'"> 鏂板 </el-button>
+                <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_RoleCommand">
+                  <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Role: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_Role: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_Role:batchDelete') || auth('fBS_Role: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='缂栫爜' show-overflow-tooltip />
+        <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip />
+        <el-table-column prop='dataScope' label='鏁版嵁鑼冨洿' show-overflow-tooltip>
+          <template #default="scope">
+            <g-sys-dict v-model="scope.row.dataScope" code="DataScopeEnum" />
+          </template>
+        </el-table-column>
+        <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip />
+        <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Role:setStatus'" show-overflow-tooltip>
+          <template #default="scope">
+            <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_RoleStatus(scope.row)" />
+          </template>
+        </el-table-column>
+        <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_Role:update') || auth('fBS_Role:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛瑙掕壊')" v-auth="'fBS_Role:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Role(scope.row)" v-auth="'fBS_Role: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_RoleApi.importData" :download="fBS_RoleApi.downloadTemplate" v-auth="'fBS_Role: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
diff --git a/Web/src/views/fb_p_complaints/procurementComplaint/index.vue b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue
index 9aee0f8..49ad44c 100644
--- a/Web/src/views/fb_p_complaints/procurementComplaint/index.vue
+++ b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue
@@ -154,14 +154,15 @@
               <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユ姇璇変簨椤�" />
             </el-form-item>
           </el-col>
-          <!-- <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
+          <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI">
             <el-form-item label="鏄惁鎴愮珛">
               <el-select v-model="state.tableQueryParams.status" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="鏄�" :value="200" />
-                <el-option label="鍚�" :value="400" />
+                <el-option label="鎴愮珛" value="Valid" />
+                <el-option label="椹冲洖" value="Rejected" />
+                <el-option label="鍏跺畠" value="Other" />
               </el-select>
             </el-form-item>
-          </el-col> -->
+          </el-col>
 
           <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
             <el-form-item label="鍏抽敭瀛�">

--
Gitblit v1.9.1