From 9d2a0d8e8398ca94204bb191c99f6ad97de01a8c Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期五, 20 六月 2025 13:28:19 +0800
Subject: [PATCH] 增加客户相关表

---
 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs                     |   12 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs            |   86 
 Web/src/views/Customer/fBS_ExRole/index.vue                                        |  225 ++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs      |  278 ++
 Web/src/api/Customer/fB_Customer.ts                                                |  122 +
 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 +
 Web/src/api/Customer/fB_CustomerRole.ts                                            |   36 
 Web/src/views/Customer/fBS_Menu/component/editDialog.vue                           |  185 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj               |   15 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs        |  223 ++
 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj                       |   13 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs                                  |    6 
 Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj                       |    4 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs                              |    4 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs          |   18 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs         |   95 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs  |  875 ++++++++
 Web/src/views/Customer/fBS_Customer/index.vue                                      |  310 ++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs    |  280 ++
 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_Customer/Dto/FBS_CustomerDto.cs    |  241 ++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs            |  261 ++
 Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs                                |    1 
 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj               |   15 
 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs            |    4 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs                                    |    6 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs                                      |    4 
 Web/src/api/Customer/fBS_Role.ts                                                   |   60 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs                                |    4 
 Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs                          |    1 
 Web/src/views/Customer/fBS_Customer/component/editDialog.vue                       |  240 ++
 Admin.NET/Admin.NET.sln                                                            |   18 
 Web/src/api/Customer/fBS_Customer.ts                                               |  122 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs        |   86 
 Web/src/views/Customer/fBS_Role/index.vue                                          |  225 ++
 Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs                         |   17 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs                                  |    4 
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs          |  266 ++
 Web/src/api/Customer/fBS_ExRole.ts                                                 |   60 
 Admin.NET/Admin.NET.Application/Configuration/Swagger.json                         |    7 
 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs                                      |    4 
 Web/src/views/Customer/fBS_Role/component/editDialog.vue                           |  121 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs         |  150 +
 Admin.NET/Admin.NET.Application/Configuration/CodeGen.json                         |    2 
 Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj                             |    2 
 Web/src/views/Customer/fBS_ExRole/component/editDialog.vue                         |  125 +
 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs |  250 ++
 Web/src/api/Customer/fBS_Menu.ts                                                   |   82 
 51 files changed, 6,500 insertions(+), 23 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/Swagger.json b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
index cf54d66..9ff0518 100644
--- a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
+++ b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json
@@ -24,6 +24,13 @@
         "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�",
         "Version": "1.0.0",
         "Order": 10000
+      },
+      {
+        "Group": "FZCCustomerGroupName",
+        "Title": "鍓嶇瀹㈡埛鍜岀郴缁熻缃�",
+        "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�",
+        "Version": "1.0.0",
+        "Order": 10000
       }
     ],
     "DefaultGroupName": "Default", // 榛樿鍒嗙粍鍚�
diff --git a/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs b/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs
index 3121eab..2a0539e 100644
--- a/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs
+++ b/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs
@@ -15,4 +15,5 @@
     /// API鍒嗙粍鍚嶇О
     /// </summary>
     public const string GroupName = "FZCCGPT";
+
 }
\ No newline at end of file
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 4f58699..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,8 @@
 
   <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>
 
diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
index 7899823..1bc5c1e 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;
diff --git a/Admin.NET/Admin.NET.sln b/Admin.NET/Admin.NET.sln
index f5ee21d..ac33046 100644
--- a/Admin.NET/Admin.NET.sln
+++ b/Admin.NET/Admin.NET.sln
@@ -36,6 +36,12 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.NET.MD", "FZCZTB.NET.MD\FZCZTB.NET.MD.csproj", "{6D667B23-0499-4352-BCA6-C9F2E388710B}"
 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
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -93,6 +99,18 @@
 		{6D667B23-0499-4352-BCA6-C9F2E388710B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6D667B23-0499-4352-BCA6-C9F2E388710B}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6D667B23-0499-4352-BCA6-C9F2E388710B}.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
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
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..8756464
--- /dev/null
+++ b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj
@@ -0,0 +1,15 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </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.MD/CutomerMd/FB_Customer.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
similarity index 98%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Customer.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
index b09e9db..fbfd501 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Customer.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs
@@ -18,11 +18,11 @@
 /// <summary>
 /// 瀹㈡埛琛�
 /// </summary>
-[SugarTable("FB_Customer", "瀹㈡埛琛�")]
+[SugarTable("FBS_Customer", "瀹㈡埛琛�")]
 [SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)]
 [SugarIndex("index_{table}_P", nameof(Phone), OrderByType.Asc)]
 
-public partial class FB_Customer : EntityBaseTenant
+public partial class FBS_Customer : EntityBaseTenant
 {
     /// <summary>
     /// 璐﹀彿
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_CustomerRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
similarity index 93%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_CustomerRole.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
index 8b0b35a..260b5c0 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_CustomerRole.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs
@@ -13,9 +13,9 @@
 using System.Threading.Tasks;
 
 namespace FZCZTB.NET.MD.CutomerMd;
-[SugarTable("FB_CustomerRole", "瀹㈡埛鑿滃崟琛�")]
+[SugarTable("FBS_CustomerRole", "瀹㈡埛鑿滃崟琛�")]
 
-public class FB_CustomerRole : EntityBaseId
+public class FBS_CustomerRole : EntityBaseId
 {
     /// <summary>
     /// 鐢ㄦ埛Id
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
similarity index 95%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRole.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
index cf5c52f..61e1be0 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRole.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs
@@ -18,11 +18,11 @@
 /// 鐧诲綍鍗宠閫夋嫨鐨勬牎鑹�
 /// </summary>
 
-[SugarTable("FB_TenantMenu", "瀹㈡埛涓诲垎绫昏鑹�")]
+[SugarTable("FBS_TenantMenu", "瀹㈡埛涓诲垎绫昏鑹�")]
 [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
 [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)]
-[IncreTable]
-public class FB_ExRole: EntityBaseTenantId
+
+public class FBS_ExRole: EntityBaseTenant
 {
     /// <summary>
     /// 鍚嶇О
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
similarity index 92%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRoleMenu.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
index 739a053..dea3147 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_ExRoleMenu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs
@@ -16,9 +16,9 @@
 /// <summary>
 /// 绯荤粺绉熸埛鑿滃崟琛�
 /// </summary>
-[SugarTable("FB_TenantMenu", "绯荤粺绉熸埛鑿滃崟琛�")]
+[SugarTable("FBS_TenantMenu", "绯荤粺绉熸埛鑿滃崟琛�")]
 
-class FB_ExRoleMenu: EntityBaseId
+class FBS_ExRoleMenu: EntityBaseId
 {
     /// <summary>
     /// 绉熸埛Id
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Menu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
similarity index 97%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Menu.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
index 5a21579..58a7502 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Menu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs
@@ -17,11 +17,11 @@
 /// <summary>
 /// 
 /// </summary>
-[SugarTable("FB_Menu", "瀹㈡埛绯荤粺鑿滃崟琛�")]
+[SugarTable("FBS_Menu", "瀹㈡埛绯荤粺鑿滃崟琛�")]
 [SugarIndex("index_{table}_T", nameof(Title), OrderByType.Asc)]
 [SugarIndex("index_{table}_T2", nameof(Type), OrderByType.Asc)]
 
-public class FB_Menu: EntityBaseTenantId
+public class FBS_Menu: EntityBaseTenant
 {
     /// <summary>
     /// 鐖禝d
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Role.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
similarity index 95%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Role.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
index 39eee6a..57e4cc8 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_Role.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs
@@ -16,11 +16,11 @@
 
 namespace FZCZTB.NET.MD.CutomerMd;
 
-[SugarTable("FB_Role", "瀹㈡埛涓�у寲瑙掕壊")]
+[SugarTable("FBS_Role", "瀹㈡埛涓�у寲瑙掕壊")]
 [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
 [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)]
 
-public class FB_Role : EntityBaseTenant
+public class FBS_Role : EntityBaseTenant
 {
     /// <summary>
     /// 鍚嶇О
diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_RoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
similarity index 92%
rename from Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_RoleMenu.cs
rename to Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
index feb0c07..ba07127 100644
--- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FB_RoleMenu.cs
+++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs
@@ -13,9 +13,9 @@
 using System.Threading.Tasks;
 
 namespace FZCZTB.NET.MD.CutomerMd;
-[IncreTable]
-[SugarTable("FB_Role", "涓�у寲鏍¤壊鑿滃崟")]
-public class FB_RoleMenu: EntityBaseId
+
+[SugarTable("FBS_Role", "涓�у寲鏍¤壊鑿滃崟")]
+public class FBS_RoleMenu: EntityBaseId
 {
 
     /// <summary>
diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs
new file mode 100644
index 0000000..3994bc7
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs
@@ -0,0 +1,12 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FZCZTB.NET.SYSService.CustomerSYS
+{
+    public class CustomerManager
+    {
+    }
+}
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..01c693f
--- /dev/null
+++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj
@@ -0,0 +1,13 @@
+锘�<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>
+
+</Project>
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..8756464
--- /dev/null
+++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj
@@ -0,0 +1,15 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </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..5ad0c9b
--- /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_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
index b16c340..4300b44 100644
--- a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs
@@ -92,9 +92,7 @@
     {
         var entity = input.Adapt<ADPenalty>();
         await _aDPenaltyRep.AsUpdateable(entity)
-        .IgnoreColumns(u => new {
-            u.Url,
-        })
+      
         .ExecuteCommandAsync();
     }
 
diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
index 0a7ffff..bb23e15 100644
--- a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
+++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs
@@ -46,7 +46,12 @@
     /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О
     /// </summary>
     public virtual string? SupervisionDepartment { get; set; }
-    
+
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
+
 }
 
 /// <summary>
@@ -113,7 +118,11 @@
     /// </summary>
     [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
     public string? SupervisionDepartment { get; set; }
-    
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
+
 }
 
 /// <summary>
@@ -167,7 +176,10 @@
     /// </summary>    
     [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")]
     public string? SupervisionDepartment { get; set; }
-    
+    /// <summary>
+    /// 绾夸笂鍦板潃
+    /// </summary>
+    public string? Url { get; set; }
 }
 
 /// <summary>
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_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/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_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

--
Gitblit v1.9.1