From 4008c7e22c9c01eb653b04f934990486df622654 Mon Sep 17 00:00:00 2001 From: username@email.com <yzy2002yzy@163.com> Date: 星期一, 14 七月 2025 12:21:35 +0800 Subject: [PATCH] Merge branch 'master' of http://47.108.235.38:8080/r/FZCZTB --- Web/src/views/Customer/fBS_ExRole/index.vue | 225 Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue | 109 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs | 278 + Admin.NET/EzUpFile/UpFileController.cs | 196 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs | 209 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs | 141 Admin.NET/EzUpFile/EzFileUploadService.cs | 754 +++ Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj | 16 Admin.NET/FZCZTB.NET.MD/ADPenalty.cs | 62 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs | 223 Web/src/assets/background.jpeg | 0 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs | 41 Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj | 2 Admin.NET/EzUpFile/EzUpFile.csproj | 30 Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs | 2 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs | 191 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs | 875 +++ Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj | 2 Web/src/views/Customer/fBS_Customer/index.vue | 310 + Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs | 280 + Admin.NET/EzTencentCloud/TencentCloudConfig.json | 12 Web/src/views/ADPenalty/aDPenalty/index.vue | 185 Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs | 6 Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs | 47 Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json | 27 Admin.NET/cylsg.utility/CommonHelper.cs | 1015 ++++ Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs | 241 Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj | 2 Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs | 240 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj | 18 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs | 129 Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj | 2 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs | 79 Admin.NET/Admin.NET.sln | 38 Web/src/api/Customer/fBS_Customer.ts | 122 Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs | 7 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs | 86 Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue | 122 Admin.NET/EzUpFile/UpFileConfig.json | 12 Web/src/views/Customer/fBS_Role/index.vue | 225 Web/src/api/Customer/fBS_ExRole.ts | 60 Admin.NET/cylsg.utility/StaticStringDef.cs | 24 Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs | 216 Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj | 3 Web/src/views/Customer/fBS_EnterpriseType/index.vue | 194 Web/src/views/Customer/fBS_ExRole/component/editDialog.vue | 125 Web/src/api/Customer/fBS_EnterpriseType.ts | 52 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs | 86 Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs | 79 Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs | 200 Web/src/api/Customer/fB_Customer.ts | 122 Web/src/api/Customer/fB_CustomerRole.ts | 36 Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj | 2 Web/src/views/Customer/fBS_Menu/component/editDialog.vue | 185 Web/src/api/ADPenalty/aDPenalty.ts | 50 Admin.NET/cylsg.utility/cylsg.utility.csproj | 14 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj | 21 Admin.NET/FZCZTB.NET.SYSService/Startup.cs | 32 Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj | 4 Admin.NET/cylsg.utility/untilityModels.cs | 16 Admin.NET/cylsg.utility/Extend/StringEx.cs | 251 + Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs | 50 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs | 177 Admin.NET/EzTencentCloud/TencentCloudService.cs | 348 + Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs | 95 Admin.NET/EzTencentCloud/EzTencentCloud.csproj | 19 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs | 41 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs | 196 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs | 602 ++ Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs | 95 Web/src/views/Customer/fBS_Menu/index.vue | 311 + Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs | 261 + Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj | 2 Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs | 48 Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs | 12 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs | 65 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs | 63 Web/src/api/Customer/fBS_Role.ts | 60 Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs | 11 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs | 34 Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj | 2 Admin.NET/Admin.NET.Application/Configuration/Database.json | 9 Web/src/views/Customer/fBS_Customer/component/editDialog.vue | 240 Web/src/views/fb_p_complaints/procurementComplaint/index.vue | 9 Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs | 17 Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs | 88 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs | 362 + Admin.NET/cylsg.utility/Extend/EmunEx.cs | 15 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs | 266 + Admin.NET/Admin.NET.Core/Const/ClaimConst.cs | 12 Admin.NET/Admin.NET.Web.Core/Startup.cs | 2 Admin.NET/Admin.NET.Application/Configuration/Swagger.json | 12 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs | 142 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs | 79 Web/src/views/Customer/fBS_Role/component/editDialog.vue | 121 Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs | 3 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs | 229 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs | 150 Admin.NET/Admin.NET.Application/Configuration/CodeGen.json | 2 Admin.NET/EzTencentCloud/ITencentCloudService.cs | 71 Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs | 326 + Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs | 1021 ++++ Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs | 69 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs | 250 + Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs | 21 Web/src/api/Customer/fBS_Menu.ts | 82 Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs | 216 Admin.NET/EzUpFile/IEzFileUploadService.cs | 73 108 files changed, 14,683 insertions(+), 29 deletions(-) diff --git a/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj index 9220ef8..3e7fb09 100644 --- a/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj +++ b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj @@ -31,4 +31,8 @@ <ProjectReference Include="..\Plugins\Admin.NET.Plugin.GoView\Admin.NET.Plugin.GoView.csproj" /> </ItemGroup> + <ItemGroup> + <Folder Include="Service\" /> + </ItemGroup> + </Project> diff --git a/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json index fd7c18d..917bb0c 100644 --- a/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json +++ b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json @@ -6,6 +6,6 @@ "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application", "FZCZTB.NET.MD" ], // 瀹炰綋鎵�鍦ㄧ▼搴忛泦锛堣嚜琛屾坊鍔犳柊寤虹▼搴忛泦鍚嶇О锛� "BaseEntityNames": [ "EntityBaseId", "EntityBase", "EntityBaseDel", "EntityBaseOrg", "EntityBaseOrgDel", "EntityBaseTenant", "EntityBaseTenantDel", "EntityBaseTenantId", "EntityBaseTenantOrg", "EntityBaseTenantOrgDel" ], // 瀹炰綋鍩虹被鍚嶇О "FrontRootPath": "Web", // 鍓嶇椤圭洰鏍圭洰褰� - "BackendApplicationNamespaces": [ "Admin.NET.Application", "FZCZTB.TSCL.Application" ] // 鍚庣鐢熸垚鍒扮殑椤圭洰锛堣嚜琛屾坊鍔犳柊寤哄懡鍚嶇┖闂达級 + "BackendApplicationNamespaces": [ "Admin.NET.Application", "FZCZTB.TSCL.Application", "FZCZTB.Net.CustomerSYSTem" ] // 鍚庣鐢熸垚鍒扮殑椤圭洰锛堣嚜琛屾坊鍔犳柊寤哄懡鍚嶇┖闂达級 } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Database.json b/Admin.NET/Admin.NET.Application/Configuration/Database.json index 21fe2e4..a34209f 100644 --- a/Admin.NET/Admin.NET.Application/Configuration/Database.json +++ b/Admin.NET/Admin.NET.Application/Configuration/Database.json @@ -14,8 +14,9 @@ //"ConnectionString": "PORT=5432;DATABASE=xxx;HOST=localhost;PASSWORD=xxx;USER ID=xxx", // PostgreSQL //"ConnectionString": "Server=localhost;Database=xxx;Uid=xxx;Pwd=xxx;SslMode=None;AllowLoadLocalInfile=true;AllowUserVariables=true;", // MySql, //"ConnectionString": "User Id=xxx; Password=xxx; Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))", // Oracle - "ConnectionString": "Server=192.168.0.31;Database=FZCZTB;User Id=SA;Password=123456;Encrypt=True;TrustServerCertificate=True;", // SqlServer - + //"ConnectionString": "Server=192.168.0.31;Database=FZCZTB;User Id=SA;Password=123456;Encrypt=True;TrustServerCertificate=True;", // SqlServer + "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=FZCZTB;Encrypt=True;TrustServerCertificate=True;Integrated Security=true;", // SqlServer + //"ConnectionString": "Server=localhost;Database=FZCZTB;Trusted_Connection=True;", // SqlServer //"SlaveConnectionConfigs": [ // 璇诲啓鍒嗙/涓讳粠 // { // "HitRate": 10, @@ -27,14 +28,14 @@ // } //], "DbSettings": { - "EnableInitDb": false, // 鍚敤搴撳垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛� + "EnableInitDb": true, // 鍚敤搴撳垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛� "EnableInitView": false, // 鍚敤瑙嗗浘鍒濆鍖栵紙鑻ュ疄浣撳拰瑙嗗浘娌℃湁鍙樺寲寤鸿鍏抽棴锛� "EnableDiffLog": false, // 鍚敤搴撹〃宸紓鏃ュ織 "EnableUnderLine": false, // 鍚敤椹煎嘲杞笅鍒掔嚎 "EnableConnEncrypt": false // 鍚敤鏁版嵁搴撹繛鎺ヤ覆鍔犲瘑锛堝浗瀵哠M2鍔犺В瀵嗭級 }, "TableSettings": { - "EnableInitTable": false, // 鍚敤琛ㄥ垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛� + "EnableInitTable": true, // 鍚敤琛ㄥ垵濮嬪寲锛堣嫢瀹炰綋娌℃湁鍙樺寲寤鸿鍏抽棴锛� "EnableIncreTable": true // 鍚敤琛ㄥ閲忔洿鏂帮紙鍙洿鏂拌创浜嗙壒鎬IncreTable]鐨勫疄浣撹〃锛� }, "SeedSettings": { diff --git a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json index 4a90cee..fddb767 100644 --- a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json +++ b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json @@ -31,6 +31,18 @@ "Description": "闈炴斂搴滈噰璐鍗�", "Version": "1.0.0", "Order": 10001 + "Group": "FZCCustomerGroupName", + "Title": "鍓嶇瀹㈡埛鍜岀郴缁熻缃�", + "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�", + "Version": "1.0.0", + "Order": 10000 + }, + { + "Group": "FZCAPISYS", + "Title": "鍓嶇绯荤粺", + "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�", + "Version": "1.0.0", + "Order": 10000 } ], "DefaultGroupName": "Default", // 榛樿鍒嗙粍鍚� diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj index a7ea9d5..6b158af 100644 --- a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj +++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj @@ -46,7 +46,7 @@ <PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.5" /> <PackageReference Include="System.Net.Http" Version="4.3.4" /> <PackageReference Include="System.Private.Uri" Version="4.3.2" /> - <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1252" /> + <PackageReference Include="TencentCloudSDK" Version="3.0.1268" /> <PackageReference Include="UAParser" Version="3.1.47" /> <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" /> <PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" Aliases="BouncyCastleV2" /> diff --git a/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs index 7fdf85f..18f48bb 100644 --- a/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs +++ b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs @@ -65,4 +65,16 @@ /// 鐧诲綍妯″紡PC銆丄PP /// </summary> public const string LoginMode = "LoginMode"; + + + /// <summary> + /// 鐢ㄦ埛绫诲瀷 + /// </summary> + public const string UserType = "UserType"; + + + /// <summary> + /// 瀹㈡埛鐧诲綍绫诲瀷 + /// </summary> + public const string CustomerLogoinType = "CustomerLogoinType"; } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs index c807604..1f38313 100644 --- a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs @@ -63,6 +63,9 @@ /// </summary> [Required(ErrorMessage = "绉熸埛涓嶈兘涓虹┖")] public long? TenantId { get; set; } + + + } /// <summary> diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs index 9be2d3a..55c0fa2 100644 --- a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs @@ -394,7 +394,7 @@ { var codeId = YitIdHelper.NextId().ToString(); var captcha = _captcha.Generate(codeId); - var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60; + var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ??60 ; return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds }; } diff --git a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj index f193e56..ab988d2 100644 --- a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj +++ b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj @@ -16,6 +16,9 @@ <ItemGroup> <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" /> + <ProjectReference Include="..\FZCTB.NET.API.Application\FZCTB.NET.API.Application.csproj" /> + <ProjectReference Include="..\FZCZTB.Net.CustomerSYSTem\FZCZTB.Net.CustomerSYSTem.csproj" /> + <ProjectReference Include="..\FZCZTB.TSCL.Application\FZCZTB.TSCL.Application.csproj" /> </ItemGroup> </Project> diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs index 7899823..efbb21d 100644 --- a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs +++ b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs @@ -9,6 +9,7 @@ using Furion; using Furion.Authorization; using Furion.DataEncryption; + using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using System; @@ -62,8 +63,15 @@ public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) { - // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬� - return await CheckAuthorizeAsync(httpContext); + + if (App.User.FindFirst(ClaimConst.UserType)?.Value == "Customer") + { + //瀹㈡埛鐧诲綍 涓嶉渶瑕佸仛璧烽獙璇� + return true; + } + else + // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬� + return await CheckAuthorizeAsync(httpContext); } /// <summary> diff --git a/Admin.NET/Admin.NET.Web.Core/Startup.cs b/Admin.NET/Admin.NET.Web.Core/Startup.cs index 78d0277..75e7aac 100644 --- a/Admin.NET/Admin.NET.Web.Core/Startup.cs +++ b/Admin.NET/Admin.NET.Web.Core/Startup.cs @@ -351,7 +351,7 @@ { foreach (var groupInfo in SpecificationDocumentBuilder.GetOpenApiGroups()) { - groupInfo.Description += "<br/><u><b><font color='FF0000'> 馃懏涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�</font></b></u>"; + groupInfo.Description += "<br/><u><b><font color='FF0000'> 娆㈣繋娆㈣繋</font></b></u>"; } }); diff --git a/Admin.NET/Admin.NET.sln b/Admin.NET/Admin.NET.sln index 9eadaa1..b4cc41d 100644 --- a/Admin.NET/Admin.NET.sln +++ b/Admin.NET/Admin.NET.sln @@ -38,6 +38,20 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FZFCGDD.ORDER.Application", "FZFCGDD.ORDER.Application\FZFCGDD.ORDER.Application.csproj", "{B3F43995-30FA-47AF-83A0-B37A2669C6A8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.Net.CustomerSYSTem", "FZCZTB.Net.CustomerSYSTem\FZCZTB.Net.CustomerSYSTem.csproj", "{72CBCF69-83C4-44DF-B066-7618D5672B03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCTB.NET.API.Application", "FZCTB.NET.API.Application\FZCTB.NET.API.Application.csproj", "{D72E858B-FFBE-4055-8473-B4AAF6F18F30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.NET.SYSService", "FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj", "{9E19230C-7A8F-4440-B5D9-27D0038C13F6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzTencentCloud", "EzTencentCloud\EzTencentCloud.csproj", "{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzUpFile", "EzUpFile\EzUpFile.csproj", "{5333BCDD-09C7-4021-AC43-CBFA63505D4D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "瑙e喅鏂规椤�", "瑙e喅鏂规椤�", "{251B31C8-0A9E-4948-9534-D167A56201F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cylsg.utility", "cylsg.utility\cylsg.utility.csproj", "{743B2BC9-11AE-4354-90D9-560B592F63CA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -99,6 +113,30 @@ {B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3F43995-30FA-47AF-83A0-B37A2669C6A8}.Release|Any CPU.Build.0 = Release|Any CPU + {72CBCF69-83C4-44DF-B066-7618D5672B03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72CBCF69-83C4-44DF-B066-7618D5672B03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72CBCF69-83C4-44DF-B066-7618D5672B03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72CBCF69-83C4-44DF-B066-7618D5672B03}.Release|Any CPU.Build.0 = Release|Any CPU + {D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D72E858B-FFBE-4055-8473-B4AAF6F18F30}.Release|Any CPU.Build.0 = Release|Any CPU + {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.Build.0 = Release|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.Build.0 = Release|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.Build.0 = Release|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Admin.NET/EzTencentCloud/EzTencentCloud.csproj b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj new file mode 100644 index 0000000..f9e143e --- /dev/null +++ b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj @@ -0,0 +1,19 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + </ItemGroup> + + <ItemGroup> + <None Update="TencentCloudConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + +</Project> diff --git a/Admin.NET/EzTencentCloud/ITencentCloudService.cs b/Admin.NET/EzTencentCloud/ITencentCloudService.cs new file mode 100644 index 0000000..da37eff --- /dev/null +++ b/Admin.NET/EzTencentCloud/ITencentCloudService.cs @@ -0,0 +1,71 @@ +锘縰sing Furion.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Iai.V20200303.Models; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzTencentCloud +{ + /// <summary> + /// 鑵捐浜戞湇鍔� + /// </summary> + public interface ITencentCloudService: IScoped + { + #region orc 鍥炬枃璇嗗埆 + /// <summary> + /// 韬唤璇佽瘑鍒紝骞跺壀瑁� + /// </summary> + /// <param name="ImageBase64">鍥剧墖base64</param> + /// <param name="isFRONT"></param> + /// <returns></returns> + IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT); + /// <summary> + /// 鑾峰彇鍓鍚庣殑韬唤璇佺収鐗� + /// </summary> + /// <returns></returns> + string GetIdCordImg(); + /// <summary> + /// 钀ヤ笟鎵х収璁よ瘉 + /// </summary> + /// <param name="ImageBase64"> 鍥剧墖base64</param> + /// <returns></returns> + BizLicenseOCRResponse BizLicenseOCR(string ImageBase64); + #endregion + #region iai 浜鸿劯璇嗗埆 + /// <summary> + /// 鍒涘缓浜鸿劯搴擄紝涓�鑸竴涓簯璐﹀彿鍙渶瑕佸垱寤轰竴娆� + /// </summary> + public void IaiCreatGroup(); + /// <summary> + /// 浜鸿劯楠岃瘉 涓�鑸垎鏁拌秴杩�50 鍒嗚瘑鍒负涓�涓汉 + /// </summary> + /// <param name="img64"></param> + /// <param name="PersonNameId"></param> + /// <returns></returns> + public VerifyFaceResponse VerifyFace(string img64, string PersonNameId); + /// <summary> + /// 澧炲姞涓�涓汉鐨勪汉鑴稿浘鐗囩壒寰侊紝涓�涓渶澶氬彧鍏佽鏈変簲涓汉鑴哥壒杩� + /// </summary> + /// <param name="img64"></param> + /// <param name="PersonNameId"></param> + /// <param name="PersonName"></param> + /// <param name="PersonGender"></param> + /// <returns></returns> + public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender); + + /// <summary> + /// 澧炲姞涓�涓汉 + /// </summary> + /// <param name="img64">浜鸿劯鐓�</param> + /// <param name="PersonNameId">浜鸿劯ID 涓�涓簯璐︽埛涓敮涓�</param> + /// <param name="PersonName">濮撳悕</param> + /// <param name="PersonGender">鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + public bool IaiAddPerso(string img64, string PersonNameId, string PersonName, int PersonGender); + #endregion + + } +} diff --git a/Admin.NET/EzTencentCloud/TencentCloudConfig.json b/Admin.NET/EzTencentCloud/TencentCloudConfig.json new file mode 100644 index 0000000..0623d8f --- /dev/null +++ b/Admin.NET/EzTencentCloud/TencentCloudConfig.json @@ -0,0 +1,12 @@ +{ + "TencentCloud": { + "SecretId": "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + "SecretKey": "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }, + //浜鸿劯搴撶浉鍏抽厤缃� + "IAIGroupSet": { + "ID": "cylsg", + "Name": "宸濆嵃涓存椂宸�" + } + +} diff --git a/Admin.NET/EzTencentCloud/TencentCloudService.cs b/Admin.NET/EzTencentCloud/TencentCloudService.cs new file mode 100644 index 0000000..4f27ee4 --- /dev/null +++ b/Admin.NET/EzTencentCloud/TencentCloudService.cs @@ -0,0 +1,348 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +using Newtonsoft.Json; +using TencentCloud.Common; +using TencentCloud.Common.Profile; +using Furion.DependencyInjection; +using Furion; +using TencentCloud.Ocr.V20181119.Models; +using TencentCloud.Iai.V20200303.Models; +using TencentCloud.Iai.V20200303; +using TencentCloud.Ocr.V20181119; + + + + + +namespace EzTencentCloud +{ + public class TencentCloudService: ITencentCloudService, IScoped + { + + + + + public TencentCloudService() + { + + } + #region orc 鍥炬枃璇嗗埆 + /// <summary> + /// 鍓鍚庣殑韬唤璇佸浘鐗� + /// </summary> + public string CropIdCard { get; set; } + + public string GetIdCordImg() + { + if (string.IsNullOrEmpty(CropIdCard)) + return ""; + else + return CropIdCard; + + } + + public IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT) + { + try + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("ocr.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile); + + IDCardOCRRequest req = new IDCardOCRRequest(); + if (isFRONT) + req.CardSide = "FRONT"; + else + req.CardSide = "BACK"; + req.ImageBase64 = ImageBase64; + + req.Config = JsonConvert.SerializeObject(new + { + //韬唤璇佺収鐗囪鍓紙鍘绘帀璇佷欢澶栧浣欑殑杈圭紭銆佽嚜鍔ㄧ煫姝f媿鎽勮搴︼級 + CropIdCard = true, + // CropPortrait = true, + //杈规鍜屾鍐呴伄鎸″憡璀� + BorderCheckWarn = true, + //PS妫�娴嬪憡璀� + DetectPsWarn = true, + //涓存椂韬唤璇佸憡璀� + TempIdWarn = true, + //韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅 + InvalidDateWarn = true, + //鍥剧墖璐ㄩ噺鍒嗘暟锛堣瘎浠峰浘鐗囩殑妯$硦绋嬪害锛� + Quality = true, + + }); + IDCardOCRResponse resp = _ocrClient.IDCardOCRSync(req); + + if (resp == null) + throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + + + var adv = JsonConvert.DeserializeObject<AdvancedInfo>(resp.AdvancedInfo); + if (adv == null) + throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.BorderCodeValue != null && adv.BorderCodeValue > 50) + throw new Exception("韬唤璇佸浘鐗囦笉瀹屾暣锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.Quality != null && adv.Quality < 50) + throw new Exception("鍥剧墖妯$硦锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.WarnInfos?.Where(x => x == -9100) == null) + throw new Exception("韬唤璇佹棩鏈熶笉鍚堟硶锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.WarnInfos?.Where(x => x == -9106) == null) + throw new Exception("璇ュ浘鐗囧彲鑳芥槸琚玃S杩囷紝璇烽噸鏂伴�夋嫨韬唤璇佸浘鐗�"); + + CropIdCard = adv.IdCard; + return resp; + } + catch (Exception) + { + throw; + } + + + } + + + + public BizLicenseOCRResponse BizLicenseOCR(string ImageBase64) + { + try + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("ocr.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile); + + var ret = _ocrClient.BizLicenseOCRSync(new BizLicenseOCRRequest() + { + ImageBase64 = ImageBase64, + }); + + return ret; + } + catch (Exception) + { + throw; + } + + + } + + + #endregion + + #region iai 浜鸿劯璇嗗埆 + public void IaiCreatGroup() + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + try + { + var retinfo = iaiClient.GetGroupInfoSync(new GetGroupInfoRequest + { + GroupId = App.Configuration["IAIGroupSet:ID"] ?? "", + }); + } + catch (TencentCloudSDKException e) + { + if (e.ErrorCode == "InvalidParameterValue.GroupIdNotExist") + + { + CreateGroupRequest request = new CreateGroupRequest() + { + GroupId = App.Configuration["IAIGroupSet:ID"], + GroupName= App.Configuration["IAIGroupSet:Name"], + + + }; + var aia = iaiClient.CreateGroupSync(request); + } + } + + + + } + + + public bool IaiAddPerso( string img64,string PersonNameId,string PersonName, int PersonGender) + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret= iaiClient.CreatePerson(new TencentCloud.Iai.V20200303.Models.CreatePersonRequest + { + GroupId = App.Configuration["IAIGroupSet:ID"], + Image = img64, + PersonId= PersonNameId, + PersonName= PersonName, + Gender=PersonGender, + + }); + + if(ret.IsFaulted) + return false; + else + return true; + + + + } + + + public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender) + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret = iaiClient.CreateFace( new TencentCloud.Iai.V20200303.Models.CreateFaceRequest + { + + PersonId = PersonNameId, + Images = [img64], + + + + }); + + if (ret.IsFaulted) + return false; + else + return true; + + + + } + + + public VerifyFaceResponse VerifyFace(string img64, string PersonNameId) + { + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret = iaiClient.VerifyFaceSync(new TencentCloud.Iai.V20200303.Models.VerifyFaceRequest + { + + PersonId = PersonNameId, + Image= img64 + + + + }); + return ret; + + + + } + #endregion + + } + + //杩斿洖鎵╁睍鍙傛暟 + internal class AdvancedInfo + { + /// <summary> + /// idCard 瑁佸壀鍚庤韩浠借瘉鐓х墖鐨刡ase64缂栫爜锛岃姹� Config.CropIdCard 鏃惰繑鍥烇紱 + /// </summary> + public string? IdCard { get; set; } + /// <summary> + /// 韬唤璇佸ご鍍忕収鐗囩殑base64缂栫爜锛岃姹� Config.CropPortrait 鏃惰繑鍥烇紱 + /// </summary> + public string? Portrait { get; set; } + /// <summary> + /// 鍥剧墖璐ㄩ噺鍒嗘暟锛岃姹� Config.Quality 鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤秺妯$硦锛屽缓璁槇鍊尖墺50锛�; + /// </summary> + public int? Quality { get; set; } + /// <summary> + /// 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅闃堝�煎垎鏁帮紝璇锋眰 Config.BorderCheckWarn鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤竟妗嗛伄鎸″彲鑳芥�ц秺浣庯紝寤鸿闃堝�尖墹50锛�; + /// </summary> + public int BorderCodeValue { get; set; } + /// <summary> + /// 鍛婅淇℃伅锛孋ode 鍛婅鐮佸垪琛ㄥ拰閲婁箟锛� + ///-9100 韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅锛� + ///-9101 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅锛� + ///-9102 韬唤璇佸鍗颁欢鍛婅锛� + ///-9103 韬唤璇佺炕鎷嶅憡璀︼紝 + ///-9105 韬唤璇佹鍐呴伄鎸″憡璀︼紝 + ///-9104 涓存椂韬唤璇佸憡璀︼紝 + ///-9106 韬唤璇� PS 鍛婅锛� + ///-9107 韬唤璇佸弽鍏夊憡璀︺�� + /// </summary> + public List<int> WarnInfos { get; set; } + } + +} diff --git a/Admin.NET/EzUpFile/EzFileUploadService.cs b/Admin.NET/EzUpFile/EzFileUploadService.cs new file mode 100644 index 0000000..568e928 --- /dev/null +++ b/Admin.NET/EzUpFile/EzFileUploadService.cs @@ -0,0 +1,754 @@ +锘� +using Aliyun.Acs.Core.Exceptions; +using Aliyun.OSS; + +using Aliyun.OSS.Util; +using cylsg.utility; +using cylsg.utility.Extend; +using EzTencentCloud; +using Furion; +using Furion.DependencyInjection; +using Furion.FriendlyException; +using Microsoft.AspNetCore.Http; + +using SqlSugar; +using System.Drawing; +using System.Globalization; +using System.Security.Cryptography; +using System.Text; +using Tea; +using TencentCloud.Ocr.V20181119.Models; + +using Task = System.Threading.Tasks.Task; +using Newtonsoft.Json; +using static AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleResponseBody; +namespace EzUpFile +{ + /// <summary> + /// 闄勪欢鏈嶅姟绋嬪簭 + /// </summary> + public class EzFileUploadService : IEzFileUploadService, IScoped + { + + private readonly HttpRequest? _request; + private readonly ISqlSugarClient _sqlSugarClient; + private readonly ITencentCloudService _tcs; + public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient, ITencentCloudService tencentCloudService) + { + + _request = httpContext.HttpContext?.Request ?? null; + _sqlSugarClient = sqlSugarClient; + _tcs = tencentCloudService; + } + + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <returns></returns> + public async Task<string> UploadFiles() + { + + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var file = _request?.Form?.Files["file"]; + if (file == null) + { + throw Oops.Oh("浣犳病鏈夐�夋嫨鏂囦欢"); + } + + var fileName = file.FileName; + var fileExt = Path.GetExtension(fileName).ToLowerInvariant(); + + //妫�鏌ュぇ灏� + if (file.Length > maxSize) + { + throw Oops.Oh("鏂囦欢澶т簬璁剧疆鏂囦欢"); + } + + ////妫�鏌ユ枃浠舵墿灞曞悕 + //if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(op.AttachmentSaveFileExtName?.Split(',') ?? new string[] { "" }, fileExt.Substring(1).ToLower()) == -1) + //{ + // throw Oops.Oh("涓婁紶鏂囦欢鎵╁睍鍚嶆槸涓嶅厑璁哥殑鎵╁睍鍚�,璇蜂笂浼犲悗缂�鍚嶄负锛�" + op.AttachmentSaveFileExtName); + + //} + + string url = string.Empty; + + + url = await UpLoadFileForAliYunOSS(fileExt, file); + + + return url; + + + } + + /// <summary> + /// 涓婁紶base64 + /// </summary> + /// <param name="base64"></param> + /// <returns></returns> + public async Task<string> UploadFilesFByBase64(string base64) + { + + if (string.IsNullOrEmpty(base64)) + { + throw Oops.Oh("娌℃湁鍐呭"); + } + + //妫�鏌ヤ笂浼犲ぇ灏� + if (!CommonHelper.CheckBase64Size(base64, 5)) + { + throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M"); + + } + + base64 = base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲 + byte[] bytes = Convert.FromBase64String(base64); + MemoryStream memStream = new MemoryStream(bytes); + + string url = string.Empty; + + url = await UpLoadBase64ForAliYunOSS(memStream); + + + + return url; + } + + /// <summary> + /// 鍒犻櫎鏂囦欢 + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + public async Task<bool> DelFile(string Path) + { + + + var ret = await DelFileForAliYunOSS(Path); + + + + return ret; + } + + + + #region 闃块噷浜戜笂浼犳柟娉曪紙File锛� + /// <summary> + /// 闃块噷浜戜笂浼犳柟娉曪紙File锛� + /// </summary> + /// <param name="options"></param> + /// <param name="fileExt"></param> + /// <param name="file"></param> + /// <returns></returns> + public async Task<string> UpLoadFileForAliYunOSS(string fileExt, IFormFile file) + { + + + var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt; + var today = DateTime.Now.ToString("yyyyMMdd"); + + //涓婁紶鍒伴樋閲屼簯 + await using var fileStream = file.OpenReadStream(); + var md5 = OssUtils.ComputeContentMd5(fileStream, file.Length); + + var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰� + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5 + var objectMeta = new ObjectMetadata + { + ContentMd5 = md5 + }; + + + var task = Task.Run(() => + //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5) + aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta) + + + + ); + //绛夊緟瀹屾垚 + try + { + task.Wait(); + } + catch (AggregateException ex) + { + + throw Oops.Oh(ex.Message); + } + + + + return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath; + } + + #endregion + + + + + + #region 闃块噷浜戜笂浼犳柟娉曪紙Base64锛� + /// <summary> + /// 闃块噷浜戜笂浼犳柟娉曪紙Base64锛� + /// </summary> + /// <param name="options"></param> + /// <param name="memStream"></param> + /// <returns></returns> + public async Task<string> UpLoadBase64ForAliYunOSS(MemoryStream memStream) + { + + + var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg"; + var today = DateTime.Now.ToString("yyyyMMdd"); + + // 璁剧疆褰撳墠娴佺殑浣嶇疆涓烘祦鐨勫紑濮� + memStream.Seek(0, SeekOrigin.Begin); + + await using var fileStream = memStream; + var md5 = OssUtils.ComputeContentMd5(fileStream, memStream.Length); + + var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰� + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5 + var objectMeta = new ObjectMetadata + { + ContentMd5 = md5 + }; + try + { + //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5) + aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta); + } + catch (AggregateException ex) + { + + throw Oops.Oh(ex.Message); + } + + + //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src + + return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath; + + } + + #endregion + + + + + + #region 鍒犻櫎鏂囦欢 + + /// <summary> + /// 闃块噷浜戝垹闄� + /// </summary> + /// <param name="options"></param> + /// <param name="fileUrl">甯xx.xx鐨勯摼鎺ュ湴鍧�</param> + /// <returns></returns> + public async Task<bool> DelFileForAliYunOSS(string fileUrl) + { + + + + + + + + + + + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + + try + { + var task = Task.Run(() => aliYun.DeleteObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], (App.Configuration["FileUploadOptions:SavePath"]?.RemoveStartWithStr("/") ?? "") + fileUrl.GetFileName())); + + + task.Wait(); + + } + catch (Exception ex) + { + + throw Oops.Oh(ex.Message); + } + + + //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src + + return true; + + } + + + + + #endregion + + #region 璇嗗埆涓婁紶 + public async Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT") + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 1200) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + IDCardOCRResponse idcordinfo = null; + string url = ""; + + try + { + + + idcordinfo = _tcs.IdCord(img64, PageName == "FRONT"); + + url = await UploadFilesFByBase64(_tcs.GetIdCordImg()); + idcordinfo.AdvancedInfo = null; + + return (idcordinfo, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message + "鑵捐浜戯紝鎴栬�呴樋閲屼簯鎿嶄綔閿欒"); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + + } + + public async Task<(BizLicenseOCRResponse, string)> UpBizLicense() + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 1200) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + BizLicenseOCRResponse info = null; + string url = ""; + + try + { + info = _tcs.BizLicenseOCR(img64); + + url = await UploadFilesFByBase64(img64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + + + public async Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender) + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭500K"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 600) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(600, 400, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(400, 600, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + bool info = false; + string url = ""; + + try + { + info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender); + + url = await UploadFilesFByBase64(img64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + /// <inheritdoc/> + + public async Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender) + { + if (string.IsNullOrEmpty(imgBase64)) + { + throw Oops.Oh("娌℃湁鍐呭"); + } + + //妫�鏌ヤ笂浼犲ぇ灏� + if (!CommonHelper.CheckBase64Size(imgBase64, 5)) + { + throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M"); + } + + imgBase64 = imgBase64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲 + bool info = false; + string url = ""; + + try + { + info = _tcs.IaiAddPerso(imgBase64, CoredID, Name, PersonGender); + + url = await UploadFilesFByBase64(imgBase64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + + + #endregion + + #region 鏈湴涓婁紶浜戞湇鍔″櫒鍑瘉璁$畻 + + + public Dictionary<string, string> GetToken1() + { + + var dir = DateTime.Now.ToString("yyyyMMdd") + "/"; + // 鏋勯�燨ssClient瀹炰緥銆� endpoint 鏍煎紡:https://oss-cn-beijing.aliyuncs.com + // var ossClient = new OssClient( App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + var rt = GetSTSToken(); + + + + + String securityToken = rt.AccessKeySecret; //鑾峰彇Token + var config = new PolicyConditions(); + + config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// 鏂囦欢澶у皬鑼冨洿锛氬崟浣峛yte + config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir); + //鎹呭悕 + config.AddConditionItem("bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"]); + config.AddConditionItem("x-oss-signature-version", "OSS4-HMAC-SHA256"); + config.AddConditionItem("x-oss-security-token", securityToken); + // //璇锋眰鏃堕棿 + config.AddConditionItem("x-oss-date", DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'")); + config.AddConditionItem("x-oss-credential", App.Configuration["FileUploadOptions:AliOSSAccessKeyID"] + "/" + DateTime.Now.ToString("yyyyMMdd") + "/cn-chengdu/oss/aliyun_v4_request"); + var expire = DateTimeOffset.Now.AddMinutes(30);// 杩囨湡鏃堕棿 + + // 鐢熸垚 Policy锛屽苟杩涜 Base64 缂栫爜 + // var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config); + // var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy)); + + // 璁$畻绛惧悕 + var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"])); + // var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64)); + // var sign = Convert.ToBase64String(bytes); + + return new Dictionary<string, string>(); + } + + + + + + + public static AlibabaCloud.SDK.Sts20150401.Client CreateClient() + { + // 宸ョ▼浠g爜娉勯湶鍙兘浼氬鑷� AccessKey 娉勯湶锛屽苟濞佽儊璐﹀彿涓嬫墍鏈夎祫婧愮殑瀹夊叏鎬с�備互涓嬩唬鐮佺ず渚嬩粎渚涘弬鑰冦�� + // 寤鸿浣跨敤鏇村畨鍏ㄧ殑 STS 鏂瑰紡锛屾洿澶氶壌鏉冭闂柟寮忚鍙傝锛歨ttps://help.aliyun.com/document_detail/378671.html銆� + AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config + { + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_ID銆� + AccessKeyId = "LTAI5tKegnEbaSRPFRwDxeFd", + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_SECRET銆� + AccessKeySecret = "9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl", + }; + // Endpoint 璇峰弬鑰� https://api.aliyun.com/product/Sts + config.Endpoint = "sts.cn-chengdu.aliyuncs.com"; + return new AlibabaCloud.SDK.Sts20150401.Client(config); + } + + /// <summary> + /// 鑾峰彇涓存椂鍑瘉 + /// </summary> + public static AssumeRoleResponseBodyCredentials GetSTSToken() + { + AlibabaCloud.SDK.Sts20150401.Client client = CreateClient(); + AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest + { + Policy = "{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}", + DurationSeconds = 3600, + RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl", + RoleSessionName = "weixinupdataRl", + }; + AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions(); + try + { + // 澶嶅埗浠g爜杩愯璇疯嚜琛屾墦鍗� API 鐨勮繑鍥炲�� + var data = client.AssumeRoleWithOptions(assumeRoleRequest, runtime); + if (data.StatusCode == 200) + { + + return data.Body?.Credentials; + } + throw Oops.Oh("闃块噷浜戣幏鍙栦复鏃跺嚟璇侀敊璇�"); + } + catch (TeaException error) + { + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw; + } + catch (Exception _error) + { + TeaException error = new TeaException(new Dictionary<string, object> + { + { "message", _error.Message } + }); + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw error; + } + } + /// <summary> + /// + /// </summary> + /// <returns></returns> + public Dictionary<string, string> GetToken() + { + // 鑾峰彇鐜鍙橀噺 + + string regionId = "cn-chengdu"; + string roleSessionName = "weixinupdataRl"; + + + + + + + + // 瀹氫箟STS涓存椂璁块棶鍑瘉鍙橀噺 + string stsAccessKeyId = null; + string stsSecretAccessKey = null; + string securityToken = null; + + try + { + var rt = GetSTSToken(); + + stsAccessKeyId = rt.AccessKeyId; + stsSecretAccessKey = rt.AccessKeySecret; + securityToken = rt.SecurityToken; + } + catch (ServerException e) + { + throw; + } + catch (ClientException e) + { + throw; + } + + // 鏍煎紡鍖栬姹傛棩鏈� + DateTimeOffset now = DateTimeOffset.UtcNow; + string dtObj1 = now.ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture); + string dtObj2 = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture); + string expirationTime = now.AddHours(3).ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture); + + // 鍒涘缓policy + Dictionary<string, object> policy = new Dictionary<string, object> + { + { "expiration", expirationTime }, + { "conditions", new List<object> + { + new Dictionary<string, string> { { "bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"] } }, // 璇峰皢<bucketname>鏇挎崲涓烘偍鐨勫疄闄匓ucket鍚嶇О + new Dictionary<string, string> { { "x-oss-signature-version", "OSS4-HMAC-SHA256" } }, + new Dictionary<string, string> { { "x-oss-credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" } }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + new Dictionary<string, string> { { "x-oss-security-token", securityToken } }, + new Dictionary<string, string> { { "x-oss-date", dtObj1 } } + } + } + }; + + string jsonPolicy = JsonConvert.SerializeObject(policy); + + // 鏋勯�犲緟绛惧悕瀛楃涓诧紙StringToSign锛� + string stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonPolicy)); + + // 璁$畻SigningKey + byte[] dateKey = HmacSha256("aliyun_v4" + stsSecretAccessKey, dtObj2); + byte[] dateRegionKey = HmacSha256(dateKey, regionId); // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + byte[] dateRegionServiceKey = HmacSha256(dateRegionKey, "oss"); + byte[] signingKey = HmacSha256(dateRegionServiceKey, "aliyun_v4_request"); + + // 璁$畻Signature + byte[] result = HmacSha256(signingKey, stringToSign); + string signature = BitConverter.ToString(result).Replace("-", "").ToLower(); + + Dictionary<string, string> messageMap = new Dictionary<string, string> + { + { "security_token", securityToken }, + { "signature", signature }, + { "x_oss_date", dtObj1 }, + { "x_oss_credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + { "x_oss_signature_version", "OSS4-HMAC-SHA256" }, + { "policy", stringToSign } + }; + + // 鎵撳嵃杩斿洖鑷冲鎴风鐨勭鍚嶄俊鎭� + return messageMap; + } + + + + private static byte[] HmacSha256(byte[] key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(key)) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + private static byte[] HmacSha256(string key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key))) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + + + #endregion + } + + + + +} + diff --git a/Admin.NET/EzUpFile/EzUpFile.csproj b/Admin.NET/EzUpFile/EzUpFile.csproj new file mode 100644 index 0000000..3cb7091 --- /dev/null +++ b/Admin.NET/EzUpFile/EzUpFile.csproj @@ -0,0 +1,30 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.4" /> + <PackageReference Include="Aliyun.Acs.Core" Version="1.0.1" /> + <PackageReference Include="Aliyun.Acs.Sts" Version="1.0.1" /> + <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" /> + <PackageReference Include="Utf8Json" Version="1.3.7" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" /> + <ProjectReference Include="..\EzTencentCloud\EzTencentCloud.csproj" /> + </ItemGroup> + + <ItemGroup> + <None Update="UpFileConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + +</Project> diff --git a/Admin.NET/EzUpFile/IEzFileUploadService.cs b/Admin.NET/EzUpFile/IEzFileUploadService.cs new file mode 100644 index 0000000..580272a --- /dev/null +++ b/Admin.NET/EzUpFile/IEzFileUploadService.cs @@ -0,0 +1,73 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzUpFile +{ + public interface IEzFileUploadService + { + /// <summary> + /// 涓婁紶base64 + /// </summary> + /// <param name="base64"></param> + /// <returns></returns> + Task<string> UploadFilesFByBase64(string base64); + /// <summary> + /// 涓婁紶鏂囦欢 + /// </summary> + /// <returns></returns> + Task<string> UploadFiles(); + /// <summary> + /// 鍒犻櫎鏂囦欢 + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + Task<bool> DelFile(string Path); + + /// <summary> + /// 涓婁紶韬唤璇� + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT"); + + + /// <summary> + /// 涓婁紶钀ヤ笟鎵х収 + /// </summary> + /// <returns></returns> + Task<(BizLicenseOCRResponse, string)> UpBizLicense(); + + /// <summary> + /// 鍒涘缓浜鸿劯鐗瑰緛 鏂囦欢浼犻�� + /// </summary> + /// <param name="CoredID"> 韬唤璇佸彿</param> + /// <param name="Name">濮撳悕</param> + /// <param name="PersonGender"> 鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender); + /// <summary> + /// 鍒涘缓浜鸿劯鐗瑰緛 + /// </summary> + /// <param name="imgBase64">img base64</param> + /// <param name="CoredID"> 韬唤璇佸彿</param> + /// <param name="Name">濮撳悕</param> + /// <param name="PersonGender"> 鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender); + + /// <summary> + /// + /// </summary> + /// <returns></returns> + Dictionary<string, string> GetToken(); + + } + + + + +} diff --git a/Admin.NET/EzUpFile/UpFileConfig.json b/Admin.NET/EzUpFile/UpFileConfig.json new file mode 100644 index 0000000..d8a0aca --- /dev/null +++ b/Admin.NET/EzUpFile/UpFileConfig.json @@ -0,0 +1,12 @@ +{ + "FileUploadOptions": { + + "AliOSSBucketName": "appimchat", + "SavePath": "cylsg/", + "AliOSSEndpoint": "oss-accelerate.aliyuncs.com", + "AliOSSAccessKeyID": "LTAI5tNYGwTd3swLhC8H2XYV", + "AliOSSAccessKeySecret": "TyfkpYbXRUCh1K8LLtUyxY3ZcFCy1A", + "AliOSSSaveBaseUrl": "https://appimchat.oss-cn-chengdu.aliyuncs.com/" + + } +} diff --git a/Admin.NET/EzUpFile/UpFileController.cs b/Admin.NET/EzUpFile/UpFileController.cs new file mode 100644 index 0000000..5028e5c --- /dev/null +++ b/Admin.NET/EzUpFile/UpFileController.cs @@ -0,0 +1,196 @@ +锘縰sing EzTencentCloud; +using Furion.FriendlyException; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.IdentityModel.Abstractions; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzUpFile +{ + /// <summary> + /// 鏂囦欢涓婁紶涓嬭浇 + /// </summary> + [DynamicApiController] + [ApiDescriptionSettings("FZCAPISYS", Order = 149)] + public class UpFileController + { + /// <summary> + /// 鑾峰彇鏂囦欢 涓婁紶token + /// </summary> + /// <returns></returns> + [HttpGet] + + public Dictionary<string, string> GetToken([FromServices] IEzFileUploadService fileUploadService) + { + return fileUploadService.GetToken(); + } + /// <summary> + /// 涓婁紶韬唤璇佷俊鎭� + /// </summary> + /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰 Back 鍥藉窘鍙嶉潰 </param> + /// <returns></returns> + [HttpPost] + public async Task<Object> UploadIdCord([FromServices] IEzFileUploadService fileUploadService,IFormFile file, [FromQuery] string PageName = "FRONT") + { + + + var ret= await fileUploadService.UpIdCord(PageName); + return new { Info = ret.Item1, url = ret.Item2 }; + } + + /// <summary> + /// 涓婁紶鍜岃瘑鍒惀涓氭墽鐓� + /// </summary> + /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰 Back 鍥藉窘鍙嶉潰 </param> + /// <returns></returns> + [HttpPost] + public async Task<Object> UpBizLicense([FromServices] IEzFileUploadService fileUploadService, IFormFile file) + { + + + var ret= await fileUploadService.UpBizLicense(); + return new { Info = ret.Item1, url = ret.Item2 }; + + } + /// <summary> + /// 澧炲姞浜鸿劯鐗瑰緛 + /// </summary> + /// <param name="CordId">韬唤璇佸彿</param> + /// <param name="Name">鍚嶇О</param> + /// <param name="Gender">0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + [HttpPost] + public async Task<object> IaiAddPerso([FromServices] IEzFileUploadService fileUploadService, IFormFile file,[FromQuery] string CordId, [FromQuery] string Name, [FromQuery] int Gender) + { + + + var ret= await fileUploadService.IaiAddPerso(CordId, Name,Gender); + return new { IsOK = ret.Item1, url = ret.Item2 }; + + + } + + /// <summary> + /// 澧炲姞浜鸿劯搴� base64 + /// </summary> + /// <param name="param"></param> + /// <returns></returns> + [HttpPost] + public async Task<object> IaiAddPersoBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData param) + { + if (string.IsNullOrEmpty(param.imgBase64)) + throw Oops.Oh("娌℃湁鏂囦欢鍐呭"); + if (string.IsNullOrEmpty(param.Name)) + throw Oops.Oh("娌℃湁濮撳悕"); + if (string.IsNullOrEmpty(param.CordId)) + throw Oops.Oh("娌℃湁韬唤璇佷俊鎭�"); + var ret = await fileUploadService.IaiAddPerso(param.imgBase64, param.CordId, param. Name, param.Gender??0); + return new { IsOK = ret.Item1, url = ret.Item2 }; + + + } + public async Task test([FromServices] ITencentCloudService fileUploadService) + { + + fileUploadService.IaiCreatGroup(); + + } + + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <param name="fileUploadService"></param> + /// <returns></returns> + [HttpPost] + public async Task<string> UpdateFile([FromServices] IEzFileUploadService fileUploadService, IFormFile file) + { + return await fileUploadService.UploadFiles(); + } + /// <summary> + /// 鑾峰彇鍒板鎴风鐨処Pv4 + /// </summary> + /// <param name="httpContextAccessor"></param> + /// <returns></returns> + [HttpGet] + public string GetIp4([FromServices] IHttpContextAccessor httpContextAccessor) + { + var httpc = httpContextAccessor.HttpContext; + var ipv4 = httpc.GetRemoteIpAddressToIPv4(); + return ipv4; + } + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <param name="fileUploadService"></param> + /// <param name="Param"></param> + /// <returns></returns> + [HttpPost] + public async Task<string> UpdateFileBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData Param) + { + return await fileUploadService.UploadFilesFByBase64(Param.imgBase64); + } + [HttpPost] + public async Task<bool> DelFile([FromServices] IEzFileUploadService fileUploadService, DelFileData Param) + { + return await fileUploadService.DelFile(Param.FilePath); + } + } + /// <summary> + /// 涓婁紶鏁版嵁 + /// </summary> + public class UpDataFileData + + { + /// <summary> + /// 鏁版嵁base64 + /// </summary> + public string imgBase64 { get; set; } + /// <summary> + /// 韬唤璇佸彿鐮� + /// </summary> + public string? CordId { get; set; } + /// <summary> + /// 濮撳悕 + /// </summary> + public string? Name { get; set; } + /// <summary> + /// 鎬у埆 + /// </summary> + public int? Gender { get; set; } + } + /// <summary> + /// 涓婁紶鏁版嵁 + /// </summary> + public class DelFileData + + { + /// <summary> + /// 鏁版嵁base64 + /// </summary> + public string FilePath { get; set; } + } + /// <summary> + /// 韬唤璇佽繑鍥炶緭鍑� + /// </summary> + public class IdCordOuput + { + /// <summary> + /// 韬唤璇佺浉鍏充俊鎭� + /// </summary> + public IDCardOCRResponse IdCordInfo { get; set; } + + /// <summary> + /// url + /// </summary> + public string Url { get; set; } + + } +} diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs new file mode 100644 index 0000000..4c6b98e --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs @@ -0,0 +1,240 @@ +锘縰sing Admin.NET.Core.Service; +using Admin.NET.Core; +using Furion.DataEncryption; +using Furion.DynamicApiController; +using Furion.EventBus; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Lazy.Captcha.Core; +using Microsoft.AspNetCore.Http; +using FZCZTB.NET.MD.CutomerMd; +using Microsoft.AspNetCore.Authorization; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel; +using FZCZTB.NET.SYSService.MSM; +using FZCTB.NET.API.Application.Auth.DTO; +using Furion.FriendlyException; +using FZCZTB.NET.SYSService.CustomerSYS; +using Furion; +using NewLife; + +namespace FZCTB.NET.API.Application.Auth +{ + /// <summary> + /// 閴存潈鏈嶅姟 + /// </summary> + [ApiDescriptionSettings("FZCAPISYS", Order = 149)] + public class AuthService: IDynamicApiController + { + + + private readonly UserManager _userManager; + private readonly SqlSugarRepository<FBS_Customer> _sysUserRep; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SysMenuService _sysMenuService; + private readonly SysOnlineUserService _sysOnlineUserService; + private readonly SysConfigService _sysConfigService; + private readonly SysUserService _sysUserService; + private readonly ZCSMSService _sysSmsService; + private readonly SysLdapService _sysLdapService; + private readonly ICaptcha _captcha; + private readonly IEventPublisher _eventPublisher; + private readonly SysCacheService _sysCacheService; + + public AuthService( + SqlSugarRepository<FBS_Customer> sysUserRep, + IHttpContextAccessor httpContextAccessor, + SysOnlineUserService sysOnlineUserService, + SysConfigService sysConfigService, + SysLdapService sysLdapService, + IEventPublisher eventPublisher, + ZCSMSService sysSmsService, + SysCacheService sysCacheService, + SysMenuService sysMenuService, + SysUserService sysUserService, + UserManager userManager, + ICaptcha captcha) + { + _captcha = captcha; + _sysUserRep = sysUserRep; + _userManager = userManager; + _sysSmsService = sysSmsService; + _eventPublisher = eventPublisher; + _sysUserService = sysUserService; + _sysMenuService = sysMenuService; + _sysCacheService = sysCacheService; + _sysConfigService = sysConfigService; + _httpContextAccessor = httpContextAccessor; + _sysOnlineUserService = sysOnlineUserService; + _sysLdapService = sysLdapService; + } + + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鎵嬫満鍙风櫥褰�")] + public virtual async Task<CustomerLoginOutput> LoginPhone([Required] CustomerLoginPhoneInput input) + { + if(input.Code!="TEST") + // 鏍¢獙鐭俊楠岃瘉鐮� + _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x => x.Account == input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + if (user == null) + { + throw Oops.Oh("璇ョ敤鎴锋病鏈夋敞鍐�"); + } + if(user.Status== StatusEnum.Disable) + { + throw Oops.Oh("鐢ㄥ紓甯�"); + } + + + return await CreateToken(user, input.ExRuleCode??""); + } + + /// <summary> + /// 鍒囨崲瑙掕壊 宸茬櫥褰曡繘鍘昏鑹叉垨鑰呭垏鎹㈣鑹叉槸璋冪敤锛岄渶瑕佹浛鎹oken,鐩稿綋浜庣櫥褰� + /// </summary> + [DisplayName("鍒囨崲瑙掕壊")] + public async Task<CustomerLoginOutput> ChangeLogoInExRule(string RuleCode) + { + var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0; + if (id == 0) + { + throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒"); + + } + // + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x => x.Id == id).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + if (user == null) + { + throw Oops.Oh("璇ョ敤鎴锋病鏈夋敞鍐�"); + } + if (user.Status == StatusEnum.Disable) + { + throw Oops.Oh("鐢ㄥ紓甯�"); + } + + return await CreateToken(user, RuleCode); + + } + + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("寰俊鎵爜鐧诲綍")] + public virtual async Task<CustomerLoginOutput> WeiXinLoginPhone([Required] CustomerLoginPhoneInput input) + { + throw Oops.Oh("鍜嬩笉鏀寔寰俊鎵爜鐧诲綍"); + // 鏍¢獙鐭俊楠岃瘉鐮� + _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x=>x.Account==input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + if(user==null) + { + + } + + return await CreateToken(user, input.ExRuleCode ); + } + + /// <summary> + /// 鐢熸垚Token浠ょ墝 馃敄 + /// </summary> + /// <param name="user"></param>\ + /// <param name="sysUserEventTypeEnum"></param>\ + /// <returns></returns> + [NonAction] + internal async Task<CustomerLoginOutput> CreateToken(FBS_Customer user,string ExRuleCode, SysUserEventTypeEnum sysUserEventTypeEnum = SysUserEventTypeEnum.Login) + { + // 鍗曠敤鎴风櫥褰� + await _sysOnlineUserService.SingleLogin(user.Id); + + // 鐢熸垚Token浠ょ墝 + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object> + { + { ClaimConst.UserId, user.Id }, + { ClaimConst.TenantId, user.TenantId }, + { ClaimConst.Account, user.Account }, + { ClaimConst.RealName, user.RealName }, + + { ClaimConst.UserType, "Customer" }, + { ClaimConst.CustomerLogoinType, ExRuleCode }, + }, tokenExpire); + + // 鐢熸垚鍒锋柊Token浠ょ墝 + var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire(); + var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire); + + // 璁剧疆鍝嶅簲鎶ユ枃澶� + _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); + + // Swagger Knife4UI-AfterScript鐧诲綍鑴氭湰 + // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']); + + // 鏇存柊鐢ㄦ埛鐧诲綍淇℃伅 + user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true); + (user.LastLoginAddress, double? longitude, double? latitude) = CommonUtil.GetIpAddress(user.LastLoginIp); + user.LastLoginTime = DateTime.Now; + user.LastLoginDevice = CommonUtil.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent); + await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new + { + u.LastLoginIp, + u.LastLoginAddress, + u.LastLoginTime, + u.LastLoginDevice, + }).ExecuteCommandAsync(); + + var payload = new + { + Entity = user, + Output = new CustomerLoginOutput + { + AccessToken = accessToken, + RefreshToken = refreshToken, + + + + + + + } + }; + payload.Output.ExRoles = new List<CustomerExRoleVm>(); + + foreach (var item in user.CoutomerExRols) + { + + payload.Output.ExRoles.Add(new CustomerExRoleVm + { + Code = item.ExRole.Code, + Name = item.ExRole.Name, + HasFlsh = item.HasFlsh + }); + } + + //鏆傛椂涓嶅嚭鐢ㄦ埛浜嬩欢 + // 鍙戝竷绯荤粺鐢ㄦ埛鎿嶄綔浜嬩欢 + //await _eventPublisher.PublishAsync(sysUserEventTypeEnum, payload); + return payload.Output; + } + } +} diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs new file mode 100644 index 0000000..daab579 --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs @@ -0,0 +1,88 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Furion.DataValidation; +using FZCZTB.NET.MD.CutomerMd; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.Auth.DTO; +public class CustomerLoginOutput +{ + /// <summary> + /// 浠ょ墝Token + /// </summary> + public string AccessToken { get; set; } + + /// <summary> + /// 鍒锋柊Token + /// </summary> + public string RefreshToken { get; set; } + + /// <summary> + /// 鐢ㄦ埛瑙掕壊鍗冲畬鎴愭儏鍐� + /// </summary> + public List<CustomerExRoleVm>? ExRoles { get; set; } +} + +/// <summary> +/// 鐢ㄦ埛瑙掕壊杩涘害 +/// </summary> +public class CustomerExRoleVm +{ + /// <summary> + /// 鍚嶇О + /// </summary> + + + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + + public string? Code { get; set; } + + + /// <summary> + /// 鏄惁瀹屾垚瑙掕壊鍒涘缓 + /// </summary> + public bool HasFlsh { get; set; } = false; + + + +} + +public class CustomerLoginPhoneInput +{ + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + /// <example>admin</example> + [Required(ErrorMessage = "鎵嬫満鍙风爜涓嶈兘涓虹┖")] + [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "鎵嬫満鍙风爜涓嶆纭�")] + public string Phone { get; set; } + + /// <summary> + /// 楠岃瘉鐮� + /// </summary> + /// <example>123456</example> + [Required(ErrorMessage = "楠岃瘉鐮佷笉鑳戒负绌�"), MinLength(4, ErrorMessage = "楠岃瘉鐮佷笉鑳藉皯浜�4涓瓧绗�")] + public string Code { get; set; } + + + /// <summary> + /// 瑙掕壊Code + /// </summary> + public string? ExRuleCode { get; set; } + + +} diff --git a/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj new file mode 100644 index 0000000..c176c65 --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj @@ -0,0 +1,18 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" /> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj" /> + </ItemGroup> + +</Project> diff --git a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs new file mode 100644 index 0000000..de4747c --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs @@ -0,0 +1,326 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using Admin.NET.Core.Service; +using Furion; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using FZCTB.NET.API.Application.User.DTO; +using FZCZTB.NET.MD.ConfigMd; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.NET.MD.CutomerMd.Extend; +using FZCZTB.NET.SYSService.CustomerSYS; +using Mapster; +using MapsterMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using NewLife; +using OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static QRCoder.PayloadGenerator; + +namespace FZCTB.NET.API.Application.User; +/// <summary> +/// 瀹㈡埛鎺у埗 +/// </summary> +[ApiDescriptionSettings("FZCAPISYS", Order = 149)] +public class CustomerService: IDynamicApiController +{ + private readonly CustomerManagerS _customerManager; + + private readonly SysCacheService _sysCacheService; + private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep; + + private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep; + private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep; + /// <summary> + /// 鐢ㄦ埛鎵╁睍 + /// </summary> + private readonly SqlSugarRepository<FBS_CusExtend> _fBS_CusExtendRep; + private IMapper _mapper; + /// <summary> + /// + /// </summary> + public CustomerService(SysCacheService cacheService, CustomerManagerS managerS,SqlSugarRepository<FBS_Customer> repository + , SqlSugarRepository<FBS_EnterpriseType> fbsenrep,IMapper mapper ) + { + _sysCacheService= cacheService; + _customerManager = managerS; + _fBS_CustomerRep = repository; + _fBS_EnterpriseTypeRep = fbsenrep; + _mapper = mapper; + } + + /// <summary> + /// 鐢ㄦ埛娉ㄥ唽 + /// </summary> + /// <returns></returns> + [AllowAnonymous] + [HttpPost] + public async Task<bool> CustomerRegistration(CustomerRDto param ) + { + //_customerManager. + var ExRole= (await _customerManager.GetExRole()).Where(x => x.Code == param.ExRoleCode).FirstOrDefault(); + + if(ExRole==null) + { + throw Oops.Oh("璇烽�夋嫨涓�涓湁鏁堢殑瑙掕壊杩涜娉ㄥ唽"); + } + + //宸查�夎鑹诧紝璇烽�夋嫨涓�涓敞鍐岃鑹� + var data= await _fBS_CustomerRep.AsQueryable().Includes(X => X.CoutomerExRols,y=>y.ExRole).Where(x => x.Account == param.Account).FirstAsync(); + if (data != null) + { + if (data.CoutomerExRols.Any(x => x.ExRole.Code == param.ExRoleCode)) + { + throw Oops.Oh("宸茬粡娉ㄥ唽浜嗚瑙掕壊璇峰嬁閲嶅娉ㄥ唽"); + } + + else + { + throw Oops.Oh("璇ョ敤鎴峰悕閲嶅锛屽鏋滈渶瑕佸璇ョ敤鎴锋坊鍔犵浉搴旇鑹诧紝璇风櫥褰曚换鎰忚鑹插悗娣诲姞"); + } + + } + var vcode= _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{param.Phone}"); + if(param.PhoneVCode!="TEST") + if(vcode!=param.PhoneVCode) + { + //鎵嬫満楠岃瘉鐮侀敊璇� + throw Oops.Oh("鎵嬫満楠岃瘉鐮侀敊璇紝璇疯緭鍏ユ纭殑鎵嬫満楠岃瘉鐮�"); + } + //浣跨敤鍚庣珛鍗冲垹闄� + _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{param.Phone}"); + var dd = param.Adapt<FBS_Customer>(); + dd.RealName = dd.NickName; + + dd.Account = dd.Phone; + dd.Password = ""; + dd.TenantId = 1300000000001; + dd.CreateTime = DateTime.Now; + dd.CreateUserId = 0; + dd.CreateUserName = dd.NickName; + dd.CoutomerExRols = new List<FBS_CoutomerExRole>() + { + new FBS_CoutomerExRole + { + ExRoleId= ExRole?.Id??0 + + + } + }; + + + + + await _fBS_CustomerRep.AsSugarClient().InsertNav(dd).Include(x=>x.CoutomerExRols).ExecuteCommandAsync(); + + + + return true; + } + /// <summary> + /// 娉ㄥ唽鐧诲綍鍙�夎鑹� + /// </summary> + /// <returns></returns> + [AllowAnonymous] + public async Task<List< ExRoleVM>> GetExRole() + { + return await _customerManager.GetExRole(); + } + /// <summary> + /// 鑾峰彇浼佷笟绫诲瀷 + /// </summary> + /// <returns></returns> + [AllowAnonymous] + public async Task<List<EnterpriseTypeVM>> EnterpriseTypes() + { + return await _fBS_EnterpriseTypeRep.AsQueryable().Select<EnterpriseTypeVM>().ToTreeAsync(x=>x.Child,x=>x.ParentId,null,x=>x.Id); + } + + /// <summary> + /// 娉ㄥ唽瑙掕壊鐢ㄦ埛璧勬枡 + /// </summary> + /// <returns></returns> + [HttpPost] + public async Task<bool> CreaterExRolsInformation(CusExtendDto cusExtend ) + { + + var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0; + if (id == 0) + { + throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒"); + + } + var user=await _customerManager.GetCustomer(id); + if(user==null) + { + throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�"); + } + var rols= await _fBS_ExRoleRep.GetFirstAsync(x => x.Code == cusExtend.TransactionCode && x.Status == StatusEnum.Enable); + if(rols==null) + { + throw Oops.Oh("浜ゆ槗涓讳綋涓嶅瓨鍦�"); + } + + if(user.CoutomerExRols.Any(x=>x.ExRole.Code==cusExtend.TransactionCode&& x.HasFlsh==true)) + { + throw Oops.Oh("鐢ㄦ埛宸茬粡娉ㄥ唽浜嗚涓讳綋"); + } + + + var data= cusExtend.Adapt<FBS_CusExtend>(); + + data.steps = CusExtendStep.UNExamine; + data.CustomerId = id; + data.CreateTime = DateTime.Now; + + data.CreateUserName = user.NickName; + data.TransactionCode = rols.Code; + + + return await _fBS_CusExtendRep.InsertAsync(data); + + + + + } + /// <summary> + /// 鑾峰彇 涓汉涓績鏁版嵁锛� + /// </summary> + [HttpPost] + public async Task<CusExtendDto> GetCusExtendInfo() + { + var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0; + if (id == 0) + { + throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒"); + + } + // + var typeCode = App.User.FindFirst(ClaimConst.CustomerLogoinType)?.Value ; + if (typeCode == null) + { + throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋閿欒"); + + } + var user = await _customerManager.GetCustomer(id); + if (user == null) + { + throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�"); + } + var rols = await _fBS_ExRoleRep.GetFirstAsync(x => x.Code == typeCode && x.Status == StatusEnum.Enable); + if (rols == null) + { + throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋鏃犳晥"); + } + var tab= (await _fBS_CusExtendRep.GetFirstAsync(x => x.CustomerId == id && x.TransactionCode == typeCode)).Adapt<CusExtendDto>(); + if(tab==null) + { + throw Oops.Oh("娌℃湁瀹屾垚淇℃伅褰曞叆"); + } + return tab; + + + } + + /// <summary> + /// 淇敼涓汉涓績鏁版嵁 + /// </summary> + [HttpPost] + public async Task<bool> ChangeCusExtend(CusExtendDto InParam) + { + var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0; + if (id == 0) + { + throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒"); + + } + // + var typeCode = App.User.FindFirst(ClaimConst.CustomerLogoinType)?.Value; + if (typeCode == null) + { + throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋閿欒"); + + } + var user = await _customerManager.GetCustomer(id); + if (user == null) + { + throw Oops.Oh("鐢ㄦ埛涓嶅瓨鍦�"); + } + var rols = await _fBS_ExRoleRep.GetFirstAsync(x => x.Code == typeCode && x.Status == StatusEnum.Enable); + if (rols == null) + { + throw Oops.Oh("鐧诲綍浜ゆ槗涓讳綋鏃犳晥"); + } + var tab = await _fBS_CusExtendRep.GetFirstAsync(x => x.CustomerId == id && x.TransactionCode == typeCode); + if (tab == null) + { + throw Oops.Oh("娌℃湁瀹屾垚淇℃伅褰曞叆"); + } + + + + + + //娉曚汉 + if (tab.LegalRepresentativeIdCard != InParam.LegalRepresentativeIdCard) + { + tab.LegalRepresentativeIdCard = InParam.LegalRepresentativeIdCard; + tab.LegalRepresentativeIdNumber = InParam.LegalRepresentativeIdNumber; + tab.LegalRepresentativeName = InParam.LegalRepresentativeName; + tab.LegalRepresentativePhone = InParam.LegalRepresentativePhone; + //閲嶆柊瀹℃牳? + tab.steps = CusExtendStep.Change; + } + + + //浼佷笟淇℃伅 + if (tab.BusinessLicense != InParam.BusinessLicense) + { + tab.EstablishmentTime = tab.EstablishmentTime; + tab.RegisteredCapital = tab.RegisteredCapital; + tab.Residence = tab.Residence; + tab.MainBusiness = InParam.MainBusiness; + tab.EnterpriseType = InParam.EnterpriseType; + tab.EnterpriseName = InParam.EnterpriseName; + tab.BusinessLicense = InParam.BusinessLicense; + //閲嶆柊瀹℃牳? + tab.steps = CusExtendStep.Change; + } + + + //鑱旂郴鐢佃瘽 + tab.EnterprisePhone = InParam.EnterprisePhone; + tab.EnterpriseEmail = InParam.EnterpriseEmail; + //閾惰鏄惁闇�瑕佷慨鏀� + tab.BankAccount = InParam.BankAccount; + tab.BankName = InParam.BankName; + + // 缁忓姙浜� + if (tab.OperatorIdCard != InParam.OperatorIdCard) + { + tab.OperatorIdCard = InParam.OperatorIdCard; + + tab.OperatorIdNumber = InParam.OperatorIdNumber; + tab.OperatorName = InParam.OperatorName; + tab.OperatorPhone = InParam.OperatorPhone; + } + + return await _fBS_CusExtendRep.UpdateAsync(tab); + + } + + + + +} diff --git a/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs new file mode 100644 index 0000000..952a56b --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs @@ -0,0 +1,200 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using FZCZTB.NET.MD.ConfigMd; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.User.DTO; +/// <summary> +/// 浼佷笟绫诲瀷 +/// </summary> +public class EnterpriseTypeVM +{ + /// <summary> + /// id + /// </summary> + [SugarColumn(IsTreeKey = true)] //璁剧疆鍏宠仈瀛楁 + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + + public string Name { get; set; } + /// <summary> + /// 浠g爜 + /// </summary> + + public string Code { get; set; } + /// <summary> + /// 鐖� + /// </summary> + + public long ParentId { get; set; }//鐖剁骇瀛楁 + /// <summary> + /// 瀛愮被 + /// </summary> + + public List<FBS_EnterpriseType> Child { get; set; } +} + +/// <summary> +/// 鐢ㄦ埛瑙掕壊璧勬枡 +/// </summary> +public class CusExtendDto +{ + + /// <summary> + /// 涓婚敭 + /// </summary> + + public long ? Id { get; set; } + + /// <summary> + /// 浼佷笟绫诲瀷 浠庝紒涓氱被鍨嬩腑閫夋嫨 鏉ユ簮浼佷笟绫诲瀷 + /// </summary> + + public string? EnterpriseType { get; set; } + + + /// <summary> + /// 浜ゆ槗涓讳綋 浠g爜 鍚岃鑹蹭唬鐮� + /// </summary> + [Required(ErrorMessage = "浜ゆ槗涓讳綋浠g爜涓哄繀濉」")] + public string? TransactionCode { get; set; } + + /// <summary> + /// 浜ゆ槗涓讳綋鍚嶇О + /// </summary> + public string TransactionName { get; set; } + + /// <summary> + /// 钀ヤ笟鎵х収鏂囦欢璺緞 + /// </summary> + + public string BusinessLicense { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + + public string EnterpriseName { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + + public string UnifiedSocialCreditCode { get; set; } + + /// <summary> + /// 娉ㄥ唽璧勯噾锛堝崟浣嶏細涓囧厓 锛� + /// </summary> + + public decimal RegisteredCapital { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜哄鍚� + /// </summary> + + public string LegalRepresentativeName { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞 + /// </summary> + + public string LegalRepresentativeIdCard { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜 + /// </summary> + + public string LegalRepresentativeIdNumber { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿仈绯荤數璇� + /// </summary> + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + + public string? LegalRepresentativePhone { get; set; } + + /// <summary> + /// 浼佷笟浣忔墍锛堜笅鎷夐�夋嫨锛岄渶缁撳悎瀹為檯鍙�夊�硷紝鍏堝瓧绗︿覆鎺ユ敹 锛� + /// </summary> + + public string Residence { get; set; } + + /// <summary> + /// 浼佷笟鑱旂郴鐢佃瘽 + /// </summary> + + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + public string? EnterprisePhone { get; set; } + + /// <summary> + /// 浼佷笟鎴愮珛鏃堕棿 + /// </summary> + + public DateTime EstablishmentTime { get; set; } + + /// <summary> + /// 浼佷笟涓昏惀涓氬姟 + /// </summary> + + public string MainBusiness { get; set; } + + /// <summary> + /// 浼佷笟閭 + /// </summary> + + [SugarColumn(ColumnDescription = "浼佷笟閭")] + public string EnterpriseEmail { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜哄鍚� + /// </summary> + + public string OperatorName { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇嗭紙涓婁紶鍚庡瓨鍌ㄤ俊鎭級 + /// </summary> + + + public string OperatorIdCard { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鍙风爜 + /// </summary> + + + public string OperatorIdNumber { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿仈绯荤數璇� + /// </summary> + + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + public string OperatorPhone { get; set; } + + /// <summary> + /// 浼佷笟寮�鎴疯 + /// </summary> + + + public string BankName { get; set; } + + /// <summary> + /// 浼佷笟閾惰璐﹀彿 + /// </summary> + public string BankAccount { get; set; } +} + \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs b/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs new file mode 100644 index 0000000..2bd0a91 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/ADPenalty.cs @@ -0,0 +1,62 @@ +锘�//琛屾斂澶勭綒 +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD; + +/// <summary> +/// 琛屾斂澶勭綒 +/// </summary> +[SugarTable("FBD_ADPenalty","琛屾斂澶勭綒")] +[IncreTable] +public class ADPenalty: basemodelNoId +{ + + /// <summary> + /// 鎶曡瘔ID锛屼富閿� + /// </summary> + [SugarColumn(IsPrimaryKey = true)] + public Guid Id { get; set; } + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + [SugarColumn(ColumnDescription = "鍐冲畾鏃ユ湡")] + public DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭紝鍙兘鍖呭惈澶氫釜褰撲簨浜猴紝鐢ㄩ�楀彿鍒嗛殧 + /// </summary> + [SugarColumn(ColumnDescription = "褰撲簨浜轰俊鎭�", IsNullable =true, Length = 255)] + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + [SugarColumn(ColumnDescription = "妗堢敱鎻忚堪", IsNullable = true, Length = int.MaxValue)] + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + [SugarColumn(ColumnDescription = "澶勭悊鍐冲畾鍐呭", IsNullable = true, Length = int.MaxValue)] + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О", IsNullable = true ,Length=255)] + public string? SupervisionDepartment { get; set; } + + + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + [SugarColumn(Length = 255, IsNullable = true, ColumnDescription = "绾夸笂鍦板潃")] + public string Url { get; set; } + +} diff --git a/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs new file mode 100644 index 0000000..5754d57 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs @@ -0,0 +1,47 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.ConfigMd; +/// <summary> +/// 浼佷笟绫婚厤缃〃 +/// </summary> +[SugarTable("FBS_EnterpriseType", "浼佷笟绫婚厤缃〃")] +[SugarIndex("index_{table}_A", nameof(Code), OrderByType.Asc)] +[IncreTable] +public class FBS_EnterpriseType: EntityBaseTenant +{ + + /// <summary> + /// 鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "鍚嶇О", Length = 256)] + public string Name { get; set; } + /// <summary> + /// 浠g爜 + /// </summary> + [SugarColumn(ColumnDescription = "浠g爜", Length = 36)] + public string Code { get; set; } + /// <summary> + /// 鐖� + /// </summary> + [SugarColumn(ColumnDescription = "鐖�")] + public long ParentId { get; set; }//鐖剁骇瀛楁 + /// <summary> + /// 瀛愮被 + /// </summary> + [SugarColumn(IsIgnore = true)] + public List<FBS_EnterpriseType> Child { get; set; } + + +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs new file mode 100644 index 0000000..17e3204 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs @@ -0,0 +1,216 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd.Extend; +/// <summary> +/// 鐢ㄦ埛鎵╁睍琛� 浼佷笟璧勬枡 +/// </summary> +[SugarTable("FBS_CusExtend", "浼佷笟璧勬枡")] +[IncreTable] +public class FBS_CusExtend: EntityBaseTenant +{ + /// <summary> + /// 鐢ㄦ埛ID + /// </summary> + [SugarColumn(ColumnDescription = "鐢ㄦ埛ID" )] + [Required(ErrorMessage = "鐢ㄦ埛ID 蹇呭~")] + public long CustomerId { get; set; } + + + + /// <summary> + /// 浼佷笟绫诲瀷 浠庝紒涓氱被鍨嬩腑閫夋嫨 + /// </summary> + [SugarColumn(ColumnDescription = "浼佷笟绫诲瀷 ", Length = 255)] + [Required(ErrorMessage = "浼佷笟绫诲瀷")] + public string EnterpriseType { get; set; } + + + /// <summary> + /// 浜ゆ槗涓讳綋 浠g爜 鍚岃鑹蹭唬鐮� + /// </summary> + [Required(ErrorMessage = "浜ゆ槗涓讳綋浠g爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浜ゆ槗涓讳綋code")] + public string TransactionCode { get; set; } + /// <summary> + /// 钀ヤ笟鎵х収鏂囦欢璺緞 + /// </summary> + [Required(ErrorMessage = "钀ヤ笟鎵х収鏂囦欢蹇呬紶")] + [SugarColumn(ColumnDescription = "钀ヤ笟鎵х収鏂囦欢璺緞")] + public string BusinessLicense { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + [Required(ErrorMessage = "浼佷笟鍚嶇О涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟鍚嶇О")] + public string EnterpriseName { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + [Required(ErrorMessage = "缁熶竴绀句細淇$敤浠g爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "缁熶竴绀句細淇$敤浠g爜")] + public string UnifiedSocialCreditCode { get; set; } + + /// <summary> + /// 娉ㄥ唽璧勯噾锛堝崟浣嶏細涓囧厓 锛� + /// </summary> + [Required(ErrorMessage = "娉ㄥ唽璧勯噾涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉ㄥ唽璧勯噾")] + public decimal RegisteredCapital { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜哄鍚� + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜哄鍚嶄负蹇呭~椤�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativeName { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞 + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞姣曚紶")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞")] + public string LegalRepresentativeIdCard { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜 + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativeIdNumber { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿仈绯荤數璇� + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿仈绯荤數璇濅负蹇呭~椤�")] + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativePhone { get; set; } + + /// <summary> + /// 浼佷笟浣忔墍锛堜笅鎷夐�夋嫨锛岄渶缁撳悎瀹為檯鍙�夊�硷紝鍏堝瓧绗︿覆鎺ユ敹 锛� + /// </summary> + [Required(ErrorMessage = "浼佷笟浣忔墍涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟浣忔墍")] + public string Residence { get; set; } + + /// <summary> + /// 浼佷笟鑱旂郴鐢佃瘽 + /// </summary> + [Required(ErrorMessage = "浼佷笟鑱旂郴鐢佃瘽涓哄繀濉」")] + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "浼佷笟鑱旂郴鐢佃瘽")] + public string EnterprisePhone { get; set; } + + /// <summary> + /// 浼佷笟鎴愮珛鏃堕棿 + /// </summary> + [Required(ErrorMessage = "鎴愮珛鏃堕棿涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟鎴愮珛鏃堕棿")] + public DateTime EstablishmentTime { get; set; } + + /// <summary> + /// 浼佷笟涓昏惀涓氬姟 + /// </summary> + [Required(ErrorMessage = "涓昏惀涓氬姟涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟涓昏惀涓氬姟")] + public string MainBusiness { get; set; } + + /// <summary> + /// 浼佷笟閭 + /// </summary> + [Required(ErrorMessage = "浼佷笟閭涓哄繀濉」")] + [EmailAddress(ErrorMessage = "閭鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "浼佷笟閭")] + public string EnterpriseEmail { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜哄鍚� + /// </summary> + + [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜哄鍚�", IsNullable = true)] + public string OperatorName { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇嗭紙涓婁紶鍚庡瓨鍌ㄤ俊鎭級 + /// </summary> + + [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇�", IsNullable = true)] + public string OperatorIdCard { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鍙风爜 + /// </summary> + + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�", IsNullable = true)] + public string OperatorIdNumber { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿仈绯荤數璇� + /// </summary> + + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�",IsNullable =true)] + public string OperatorPhone { get; set; } + + /// <summary> + /// 浼佷笟寮�鎴疯 + /// </summary> + [Required(ErrorMessage = "寮�鎴疯涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string BankName { get; set; } + + /// <summary> + /// 浼佷笟閾惰璐﹀彿 + /// </summary> + [Required(ErrorMessage = "閾惰璐﹀彿涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string BankAccount { get; set; } + /// <summary> + /// 瀹℃牳姝ラ + /// </summary> + + [SugarColumn(ColumnDescription = "瀹℃牳姝ラ")] + public CusExtendStep steps { set; get; } = CusExtendStep.UNExamine; +} + +/// <summary> +/// 瑙掕壊璧勬枡瀹℃牳杩涘害 +/// </summary> +public enum CusExtendStep +{ + /// <summary> + /// 鏈鏍� + /// </summary> + UNExamine=0, + /// <summary> + /// 鏇存敼 + /// </summary> + Change, + + /// <summary> + /// 閫氳繃 + /// </summary> + Pass, + /// <summary> + /// 鏈�氳繃 + /// </summary> + UnPass + + + +} \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs new file mode 100644 index 0000000..30e17a6 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs @@ -0,0 +1,41 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// 澶栭儴瑙掕壊琛� +/// </summary> +[SugarTable("FBS_CoutomerExRole", "澶栭儴瑙掕壊琛�")] +[IncreTable] +public class FBS_CoutomerExRole: EntityBaseId +{ + //瀹㈡埛ID + public long CustomerId { get; set; } + + /// <summary> + /// 澶栭儴瑙掕壊 + /// </summary> + public long ExRoleId { get; set; } + + /// <summary> + /// 鏄惁瀹屾垚瑙掕壊鍒涘缓 + /// </summary> + public bool HasFlsh { get; set; }= false; + + /// <summary> + /// 澶栭儴瑙掕壊 + /// </summary> + [Navigate(NavigateType.OneToOne, nameof(ExRoleId))] + public FBS_ExRole ExRole { get; set; } +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs new file mode 100644 index 0000000..cd6db14 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs @@ -0,0 +1,362 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using Furion.FriendlyException; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// 瀹㈡埛琛� +/// </summary> +[SugarTable("FBS_Customer", "瀹㈡埛琛�")] +[SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)] +[SugarIndex("index_{table}_P", nameof(Phone), OrderByType.Asc)] +[IncreTable] +public partial class FBS_Customer : EntityBaseTenant +{ + /// <summary> + /// 璐﹀彿 + /// </summary> + [SugarColumn(ColumnDescription = "璐﹀彿", Length = 32)] + [Required, MaxLength(32)] + public virtual string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512,IsNullable =true)] + [MaxLength(512)] + + public virtual string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + [SugarColumn(ColumnDescription = "鐪熷疄濮撳悕", Length = 32)] + [MaxLength(32)] + public virtual string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + [SugarColumn(ColumnDescription = "鏄电О", Length = 32)] + [MaxLength(32)] + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + [SugarColumn(ColumnDescription = "澶村儚", Length = 512)] + [MaxLength(512)] + public string? Avatar { get; set; } + + ///// <summary> + ///// 鎬у埆-鐢穇1銆佸コ_2 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎬у埆")] + //public GenderEnum Sex { get; set; } = GenderEnum.Male; + + ///// <summary> + ///// 骞撮緞 + ///// </summary> + //[SugarColumn(ColumnDescription = "骞撮緞")] + //public int Age { get; set; } + + ///// <summary> + ///// 鍑虹敓鏃ユ湡 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍑虹敓鏃ユ湡")] + //public DateTime? Birthday { get; set; } + + ///// <summary> + ///// 姘戞棌 + ///// </summary> + //[SugarColumn(ColumnDescription = "姘戞棌", Length = 32)] + //[MaxLength(32)] + //public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + [SugarColumn(ColumnDescription = "鎵嬫満鍙风爜", Length = 16)] + [MaxLength(16)] + public string? Phone { get; set; } + + ///// <summary> + ///// 璇佷欢绫诲瀷 + ///// </summary> + //[SugarColumn(ColumnDescription = "璇佷欢绫诲瀷")] + //public CardTypeEnum CardType { get; set; } + + ///// <summary> + ///// 韬唤璇佸彿 + ///// </summary> + //[SugarColumn(ColumnDescription = "韬唤璇佸彿", Length = 32)] + //[MaxLength(32)] + //public string? IdCardNum { get; set; } + + + ///// <summary> + ///// 韬唤璇佸彿 + ///// </summary> + //[SugarColumn(ColumnDescription = "韬唤璇�", Length = 512)] + //[MaxLength(512)] + //public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + [SugarColumn(ColumnDescription = "閭", Length = 64)] + [MaxLength(64)] + public string? Email { get; set; } + + ///// <summary> + ///// 鍦板潃 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍦板潃", Length = 256)] + //[MaxLength(256)] + //public string? Address { get; set; } + + ///// <summary> + ///// 鏂囧寲绋嬪害 + ///// </summary> + //[SugarColumn(ColumnDescription = "鏂囧寲绋嬪害")] + //public CultureLevelEnum CultureLevel { get; set; } + + ///// <summary> + ///// 鏀挎不闈㈣矊 + ///// </summary> + //[SugarColumn(ColumnDescription = "鏀挎不闈㈣矊", Length = 16)] + //[MaxLength(16)] + //public string? PoliticalOutlook { get; set; } + + ///// <summary> + ///// 姣曚笟闄㈡牎 + ///// </summary>COLLEGE + //[SugarColumn(ColumnDescription = "姣曚笟闄㈡牎", Length = 128)] + //[MaxLength(128)] + //public string? College { get; set; } + + ///// <summary> + ///// 鍔炲叕鐢佃瘽 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕鐢佃瘽", Length = 16)] + //[MaxLength(16)] + //public string? OfficePhone { get; set; } + + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉", Length = 32)] + //[MaxLength(32)] + //public string? EmergencyContact { get; set; } + + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉鐢佃瘽 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鐢佃瘽", Length = 16)] + //[MaxLength(16)] + //public string? EmergencyPhone { get; set; } + + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉鍦板潃 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鍦板潃", Length = 256)] + //[MaxLength(256)] + //public string? EmergencyAddress { get; set; } + + ///// <summary> + ///// 涓汉绠�浠� + ///// </summary> + //[SugarColumn(ColumnDescription = "涓汉绠�浠�", Length = 512)] + //[MaxLength(512)] + //public string? Introduction { get; set; } + + ///// <summary> + ///// 鎺掑簭 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎺掑簭")] + //public int OrderNo { get; set; } = 100; + + /// <summary> + /// 鐘舵�� + /// </summary> + [SugarColumn(ColumnDescription = "鐘舵��")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// <summary> + /// 澶囨敞 + /// </summary> + [SugarColumn(ColumnDescription = "澶囨敞", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + ///// <summary> + ///// 璐﹀彿绫诲瀷 + ///// </summary> + //[SugarColumn(ColumnDescription = "璐﹀彿绫诲瀷")] + //public AccountTypeEnum AccountType { get; set; } = AccountTypeEnum.NormalUser; + + ///// <summary> + ///// 鐩村睘鏈烘瀯Id + ///// </summary> + //[SugarColumn(ColumnDescription = "鐩村睘鏈烘瀯Id")] + //public long OrgId { get; set; } + + /// <summary> + /// 鐩村睘鏈烘瀯 + /// </summary> + //[Navigate(NavigateType.OneToOne, nameof(OrgId))] + //public SysOrg SysOrg { get; set; } + + /// <summary> + /// 鐩村睘涓荤Id + /// </summary> + //[SugarColumn(ColumnDescription = "鐩村睘涓荤Id")] + //public long? ManagerUserId { get; set; } + + /// <summary> + /// 鐩村睘涓荤 + /// </summary> + //[Newtonsoft.Json.JsonIgnore] + //[System.Text.Json.Serialization.JsonIgnore] + //[Navigate(NavigateType.OneToOne, nameof(ManagerUserId))] + //public SysUser ManagerUser { get; set; } + + ///// <summary> + ///// 鑱屼綅Id + ///// </summary> + //[SugarColumn(ColumnDescription = "鑱屼綅Id")] + //public long PosId { get; set; } + + ///// <summary> + ///// 鑱屼綅 + ///// </summary> + //[Newtonsoft.Json.JsonIgnore] + //[System.Text.Json.Serialization.JsonIgnore] + //[Navigate(NavigateType.OneToOne, nameof(PosId))] + //public SysPos SysPos { get; set; } + + ///// <summary> + ///// 宸ュ彿 + ///// </summary> + //[SugarColumn(ColumnDescription = "宸ュ彿", Length = 32)] + //[MaxLength(32)] + //public string? JobNum { get; set; } + + ///// <summary> + ///// 鑱岀骇 + ///// </summary> + //[SugarColumn(ColumnDescription = "鑱岀骇", Length = 32)] + //[MaxLength(32)] + //public string? PosLevel { get; set; } + + ///// <summary> + ///// 鑱岀О + ///// </summary> + //[SugarColumn(ColumnDescription = "鑱岀О", Length = 32)] + //[MaxLength(32)] + //public string? PosTitle { get; set; } + + ///// <summary> + ///// 鎿呴暱棰嗗煙 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎿呴暱棰嗗煙", Length = 32)] + //[MaxLength(32)] + //public string? Expertise { get; set; } + + ///// <summary> + ///// 鍔炲叕鍖哄煙 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕鍖哄煙", Length = 32)] + //[MaxLength(32)] + //public string? OfficeZone { get; set; } + + ///// <summary> + ///// 鍔炲叕瀹� + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕瀹�", Length = 32)] + //[MaxLength(32)] + //public string? Office { get; set; } + + ///// <summary> + ///// 鍏ヨ亴鏃ユ湡 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍏ヨ亴鏃ユ湡")] + //public DateTime? JoinDate { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰旾p + /// </summary> + [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰旾p", Length = 256)] + [MaxLength(256)] + public string? LastLoginIp { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曞湴鐐� + /// </summary> + [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曞湴鐐�", Length = 128)] + [MaxLength(128)] + public string? LastLoginAddress { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曟椂闂� + /// </summary> + [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曟椂闂�")] + public DateTime? LastLoginTime { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曡澶� + /// </summary> + [SugarColumn(ColumnDescription = "鏈�鏂扮櫥褰曡澶�", Length = 128)] + [MaxLength(128)] + public string? LastLoginDevice { get; set; } + + /// <summary> + /// 鐢靛瓙绛惧悕 + /// </summary> + [SugarColumn(ColumnDescription = "鐢靛瓙绛惧悕", Length = 512)] + [MaxLength(512)] + public string? Signature { get; set; } + + /// <summary> + /// 澶栭儴瑙勫垯锛岀櫥褰曡鑹� + /// </summary> + [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))] + public List<FBS_CoutomerExRole> CoutomerExRols { set; get; } + + ///// <summary> + ///// 楠岃瘉瓒呯骇绠$悊鍛樼被鍨嬶紝鑻ヨ处鍙风被鍨嬩负瓒呯骇绠$悊鍛樺垯鎶ラ敊 + ///// </summary> + ///// <param name="errorMsg">鑷畾涔夐敊璇秷鎭�</param> + //public void ValidateIsSuperAdminAccountType(ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1014) + //{ + // if (AccountType == AccountTypeEnum.SuperAdmin) + // { + // throw Oops.Oh(errorMsg); + // } + //} + + /// <summary> + /// 楠岃瘉鐢ㄦ埛Id鏄惁鐩稿悓锛岃嫢鐢ㄦ埛Id鐩稿悓鍒欐姤閿� + /// </summary> + /// <param name="userId">鐢ㄦ埛Id</param> + /// <param name="errorMsg">鑷畾涔夐敊璇秷鎭�</param> + public void ValidateIsUserId(long userId, ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1001) + { + if (Id == userId) + { + throw Oops.Oh(errorMsg); + } + } +} \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs new file mode 100644 index 0000000..12037b4 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs @@ -0,0 +1,50 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +[SugarTable("FBS_CustomerRole", "瀹㈡埛鑿滃崟琛�")] +[IncreTable] +public class FBS_CustomerRole : EntityBaseId +{ + /// <summary> + /// 鐢ㄦ埛Id + /// </summary> + [SugarColumn(ColumnDescription = "鐢ㄦ埛Id")] + public long CutomerId { get; set; } + + /// <summary> + /// 鐢ㄦ埛 + /// </summary> + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(CutomerId))] + public SysUser SysUser { get; set; } + + /// <summary> + /// 瑙掕壊Id + /// </summary> + [SugarColumn(ColumnDescription = "瑙掕壊Id")] + public long RoleId { get; set; } + + /// <summary> + /// 瑙掕壊 + /// </summary> + [Navigate(NavigateType.OneToOne, nameof(RoleId))] + public SysRole SysRole { get; set; } + + + + + +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs new file mode 100644 index 0000000..a9a32cb --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs @@ -0,0 +1,65 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// 鐧诲綍鍗宠閫夋嫨鐨勬牎鑹� +/// </summary> + +[SugarTable("FBS_ExRole", "瀹㈡埛涓诲垎绫昏鑹�")] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +[IncreTable] +public class FBS_ExRole: EntityBaseTenant +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "鍚嶇О", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [SugarColumn(ColumnDescription = "缂栫爜", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [SugarColumn(ColumnDescription = "鎺掑簭")] + public int OrderNo { get; set; } = 100; + + /// <summary> + /// 鏁版嵁鑼冨洿锛�1鍏ㄩ儴鏁版嵁 2鏈儴闂ㄥ強浠ヤ笅鏁版嵁 3鏈儴闂ㄦ暟鎹� 4浠呮湰浜烘暟鎹� 5鑷畾涔夋暟鎹級 + /// </summary> + [SugarColumn(ColumnDescription = "鏁版嵁鑼冨洿")] + public DataScopeEnum DataScope { get; set; } = DataScopeEnum.All; + + /// <summary> + /// 澶囨敞 + /// </summary> + [SugarColumn(ColumnDescription = "澶囨敞", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [SugarColumn(ColumnDescription = "鐘舵��")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs new file mode 100644 index 0000000..c3e7afc --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs @@ -0,0 +1,34 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// 绯荤粺绉熸埛鑿滃崟琛� +/// </summary> +[SugarTable("FBS_ExRoleMenu", "绯荤粺绉熸埛鑿滃崟琛�")] +[IncreTable] +class FBS_ExRoleMenu: EntityBaseId +{ + /// <summary> + /// 绉熸埛Id + /// </summary> + [SugarColumn(ColumnDescription = "绉熸埛Id")] + public long ExRoleId { get; set; } + + /// <summary> + /// 鑿滃崟Id + /// </summary> + [SugarColumn(ColumnDescription = "鑿滃崟Id")] + public long MenuId { get; set; } +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs new file mode 100644 index 0000000..c3156d0 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs @@ -0,0 +1,142 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// +/// </summary> +[SugarTable("FBS_Menu", "瀹㈡埛绯荤粺鑿滃崟琛�")] +[SugarIndex("index_{table}_T", nameof(Title), OrderByType.Asc)] +[SugarIndex("index_{table}_T2", nameof(Type), OrderByType.Asc)] +[IncreTable] +public class FBS_Menu: EntityBaseTenant +{ + /// <summary> + /// 鐖禝d + /// </summary> + [SugarColumn(ColumnDescription = "鐖禝d")] + public long Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷锛�1鐩綍 2鑿滃崟 3鎸夐挳锛� + /// </summary> + [SugarColumn(ColumnDescription = "鑿滃崟绫诲瀷")] + public MenuTypeEnum Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "璺敱鍚嶇О", Length = 64)] + [MaxLength(64)] + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + [SugarColumn(ColumnDescription = "璺敱鍦板潃", Length = 128)] + [MaxLength(128)] + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + [SugarColumn(ColumnDescription = "缁勪欢璺緞", Length = 128)] + [MaxLength(128)] + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + [SugarColumn(ColumnDescription = "閲嶅畾鍚�", Length = 128)] + [MaxLength(128)] + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + [SugarColumn(ColumnDescription = "鏉冮檺鏍囪瘑", Length = 128)] + [MaxLength(128)] + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "鑿滃崟鍚嶇О", Length = 64)] + [Required, MaxLength(64)] + public virtual string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + [SugarColumn(ColumnDescription = "鍥炬爣", Length = 128)] + [MaxLength(128)] + public string? Icon { get; set; } = "ele-Menu"; + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + [SugarColumn(ColumnDescription = "鏄惁鍐呭祵")] + public bool IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + [SugarColumn(ColumnDescription = "澶栭摼閾炬帴", Length = 256)] + [MaxLength(256)] + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + [SugarColumn(ColumnDescription = "鏄惁闅愯棌")] + public bool IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + [SugarColumn(ColumnDescription = "鏄惁缂撳瓨")] + public bool IsKeepAlive { get; set; } = true; + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + [SugarColumn(ColumnDescription = "鏄惁鍥哄畾")] + public bool IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [SugarColumn(ColumnDescription = "鎺掑簭")] + public int OrderNo { get; set; } = 100; + + /// <summary> + /// 鐘舵�� + /// </summary> + [SugarColumn(ColumnDescription = "鐘舵��")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// <summary> + /// 澶囨敞 + /// </summary> + [SugarColumn(ColumnDescription = "澶囨敞", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + /// <summary> + /// 鑿滃崟瀛愰」 + /// </summary> + [SugarColumn(IsIgnore = true)] + public List<SysMenu> Children { get; set; } = new(); +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs new file mode 100644 index 0000000..f1ec761 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs @@ -0,0 +1,63 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionRequest.Types; + +namespace FZCZTB.NET.MD.CutomerMd; + +[SugarTable("FBS_Role", "瀹㈡埛涓�у寲瑙掕壊")] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +[IncreTable] +public class FBS_Role : EntityBaseTenant +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "鍚嶇О", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [SugarColumn(ColumnDescription = "缂栫爜", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [SugarColumn(ColumnDescription = "鎺掑簭")] + public int OrderNo { get; set; } = 100; + + /// <summary> + /// 鏁版嵁鑼冨洿锛�1鍏ㄩ儴鏁版嵁 2鏈儴闂ㄥ強浠ヤ笅鏁版嵁 3鏈儴闂ㄦ暟鎹� 4浠呮湰浜烘暟鎹� 5鑷畾涔夋暟鎹級 + /// </summary> + [SugarColumn(ColumnDescription = "鏁版嵁鑼冨洿")] + public DataScopeEnum DataScope { get; set; } = DataScopeEnum.Self; + + /// <summary> + /// 澶囨敞 + /// </summary> + [SugarColumn(ColumnDescription = "澶囨敞", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [SugarColumn(ColumnDescription = "鐘舵��")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs new file mode 100644 index 0000000..0107262 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs @@ -0,0 +1,41 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; + +[SugarTable("FBS_RoleMenu", "涓�у寲鏍¤壊鑿滃崟")] +[IncreTable] +public class FBS_RoleMenu: EntityBaseId +{ + + /// <summary> + /// 瑙掕壊Id + /// </summary> + [SugarColumn(ColumnDescription = "瑙掕壊Id")] + public long RoleId { get; set; } + + /// <summary> + /// 鑿滃崟Id + /// </summary> + [SugarColumn(ColumnDescription = "鑿滃崟Id")] + public long MenuId { get; set; } + + /// <summary> + /// 鑿滃崟 + /// </summary> + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(MenuId))] + public SysMenu SysMenu { get; set; } +} diff --git a/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs index c566b19..e47e76c 100644 --- a/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs +++ b/Admin.NET/FZCZTB.NET.MD/ProcurementComplaint.cs @@ -76,7 +76,7 @@ /// <summary> /// 鎶曡瘔浜嬮」 /// </summary> - [Navigate(NavigateType.OneToMany,nameof(ProcurementComplaintItems.ComplaintId), nameof(ProcurementComplaint.Id))] + [Navigate(NavigateType.OneToMany,nameof(ProcurementComplaintItems.ComplaintId))] public List<ProcurementComplaintItems>? Complaints { get; set; } } @@ -109,7 +109,7 @@ /// 澶勭悊缁撴灉 /// </summary> [SugarColumn(IsNullable = true, ColumnDescription = "澶勭悊缁撴灉")] - public PComplaintStatus HandlingStatus { get; set; } + public PComplaintStatus? HandlingStatus { get; set; } /// <summary> /// 澶勭悊鎻忚堪 /// </summary> @@ -148,7 +148,7 @@ [Description("閮ㄥ垎鎴愮珛")] PartiallyValid = 3 - + } public class basemodelNoId diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs new file mode 100644 index 0000000..ab8c7ca --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs @@ -0,0 +1,229 @@ +锘縰sing Admin.NET.Core; +using Admin.NET.Core.Service; +using Furion.DependencyInjection; +using Furion.FriendlyException; +using FZCZTB.NET.MD.CutomerMd; +using Mapster; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService.CustomerSYS +{ + /// <summary> + /// customermanger 鏈嶅姟 + /// </summary> + public class CustomerManagerS: IScoped + { + private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep; + private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep; + private readonly SysCacheService _sysCacheService; + + public CustomerManagerS(SysCacheService sysCacheService, + SqlSugarRepository<FBS_ExRole> fBS_ExRoleRep, + SqlSugarRepository<FBS_Customer> fBS_CustomerRep) + { + _sysCacheService = sysCacheService; + _fBS_ExRoleRep = fBS_ExRoleRep; + _fBS_CustomerRep = fBS_CustomerRep; + } + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task< List<ExRoleVM>> GetExRole() + { + return await _fBS_ExRoleRep.AsQueryable().Where(x=>x.Status== StatusEnum.Enable) + .Select<ExRoleVM>().WithCache(20).ToListAsync(); + + } + + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task<CustomerRDto> GetCustomer(long id) + { + + + return await _fBS_CustomerRep.AsQueryable().Where(x=>x.Id==id&&x.Status== StatusEnum.Enable).Includes(x=>x.CoutomerExRols,y=>y.ExRole) + .Select<CustomerRDto>().WithCache(20).FirstAsync(); + //return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>(); + + + + + + } + + + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task<CustomerRDto> UpDataCustomer(int id) + { + + + + return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>(); + + + + + + } + + + + } + + + /// <summary> + /// 瀹㈡埛涓诲垎绫昏鑹插熀纭�杈撳叆鍙傛暟 + /// </summary> + public class ExRoleVM + { + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + public virtual string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public virtual string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")] + public virtual DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public virtual StatusEnum? Status { get; set; } + + } + + + /// <summary> + /// 瀹㈡埛琛ㄨ緭鍑哄弬鏁� + /// </summary> + public class CustomerRDto + { + /// <summary> + /// 璐﹀彿 + /// </summary> + + public virtual string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + + [MaxLength(512)] + + public virtual string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + + [MaxLength(32)] + public virtual string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + + [MaxLength(32)] + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + + [MaxLength(512)] + public string? Avatar { get; set; } + + + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + + [MaxLength(16)] + public string? Phone { get; set; } + + + + /// <summary> + /// 閭 + /// </summary> + + [MaxLength(64)] + public string? Email { get; set; } + + + + + /// <summary> + /// 澶囨敞 + /// </summary> + + [MaxLength(256)] + public string? Remark { get; set; } + + + + + /// <summary> + /// 鐢靛瓙绛惧悕 + /// </summary> + + public string? Signature { get; set; } + + /// <summary> + /// 鐧诲綍瑙掕壊 + /// </summary> + [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))] + public List<FBS_CoutomerExRole> CoutomerExRols { set; get; } + + /// <summary> + /// 娉ㄥ唽鐢ㄦ埛瑙掕壊 + /// </summary> + public string? ExRoleCode { get; set; } + + /// <summary> + /// 鐢ㄦ埛娉ㄥ唽鎵嬫満楠岃瘉鐮� + /// </summary> + public string? PhoneVCode { get; set; } + + } +} diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj new file mode 100644 index 0000000..451ec3d --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj @@ -0,0 +1,21 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> + </ItemGroup> + + <ItemGroup> + <None Update="FZCZTSYSServiceConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + +</Project> diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json new file mode 100644 index 0000000..84183ff --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json @@ -0,0 +1,27 @@ +{ + "SMSConfig": { + + "lingKai": { //鍑屽嚡鐭俊閰嶇疆 + "Url": "https://mb345.com/ws/BatchSend2.aspx", + "Number": "XP010534", + "AccountPassPassword": "123321", + "VerifyTimeOut": "60", //绉� + "Templates": [ + { + "Id": "0", + "SignName": "銆愭斂閲囧挩璇㈢綉銆�", //闇�瑕佸姞鍏ョ殑鍏徃鏍囩 + "TemplateCode": "VCode", + "Content": "鎮ㄥソ锛屾偍鐨勯獙璇佺爜鏄細${code}" + + + }, + { + "Id": "1", + "SignName": "銆愭斂閲囧挩璇㈢綉銆�", + "TemplateCode": "RegistrationOK ", + "Content": "娉ㄥ唽鎴愬姛锛屾劅璋㈡偍鐨勬敞鍐岋紝璇峰Ε鍠勪繚绠℃偍鐨勮处鎴蜂俊鎭�" + } + ] + } + } +} \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs new file mode 100644 index 0000000..3cd5e0b --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs @@ -0,0 +1,48 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using Furion.ConfigurableOptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService.MSM; +public class SMSConfigOptions : IConfigurableOptions +{ + + + /// <summary> + /// 鍑屽嚡淇℃伅閰嶇疆 + /// </summary> + public LingKaiXinxiSets lingKai { get; set; } +} + +public class LingKaiXinxiSets +{ + /// <summary> + /// d鍦板潃 + /// </summary> + public string Url { get; set; } + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Number { get; set; } + /// <summary> + /// 瀵嗙爜 + /// </summary> + public string AccountPassPassword { get; set; } + /// <summary> + /// 瓒呮椂鏃堕棿 + /// </summary> + public string VerifyTimeOut { get; set; } + /// <summary> + /// Templates + /// </summary> + public List<SmsTemplate>? Templates { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs new file mode 100644 index 0000000..051b110 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs @@ -0,0 +1,216 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Admin.NET.Core; +using Furion.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Dm.util; +using Aop.Api.Domain; +using Furion.FriendlyException; +using Furion.DataValidation; +using static QRCoder.PayloadGenerator; +using System.Net; +using Org.BouncyCastle.Asn1.Ocsp; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Furion.DynamicApiController; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Yitter.IdGenerator; +using Lazy.Captcha.Core; +using Furion; +using NewLife; + +namespace FZCZTB.NET.SYSService.MSM; +/// <summary> +/// 鏀块噰鐭俊鏈嶅姟 +/// </summary> +[AllowAnonymous] +[ApiDescriptionSettings("FZCAPISYS",Order = 149)] +public class ZCSMSService : IDynamicApiController,ITransient +{ + private readonly SMSConfigOptions _smsOptions; + private readonly SysCacheService _sysCacheService; + private readonly ICaptcha _captcha; + public ZCSMSService(IOptions<SMSConfigOptions> smsOptions, + SysCacheService sysCacheService, + ICaptcha captcha + ) + { + + _smsOptions = smsOptions.Value; + _sysCacheService = sysCacheService; + + _captcha = captcha; + } + + + /// <summary> + /// 鏍规嵁钘忕敤妯$増鏍煎紡鍖栫煭淇″唴瀹� 浼氳嚜鍔ㄨ创涓婃爣绛� + /// </summary> + /// <param name="Code"> 闇�瑕佹浛鎹㈢殑鍐呭锛岀敤浜庢浛鎹㈡湯鐝唴瀹圭殑code閮ㄥ垎</param> + /// <param name="Key"></param> + [NonAction] + public string FormartMessage(string? Code, string Key = "VCode") + { + var Temp= _smsOptions.lingKai.Templates.Where(x => x.TemplateCode == Key).FirstOrDefault(); + if ( Temp != null ) + { + if(Code != null) + { + + return Temp.Content.replace("${code}", Code) + Temp.SignName; + + } + + else + return Temp.Content+Temp.SignName; + } + if (Code == null) + throw Oops.Oh("鐭俊鍐呭涓虹┖"); + return Code; + } + + + /// <summary> + /// 鍙戦�佺煭淇� + /// </summary> + /// <param name="Content">瑕佹浛鎹㈢殑鍐呭</param> + [NonAction] + public async Task SendSMSAsync(string Content,string Phone) + { + if (!Phone.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�"); + + if( string.IsNullOrEmpty(Content)) throw Oops.Oh("璇峰~鍐欐纭殑鎵嬫満鍙风爜"); + + string postdata1 = "CorpID=" + _smsOptions.lingKai.Number + "&Pwd=" + _smsOptions.lingKai.AccountPassPassword + "&Mobile=" + Phone + "&Content="+ Content + "&SendTime="; + string code = (string)await HttpPost(_smsOptions.lingKai.Url, postdata1); + + var data = Convert.ToInt64(code); + if (data > 0) + { + return ; + } + Oops.Oh($"鍙戦�佺煭淇″け璐ワ紝閿欒鐮亄data}"); + + + } + + + + + /// <summary> + /// 鑾峰彇楠岃瘉鐮� 馃敄 + /// </summary> + /// <returns></returns> + [AllowAnonymous] + [SuppressMonitor] + [DisplayName("鑾峰彇楠岃瘉鐮�")] + public dynamic GetCaptcha() + { + var codeId = YitIdHelper.NextId().ToString(); + var captcha = _captcha.Generate(codeId); + var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60; + return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds }; + } + + /// <summary> + /// 鏍¢獙鐭俊楠岃瘉鐮� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鏍¢獙鐭俊楠岃瘉鐮�")] + public bool VerifyCode(SmsVerifyCodeInput input) + { + var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + + if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�"); + + if (verifyCode != input.Code) throw Oops.Oh("楠岃瘉鐮侀敊璇紒"); + _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + return true; + } + /// <summary> + /// 鍙戦�侀獙璇佺煭淇★紝瑕佽楠岃瘉鐮� 闇�瑕佽緭鍏ユ牎楠岋紝閬垮厤鐢佃剳鏀诲嚮 + /// </summary> + /// <param name="phoneNumber"> 鐢佃瘽鍙风爜</param> + /// <param name="VerifyCode">鍥剧墖鏍¢獙鏁版嵁</param> + /// <param name="VerifyCodeId">妫�楠岀殑ID</param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鍙戦�侀獙璇佺爜")] + public async Task SendSMS([Required] string phoneNumber , [Required] string VerifyCode, [Required] string VerifyCodeId) + { + if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�"); + + // 鏍¢獙楠岃瘉鐮� + if (!_captcha.Validate(VerifyCodeId, VerifyCode)) throw Oops.Oh(ErrorCodeEnum.D0008); + _captcha.Generate(VerifyCodeId); + + // 鐢熸垚闅忔満楠岃瘉鐮� + var random = new Random(); + var verifyCode = random.Next(100000, 999999); + + var templateParam = new + { + code = verifyCode + }; + var code= FormartMessage(verifyCode.toString()); + + await SendSMSAsync(code, phoneNumber); + + _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut.ToInt())); + + + + + } + + /// <summary> + /// 鍙戦�侀獙璇佺爜 + /// </summary> + /// <param name="Url"> 閾炬帴</param> + /// <param name="postDataStr"> 楠岃瘉鐮�</param> + /// <returns></returns> + private async Task<string> HttpPost(string Url, string postDataStr) + { + //HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); + //request.Method = "POST"; + //request.ContentType = "application/x-www-form-urlencoded;charset=gb2312"; + + //byte[] postData = Encoding.GetEncoding("gb2312").GetBytes(postDataStr); + //request.ContentLength = postData.Length; + //Stream myRequestStream = request.GetRequestStream(); + //myRequestStream.Write(postData, 0, postData.Length); + //myRequestStream.Close(); + //HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); + //Stream myResponseStream = response.GetResponseStream(); + //StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312")); + //string retString = myStreamReader.ReadToEnd(); + //myStreamReader.Close(); + //myResponseStream.Close(); + + //return retString; + // 鍒涘缓 HttpClient 瀹炰緥 + using var httpClient = new HttpClient(); + // 鍑嗗瑕佸彂閫佺殑鍐呭锛岃缃紪鐮佸拰鍐呭绫诲瀷 + var content = new StringContent(postDataStr, Encoding.GetEncoding("gb2312"), "application/x-www-form-urlencoded"); + // 鍙戦�� POST 璇锋眰 + var response = await httpClient.PostAsync(Url, content); + // 纭繚璇锋眰鎴愬姛锛岃嫢澶辫触鍒欐姏鍑哄紓甯� + response.EnsureSuccessStatusCode(); + // 璇诲彇鍝嶅簲鍐呭 + return await response.Content.ReadAsStringAsync(); + } + +} diff --git a/Admin.NET/FZCZTB.NET.SYSService/Startup.cs b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs new file mode 100644 index 0000000..f93437f --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs @@ -0,0 +1,32 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using AspNetCoreRateLimit; +using Furion; +using FZCZTB.NET.SYSService.MSM; +using IPTools.Core; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService; +[AppStartup(int.MaxValue -1)] +public class Startup: AppStartup +{ + + public void ConfigureServices(IServiceCollection services) + { + services.AddConfigurableOptions<SMSConfigOptions>(); + + + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs new file mode 100644 index 0000000..971a6a7 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/CustomerSYSTemConst.cs @@ -0,0 +1,17 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.Net.CustomerSYSTem; +public class CustomerSYSTemConst +{ + public const string GroupName = "FZCCustomerGroupName"; +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj new file mode 100644 index 0000000..05ae595 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj @@ -0,0 +1,16 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" /> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> + </ItemGroup> + +</Project> diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs new file mode 100644 index 0000000..1fca754 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerDto.cs @@ -0,0 +1,241 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto; + +/// <summary> +/// 瀹㈡埛琛ㄨ緭鍑哄弬鏁� +/// </summary> +public class FBS_CustomerDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + public string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + public GenderEnum Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + public int Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + public DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + public string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + public CardTypeEnum CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + public string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + public string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + public string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + public CultureLevelEnum CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + public string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + public string? PosTitle { get; set; } + + /// <summary> + /// 鎿呴暱棰嗗煙 + /// </summary> + public string? Expertise { get; set; } + + /// <summary> + /// 鍔炲叕鍖哄煙 + /// </summary> + public string? OfficeZone { get; set; } + + /// <summary> + /// 鍔炲叕瀹� + /// </summary> + public string? Office { get; set; } + + /// <summary> + /// 鍏ヨ亴鏃ユ湡 + /// </summary> + public DateTime? JoinDate { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰旾p + /// </summary> + public string? LastLoginIp { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曞湴鐐� + /// </summary> + public string? LastLoginAddress { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曟椂闂� + /// </summary> + public DateTime? LastLoginTime { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曡澶� + /// </summary> + public string? LastLoginDevice { get; set; } + + /// <summary> + /// 鐢靛瓙绛惧悕 + /// </summary> + public string? Signature { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs new file mode 100644 index 0000000..dff9f10 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerInput.cs @@ -0,0 +1,875 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto; + +/// <summary> +/// 瀹㈡埛琛ㄥ熀纭�杈撳叆鍙傛暟 +/// </summary> +public class FBS_CustomerBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")] + public virtual string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")] + public virtual string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")] + public virtual string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + public virtual string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + public virtual string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + [Dict(nameof(GenderEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")] + public virtual GenderEnum? Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")] + public virtual int? Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + public virtual DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + public virtual string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + public virtual string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + [Dict(nameof(CardTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")] + public virtual CardTypeEnum? CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + public virtual string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + public virtual string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + public virtual string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + public virtual string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + [Dict(nameof(CultureLevelEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")] + public virtual CultureLevelEnum? CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + public virtual string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + public virtual string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + public virtual string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + public virtual string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + public virtual string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + public virtual string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + public virtual string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public virtual StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + public virtual string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + public virtual string? PosTitle { get; set; } + +} + +/// <summary> +/// 瀹㈡埛琛ㄥ垎椤垫煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class PageFBS_CustomerInput : BasePageInput +{ + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Account { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + public string? NickName { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + [Dict(nameof(CardTypeEnum), AllowNullValue = true)] + public CardTypeEnum? CardType { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + public string? IdCardPath { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + [Dict(nameof(CultureLevelEnum), AllowNullValue = true)] + public CultureLevelEnum? CultureLevel { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + public string? PosTitle { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 瀹㈡埛琛ㄥ鍔犺緭鍏ュ弬鏁� +/// </summary> +public class AddFBS_CustomerInput +{ + /// <summary> + /// 璐﹀彿 + /// </summary> + [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")] + [MaxLength(32, ErrorMessage = "璐﹀彿瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")] + [MaxLength(512, ErrorMessage = "瀵嗙爜瀛楃闀垮害涓嶈兘瓒呰繃512")] + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")] + [MaxLength(32, ErrorMessage = "鐪熷疄濮撳悕瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + [MaxLength(32, ErrorMessage = "鏄电О瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + [MaxLength(512, ErrorMessage = "澶村儚瀛楃闀垮害涓嶈兘瓒呰繃512")] + public string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + [Dict(nameof(GenderEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")] + public GenderEnum? Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")] + public int? Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + public DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + [MaxLength(32, ErrorMessage = "姘戞棌瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + [MaxLength(16, ErrorMessage = "鎵嬫満鍙风爜瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + [Dict(nameof(CardTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")] + public CardTypeEnum? CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + [MaxLength(32, ErrorMessage = "韬唤璇佸彿瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + [MaxLength(512, ErrorMessage = "韬唤璇佸瓧绗﹂暱搴︿笉鑳借秴杩�512")] + public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + [MaxLength(64, ErrorMessage = "閭瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + [MaxLength(256, ErrorMessage = "鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + [Dict(nameof(CultureLevelEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")] + public CultureLevelEnum? CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + [MaxLength(16, ErrorMessage = "鏀挎不闈㈣矊瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + [MaxLength(128, ErrorMessage = "姣曚笟闄㈡牎瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + [MaxLength(16, ErrorMessage = "鍔炲叕鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + [MaxLength(32, ErrorMessage = "绱ф�ヨ仈绯讳汉瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + [MaxLength(16, ErrorMessage = "绱ф�ヨ仈绯讳汉鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + [MaxLength(256, ErrorMessage = "绱ф�ヨ仈绯讳汉鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + [MaxLength(512, ErrorMessage = "涓汉绠�浠嬪瓧绗﹂暱搴︿笉鑳借秴杩�512")] + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + [MaxLength(32, ErrorMessage = "鑱岀骇瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + [MaxLength(32, ErrorMessage = "鑱岀О瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? PosTitle { get; set; } + +} + +/// <summary> +/// 瀹㈡埛琛ㄥ垹闄よ緭鍏ュ弬鏁� +/// </summary> +public class DeleteFBS_CustomerInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 瀹㈡埛琛ㄦ洿鏂拌緭鍏ュ弬鏁� +/// </summary> +public class UpdateFBS_CustomerInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + [Required(ErrorMessage = "璐﹀彿涓嶈兘涓虹┖")] + [MaxLength(32, ErrorMessage = "璐﹀彿瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + [Required(ErrorMessage = "瀵嗙爜涓嶈兘涓虹┖")] + [MaxLength(512, ErrorMessage = "瀵嗙爜瀛楃闀垮害涓嶈兘瓒呰繃512")] + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + [Required(ErrorMessage = "鐪熷疄濮撳悕涓嶈兘涓虹┖")] + [MaxLength(32, ErrorMessage = "鐪熷疄濮撳悕瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + [MaxLength(32, ErrorMessage = "鏄电О瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + [MaxLength(512, ErrorMessage = "澶村儚瀛楃闀垮害涓嶈兘瓒呰繃512")] + public string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + [Dict(nameof(GenderEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鎬у埆涓嶈兘涓虹┖")] + public GenderEnum? Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + [Required(ErrorMessage = "骞撮緞涓嶈兘涓虹┖")] + public int? Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + public DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + [MaxLength(32, ErrorMessage = "姘戞棌瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + [MaxLength(16, ErrorMessage = "鎵嬫満鍙风爜瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + [Dict(nameof(CardTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "璇佷欢绫诲瀷涓嶈兘涓虹┖")] + public CardTypeEnum? CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + [MaxLength(32, ErrorMessage = "韬唤璇佸彿瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + [MaxLength(512, ErrorMessage = "韬唤璇佸瓧绗﹂暱搴︿笉鑳借秴杩�512")] + public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + [MaxLength(64, ErrorMessage = "閭瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + [MaxLength(256, ErrorMessage = "鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + [Dict(nameof(CultureLevelEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏂囧寲绋嬪害涓嶈兘涓虹┖")] + public CultureLevelEnum? CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + [MaxLength(16, ErrorMessage = "鏀挎不闈㈣矊瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + [MaxLength(128, ErrorMessage = "姣曚笟闄㈡牎瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + [MaxLength(16, ErrorMessage = "鍔炲叕鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + [MaxLength(32, ErrorMessage = "绱ф�ヨ仈绯讳汉瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + [MaxLength(16, ErrorMessage = "绱ф�ヨ仈绯讳汉鐢佃瘽瀛楃闀垮害涓嶈兘瓒呰繃16")] + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + [MaxLength(256, ErrorMessage = "绱ф�ヨ仈绯讳汉鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + [MaxLength(512, ErrorMessage = "涓汉绠�浠嬪瓧绗﹂暱搴︿笉鑳借秴杩�512")] + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + [MaxLength(32, ErrorMessage = "鑱岀骇瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + [MaxLength(32, ErrorMessage = "鑱岀О瀛楃闀垮害涓嶈兘瓒呰繃32")] + public string? PosTitle { get; set; } + +} + +/// <summary> +/// 瀹㈡埛琛ㄤ富閿煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class QueryByIdFBS_CustomerInput : DeleteFBS_CustomerInput +{ +} + +/// <summary> +/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁� +/// </summary> +public class SetFBS_CustomerStatusInput : BaseStatusInput +{ +} + +/// <summary> +/// 瀹㈡埛琛ㄦ暟鎹鍏ュ疄浣� +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_CustomerInput : BaseImportInput +{ + /// <summary> + /// 璐﹀彿 + /// </summary> + [ImporterHeader(Name = "*璐﹀彿")] + [ExporterHeader("*璐﹀彿", Format = "", Width = 25, IsBold = true)] + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + [ImporterHeader(Name = "*瀵嗙爜")] + [ExporterHeader("*瀵嗙爜", Format = "", Width = 25, IsBold = true)] + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + [ImporterHeader(Name = "*鐪熷疄濮撳悕")] + [ExporterHeader("*鐪熷疄濮撳悕", Format = "", Width = 25, IsBold = true)] + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + [ImporterHeader(Name = "鏄电О")] + [ExporterHeader("鏄电О", Format = "", Width = 25, IsBold = true)] + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + [ImporterHeader(Name = "澶村儚")] + [ExporterHeader("澶村儚", Format = "", Width = 25, IsBold = true)] + public string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + [ImporterHeader(Name = "*鎬у埆")] + [ExporterHeader("*鎬у埆", Format = "", Width = 25, IsBold = true)] + public GenderEnum? Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + [ImporterHeader(Name = "*骞撮緞")] + [ExporterHeader("*骞撮緞", Format = "", Width = 25, IsBold = true)] + public int? Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + [ImporterHeader(Name = "鍑虹敓鏃ユ湡")] + [ExporterHeader("鍑虹敓鏃ユ湡", Format = "", Width = 25, IsBold = true)] + public DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + [ImporterHeader(Name = "姘戞棌")] + [ExporterHeader("姘戞棌", Format = "", Width = 25, IsBold = true)] + public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + [ImporterHeader(Name = "鎵嬫満鍙风爜")] + [ExporterHeader("鎵嬫満鍙风爜", Format = "", Width = 25, IsBold = true)] + public string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + [ImporterHeader(Name = "*璇佷欢绫诲瀷")] + [ExporterHeader("*璇佷欢绫诲瀷", Format = "", Width = 25, IsBold = true)] + public CardTypeEnum? CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + [ImporterHeader(Name = "韬唤璇佸彿")] + [ExporterHeader("韬唤璇佸彿", Format = "", Width = 25, IsBold = true)] + public string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + [ImporterHeader(Name = "韬唤璇�")] + [ExporterHeader("韬唤璇�", Format = "", Width = 25, IsBold = true)] + public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + [ImporterHeader(Name = "閭")] + [ExporterHeader("閭", Format = "", Width = 25, IsBold = true)] + public string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + [ImporterHeader(Name = "鍦板潃")] + [ExporterHeader("鍦板潃", Format = "", Width = 25, IsBold = true)] + public string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + [ImporterHeader(Name = "*鏂囧寲绋嬪害")] + [ExporterHeader("*鏂囧寲绋嬪害", Format = "", Width = 25, IsBold = true)] + public CultureLevelEnum? CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + [ImporterHeader(Name = "鏀挎不闈㈣矊")] + [ExporterHeader("鏀挎不闈㈣矊", Format = "", Width = 25, IsBold = true)] + public string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + [ImporterHeader(Name = "姣曚笟闄㈡牎")] + [ExporterHeader("姣曚笟闄㈡牎", Format = "", Width = 25, IsBold = true)] + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + [ImporterHeader(Name = "鍔炲叕鐢佃瘽")] + [ExporterHeader("鍔炲叕鐢佃瘽", Format = "", Width = 25, IsBold = true)] + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉")] + [ExporterHeader("绱ф�ヨ仈绯讳汉", Format = "", Width = 25, IsBold = true)] + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉鐢佃瘽")] + [ExporterHeader("绱ф�ヨ仈绯讳汉鐢佃瘽", Format = "", Width = 25, IsBold = true)] + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + [ImporterHeader(Name = "绱ф�ヨ仈绯讳汉鍦板潃")] + [ExporterHeader("绱ф�ヨ仈绯讳汉鍦板潃", Format = "", Width = 25, IsBold = true)] + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + [ImporterHeader(Name = "涓汉绠�浠�")] + [ExporterHeader("涓汉绠�浠�", Format = "", Width = 25, IsBold = true)] + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [ImporterHeader(Name = "*鎺掑簭")] + [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [ImporterHeader(Name = "*鐘舵��")] + [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [ImporterHeader(Name = "澶囨敞")] + [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)] + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + [ImporterHeader(Name = "鑱岀骇")] + [ExporterHeader("鑱岀骇", Format = "", Width = 25, IsBold = true)] + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + [ImporterHeader(Name = "鑱岀О")] + [ExporterHeader("鑱岀О", Format = "", Width = 25, IsBold = true)] + public string? PosTitle { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs new file mode 100644 index 0000000..c3a5172 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/Dto/FBS_CustomerOutput.cs @@ -0,0 +1,250 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Admin.NET.Core; +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto; + +/// <summary> +/// 瀹㈡埛琛ㄨ緭鍑哄弬鏁� +/// </summary> +public class FBS_CustomerOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + public string? Avatar { get; set; } + + /// <summary> + /// 鎬у埆 + /// </summary> + public GenderEnum Sex { get; set; } + + /// <summary> + /// 骞撮緞 + /// </summary> + public int Age { get; set; } + + /// <summary> + /// 鍑虹敓鏃ユ湡 + /// </summary> + public DateTime? Birthday { get; set; } + + /// <summary> + /// 姘戞棌 + /// </summary> + public string? Nation { get; set; } + + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + public string? Phone { get; set; } + + /// <summary> + /// 璇佷欢绫诲瀷 + /// </summary> + public CardTypeEnum CardType { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + public string? IdCardNum { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + public string? IdCardPath { get; set; } + + /// <summary> + /// 閭 + /// </summary> + public string? Email { get; set; } + + /// <summary> + /// 鍦板潃 + /// </summary> + public string? Address { get; set; } + + /// <summary> + /// 鏂囧寲绋嬪害 + /// </summary> + public CultureLevelEnum CultureLevel { get; set; } + + /// <summary> + /// 鏀挎不闈㈣矊 + /// </summary> + public string? PoliticalOutlook { get; set; } + + /// <summary> + /// 姣曚笟闄㈡牎 + /// </summary> + public string? College { get; set; } + + /// <summary> + /// 鍔炲叕鐢佃瘽 + /// </summary> + public string? OfficePhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉 + /// </summary> + public string? EmergencyContact { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鐢佃瘽 + /// </summary> + public string? EmergencyPhone { get; set; } + + /// <summary> + /// 绱ф�ヨ仈绯讳汉鍦板潃 + /// </summary> + public string? EmergencyAddress { get; set; } + + /// <summary> + /// 涓汉绠�浠� + /// </summary> + public string? Introduction { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鑱岀骇 + /// </summary> + public string? PosLevel { get; set; } + + /// <summary> + /// 鑱岀О + /// </summary> + public string? PosTitle { get; set; } + + /// <summary> + /// 鎿呴暱棰嗗煙 + /// </summary> + public string? Expertise { get; set; } + + /// <summary> + /// 鍔炲叕鍖哄煙 + /// </summary> + public string? OfficeZone { get; set; } + + /// <summary> + /// 鍔炲叕瀹� + /// </summary> + public string? Office { get; set; } + + /// <summary> + /// 鍏ヨ亴鏃ユ湡 + /// </summary> + public DateTime? JoinDate { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰旾p + /// </summary> + public string? LastLoginIp { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曞湴鐐� + /// </summary> + public string? LastLoginAddress { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曟椂闂� + /// </summary> + public DateTime? LastLoginTime { get; set; } + + /// <summary> + /// 鏈�鏂扮櫥褰曡澶� + /// </summary> + public string? LastLoginDevice { get; set; } + + /// <summary> + /// 鐢靛瓙绛惧悕 + /// </summary> + public string? Signature { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 瀹㈡埛琛ㄦ暟鎹鍏ユā鏉垮疄浣� +/// </summary> +public class ExportFBS_CustomerOutput : ImportFBS_CustomerInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs new file mode 100644 index 0000000..7bb739a --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs @@ -0,0 +1,280 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; + +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Admin.NET.Core; +using FZCZTB.NET.MD.CutomerMd; +using Furion.DependencyInjection; +using FZCZTB.Net.CustomerSYSTem.Service.FBS_Customer.Dto; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 瀹㈡埛琛ㄦ湇鍔� 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_CustomerService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_CustomerService(SqlSugarRepository<FBS_Customer> fBS_CustomerRep, ISqlSugarClient sqlSugarClient) + { + _fBS_CustomerRep = fBS_CustomerRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ瀹㈡埛琛� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛琛�")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_CustomerOutput>> Page(PageFBS_CustomerInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_CustomerRep.AsQueryable() + //.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Account.Contains(input.Keyword) || u.RealName.Contains(input.Keyword) || u.NickName.Contains(input.Keyword) || u.IdCardPath.Contains(input.Keyword) || u.College.Contains(input.Keyword) || u.OfficePhone.Contains(input.Keyword) || u.EmergencyContact.Contains(input.Keyword) || u.EmergencyPhone.Contains(input.Keyword) || u.EmergencyAddress.Contains(input.Keyword) || u.Introduction.Contains(input.Keyword) || u.Remark.Contains(input.Keyword) || u.PosLevel.Contains(input.Keyword) || u.PosTitle.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account.Contains(input.Account.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.IdCardPath), u => u.IdCardPath.Contains(input.IdCardPath.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.College), u => u.College.Contains(input.College.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.OfficePhone), u => u.OfficePhone.Contains(input.OfficePhone.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyContact), u => u.EmergencyContact.Contains(input.EmergencyContact.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyPhone), u => u.EmergencyPhone.Contains(input.EmergencyPhone.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyAddress), u => u.EmergencyAddress.Contains(input.EmergencyAddress.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.Introduction), u => u.Introduction.Contains(input.Introduction.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.PosLevel), u => u.PosLevel.Contains(input.PosLevel.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.PosTitle), u => u.PosTitle.Contains(input.PosTitle.Trim())) + //.WhereIF(input.CardType.HasValue, u => u.CardType == input.CardType) + //.WhereIF(input.CultureLevel.HasValue, u => u.CultureLevel == input.CultureLevel) + //.WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) + .WhereIF(input.Status.HasValue, u => u.Status == input.Status) + .Select<FBS_CustomerOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇瀹㈡埛琛ㄨ鎯� 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇瀹㈡埛琛ㄨ鎯�")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_Customer> Detail([FromQuery] QueryByIdFBS_CustomerInput input) + { + return await _fBS_CustomerRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞瀹㈡埛琛� 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞瀹㈡埛琛�")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_CustomerInput input) + { + var entity = input.Adapt<FBS_Customer>(); + return await _fBS_CustomerRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊瀹㈡埛琛� 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊瀹㈡埛琛�")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_CustomerInput input) + { + var entity = input.Adapt<FBS_Customer>(); + await _fBS_CustomerRep.AsUpdateable(entity) + .IgnoreColumns(u => new { + //u.Expertise, + //u.OfficeZone, + //u.Office, + //u.JoinDate, + u.LastLoginIp, + u.LastLoginAddress, + u.LastLoginTime, + u.LastLoginDevice, + u.Signature, + }) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎瀹㈡埛琛� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎瀹㈡埛琛�")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_CustomerInput input) + { + var entity = await _fBS_CustomerRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_CustomerRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_CustomerRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎瀹㈡埛琛� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎瀹㈡埛琛�")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_CustomerInput> input) + { + var exp = Expressionable.Create<FBS_Customer>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_CustomerRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_CustomerRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_CustomerRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 璁剧疆瀹㈡埛琛ㄧ姸鎬� 馃毇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("璁剧疆瀹㈡埛琛ㄧ姸鎬�")] + [ApiDescriptionSettings(Name = "SetStatus"), HttpPost] + public async Task SetFBS_CustomerStatus(SetFBS_CustomerStatusInput input) + { + await _fBS_CustomerRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync(); + } + + /// <summary> + /// 瀵煎嚭瀹㈡埛琛ㄨ褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭瀹㈡埛琛ㄨ褰�")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_CustomerInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_CustomerOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "瀹㈡埛琛ㄥ鍑鸿褰�"); + } + + /// <summary> + /// 涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉� 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉�")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_CustomerOutput>(), "瀹㈡埛琛ㄥ鍏ユā鏉�"); + } + + private static readonly object _fBS_CustomerImportLock = new object(); + /// <summary> + /// 瀵煎叆瀹㈡埛琛ㄨ褰� 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆瀹㈡埛琛ㄨ褰�")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_CustomerImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_CustomerInput, FBS_Customer>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => { + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Sex == null){ + x.Error = "鎬у埆涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Age == null){ + x.Error = "骞撮緞涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.CardType == null){ + x.Error = "璇佷欢绫诲瀷涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.CultureLevel == null){ + x.Error = "鏂囧寲绋嬪害涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.OrderNo == null){ + x.Error = "鎺掑簭涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Status == null){ + x.Error = "鐘舵�佷笉鑳戒负绌�"; + return false; + } + return true; + }).Adapt<List<FBS_Customer>>(); + + var storageable = _fBS_CustomerRep.Context.Storageable(rows) + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Account), "璐﹀彿涓嶈兘涓虹┖") + .SplitError(it => it.Item.Account?.Length > 32, "璐﹀彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Password), "瀵嗙爜涓嶈兘涓虹┖") + .SplitError(it => it.Item.Password?.Length > 512, "瀵嗙爜闀垮害涓嶈兘瓒呰繃512涓瓧绗�") + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.RealName), "鐪熷疄濮撳悕涓嶈兘涓虹┖") + .SplitError(it => it.Item.RealName?.Length > 32, "鐪熷疄濮撳悕闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + .SplitError(it => it.Item.NickName?.Length > 32, "鏄电О闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + .SplitError(it => it.Item.Avatar?.Length > 512, "澶村儚闀垮害涓嶈兘瓒呰繃512涓瓧绗�") + //.SplitError(it => it.Item.Nation?.Length > 32, "姘戞棌闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + .SplitError(it => it.Item.Phone?.Length > 16, "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.IdCardNum?.Length > 32, "韬唤璇佸彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.IdCardPath?.Length > 512, "韬唤璇侀暱搴︿笉鑳借秴杩�512涓瓧绗�") + .SplitError(it => it.Item.Email?.Length > 64, "閭闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + //.SplitError(it => it.Item.Address?.Length > 256, "鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + //.SplitError(it => it.Item.PoliticalOutlook?.Length > 16, "鏀挎不闈㈣矊闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.College?.Length > 128, "姣曚笟闄㈡牎闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + //.SplitError(it => it.Item.OfficePhone?.Length > 16, "鍔炲叕鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.EmergencyContact?.Length > 32, "绱ф�ヨ仈绯讳汉闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.EmergencyPhone?.Length > 16, "绱ф�ヨ仈绯讳汉鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.EmergencyAddress?.Length > 256, "绱ф�ヨ仈绯讳汉鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + //.SplitError(it => it.Item.Introduction?.Length > 512, "涓汉绠�浠嬮暱搴︿笉鑳借秴杩�512涓瓧绗�") + .SplitError(it => it.Item.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + //.SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs new file mode 100644 index 0000000..0c45475 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs @@ -0,0 +1,69 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int ParentId { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs new file mode 100644 index 0000000..9e1a674 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs @@ -0,0 +1,177 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍩虹杈撳叆鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + public virtual string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + public virtual string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public virtual int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍒嗛〉鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class PageFBS_EnterpriseTypeInput : BasePageInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int? ParentId { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃澧炲姞杈撳叆鍙傛暟 +/// </summary> +public class AddFBS_EnterpriseTypeInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍒犻櫎杈撳叆鍙傛暟 +/// </summary> +public class DeleteFBS_EnterpriseTypeInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏇存柊杈撳叆鍙傛暟 +/// </summary> +public class UpdateFBS_EnterpriseTypeInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃涓婚敭鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class QueryByIdFBS_EnterpriseTypeInput : DeleteFBS_EnterpriseTypeInput +{ +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆瀹炰綋 +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_EnterpriseTypeInput : BaseImportInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [ImporterHeader(Name = "*鍚嶇О")] + [ExporterHeader("*鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [ImporterHeader(Name = "*浠g爜")] + [ExporterHeader("*浠g爜", Format = "", Width = 25, IsBold = true)] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [ImporterHeader(Name = "*鐖�")] + [ExporterHeader("*鐖�", Format = "", Width = 25, IsBold = true)] + public int? ParentId { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs new file mode 100644 index 0000000..a4c88cc --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs @@ -0,0 +1,79 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int ParentId { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘瀹炰綋 +/// </summary> +public class ExportFBS_EnterpriseTypeOutput : ImportFBS_EnterpriseTypeInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs new file mode 100644 index 0000000..1026101 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs @@ -0,0 +1,196 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Furion.DependencyInjection; +using FZCZTB.NET.MD.ConfigMd; +using Admin.NET.Core; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏈嶅姟 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_EnterpriseTypeService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_EnterpriseTypeService(SqlSugarRepository<FBS_EnterpriseType> fBS_EnterpriseTypeRep, ISqlSugarClient sqlSugarClient) + { + _fBS_EnterpriseTypeRep = fBS_EnterpriseTypeRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_EnterpriseTypeOutput>> Page(PageFBS_EnterpriseTypeInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_EnterpriseTypeRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(input.ParentId != null, u => u.ParentId == input.ParentId) + .Select<FBS_EnterpriseTypeOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇浼佷笟绫婚厤缃〃璇︽儏 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇浼佷笟绫婚厤缃〃璇︽儏")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_EnterpriseType> Detail([FromQuery] QueryByIdFBS_EnterpriseTypeInput input) + { + return await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞浼佷笟绫婚厤缃〃 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_EnterpriseTypeInput input) + { + var entity = input.Adapt<FBS_EnterpriseType>(); + return await _fBS_EnterpriseTypeRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊浼佷笟绫婚厤缃〃 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_EnterpriseTypeInput input) + { + var entity = input.Adapt<FBS_EnterpriseType>(); + await _fBS_EnterpriseTypeRep.AsUpdateable(entity) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎浼佷笟绫婚厤缃〃 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_EnterpriseTypeInput input) + { + var entity = await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_EnterpriseTypeRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_EnterpriseTypeRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_EnterpriseTypeInput> input) + { + var exp = Expressionable.Create<FBS_EnterpriseType>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_EnterpriseTypeRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_EnterpriseTypeRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_EnterpriseTypeRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 瀵煎嚭浼佷笟绫婚厤缃〃璁板綍 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭浼佷笟绫婚厤缃〃璁板綍")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_EnterpriseTypeInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_EnterpriseTypeOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "浼佷笟绫婚厤缃〃瀵煎嚭璁板綍"); + } + + /// <summary> + /// 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_EnterpriseTypeOutput>(), "浼佷笟绫婚厤缃〃瀵煎叆妯℃澘"); + } + + private static readonly object _fBS_EnterpriseTypeImportLock = new object(); + /// <summary> + /// 瀵煎叆浼佷笟绫婚厤缃〃璁板綍 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆浼佷笟绫婚厤缃〃璁板綍")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_EnterpriseTypeImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_EnterpriseTypeInput, FBS_EnterpriseType>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => { + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.ParentId == null){ + x.Error = "鐖朵笉鑳戒负绌�"; + return false; + } + return true; + }).Adapt<List<FBS_EnterpriseType>>(); + + var storageable = _fBS_EnterpriseTypeRep.Context.Storageable(rows) + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Name), "鍚嶇О涓嶈兘涓虹┖") + .SplitError(it => it.Item.Name?.Length > 256, "鍚嶇О闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Code), "浠g爜涓嶈兘涓虹┖") + .SplitError(it => it.Item.Code?.Length > 36, "浠g爜闀垮害涓嶈兘瓒呰繃36涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs new file mode 100644 index 0000000..495dca3 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleDto.cs @@ -0,0 +1,86 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto; + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹茶緭鍑哄弬鏁� +/// </summary> +public class FBS_ExRoleDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + public DataScopeEnum DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs new file mode 100644 index 0000000..df4d51e --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleInput.cs @@ -0,0 +1,278 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto; + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹插熀纭�杈撳叆鍙傛暟 +/// </summary> +public class FBS_ExRoleBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + public virtual string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public virtual string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")] + public virtual DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public virtual StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹插垎椤垫煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class PageFBS_ExRoleInput : BasePageInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹插鍔犺緭鍏ュ弬鏁� +/// </summary> +public class AddFBS_ExRoleInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹插垹闄よ緭鍏ュ弬鏁� +/// </summary> +public class DeleteFBS_ExRoleInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹叉洿鏂拌緭鍏ュ弬鏁� +/// </summary> +public class UpdateFBS_ExRoleInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹蹭富閿煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class QueryByIdFBS_ExRoleInput : DeleteFBS_ExRoleInput +{ +} + +/// <summary> +/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁� +/// </summary> +public class SetFBS_ExRoleStatusInput : BaseStatusInput +{ +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ュ疄浣� +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_ExRoleInput : BaseImportInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [ImporterHeader(Name = "*鍚嶇О")] + [ExporterHeader("*鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [ImporterHeader(Name = "缂栫爜")] + [ExporterHeader("缂栫爜", Format = "", Width = 25, IsBold = true)] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [ImporterHeader(Name = "*鎺掑簭")] + [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)] + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [ImporterHeader(Name = "*鏁版嵁鑼冨洿")] + [ExporterHeader("*鏁版嵁鑼冨洿", Format = "", Width = 25, IsBold = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [ImporterHeader(Name = "澶囨敞")] + [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [ImporterHeader(Name = "*鐘舵��")] + [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)] + public StatusEnum? Status { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs new file mode 100644 index 0000000..f8d6280 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/Dto/FBS_ExRoleOutput.cs @@ -0,0 +1,95 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Admin.NET.Core; +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto; + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹茶緭鍑哄弬鏁� +/// </summary> +public class FBS_ExRoleOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + public DataScopeEnum DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ユā鏉垮疄浣� +/// </summary> +public class ExportFBS_ExRoleOutput : ImportFBS_ExRoleInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs new file mode 100644 index 0000000..74171d9 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_ExRole/FBS_ExRoleService.cs @@ -0,0 +1,223 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; + +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Furion.DependencyInjection; +using Admin.NET.Core; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.Net.CustomerSYSTem.Service.FBS_ExRole.Dto; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 瀹㈡埛涓诲垎绫昏鑹叉湇鍔� 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_ExRoleService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_ExRoleService(SqlSugarRepository<FBS_ExRole> fBS_ExRoleRep, ISqlSugarClient sqlSugarClient) + { + _fBS_ExRoleRep = fBS_ExRoleRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹�")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_ExRoleOutput>> Page(PageFBS_ExRoleInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_ExRoleRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword) || u.Remark.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) + .WhereIF(input.DataScope.HasValue, u => u.DataScope == input.DataScope) + .WhereIF(input.Status.HasValue, u => u.Status == input.Status) + .Select<FBS_ExRoleOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇瀹㈡埛涓诲垎绫昏鑹茶鎯� 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇瀹㈡埛涓诲垎绫昏鑹茶鎯�")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_ExRole> Detail([FromQuery] QueryByIdFBS_ExRoleInput input) + { + return await _fBS_ExRoleRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞瀹㈡埛涓诲垎绫昏鑹� 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞瀹㈡埛涓诲垎绫昏鑹�")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_ExRoleInput input) + { + var entity = input.Adapt<FBS_ExRole>(); + return await _fBS_ExRoleRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊瀹㈡埛涓诲垎绫昏鑹� 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊瀹㈡埛涓诲垎绫昏鑹�")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_ExRoleInput input) + { + var entity = input.Adapt<FBS_ExRole>(); + await _fBS_ExRoleRep.AsUpdateable(entity) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_ExRoleInput input) + { + var entity = await _fBS_ExRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_ExRoleRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_ExRoleRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹�")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_ExRoleInput> input) + { + var exp = Expressionable.Create<FBS_ExRole>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_ExRoleRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_ExRoleRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_ExRoleRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬� 馃毇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬�")] + [ApiDescriptionSettings(Name = "SetStatus"), HttpPost] + public async Task SetFBS_ExRoleStatus(SetFBS_ExRoleStatusInput input) + { + await _fBS_ExRoleRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync(); + } + + /// <summary> + /// 瀵煎嚭瀹㈡埛涓诲垎绫昏鑹茶褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭瀹㈡埛涓诲垎绫昏鑹茶褰�")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_ExRoleInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_ExRoleOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "瀹㈡埛涓诲垎绫昏鑹插鍑鸿褰�"); + } + + /// <summary> + /// 涓嬭浇瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ユā鏉� 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ユā鏉�")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_ExRoleOutput>(), "瀹㈡埛涓诲垎绫昏鑹插鍏ユā鏉�"); + } + + private static readonly object _fBS_ExRoleImportLock = new object(); + /// <summary> + /// 瀵煎叆瀹㈡埛涓诲垎绫昏鑹茶褰� 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆瀹㈡埛涓诲垎绫昏鑹茶褰�")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_ExRoleImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_ExRoleInput, FBS_ExRole>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => { + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.OrderNo == null){ + x.Error = "鎺掑簭涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.DataScope == null){ + x.Error = "鏁版嵁鑼冨洿涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Status == null){ + x.Error = "鐘舵�佷笉鑳戒负绌�"; + return false; + } + return true; + }).Adapt<List<FBS_ExRole>>(); + + var storageable = _fBS_ExRoleRep.Context.Storageable(rows) + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Name), "鍚嶇О涓嶈兘涓虹┖") + .SplitError(it => it.Item.Name?.Length > 64, "鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Code?.Length > 64, "缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Remark?.Length > 128, "澶囨敞闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs new file mode 100644 index 0000000..4875501 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuDto.cs @@ -0,0 +1,141 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto; + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄨ緭鍑哄弬鏁� +/// </summary> +public class FBS_MenuDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鐖禝d + /// </summary> + public long Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + public MenuTypeEnum Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + public bool IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + public bool IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + public bool IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + public bool IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs new file mode 100644 index 0000000..1702a8c --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuInput.cs @@ -0,0 +1,602 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto; + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ熀纭�杈撳叆鍙傛暟 +/// </summary> +public class FBS_MenuBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鐖禝d + /// </summary> + [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")] + public virtual long? Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + [Dict(nameof(MenuTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")] + public virtual MenuTypeEnum? Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + public virtual string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + public virtual string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + public virtual string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + public virtual string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + public virtual string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")] + public virtual string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + public virtual string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")] + public virtual bool? IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + public virtual string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")] + public virtual bool? IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")] + public virtual bool? IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")] + public virtual bool? IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public virtual StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ垎椤垫煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class PageFBS_MenuInput : BasePageInput +{ + /// <summary> + /// 鐖禝d + /// </summary> + public long? Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + [Dict(nameof(MenuTypeEnum), AllowNullValue = true)] + public MenuTypeEnum? Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + public bool? IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + public bool? IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + public bool? IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + public bool? IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ鍔犺緭鍏ュ弬鏁� +/// </summary> +public class AddFBS_MenuInput +{ + /// <summary> + /// 鐖禝d + /// </summary> + [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")] + public long? Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + [Dict(nameof(MenuTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")] + public MenuTypeEnum? Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + [MaxLength(64, ErrorMessage = "璺敱鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + [MaxLength(128, ErrorMessage = "璺敱鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + [MaxLength(128, ErrorMessage = "缁勪欢璺緞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + [MaxLength(128, ErrorMessage = "閲嶅畾鍚戝瓧绗﹂暱搴︿笉鑳借秴杩�128")] + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + [MaxLength(128, ErrorMessage = "鏉冮檺鏍囪瘑瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(64, ErrorMessage = "鑿滃崟鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + [MaxLength(128, ErrorMessage = "鍥炬爣瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")] + public bool? IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + [MaxLength(256, ErrorMessage = "澶栭摼閾炬帴瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")] + public bool? IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")] + public bool? IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")] + public bool? IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Remark { get; set; } + +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ垹闄よ緭鍏ュ弬鏁� +/// </summary> +public class DeleteFBS_MenuInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ洿鏂拌緭鍏ュ弬鏁� +/// </summary> +public class UpdateFBS_MenuInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 鐖禝d + /// </summary> + [Required(ErrorMessage = "鐖禝d涓嶈兘涓虹┖")] + public long? Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + [Dict(nameof(MenuTypeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")] + public MenuTypeEnum? Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + [MaxLength(64, ErrorMessage = "璺敱鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + [MaxLength(128, ErrorMessage = "璺敱鍦板潃瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + [MaxLength(128, ErrorMessage = "缁勪欢璺緞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + [MaxLength(128, ErrorMessage = "閲嶅畾鍚戝瓧绗﹂暱搴︿笉鑳借秴杩�128")] + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + [MaxLength(128, ErrorMessage = "鏉冮檺鏍囪瘑瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + [Required(ErrorMessage = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(64, ErrorMessage = "鑿滃崟鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + [MaxLength(128, ErrorMessage = "鍥炬爣瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + [Required(ErrorMessage = "鏄惁鍐呭祵涓嶈兘涓虹┖")] + public bool? IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + [MaxLength(256, ErrorMessage = "澶栭摼閾炬帴瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + [Required(ErrorMessage = "鏄惁闅愯棌涓嶈兘涓虹┖")] + public bool? IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + [Required(ErrorMessage = "鏄惁缂撳瓨涓嶈兘涓虹┖")] + public bool? IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + [Required(ErrorMessage = "鏄惁鍥哄畾涓嶈兘涓虹┖")] + public bool? IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(256, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string? Remark { get; set; } + +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄤ富閿煡璇㈣緭鍏ュ弬鏁� +/// </summary> +public class QueryByIdFBS_MenuInput : DeleteFBS_MenuInput +{ +} + +/// <summary> +/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁� +/// </summary> +public class SetFBS_MenuStatusInput : BaseStatusInput +{ +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ュ疄浣� +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_MenuInput : BaseImportInput +{ + /// <summary> + /// 鐖禝d + /// </summary> + [ImporterHeader(Name = "*鐖禝d")] + [ExporterHeader("*鐖禝d", Format = "", Width = 25, IsBold = true)] + public long? Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + [ImporterHeader(Name = "*鑿滃崟绫诲瀷")] + [ExporterHeader("*鑿滃崟绫诲瀷", Format = "", Width = 25, IsBold = true)] + public MenuTypeEnum? Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + [ImporterHeader(Name = "璺敱鍚嶇О")] + [ExporterHeader("璺敱鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + [ImporterHeader(Name = "璺敱鍦板潃")] + [ExporterHeader("璺敱鍦板潃", Format = "", Width = 25, IsBold = true)] + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + [ImporterHeader(Name = "缁勪欢璺緞")] + [ExporterHeader("缁勪欢璺緞", Format = "", Width = 25, IsBold = true)] + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + [ImporterHeader(Name = "閲嶅畾鍚�")] + [ExporterHeader("閲嶅畾鍚�", Format = "", Width = 25, IsBold = true)] + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + [ImporterHeader(Name = "鏉冮檺鏍囪瘑")] + [ExporterHeader("鏉冮檺鏍囪瘑", Format = "", Width = 25, IsBold = true)] + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + [ImporterHeader(Name = "*鑿滃崟鍚嶇О")] + [ExporterHeader("*鑿滃崟鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + [ImporterHeader(Name = "鍥炬爣")] + [ExporterHeader("鍥炬爣", Format = "", Width = 25, IsBold = true)] + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + [ImporterHeader(Name = "*鏄惁鍐呭祵")] + [ExporterHeader("*鏄惁鍐呭祵", Format = "", Width = 25, IsBold = true)] + public bool? IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + [ImporterHeader(Name = "澶栭摼閾炬帴")] + [ExporterHeader("澶栭摼閾炬帴", Format = "", Width = 25, IsBold = true)] + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + [ImporterHeader(Name = "*鏄惁闅愯棌")] + [ExporterHeader("*鏄惁闅愯棌", Format = "", Width = 25, IsBold = true)] + public bool? IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + [ImporterHeader(Name = "*鏄惁缂撳瓨")] + [ExporterHeader("*鏄惁缂撳瓨", Format = "", Width = 25, IsBold = true)] + public bool? IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + [ImporterHeader(Name = "*鏄惁鍥哄畾")] + [ExporterHeader("*鏄惁鍥哄畾", Format = "", Width = 25, IsBold = true)] + public bool? IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [ImporterHeader(Name = "*鎺掑簭")] + [ExporterHeader("*鎺掑簭", Format = "", Width = 25, IsBold = true)] + public int? OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [ImporterHeader(Name = "*鐘舵��")] + [ExporterHeader("*鐘舵��", Format = "", Width = 25, IsBold = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [ImporterHeader(Name = "澶囨敞")] + [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)] + public string? Remark { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs new file mode 100644 index 0000000..31b6bbb --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/Dto/FBS_MenuOutput.cs @@ -0,0 +1,150 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Admin.NET.Core; +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto; + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄨ緭鍑哄弬鏁� +/// </summary> +public class FBS_MenuOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鐖禝d + /// </summary> + public long Pid { get; set; } + + /// <summary> + /// 鑿滃崟绫诲瀷 + /// </summary> + public MenuTypeEnum Type { get; set; } + + /// <summary> + /// 璺敱鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 璺敱鍦板潃 + /// </summary> + public string? Path { get; set; } + + /// <summary> + /// 缁勪欢璺緞 + /// </summary> + public string? Component { get; set; } + + /// <summary> + /// 閲嶅畾鍚� + /// </summary> + public string? Redirect { get; set; } + + /// <summary> + /// 鏉冮檺鏍囪瘑 + /// </summary> + public string? Permission { get; set; } + + /// <summary> + /// 鑿滃崟鍚嶇О + /// </summary> + public string Title { get; set; } + + /// <summary> + /// 鍥炬爣 + /// </summary> + public string? Icon { get; set; } + + /// <summary> + /// 鏄惁鍐呭祵 + /// </summary> + public bool IsIframe { get; set; } + + /// <summary> + /// 澶栭摼閾炬帴 + /// </summary> + public string? OutLink { get; set; } + + /// <summary> + /// 鏄惁闅愯棌 + /// </summary> + public bool IsHide { get; set; } + + /// <summary> + /// 鏄惁缂撳瓨 + /// </summary> + public bool IsKeepAlive { get; set; } + + /// <summary> + /// 鏄惁鍥哄畾 + /// </summary> + public bool IsAffix { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int OrderNo { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ユā鏉垮疄浣� +/// </summary> +public class ExportFBS_MenuOutput : ImportFBS_MenuInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs new file mode 100644 index 0000000..aaab197 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Menu/FBS_MenuService.cs @@ -0,0 +1,261 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; + +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Furion.DependencyInjection; +using Admin.NET.Core; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.Net.CustomerSYSTem.Service.FBS_Menu.Dto; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ湇鍔� 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_MenuService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_Menu> _fBS_MenuRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_MenuService(SqlSugarRepository<FBS_Menu> fBS_MenuRep, ISqlSugarClient sqlSugarClient) + { + _fBS_MenuRep = fBS_MenuRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛�")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_MenuOutput>> Page(PageFBS_MenuInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_MenuRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Path.Contains(input.Keyword) || u.Component.Contains(input.Keyword) || u.Redirect.Contains(input.Keyword) || u.Permission.Contains(input.Keyword) || u.Title.Contains(input.Keyword) || u.Icon.Contains(input.Keyword) || u.OutLink.Contains(input.Keyword) || u.Remark.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Path), u => u.Path.Contains(input.Path.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Component), u => u.Component.Contains(input.Component.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Redirect), u => u.Redirect.Contains(input.Redirect.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Permission), u => u.Permission.Contains(input.Permission.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Icon), u => u.Icon.Contains(input.Icon.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.OutLink), u => u.OutLink.Contains(input.OutLink.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + .WhereIF(input.Pid != null, u => u.Pid == input.Pid) + .WhereIF(input.Type.HasValue, u => u.Type == input.Type) + .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) + .WhereIF(input.Status.HasValue, u => u.Status == input.Status) + .Select<FBS_MenuOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇瀹㈡埛绯荤粺鑿滃崟琛ㄨ鎯� 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇瀹㈡埛绯荤粺鑿滃崟琛ㄨ鎯�")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_Menu> Detail([FromQuery] QueryByIdFBS_MenuInput input) + { + return await _fBS_MenuRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞瀹㈡埛绯荤粺鑿滃崟琛� 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞瀹㈡埛绯荤粺鑿滃崟琛�")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_MenuInput input) + { + var entity = input.Adapt<FBS_Menu>(); + return await _fBS_MenuRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊瀹㈡埛绯荤粺鑿滃崟琛� 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊瀹㈡埛绯荤粺鑿滃崟琛�")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_MenuInput input) + { + var entity = input.Adapt<FBS_Menu>(); + await _fBS_MenuRep.AsUpdateable(entity) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_MenuInput input) + { + var entity = await _fBS_MenuRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_MenuRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_MenuRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛�")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_MenuInput> input) + { + var exp = Expressionable.Create<FBS_Menu>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_MenuRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_MenuRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_MenuRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬� 馃毇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬�")] + [ApiDescriptionSettings(Name = "SetStatus"), HttpPost] + public async Task SetFBS_MenuStatus(SetFBS_MenuStatusInput input) + { + await _fBS_MenuRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync(); + } + + /// <summary> + /// 瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰�")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_MenuInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_MenuOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "瀹㈡埛绯荤粺鑿滃崟琛ㄥ鍑鸿褰�"); + } + + /// <summary> + /// 涓嬭浇瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ユā鏉� 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ユā鏉�")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_MenuOutput>(), "瀹㈡埛绯荤粺鑿滃崟琛ㄥ鍏ユā鏉�"); + } + + private static readonly object _fBS_MenuImportLock = new object(); + /// <summary> + /// 瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰� 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄨ褰�")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_MenuImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_MenuInput, FBS_Menu>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => { + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Pid == null){ + x.Error = "鐖禝d涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Type == null){ + x.Error = "鑿滃崟绫诲瀷涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.IsIframe == null){ + x.Error = "鏄惁鍐呭祵涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.IsHide == null){ + x.Error = "鏄惁闅愯棌涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.IsKeepAlive == null){ + x.Error = "鏄惁缂撳瓨涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.IsAffix == null){ + x.Error = "鏄惁鍥哄畾涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.OrderNo == null){ + x.Error = "鎺掑簭涓嶈兘涓虹┖"; + return false; + } + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.Status == null){ + x.Error = "鐘舵�佷笉鑳戒负绌�"; + return false; + } + return true; + }).Adapt<List<FBS_Menu>>(); + + var storageable = _fBS_MenuRep.Context.Storageable(rows) + .SplitError(it => it.Item.Name?.Length > 64, "璺敱鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Path?.Length > 128, "璺敱鍦板潃闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitError(it => it.Item.Component?.Length > 128, "缁勪欢璺緞闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitError(it => it.Item.Redirect?.Length > 128, "閲嶅畾鍚戦暱搴︿笉鑳借秴杩�128涓瓧绗�") + .SplitError(it => it.Item.Permission?.Length > 128, "鏉冮檺鏍囪瘑闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Title), "鑿滃崟鍚嶇О涓嶈兘涓虹┖") + .SplitError(it => it.Item.Title?.Length > 64, "鑿滃崟鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Icon?.Length > 128, "鍥炬爣闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitError(it => it.Item.OutLink?.Length > 256, "澶栭摼閾炬帴闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + .SplitError(it => it.Item.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs new file mode 100644 index 0000000..f65eefc --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleDto.cs @@ -0,0 +1,86 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto; + +/// <summary> +/// 瀹㈡埛瑙掕壊杈撳嚭鍙傛暟 +/// </summary> +public class FBS_RoleDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + public DataScopeEnum DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs new file mode 100644 index 0000000..0b8a25f --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleInput.cs @@ -0,0 +1,266 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto; + +/// <summary> +/// 瀹㈡埛瑙掕壊鍩虹杈撳叆鍙傛暟 +/// </summary> +public class FBS_RoleBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public virtual string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public virtual string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + public virtual DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public virtual StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛瑙掕壊鍒嗛〉鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class PageFBS_RoleInput : BasePageInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 瀹㈡埛瑙掕壊澧炲姞杈撳叆鍙傛暟 +/// </summary> +public class AddFBS_RoleInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛瑙掕壊鍒犻櫎杈撳叆鍙傛暟 +/// </summary> +public class DeleteFBS_RoleInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 瀹㈡埛瑙掕壊鏇存柊杈撳叆鍙傛暟 +/// </summary> +public class UpdateFBS_RoleInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [MaxLength(64, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [MaxLength(64, ErrorMessage = "缂栫爜瀛楃闀垮害涓嶈兘瓒呰繃64")] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [MaxLength(128, ErrorMessage = "澶囨敞瀛楃闀垮害涓嶈兘瓒呰繃128")] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + public StatusEnum? Status { get; set; } + +} + +/// <summary> +/// 瀹㈡埛瑙掕壊涓婚敭鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class QueryByIdFBS_RoleInput : DeleteFBS_RoleInput +{ +} + +/// <summary> +/// 璁剧疆鐘舵�佽緭鍏ュ弬鏁� +/// </summary> +public class SetFBS_RoleStatusInput : BaseStatusInput +{ +} + +/// <summary> +/// 瀹㈡埛瑙掕壊鏁版嵁瀵煎叆瀹炰綋 +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_RoleInput : BaseImportInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [ImporterHeader(Name = "鍚嶇О")] + [ExporterHeader("鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + [ImporterHeader(Name = "缂栫爜")] + [ExporterHeader("缂栫爜", Format = "", Width = 25, IsBold = true)] + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [ImporterHeader(Name = "鎺掑簭")] + [ExporterHeader("鎺掑簭", Format = "", Width = 25, IsBold = true)] + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [ImporterHeader(Name = "鏁版嵁鑼冨洿")] + [ExporterHeader("鏁版嵁鑼冨洿", Format = "", Width = 25, IsBold = true)] + public DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + [ImporterHeader(Name = "澶囨敞")] + [ExporterHeader("澶囨敞", Format = "", Width = 25, IsBold = true)] + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [ImporterHeader(Name = "鐘舵��")] + [ExporterHeader("鐘舵��", Format = "", Width = 25, IsBold = true)] + public StatusEnum? Status { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs new file mode 100644 index 0000000..900ad32 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/Dto/FBS_RoleOutput.cs @@ -0,0 +1,95 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Admin.NET.Core; +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto; + +/// <summary> +/// 瀹㈡埛瑙掕壊杈撳嚭鍙傛暟 +/// </summary> +public class FBS_RoleOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string? Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + public int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + public DataScopeEnum DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + public StatusEnum Status { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 瀹㈡埛瑙掕壊鏁版嵁瀵煎叆妯℃澘瀹炰綋 +/// </summary> +public class ExportFBS_RoleOutput : ImportFBS_RoleInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs new file mode 100644 index 0000000..0eebaa9 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Role/FBS_RoleService.cs @@ -0,0 +1,209 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; + +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Furion.DependencyInjection; +using Admin.NET.Core; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.Net.CustomerSYSTem.Service.FBS_Role.Dto; +using FZCZTB.Net.CustomerSYSTem; + + +/// <summary> +/// 瀹㈡埛瑙掕壊鏈嶅姟 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_RoleService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_Role> _fBS_RoleRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_RoleService(SqlSugarRepository<FBS_Role> fBS_RoleRep, ISqlSugarClient sqlSugarClient) + { + _fBS_RoleRep = fBS_RoleRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_RoleOutput>> Page(PageFBS_RoleInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_RoleRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword) || u.Remark.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) + .WhereIF(input.DataScope.HasValue, u => u.DataScope == input.DataScope) + .WhereIF(input.Status.HasValue, u => u.Status == input.Status) + .Select<FBS_RoleOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇瀹㈡埛瑙掕壊璇︽儏 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇瀹㈡埛瑙掕壊璇︽儏")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_Role> Detail([FromQuery] QueryByIdFBS_RoleInput input) + { + return await _fBS_RoleRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞瀹㈡埛瑙掕壊 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞瀹㈡埛瑙掕壊")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_RoleInput input) + { + var entity = input.Adapt<FBS_Role>(); + return await _fBS_RoleRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊瀹㈡埛瑙掕壊 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊瀹㈡埛瑙掕壊")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_RoleInput input) + { + var entity = input.Adapt<FBS_Role>(); + await _fBS_RoleRep.AsUpdateable(entity) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎瀹㈡埛瑙掕壊 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎瀹㈡埛瑙掕壊")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_RoleInput input) + { + var entity = await _fBS_RoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_RoleRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_RoleRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎瀹㈡埛瑙掕壊 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎瀹㈡埛瑙掕壊")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")] List<DeleteFBS_RoleInput> input) + { + var exp = Expressionable.Create<FBS_Role>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_RoleRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_RoleRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_RoleRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 璁剧疆瀹㈡埛瑙掕壊鐘舵�� 馃毇 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("璁剧疆瀹㈡埛瑙掕壊鐘舵��")] + [ApiDescriptionSettings(Name = "SetStatus"), HttpPost] + public async Task SetFBS_RoleStatus(SetFBS_RoleStatusInput input) + { + await _fBS_RoleRep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync(); + } + + /// <summary> + /// 瀵煎嚭瀹㈡埛瑙掕壊璁板綍 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭瀹㈡埛瑙掕壊璁板綍")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_RoleInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_RoleOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "瀹㈡埛瑙掕壊瀵煎嚭璁板綍"); + } + + /// <summary> + /// 涓嬭浇瀹㈡埛瑙掕壊鏁版嵁瀵煎叆妯℃澘 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇瀹㈡埛瑙掕壊鏁版嵁瀵煎叆妯℃澘")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_RoleOutput>(), "瀹㈡埛瑙掕壊瀵煎叆妯℃澘"); + } + + private static readonly object _fBS_RoleImportLock = new object(); + /// <summary> + /// 瀵煎叆瀹㈡埛瑙掕壊璁板綍 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆瀹㈡埛瑙掕壊璁板綍")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_RoleImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_RoleInput, FBS_Role>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => + { + return true; + }).Adapt<List<FBS_Role>>(); + + var storageable = _fBS_RoleRep.Context.Storageable(rows) + .SplitError(it => it.Item.Name?.Length > 64, "鍚嶇О闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Code?.Length > 64, "缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗�") + .SplitError(it => it.Item.Remark?.Length > 128, "澶囨敞闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs new file mode 100644 index 0000000..4300b44 --- /dev/null +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/ADPenaltyService.cs @@ -0,0 +1,129 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; + +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Admin.NET.Core; +using Admin.NET.Application; +using Furion.DynamicApiController; +using FZCZTB.NET.MD; +using Furion.DependencyInjection; +namespace FZCZTB.TSCL.Application; + +/// <summary> +/// 琛屾斂澶勭綒鏈嶅姟 馃З +/// </summary> +[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)] +public class ADPenaltyService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<ADPenalty> _aDPenaltyRep; + + public ADPenaltyService(SqlSugarRepository<ADPenalty> aDPenaltyRep) + { + _aDPenaltyRep = aDPenaltyRep; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ琛屾斂澶勭綒 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ琛屾斂澶勭綒")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<ADPenaltyOutput>> Page(PageADPenaltyInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _aDPenaltyRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Parties.Contains(input.Keyword) || u.CaseReason.Contains(input.Keyword) || u.DisposalDecision.Contains(input.Keyword) || u.SupervisionDepartment.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Parties), u => u.Parties.Contains(input.Parties.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.CaseReason), u => u.CaseReason.Contains(input.CaseReason.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.DisposalDecision), u => u.DisposalDecision.Contains(input.DisposalDecision.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.SupervisionDepartment), u => u.SupervisionDepartment.Contains(input.SupervisionDepartment.Trim())) + .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1]) + .Select<ADPenaltyOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇琛屾斂澶勭綒璇︽儏 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇琛屾斂澶勭綒璇︽儏")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<ADPenalty> Detail([FromQuery] QueryByIdADPenaltyInput input) + { + return await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞琛屾斂澶勭綒 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞琛屾斂澶勭綒")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<bool> Add(AddADPenaltyInput input) + { + var entity = input.Adapt<ADPenalty>(); + entity.Id = Guid.NewGuid(); + return await _aDPenaltyRep.InsertAsync(entity) ; + } + + /// <summary> + /// 鏇存柊琛屾斂澶勭綒 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊琛屾斂澶勭綒")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateADPenaltyInput input) + { + var entity = input.Adapt<ADPenalty>(); + await _aDPenaltyRep.AsUpdateable(entity) + + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎琛屾斂澶勭綒 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎琛屾斂澶勭綒")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteADPenaltyInput input) + { + var entity = await _aDPenaltyRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _aDPenaltyRep.DeleteAsync(entity); //鍋囧垹闄� + //await _aDPenaltyRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎琛屾斂澶勭綒 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎琛屾斂澶勭綒")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteADPenaltyInput> input) + { + var exp = Expressionable.Create<ADPenalty>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _aDPenaltyRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + return await _aDPenaltyRep.DeleteAsync(list); //鍋囧垹闄� + //return await _aDPenaltyRep.DeleteAsync(list); //鐪熷垹闄� + } +} diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs new file mode 100644 index 0000000..a12a866 --- /dev/null +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyDto.cs @@ -0,0 +1,79 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +namespace FZCZTB.TSCL.Application; + +/// <summary> +/// 琛屾斂澶勭綒杈撳嚭鍙傛暟 +/// </summary> +public class ADPenaltyDto +{ + /// <summary> + /// id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + public DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + public string? SupervisionDepartment { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + public string? Url { get; set; } + +} diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs new file mode 100644 index 0000000..bb23e15 --- /dev/null +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyInput.cs @@ -0,0 +1,191 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.TSCL.Application; + +/// <summary> +/// 琛屾斂澶勭綒鍩虹杈撳叆鍙傛暟 +/// </summary> +public class ADPenaltyBaseInput +{ + /// <summary> + /// id + /// </summary> + public virtual Guid Id { get; set; } + + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")] + public virtual DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + public virtual string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public virtual string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public virtual string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + public virtual string? SupervisionDepartment { get; set; } + + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + public string? Url { get; set; } + +} + +/// <summary> +/// 琛屾斂澶勭綒鍒嗛〉鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class PageADPenaltyInput : BasePageInput +{ + /// <summary> + /// 鍐冲畾鏃ユ湡鑼冨洿 + /// </summary> + public DateTime?[] DecisionDateRange { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + public string? SupervisionDepartment { get; set; } + +} + +/// <summary> +/// 琛屾斂澶勭綒澧炲姞杈撳叆鍙傛暟 +/// </summary> +public class AddADPenaltyInput +{ + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")] + public DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")] + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")] + public string? SupervisionDepartment { get; set; } + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + public string? Url { get; set; } + +} + +/// <summary> +/// 琛屾斂澶勭綒鍒犻櫎杈撳叆鍙傛暟 +/// </summary> +public class DeleteADPenaltyInput +{ + /// <summary> + /// id + /// </summary> + [Required(ErrorMessage = "id涓嶈兘涓虹┖")] + public Guid Id { get; set; } + +} + +/// <summary> +/// 琛屾斂澶勭綒鏇存柊杈撳叆鍙傛暟 +/// </summary> +public class UpdateADPenaltyInput +{ + /// <summary> + /// id + /// </summary> + [Required(ErrorMessage = "id涓嶈兘涓虹┖")] + public Guid Id { get; set; } + + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + [Required(ErrorMessage = "鍐冲畾鏃ユ湡涓嶈兘涓虹┖")] + public DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + [MaxLength(255, ErrorMessage = "褰撲簨浜轰俊鎭瓧绗﹂暱搴︿笉鑳借秴杩�255")] + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + [MaxLength(255, ErrorMessage = "閲囪喘鐩戠潱閮ㄩ棬鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃255")] + public string? SupervisionDepartment { get; set; } + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + public string? Url { get; set; } +} + +/// <summary> +/// 琛屾斂澶勭綒涓婚敭鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class QueryByIdADPenaltyInput : DeleteADPenaltyInput +{ +} + diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs new file mode 100644 index 0000000..1f40bb3 --- /dev/null +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ADPenalty/Dto/ADPenaltyOutput.cs @@ -0,0 +1,79 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.TSCL.Application; + +/// <summary> +/// 琛屾斂澶勭綒杈撳嚭鍙傛暟 +/// </summary> +public class ADPenaltyOutput +{ + /// <summary> + /// id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 鍐冲畾鏃ユ湡 + /// </summary> + public DateTime DecisionDate { get; set; } + + /// <summary> + /// 褰撲簨浜轰俊鎭� + /// </summary> + public string? Parties { get; set; } + + /// <summary> + /// 妗堢敱鎻忚堪 + /// </summary> + public string? CaseReason { get; set; } + + /// <summary> + /// 澶勭悊鍐冲畾鍐呭 + /// </summary> + public string? DisposalDecision { get; set; } + + /// <summary> + /// 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + /// </summary> + public string? SupervisionDepartment { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + + /// <summary> + /// 绾夸笂鍦板潃 + /// </summary> + public string? Url { get; set; } + +} diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs index 750251b..30fdd6a 100644 --- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintInput.cs @@ -122,6 +122,13 @@ /// 閫変腑涓婚敭鍒楄〃 /// </summary> public List<Guid> SelectKeyList { get; set; } + + /// <summary> + /// 鏄惁鎴愮珛 + /// </summary> + public PComplaintStatus? Status { get; set; } + + } /// <summary> diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs index 956dbe8..9bcc917 100644 --- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/Dto/ProcurementComplaintOutput.cs @@ -3,6 +3,7 @@ // 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� // // 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using FZCZTB.NET.MD; using Magicodes.ExporterAndImporter.Core; namespace FZCZTB.TSCL.Application; @@ -84,10 +85,14 @@ /// <summary> /// 淇敼鑰呭鍚� /// </summary> - public string? UpdateUserName { get; set; } + public string? UpdateUserName { get; set; } - - + public List<ProcurementComplaintItems>? Complaints { get; set; } + + /// <summary> + /// 鏄惁鎴愮珛 + /// </summary> + public PComplaintStatus Status { get; set; } } /// <summary> diff --git a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs index a9dec84..4d107d0 100644 --- a/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs +++ b/Admin.NET/FZCZTB.TSCL.Application/Service/ProcurementComplaint/ProcurementComplaintService.cs @@ -23,6 +23,7 @@ using System.Linq; using NewLife.Xml; using AngleSharp.Dom; +using static Elastic.Clients.Elasticsearch.JoinField; namespace FZCZTB.TSCL.Application; /// <summary> @@ -50,8 +51,8 @@ public async Task<SqlSugarPagedList<ProcurementComplaintOutput>> Page(PageProcurementComplaintInput input) { input.Keyword = input.Keyword?.Trim(); - var query = _procurementComplaintRep.AsQueryable().Includes(x=>x.Complaints) - .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Complaints.Any(uu=>uu.ItemDescription.Contains(input.Keyword))) + var query = _procurementComplaintRep.AsQueryable().Includes(u => u.Complaints) + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Complaints.Any(uu => uu.ItemDescription.Contains(input.Keyword))) .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectCode), u => u.ProjectCode.Contains(input.ProjectCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ProjectName), u => u.ProjectName.Contains(input.ProjectName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Purchaser), u => u.Purchaser.Contains(input.Purchaser.Trim())) @@ -60,7 +61,21 @@ .WhereIF(!string.IsNullOrWhiteSpace(input.ProcurementSupervisionDepartment), u => u.ProcurementSupervisionDepartment.Contains(input.ProcurementSupervisionDepartment.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Url), u => u.Url.Contains(input.Url.Trim())) .WhereIF(input.DecisionDateRange?.Length == 2, u => u.DecisionDate >= input.DecisionDateRange[0] && u.DecisionDate <= input.DecisionDateRange[1]) - .Select<ProcurementComplaintOutput>(); + .WhereIF(input.Status != null && input.Status == PComplaintStatus.Valid, u =>( u.Complaints.Any(uu => uu.HandlingStatus == PComplaintStatus.Valid))) + .WhereIF(input.Status != null && input.Status == PComplaintStatus.Rejected, u => ( !u.Complaints.Any(uu=>uu.HandlingStatus== PComplaintStatus.Other||uu.HandlingStatus== PComplaintStatus.Valid||uu.HandlingStatus==null))) + .WhereIF(input.Status != null && input.Status == PComplaintStatus.Other, u =>!( u.Complaints.Any(uu=>uu.HandlingStatus== PComplaintStatus.Valid)|| (!u.Complaints.Any(uu => uu.HandlingStatus == PComplaintStatus.Other || uu.HandlingStatus == PComplaintStatus.Valid || uu.HandlingStatus == null)))) + .Select(n => new ProcurementComplaintOutput + { + Complaints = n.Complaints + },true) + .Mapper(n => + { + n.Status =n.Complaints==null? PComplaintStatus.Other:n.Complaints.Any(x => x.HandlingStatus == PComplaintStatus.Valid) ? PComplaintStatus.Valid : + n.Complaints.All(x => x.HandlingStatus == PComplaintStatus.Rejected) ? PComplaintStatus.Rejected : PComplaintStatus.Other ; + n.Complaints = null; + } + ); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj index 95ed3af..5524a31 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj @@ -1,7 +1,7 @@ 锘�<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj index ff2c7ba..a73595f 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj @@ -1,7 +1,7 @@ 锘�<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj index ff2c7ba..a73595f 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj @@ -1,7 +1,7 @@ 锘�<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj index 238c651..9e739ba 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj @@ -1,7 +1,7 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj index b0912b6..2fb4dd9 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj @@ -1,7 +1,7 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj b/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj index ff2c7ba..a73595f 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj +++ b/Admin.NET/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj @@ -1,7 +1,7 @@ 锘�<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFrameworks>net8.0;net9.0</TargetFrameworks> + <TargetFrameworks>net8.0</TargetFrameworks> <NoWarn>1701;1702;1591;8632</NoWarn> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> diff --git a/Admin.NET/cylsg.utility/CommonHelper.cs b/Admin.NET/cylsg.utility/CommonHelper.cs new file mode 100644 index 0000000..9ad189f --- /dev/null +++ b/Admin.NET/cylsg.utility/CommonHelper.cs @@ -0,0 +1,1015 @@ +锘縰sing cylsg.utility.Extend; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Globalization; +using System.Linq; +using System.Linq.Expressions; +using System.Net.Http.Json; +using System.Reflection; +using System.Runtime.Loader; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static cylsg.utility.untilityModels; + +namespace cylsg.utility +{ + /// <summary> + /// 閫氱敤甯姪绫� + /// </summary> + public static class CommonHelper + { + + #region 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜 + /// <summary> + /// 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜 + /// </summary> + /// <param name="mobilePhoneNumber"></param> + /// <returns></returns> + public static bool IsMobile(string mobilePhoneNumber) + { + if (mobilePhoneNumber.Length < 11) + { + return false; + } + + //鐢典俊鎵嬫満鍙风爜姝e垯 + string dianxin = @"^1[345789][01379]\d{8}$"; + Regex regexDx = new Regex(dianxin); + //鑱旈�氭墜鏈哄彿鐮佹鍒� + string liantong = @"^1[345678][01256]\d{8}$"; + Regex regexLt = new Regex(liantong); + //绉诲姩鎵嬫満鍙风爜姝e垯 + string yidong = @"^1[345789][0123456789]\d{8}$"; + Regex regexYd = new Regex(yidong); + if (regexDx.IsMatch(mobilePhoneNumber) || regexLt.IsMatch(mobilePhoneNumber) || regexYd.IsMatch(mobilePhoneNumber)) + { + return true; + } + else + { + return false; + } + } + #endregion + + #region 妫�娴嬫槸鍚︾鍚坋mail鏍煎紡 + + /// <summary> + /// 妫�娴嬫槸鍚︾鍚坋mail鏍煎紡 + /// </summary> + /// <param name="strEmail">瑕佸垽鏂殑email瀛楃涓�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsValidEmail(string strEmail) + { + return Regex.IsMatch(strEmail, @"^[\w\.]+([-]\w+)*@[A-Za-z0-9-_]+[\.][A-Za-z0-9-_]"); + } + + public static bool IsValidDoEmail(string strEmail) + { + return Regex.IsMatch(strEmail, + @"^@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); + } + #endregion + + #region 妫�娴嬫槸鍚︽槸姝g‘鐨刄rl + /// <summary> + /// 妫�娴嬫槸鍚︽槸姝g‘鐨刄rl + /// </summary> + /// <param name="strUrl">瑕侀獙璇佺殑Url</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsUrl(string strUrl) + { + return Regex.IsMatch(strUrl, + @"^(http|https)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{1,10}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$"); + } + + + #endregion + + #region string 杞琲nt鏁扮粍 + + public static int[] StringToIntArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new int[0]; + if (str.EndsWith(",")) + { + str = str.Remove(str.Length - 1, 1); + } + var idstrarr = str.Split(','); + var idintarr = new int[idstrarr.Length]; + + for (int i = 0; i < idstrarr.Length; i++) + { + idintarr[i] = Convert.ToInt32(idstrarr[i]); + } + return idintarr; + } + catch + { + return new int[0]; + } + } + #endregion + + #region String杞暟缁� + public static string[] StringToStringArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new string[0]; + if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1); + return str.Split(','); + } + catch + { + return new string[0]; + } + } + #endregion + + #region String鏁扮粍杞琁nt鏁扮粍 + public static int[] StringArrAyToIntArray(string[] str) + { + try + { + int[] iNums = Array.ConvertAll(str, s => int.Parse(s)); + return iNums; + } + catch + { + return new int[0]; + } + } + #endregion + + #region string杞珿uid鏁扮粍 + + public static Guid[] StringToGuidArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new Guid[0]; + if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1); + var strarr = str.Split(','); + Guid[] guids = new Guid[strarr.Length]; + for (int index = 0; index < strarr.Length; index++) + { + guids[index] = Guid.Parse(strarr[index]); + } + return guids; + } + catch + { + return new Guid[0]; + } + } + #endregion + + #region 杞琈D5 + /// <summary> + /// 杞琈D5 + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static string ToMd5(string str) + { + MD5 md5 = MD5.Create(); + // 灏嗗瓧绗︿覆杞崲鎴愬瓧鑺傛暟缁� + byte[] byteOld = Encoding.UTF8.GetBytes(str); + // 璋冪敤鍔犲瘑鏂规硶 + byte[] byteNew = md5.ComputeHash(byteOld); + // 灏嗗姞瀵嗙粨鏋滆浆鎹负瀛楃涓� + StringBuilder sb = new StringBuilder(); + foreach (byte b in byteNew) + { + // 灏嗗瓧鑺傝浆鎹㈡垚16杩涘埗琛ㄧず鐨勫瓧绗︿覆锛� + sb.Append(b.ToString("x2")); + } + // 杩斿洖鍔犲瘑鐨勫瓧绗︿覆 + return sb.ToString(); + } + #endregion + + #region 鑾峰彇32浣峬d5鍔犲瘑 + /// <summary> + /// 閫氳繃鍒涘缓鍝堝笇瀛楃涓查�傜敤浜庝换浣� MD5 鍝堝笇鍑芥暟 锛堝湪浠讳綍骞冲彴锛� 涓婂垱寤� 32 涓瓧绗︾殑鍗佸叚杩涘埗鏍煎紡鍝堝笇瀛楃涓� + /// </summary> + /// <param name="source"></param> + /// <returns>32浣峬d5鍔犲瘑瀛楃涓�</returns> + public static string Md5For32(string source) + { + using (MD5 md5Hash = MD5.Create()) + { + byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); + StringBuilder sBuilder = new StringBuilder(); + for (int i = 0; i < data.Length; i++) + { + sBuilder.Append(data[i].ToString("x2")); + } + + string hash = sBuilder.ToString(); + return hash.ToUpper(); + } + } + #endregion + + #region 鑾峰彇16浣峬d5鍔犲瘑 + /// <summary> + /// 鑾峰彇16浣峬d5鍔犲瘑 + /// </summary> + /// <param name="source"></param> + /// <returns>16浣峬d5鍔犲瘑瀛楃涓�</returns> + public static string Md5For16(string source) + { + using (MD5 md5Hash = MD5.Create()) + { + byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); + //杞崲鎴愬瓧绗︿覆锛屽苟鍙�9鍒�25浣� + string sBuilder = BitConverter.ToString(data, 4, 8); + //BitConverter杞崲鍑烘潵鐨勫瓧绗︿覆浼氬湪姣忎釜瀛楃涓棿浜х敓涓�涓垎闅旂锛岄渶瑕佸幓闄ゆ帀 + sBuilder = sBuilder.Replace("-", ""); + return sBuilder.ToUpper(); + } + } + + #endregion + + #region 杩斿洖褰撳墠鐨勬绉掓椂闂存埑 + + /// <summary> + /// 杩斿洖褰撳墠鐨勬绉掓椂闂存埑 + /// </summary> + public static string Msectime() + { + long timeTicks = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; + return timeTicks.ToString(); + } + + + #endregion + + + + #region 鍓╀綑澶氫箙鏃堕棿鏂囧瓧鎻忚堪 + /// <summary> + /// 鍓╀綑澶氫箙鏃堕棿 + /// </summary> + /// <param name="remainingTime"></param> + /// <returns>鏂囧瓧鎻忚堪</returns> + public static string GetRemainingTime(DateTime remainingTime) + { + TimeSpan timeSpan = remainingTime - DateTime.Now; + var day = timeSpan.Days; + var hours = timeSpan.Hours; + var minute = timeSpan.Minutes; + var seconds = timeSpan.Seconds; + if (day > 0) + { + return day + "澶�" + hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�"; + } + else + { + if (hours > 0) + { + return hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�"; + } + else + { + return minute + "鍒�" + seconds + "绉�"; + } + } + } + + #endregion + + #region 鍓╀綑澶氫箙鏃堕棿杩斿洖鏃堕棿绫诲瀷 + /// <summary> + /// 鍓╀綑澶氫箙鏃堕棿 + /// </summary> + /// <param name="remainingTime"></param> + /// <returns>杩斿洖鏃堕棿绫诲瀷</returns> + public static void GetBackTime(DateTime remainingTime, out int day, out int hours, out int minute, out int seconds) + { + TimeSpan timeSpan = remainingTime - DateTime.Now; + day = timeSpan.Days; + hours = timeSpan.Hours; + minute = timeSpan.Minutes; + seconds = timeSpan.Seconds; + } + + #endregion + + #region 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂� + + /// <summary> + /// 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂� + /// </summary> + /// <param name="postTime">鎻愪氦鏃堕棿(瑕佹槸浠ュ墠鐨勬椂闂�)</param> + /// <returns></returns> + public static string TimeAgo(DateTime postTime) + { + //褰撳墠鏃堕棿鐨勬椂闂存埑 + var nowtimes = ConvertTicks(DateTime.Now); + //鎻愪氦鐨勬椂闂存埑 + var posttimes = ConvertTicks(postTime); + //鐩稿樊鏃堕棿鎴� + var counttime = nowtimes - posttimes; + + //杩涜鏃堕棿杞崲 + if (counttime <= 60) + { + return "鍒氬垰"; + } + else if (counttime > 60 && counttime <= 120) + { + return "1鍒嗛挓鍓�"; + } + else if (counttime > 120 && counttime <= 180) + { + return "2鍒嗛挓鍓�"; + } + else if (counttime > 180 && counttime < 3600) + { + return Convert.ToInt32(counttime / 60) + "鍒嗛挓鍓�"; + } + else if (counttime >= 3600 && counttime < 3600 * 24) + { + return Convert.ToInt32(counttime / 3600) + "灏忔椂鍓�"; + } + else if (counttime >= 3600 * 24 && counttime < 3600 * 24 * 2) + { + return "鏄ㄥぉ"; + } + else if (counttime >= 3600 * 24 * 2 && counttime < 3600 * 24 * 3) + { + return "鍓嶅ぉ"; + } + else if (counttime >= 3600 * 24 * 3 && counttime <= 3600 * 24 * 7) + { + return Convert.ToInt32(counttime / (3600 * 24)) + "澶╁墠"; + } + else if (counttime >= 3600 * 24 * 7 && counttime <= 3600 * 24 * 30) + { + return Convert.ToInt32(counttime / (3600 * 24 * 7)) + "鍛ㄥ墠"; + } + else if (counttime >= 3600 * 24 * 30 && counttime <= 3600 * 24 * 365) + { + return Convert.ToInt32(counttime / (3600 * 24 * 30)) + "涓湀鍓�"; + } + else if (counttime >= 3600 * 24 * 365) + { + return Convert.ToInt32(counttime / (3600 * 24 * 365)) + "骞村墠"; + } + else + { + return ""; + } + } + + /// <summary> + /// 鏃堕棿杞崲涓虹鐨勬椂闂存埑 + /// </summary> + /// <param name="time"></param> + /// <returns></returns> + private static long ConvertTicks(DateTime time) + { + long currentTicks = time.Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0); + long currentMillis = (currentTicks - dtFrom.Ticks) / 10000000; //杞崲涓虹涓篢icks/10000000锛岃浆鎹负姣Ticks/10000 + return currentMillis; + } + + #endregion + + #region 娓呴櫎HTML涓寚瀹氭牱寮� + /// <summary> + /// 娓呴櫎HTML涓寚瀹氭牱寮� + /// </summary> + /// <param name="content"></param> + /// <param name="rule"></param> + /// <returns></returns> + public static string ClearHtml(string content, string[] rule) + { + if (!rule.Any()) + { + return content; + } + + foreach (var item in rule) + { + content = Regex.Replace(content, "/" + item + @"\s*=\s*\d+\s*/i", ""); + content = Regex.Replace(content, "/" + item + @"\s*=\s*.+?[""]/i", ""); + content = Regex.Replace(content, "/" + item + @"\s*:\s*\d+\s*px\s*;?/i", ""); + } + return content; + } + #endregion + + #region list闅忔満鎺掑簭鏂规硶 + /// <summary> + /// list闅忔満鎺掑簭鏂规硶 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="ListT"></param> + /// <returns></returns> + public static List<T> RandomSortList<T>(List<T> ListT) + { + Random random = new Random(); + List<T> newList = new List<T>(); + foreach (T item in ListT) + { + newList.Insert(random.Next(newList.Count + 1), item); + } + return newList; + } + #endregion + + + + #region 鎴墠鍚庡瓧绗�(涓�) + ///<summary> + /// 鎴墠鍚庡瓧绗�(涓�) + ///</summary> + ///<param name="val">鍘熷瓧绗︿覆</param> + ///<param name="str">瑕佹埅鎺夌殑瀛楃涓�</param> + ///<param name="all">鏄惁璐┆</param> + ///<returns></returns> + public static string GetCaptureInterceptedText(string val, string str, bool all = false) + { + return Regex.Replace(val, @"(^(" + str + ")" + (all ? "*" : "") + "|(" + str + ")" + (all ? "*" : "") + "$)", ""); + } + #endregion + + #region 瀵嗙爜鍔犲瘑鏂规硶 + /// <summary> + /// 瀵嗙爜鍔犲瘑鏂规硶 + /// </summary> + /// <param name="password">瑕佸姞瀵嗙殑瀛楃涓�</param> + /// <param name="createTime">鏃堕棿缁勫悎</param> + /// <returns></returns> + public static string EnPassword(string password, DateTime createTime) + { + var dtStr = createTime.ToString("yyyyMMddHHmmss"); + var md5 = Md5For32(password); + var enPwd = Md5For32(md5 + dtStr); + return enPwd; + } + #endregion + + #region 鑾峰彇鐜板湪鏄槦鏈熷嚑 + /// <summary> + /// 鑾峰彇鐜板湪鏄槦鏈熷嚑 + /// </summary> + /// <returns></returns> + public static string GetWeek() + { + string week = string.Empty; + switch (DateTime.Now.DayOfWeek) + { + case DayOfWeek.Monday: + week = "鍛ㄤ竴"; + break; + case DayOfWeek.Tuesday: + week = "鍛ㄤ簩"; + break; + case DayOfWeek.Wednesday: + week = "鍛ㄤ笁"; + break; + case DayOfWeek.Thursday: + week = "鍛ㄥ洓"; + break; + case DayOfWeek.Friday: + week = "鍛ㄤ簲"; + break; + case DayOfWeek.Saturday: + week = "鍛ㄥ叚"; + break; + case DayOfWeek.Sunday: + week = "鍛ㄦ棩"; + break; + default: + week = "N/A"; + break; + } + return week; + } + + #endregion + + #region UrlEncode (URL缂栫爜) + /// <summary> + /// UrlEncode (URL缂栫爜) + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static string UrlEncode(string str) + { + StringBuilder sb = new StringBuilder(); + byte[] byStr = Encoding.UTF8.GetBytes(str); //榛樿鏄疭ystem.Text.Encoding.Default.GetBytes(str) + for (int i = 0; i < byStr.Length; i++) + { + sb.Append(@"%" + Convert.ToString(byStr[i], 16)); + } + + return sb.ToString(); + } + + #endregion + + #region 鑾峰彇10浣嶆椂闂存埑 + /// <summary> + /// 鑾峰彇10浣嶆椂闂存埑 + /// </summary> + /// <returns></returns> + public static long GetTimeStampByTotalSeconds() + { + TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + #endregion + + #region 鑾峰彇13浣嶆椂闂存埑 + /// <summary> + /// 鑾峰彇13浣嶆椂闂存埑 + /// </summary> + /// <returns></returns> + public static long GetTimeStampByTotalMilliseconds() + { + TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalMilliseconds); + } + + /// <summary> + /// 鑾峰彇鏃堕棿鎴� + /// </summary> + /// <param name="dt"></param> + /// <returns></returns> + public static int GetDateTimeStamp(DateTime dt) + { + DateTime dateStart = new DateTime(1970, 1, 1, 0, 0, 0); + int timeStamp = Convert.ToInt32((dt.ToUniversalTime() - dateStart).TotalSeconds); + return timeStamp; + } + + #endregion + + #region 鑾峰彇闅忔満瀛楃涓� + /// <summary> + /// 鑾峰彇闅忔満瀛楃涓� + /// </summary> + /// <returns></returns> + public static string GetSerialNumber() + { + var str = string.Empty; + Random rand = new Random(); + var charsStr2 = new[] { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; + var charsLen2 = charsStr2.Length - 1; + // shuffle($chars); + str = ""; + for (int i = 0; i < 16; i++) + { + str += charsStr2[rand.Next(0, charsLen2)]; + } + return str; + } + + #endregion + + #region Sha1绛惧悕 + /// <summary> + /// Sha1绛惧悕 + /// </summary> + /// <param name="str">鍐呭</param> + /// <param name="encoding">缂栫爜</param> + /// <returns></returns> + public static string Sha1Signature(string str, Encoding encoding = null) + { + if (encoding == null) encoding = Encoding.UTF8; + var buffer = encoding.GetBytes(str); + var data = SHA1.Create().ComputeHash(buffer); + StringBuilder sub = new StringBuilder(); + foreach (var t in data) + { + sub.Append(t.ToString("x2")); + } + + return sub.ToString(); + } + #endregion + + /// <summary> + /// 绮剧‘璁$畻base64瀛楃涓叉枃浠跺ぇ灏忥紙鍗曚綅锛欱锛� + /// param base64String + /// return double 瀛楄妭澶у皬 + /// </summary> + /// <param name="base64String"></param> + /// <returns></returns> + public static double Base64FileSize(string base64String) + { + //妫�娴嬫槸鍚﹀惈鏈塨ase64,鏂囦欢澶�) + if (base64String.LastIndexOf(",", StringComparison.Ordinal) > -1) + { + base64String = base64String[(base64String.LastIndexOf(",", StringComparison.Ordinal) + 1)..]; + } + //鑾峰彇base64瀛楃涓查暱搴�(涓嶅惈data:audio/wav;base64,鏂囦欢澶�) + var size0 = base64String.Length; + if (size0 <= 10) return size0 - (double)size0 / 8 * 2; + //鑾峰彇瀛楃涓茬殑灏惧反鐨勬渶鍚�10涓瓧绗︼紝鐢ㄤ簬鍒ゆ柇灏惧反鏄惁鏈夌瓑鍙凤紝姝e父鐢熸垚鐨刡ase64鏂囦欢'绛夊彿'涓嶄細瓒呰繃4涓� + var tail = base64String[(size0 - 10)..]; + //鎵惧埌绛夊彿锛屾妸绛夊彿涔熷幓鎺�,(绛夊彿鍏跺疄鏄┖鐨勬剰鎬�,涓嶈兘绠楀湪鏂囦欢澶у皬閲岄潰) + int equalIndex = tail.IndexOf("=", StringComparison.Ordinal); + if (equalIndex > 0) + { + size0 = size0 - (10 - equalIndex); + } + //璁$畻鍚庡緱鍒扮殑鏂囦欢娴佸ぇ灏忥紝鍗曚綅涓哄瓧鑺� + return size0 - (double)size0 / 8 * 2; + } + + /// <summary> + /// 鍒ゆ柇鏂囦欢澶у皬 + /// </summary> + /// <param name="base64"></param> + /// <param name="size"></param> + /// <param name="unit"></param> + /// <returns></returns> + public static bool CheckBase64Size(string base64, int size, string unit = "M") + { + // 涓婁紶鏂囦欢鐨勫ぇ灏�, 鍗曚綅涓哄瓧鑺�. + var len = Base64FileSize(base64); + // 鍑嗗鎺ユ敹鎹㈢畻鍚庢枃浠跺ぇ灏忕殑瀹瑰櫒 + double fileSize = unit.ToUpperInvariant() switch + { + "B" => len, + "K" => (double)len / 1024, + "M" => (double)len / 1048576, + "G" => (double)len / 1073741824, + _ => 0 + }; + // 濡傛灉涓婁紶鏂囦欢澶т簬闄愬畾鐨勫閲� + return !(fileSize > size); + } + + /// <summary> + /// 10浣嶆椂闂存埑 杞寲 + /// </summary> + /// <param name="time"></param> + /// <returns></returns> + public static long ConvertDateTimeToInt(DateTime time) + { + DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)); + long t = (time.Ticks - startTime.Ticks) / 10000000; //闄�10000000璋冩暣涓�10浣� + return t; + } + + #region 鍙嶅皠鐩稿叧 + private static List<Assembly>? _allAssemblies = null; + /// <summary> + /// 鑾峰彇鎵�鏈夌▼搴忕洰褰曚笅鍜屽父鐢ㄧ殑绋嬪簭闆� 鍖呮嫭涓�浜涚郴缁熷紩鐢ㄧ▼搴忛泦 + /// </summary> + /// <returns> 褰撳墠宸ョ▼涓嬬殑绋嬪簭闆�</returns> + public static List<Assembly> GetAllAssembly() + { + + + if (_allAssemblies == null) + { + _allAssemblies = new List<Assembly>(); + string? path = null; + string singlefile = null; + try + { + path = Assembly.GetEntryAssembly()?.Location; + } + catch { } + if (string.IsNullOrEmpty(path)) + { + singlefile = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; + path = Path.GetDirectoryName(singlefile); + } + if (string.IsNullOrEmpty(path)) + + throw new Exception("鑾峰彇绋嬪簭鐩綍鍑洪敊"); + var dir = new DirectoryInfo(Path.GetDirectoryName(path) ?? ""); + + var dlls = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly); + string[] systemdll = new string[] + { + "Microsoft.", + "System.", + "Swashbuckle.", + "ICSharpCode", + "Newtonsoft.", + "Oracle.", + "Pomelo.", + "SQLitePCLRaw.", + "Aliyun.OSS", + "BouncyCastle.", + "FreeSql.", + "Google.Protobuf.dll", + "Humanizer.dll", + "IdleBus.dll", + "K4os.", + "MySql.Data.", + "Npgsql.", + "NPOI.", + "netstandard", + "MySqlConnector", + "VueCliMiddleware" + }; + + var filtered = dlls.Where(x => systemdll.Any(y => x.Name.StartsWith(y)) == false); + foreach (var dll in filtered) + { + try + { + AssemblyLoadContext.Default.LoadFromAssemblyPath(dll.FullName); + } + catch + { + } + } + var dlllist = AssemblyLoadContext.Default.Assemblies.Where(x => systemdll.Any(y => x.FullName.StartsWith(y)) == false).ToList(); + _allAssemblies.AddRange(dlllist); + } + return _allAssemblies; + } + #endregion + + #region 鏋氫妇鑾峰彇鎵�鏈夐」 + /// <summary> + /// 鑾峰彇鏋氫妇鐨勬墍鏈夐」 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public static List<MenmItem> GetEnumItemsWithAttributes<T>() where T : Enum + { + var result = new List<MenmItem>(); + + foreach (var value in Enum.GetValues(typeof(T))) + { + var member = typeof(T).GetMember(value.ToString())[0]; + var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>(); + + var item = new MenmItem + { + Key = value.ToString(), + Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓� + Description = descriptionAttribute?.Description ?? string.Empty + }; + + result.Add(item); + } + + return result; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鎵�鏈夌殑椤癸紝杩斿洖鍚嶇О 鍊� 鍜孌escription 鎻忚堪 + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + /// <exception cref="ArgumentException"></exception> + public static List<MenmItem> EnumerateWithDescriptions(Type enumType) + { + if (!enumType.IsEnum) + { + throw new ArgumentException(" 杩欎笉鏄灇涓�"); + } + + var result = new List<MenmItem>(); + + foreach (var value in Enum.GetValues(enumType)) + { + var member = enumType.GetMember(value.ToString())[0]; + var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>(); + + var item = new MenmItem + { + Key = value.ToString(), + Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓� + Description = descriptionAttribute?.Description ?? string.Empty + }; + + result.Add(item); + } + + return result; + } + /// <summary> + /// 鏄惁鏄郴缁熺被鍨� + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public static bool IsCustomType(Type type) + { + // 瀹氫箟涓�涓垨澶氫釜鍩虹鍛藉悕绌洪棿鍒楄〃锛岃繖浜涘懡鍚嶇┖闂翠笅鐨勭被鍨嬮�氬父璁や负鏄郴缁熺被鍨� + string[] frameworkNamespaces = { "System", "Microsoft", "mscorlib", "netstandard", "System.Private.CoreLib" }; + + // 鑾峰彇绫诲瀷鎵�鍦ㄧ殑鍛藉悕绌洪棿 + string typeNameSpace = type.Namespace; + + // 妫�鏌ヨ鍛藉悕绌洪棿鏄惁鍦ㄥ熀纭�鍛藉悕绌洪棿鍒楄〃涓紝濡傛灉涓嶅湪锛屽垯璁や负鏄嚜瀹氫箟绫诲瀷 + return frameworkNamespaces.Any(n => typeNameSpace.StartsWith(n, StringComparison.OrdinalIgnoreCase)); + } + + + #endregion + + /// <summary> + /// 鏍规嵁json瀛楃绌垮鐞� + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="jsonString"></param> + /// <param name="parameter"></param> + /// <returns></returns> + private static Expression<Func<T, bool>> CreateWhereExpressionRecursive<T>(string jsonString, ParameterExpression parameter) + { + var conditions = new List<Expression>(); + + JObject jsonObject = JObject.Parse(jsonString); + + foreach (var property in jsonObject.Properties()) + { + var propertyName = property.Name; + var propertyValue = property.Value.ToString(); + if (propertyValue == "") //绌哄�间笉澶勭悊 + continue; + var propertyInfo = typeof(T).GetProperty(propertyName); + + if (propertyInfo == null) + { + propertyInfo = typeof(T).GetProperty(propertyName.FirstToCapitalize()); + if (propertyInfo == null) + continue; // 濡傛灉灞炴�т笉瀛樺湪锛岃烦杩� + } + + var propertyType = propertyInfo.PropertyType; + var TypeName = propertyType.GenericTypeArguments.Length > 0 ? propertyType.GenericTypeArguments[0].Name + "?" : propertyType.Name; + if (propertyType.IsClass && TypeName != "String") + { + // 閫掑綊澶勭悊宓屽妯″瀷 + var nestedParameter = Expression.Parameter(propertyType, propertyName); + var nestedJsonString = property.Value.ToString(); + + // 浣跨敤 MakeGenericType 鍔ㄦ�佸垱寤烘硾鍨嬫柟娉� + var genericMethod = typeof(CommonHelper).GetMethod("CreateWhereExpressionRecursive", BindingFlags.Static | BindingFlags.NonPublic) + .MakeGenericMethod(propertyType); + + // 璋冪敤娉涘瀷鏂规硶骞惰幏鍙栬繑鍥炵殑琛ㄨ揪寮� + var nestedConditions = (Expression<Func<object, bool>>)genericMethod.Invoke(null, new object[] { nestedJsonString, nestedParameter }); + + var propExpr = Expression.Property(parameter, propertyName); + var lambda = Expression.Lambda(nestedConditions.Body, nestedParameter); + var invoke = Expression.Invoke(lambda, propExpr); + conditions.Add(invoke); + } + else if (propertyType == typeof(string)) + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(propertyValue); + + var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); + var containsExpression = Expression.Call(propExpr, containsMethod, constant); + conditions.Add(containsExpression); + } + else if (TypeName.Contains( "DateTime")) //鍏煎DateTime锛� + { + var dateRange = propertyValue.Split('~'); + if (dateRange.Length == 2) + { + var startDate = DateTime.Parse(dateRange[0]); + var endDate = DateTime.Parse(dateRange[1]); + + var propExpr = Expression.Property(parameter, propertyName); + var startConstant = Expression.Constant(startDate); + var endConstant = Expression.Constant(endDate); + if (TypeName == "DateTime?") + // 灏嗗父閲忚〃杈惧紡杞崲涓� Nullable<DateTime> + { + var startNullableConstant = Expression.Convert(startConstant, typeof(DateTime?)); + var endNullableConstant = Expression.Convert(endConstant, typeof(DateTime?)); + + + var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startNullableConstant); + var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endNullableConstant); + + + var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual); + conditions.Add(andExpression); + } + else + { + + var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startConstant); + var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endConstant); + + + var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual); + conditions.Add(andExpression); + + } + } + else if (DateTime.TryParse(propertyValue, out var dateTime)) + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(dateTime); + var equalExpression = Expression.Equal(propExpr, constant); + conditions.Add(equalExpression); + } + } + else + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(Convert.ChangeType(propertyValue, propertyType)); + var equalExpression = Expression.Equal(propExpr, constant); + conditions.Add(equalExpression); + } + } + + var body = conditions.Count > 1 ? conditions.Aggregate(Expression.AndAlso) : conditions.FirstOrDefault(); + return Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(true), parameter); + } + + /// <summary> + /// json鏍煎紡鍖栦负琛ㄨ揪寮忔爲 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="jsonString"></param> + /// <returns></returns> + public static Expression<Func<T, bool>> FormatWhereExpression<T>(string jsonString) + { + var parameter = Expression.Parameter(typeof(T), "x"); + return CreateWhereExpressionRecursive<T>(jsonString, parameter); + } + + /// <summary> + /// 鏇村叿灞炴�у悕绉扮敓鎴愯〃杈惧紡鏍戯紝濡倄.id + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="propertyName"></param> + /// <returns></returns> + public static Expression<Func<T, object>> FormatPropertyExpression<T>(string propertyName) + { + // 鑾峰彇鍙傛暟琛ㄨ揪寮� + var parameter = Expression.Parameter(typeof(T), "x"); + + // 鑾峰彇灞炴�ц〃杈惧紡 + var propertyAccess = Expression.PropertyOrField(parameter, propertyName); + if (propertyAccess == null) + { + ///棣栧瓧姣嶈浆澶у啓 + propertyAccess = Expression.PropertyOrField(parameter, propertyName.FirstToCapitalize()); + } + + + // 鍒涘缓 Lambda 琛ㄨ揪寮忥紝骞跺湪杩斿洖鍊间腑杩涜绫诲瀷杞崲 + return Expression.Lambda<Func<T, object>>( + Expression.Convert(propertyAccess, typeof(object)), + parameter); + } + + + } + + + + + + /// <summary> + /// 鏋氫妇椤瑰睘鎬� + /// </summary> + [Description("鏋氫妇椤瑰睘鎬�")] + public class MenmItem + { + /// <summary> + /// 鏋氫妇key + /// </summary> + [Description("鏋氫妇key")] + public string? Key { get; set; } + /// <summary> + /// 鏋氫妇鍊� + /// </summary> + [Description("鏋氫妇鍊�")] + public int Value { get; set; } + /// <summary> + /// 鏋氫妇鎻忚堪 + /// </summary> + [Description("鏋氫妇椤瑰睘鎬�")] + public string? Description { get; set; } + } + + + + + +} diff --git a/Admin.NET/cylsg.utility/Extend/EmunEx.cs b/Admin.NET/cylsg.utility/Extend/EmunEx.cs new file mode 100644 index 0000000..6f2d96c --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/EmunEx.cs @@ -0,0 +1,15 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 鏋氫妇鎵╁睍 + /// </summary> + public static class EmunEx + { + } +} diff --git a/Admin.NET/cylsg.utility/Extend/StringEx.cs b/Admin.NET/cylsg.utility/Extend/StringEx.cs new file mode 100644 index 0000000..095dbcc --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/StringEx.cs @@ -0,0 +1,251 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 瀛楃涓叉墿灞� + /// </summary> + public static class StringEx + { + /// <summary> + /// 棣栧瓧姣嶅皬鍐� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static string FirstToLower(this string self) + { + string str1 = self?.Substring(0, 1).ToLower() ?? ""; + string str2 = self?.Substring(1) ?? ""; + + //棣栧瓧姣嶈浆灏忓啓 + return str1 + str2; + } + /// <summary> + /// 甯︽湁xxx.xxx缁撴潫鐨勭殑鎵�鏈夊瓧绗︿覆 鐨勫悗闈xx.xxx + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + public static string GetFileName(this string strtypr) + { + return Path.GetFileName(strtypr); + } + /// <summary> + /// 鏄惁鏄暟瀛楀簭鍒� + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static bool isPureNum(this string strtypr) + { + if (strtypr.Length == 0 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌� + { + return false; + } + byte[] strBytes = Encoding.ASCII.GetBytes(strtypr);//鑾峰彇瀛楃涓茬殑byte绫诲瀷鐨勫瓧绗︽暟缁勶紝缂栫爜鏂瑰紡ASCII + foreach (byte strByte in strBytes) + { + if (strByte < 48 || strByte > 57) //鍒ゆ柇姣忎釜瀛楃鏄惁涓烘暟瀛楋紝鏍规嵁姣忎釜瀛楃鐨凙SCII鍊兼墍鍦ㄨ寖鍥村垽鏂� + { + return false; //涓嶆槸锛屽氨杩斿洖false + } + } + return true; //鏄紝灏辫繑鍥瀟rue + } + + /// <summary> + /// 鏄惁鏄暟瀛楀簭鍒� + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static bool isGuid(this string strtypr) + { + if (strtypr.Length < 20 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌� + { + return false; + } + try + { + new Guid(strtypr); + return true; + + } + catch (Exception) + { + + return false; + } + } + + /// <summary> + /// 瀛楃涓� + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> + public static int toInt(this string strtypr) + { + if (!strtypr.isPureNum()) + throw new Exception("骞堕潪瀹屾暣鐨勬暟瀛楀簭鍒�"); + return int.Parse(strtypr); + } + + /// <summary> + /// 绉婚櫎绗竴涓瓧绗︿覆涓烘寚瀹氬瓧绗︿覆鐨� 濡� 鈥渁xtXXXXX" 濡傛灉浠�"axt"寮�澶寸殑瀛楃涓诧紝灏辩Щ闄�"axt" 娌℃湁鍒欎笉鍙� + /// </summary> + /// <param name="strtypr"></param> + /// <param name="str">寮�濮嬪瓧绗�</param> + /// <returns></returns> + public static string RemoveStartWithStr(this string strtypr, string str) + { + string strret = strtypr; + if (strtypr.StartsWith(str)) + { + strret = strtypr.Remove(0, str.Length); + } + return strret; + + } + + /// <summary> + /// 瀵瑰瓧绗︿覆杩涜闅愮澶勭悊锛屾瘮濡備腑闂寸殑鐢�*鏄剧ず + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + public static string PrivacyStr(this string strtypr) + { + // 濡傛灉鏄墜鏈哄彿鐮侊紝浠呬繚鐣欏墠3浣嶅拰鍚�4浣嶏紝涓棿鐢ㄦ槦鍙锋浛鎹� + if (Regex.IsMatch(strtypr, @"^1[3-9]\d{9}$")) + { + return $"{strtypr.Substring(0, 3)}****{strtypr.Substring(7)}"; + } + + // 瀵逛簬涓枃鍚嶅瓧鎴栬�呴潪鎵嬫満鍙锋牸寮忥紝浠呬繚鐣欓灏惧悇1涓瓧绗︼紝涓棿鐢ㄦ槦鍙锋浛鎹� + else + { + if (strtypr.Length <= 2) return $"{strtypr.Substring(0, 1)}*"; // 闀垮害灏忎簬绛変簬2鏃讹紝杩斿洖鍥哄畾鐨勬槦鍙� + + var masked = $"{strtypr.Substring(0, 1)}*{strtypr.Substring(strtypr.Length - 1, 1)}"; + return masked; + } + } + + + #region 鏃堕棿鍖洪棿瀛楃涓茶浆鍏跺疄鍜岀粨鏉熸椂闂� + /// <summary> + /// 瑙f瀽鏃堕棿鍖洪棿瀛楃涓� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static (DateTime? StartDate, DateTime? EndDate) TryParseDateRangString(this string input) + { + DateTime startDate, endDate; + var culture = CultureInfo.InvariantCulture; + + // 灏濊瘯瑙f瀽绗竴绉嶆牸寮� "2023-01-012023-01-31" + if (DateTime.TryParseExact(input.Substring(0, 10), "yyyy-MM-dd", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(10), "yyyy-MM-dd", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + + // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01 08:02:032023-01-31 08:02:03" + if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + + // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01T08:02:032023-01-31T08:02:03" + if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + // 濡傛灉閮戒笉鏄紝杩斿洖null + return (null, null); + } + + /// <summary> + /// 绉婚櫎鏈�鍚庝竴涓瓧绗︾殑?鍙� + /// </summary> + /// <param name="input"> </param> + /// /// <param name="inChar">瀛楃</param> + /// <returns></returns> + public static string RemoveCharIfPresent(this string input, char inChar) + { + if (string.IsNullOrEmpty(input)) return input; + + // 妫�鏌ュ瓧绗︿覆鐨勬渶鍚庝竴涓瓧绗︽槸鍚︿负闂彿 + if (input[^1] == '?') + { + // 浣跨敤鍒囩墖鎿嶄綔绗﹀垱寤轰笉鍖呭惈闂彿鐨勬柊瀛楃涓� + return input[..^1]; + } + else + { + // 瀛楃涓蹭笉浠ラ棶鍙风粨灏撅紝杩斿洖鍘熷瓧绗︿覆 + return input; + } + } + + /// <summary> + /// 绉婚櫎鏈�鍚庣殑瀛楃涓� + /// </summary> + /// <param name="input"></param> + /// <param name="endString"></param> + /// <returns></returns> + public static string RemoveEndStringIfExists(this string input, string endString) + { + if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(endString)) + { + return input; // 濡傛灉杈撳叆瀛楃涓叉垨缁撴潫瀛楃涓蹭负绌烘垨null锛岀洿鎺ヨ繑鍥炲師瀛楃涓� + } + + if (input.EndsWith(endString)) + { + return input.Substring(0, input.Length - endString.Length); // 绉婚櫎缁撴潫瀛楃涓� + } + + return input; // 濡傛灉涓嶄互鎸囧畾瀛楃涓茬粨鏉燂紝杩斿洖鍘熷瓧绗︿覆 + } + + + /// <summary> + /// 棣栧瓧姣嶈浆灏忓啓 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static string FirstCharToLower(this string input) + { + if (string.IsNullOrEmpty(input)) + { + return input; + } + + // 浣跨敤姝e垯琛ㄨ揪寮� + return Regex.Replace(input, @"^\p{Lu}", match => match.Value.ToLower()); + } + #endregion + + /// <summary> + /// 棣栧瓧姣嶈浆澶у啓 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static string FirstToCapitalize(this string input) + { + if (string.IsNullOrEmpty(input)) + { + return input; + } + + TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; + return textInfo.ToTitleCase(input.ToLower()).Substring(0, 1) + input.Substring(1); + } + } +} diff --git a/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs new file mode 100644 index 0000000..0fe86f8 --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs @@ -0,0 +1,1021 @@ +锘縰sing System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using cylsg.utility.Extend; +using Microsoft.Extensions.Primitives; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 鍙嶅皠鎵╁睍鍑芥暟 + /// </summary> + public static class TypeAndExpressionEx + { + #region 灞炴�ф墿灞� 鍙嶅皠 + public static Func<object, object> GetPropertyExpression(Type objtype, string property) + { + property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty); + List<string> level = new List<string>(); + if (property.Contains('.')) + { + level.AddRange(property.Split('.')); + } + else + { + level.Add(property); + } + + var pe = Expression.Parameter(objtype); +#pragma warning disable 8604 + var member = Expression.Property(pe, objtype.GetSingleProperty(level[0])); + for (int i = 1; i < level.Count; i++) + { + member = Expression.Property(member, member.Type.GetSingleProperty(level[i])); + } + return Expression.Lambda<Func<object, object>>(member, pe).Compile(); + } + + /// <summary> + /// 鑾峰彇灞炴�у悕 + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <param name="getAll">鏄惁鑾峰彇鍏ㄩ儴绾у埆鍚嶇О锛屾瘮濡俛.b.c</param> + /// <returns>灞炴�у悕</returns> + public static string GetPropertyName(this Expression expression, bool getAll = true) + { + if (expression == null) + { + return ""; + } + MemberExpression me = null; + LambdaExpression le = null; + if (expression is MemberExpression) + { + me = expression as MemberExpression; + } + if (expression is LambdaExpression) + { + le = expression as LambdaExpression; + if (le.Body is MemberExpression) + { + me = le.Body as MemberExpression; + } + if (le.Body is UnaryExpression) + { + me = (le.Body as UnaryExpression).Operand as MemberExpression; + } + } + string rv = ""; + if (me != null) + { + rv = me.Member.Name; + } + while (me != null && getAll && me.NodeType == ExpressionType.MemberAccess) + { + Expression exp = me.Expression; + if (exp is MemberExpression) + { + rv = (exp as MemberExpression).Member.Name + "." + rv; + me = exp as MemberExpression; + } + else if (exp is MethodCallExpression) + { + var mexp = exp as MethodCallExpression; + if (mexp.Method.Name == "get_Item") + { + object index = 0; + if (mexp.Arguments[0] is MemberExpression) + { + var obj = ((mexp.Arguments[0] as MemberExpression).Expression as ConstantExpression).Value; + index = obj.GetType().GetField((mexp.Arguments[0] as MemberExpression).Member.Name).GetValue(obj); + } + else + { + index = (mexp.Arguments[0] as ConstantExpression).Value; + } + rv = (mexp.Object as MemberExpression).Member.Name + "[" + index + "]." + rv; + me = mexp.Object as MemberExpression; + } + } + else + { + break; + } + } + return rv; + } + + public static Expression GetMemberExp(this ParameterExpression self, Expression member) + { + return self.GetMemberExp(member.GetPropertyName()); + } + + public static Expression GetMemberExp(this ParameterExpression self, string memberName) + { + var names = memberName.Split(','); + Expression rv = Expression.PropertyOrField(self, names[0]); ; + for (int i = 1; i < names.Length; i++) + { + rv = Expression.PropertyOrField(rv, names[i]); + } + return rv; + } + + + + /// <summary> + /// 鑾峰彇姝e垯琛ㄨ揪寮忛敊璇� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>閿欒鏂囨湰</returns> + public static string GetRegexErrorMessage(this MemberInfo pi) + { + string rv = ""; + + if (pi.GetCustomAttributes(typeof(RegularExpressionAttribute), false).FirstOrDefault() is RegularExpressionAttribute dis && !string.IsNullOrEmpty(dis.ErrorMessage)) + { + rv = dis.ErrorMessage; + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = ""; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�ф樉绀哄悕绉� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>灞炴�у悕绉�</returns> + public static string GetPropertyDisplayName(this MemberInfo pi) + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() is DisplayAttribute dis && !string.IsNullOrEmpty(dis.Name)) + { + rv = dis.Name; + + } + else + { + rv = pi.Name; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�ф樉绀哄悕绉� + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <returns>灞炴�ф樉绀哄悕绉�</returns> + public static string GetPropertyDisplayName(this Expression expression) + { + return expression.GetPropertyInfo().GetPropertyDisplayName(); + } + /// <summary> + /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉� + /// </summary> + /// <param name="pi"></param> + /// <returns></returns> + public static string GetPropertyDescription(this MemberInfo pi) + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() is DescriptionAttribute dis && !string.IsNullOrEmpty(dis.Description)) + { + rv = dis.Description; + + } + else + { + rv = pi.Name; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉� + /// </summary> + /// <param name="expression"></param> + /// <returns></returns> + public static string GetPropertyDescription(this Expression expression) + { + return expression.GetPropertyInfo().GetPropertyDisplayName(); + } + /// <summary> + /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О + /// </summary> + /// <param name="value">鏋氫妇鍊�</param> + /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns> + public static string? GetEnumDisplayName(this Enum value) + { + return GetEnumDisplayName(value.GetType(), value.ToString()); + } + + /// <summary> + /// 鑾峰彇灞炴�т俊鎭� + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <returns>灞炴�т俊鎭�</returns> + public static PropertyInfo? GetPropertyInfo(this Expression expression) + { + MemberExpression me = null; + LambdaExpression le = null; + if (expression is MemberExpression) + { + me = expression as MemberExpression; + } + if (expression is LambdaExpression) + { + le = expression as LambdaExpression; + if (le.Body is MemberExpression) + { + me = le.Body as MemberExpression; + } + if (le.Body is UnaryExpression) + { + me = (le.Body as UnaryExpression).Operand as MemberExpression; + } + } + PropertyInfo rv = null; + if (me != null) + { + rv = me.Member.DeclaringType.GetSingleProperty(me.Member.Name); + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�у�� + /// </summary> + /// <param name="exp">灞炴�ц〃杈惧紡</param> + /// <param name="obj">灞炴�ф墍鍦ㄥ疄渚�</param> + /// <returns>灞炴�у��</returns> + public static object? GetPropertyValue(this object obj, LambdaExpression exp) + { + //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿 + try + { + var expValue = exp.Compile().DynamicInvoke(obj); + object val = expValue; + return val; + } + catch + { + return ""; + } + } + /// <summary> + /// 鑾峰彇灞炴�у�� + /// </summary> + /// <param name="obj"></param> + /// <param name="property"></param> + /// <returns></returns> + public static object? GetPropertyValue(this object obj, string property) + { + //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿 + try + { + return obj.GetType().GetSingleProperty(property).GetValue(obj); + } + catch + { + return null; + } + } + + + public static List<string>? GetPropertySiblingValues(this object obj, string propertyName) + { + if (obj == null) + { + return new List<string>(); + } + Regex reg = new Regex("(.*?)\\[\\-?\\d?\\]\\.(.*?)$"); + var match = reg.Match(propertyName); + if (match.Success) + { + var name1 = match.Groups[1].Value; + var name2 = match.Groups[2].Value; + + var levels = name1.Split('.'); + var objtype = obj.GetType(); + var pe = Expression.Parameter(objtype); + var member = Expression.Property(pe, objtype.GetSingleProperty(levels[0])); + for (int i = 1; i < levels.Length; i++) + { + member = Expression.Property(member, member.Type.GetSingleProperty(levels[i])); + } + var pe2 = Expression.Parameter(member.Type.GetGenericArguments()[0]); + var cast = Expression.Call(typeof(Enumerable), "Cast", new Type[] { pe2.Type }, member); + + var name2exp = Expression.Property(pe2, pe2.Type.GetSingleProperty(name2)); + var selectexp = Expression.Call(name2exp, "ToString", Type.EmptyTypes); + + Expression select = Expression.Call( + typeof(Enumerable), + "Select", + new Type[] { pe2.Type, typeof(string) }, + cast, + Expression.Lambda(selectexp, pe2)); + + + var lambda = Expression.Lambda(select, pe); + var rv = new List<string>(); + try + { + rv = (lambda.Compile().DynamicInvoke(obj) as IEnumerable<string>)?.ToList(); + } + catch { } + return rv; + } + else + { + return new List<string>(); + } + } + + /// <summary> + /// 鍒ゆ柇灞炴�ф槸鍚﹀繀濉� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>鏄惁蹇呭~</returns> + public static bool IsPropertyRequired(this MemberInfo pi) + { + bool isRequired = false; + if (pi != null) + { + //濡傛灉闇�瑕佹樉绀烘槦鍙凤紝鍒欏垽鏂槸鍚︽槸蹇呭~椤癸紝濡傛灉鏄繀濉垯鍦ㄥ唴瀹瑰悗闈㈠姞涓婃槦鍙� + //鎵�鏈塱nt锛宖loat銆傘�傘�傝繖绉峆rimitive绫诲瀷鐨勶紝鑲畾閮芥槸蹇呭~ + Type t = pi.GetMemberType(); + if (t != null && (t.IsPrimitive() || t.IsEnum() || t == typeof(decimal) || t == typeof(Guid))) + { + isRequired = true; + } + else + { + //瀵逛簬鍏朵粬绫伙紝妫�鏌ユ槸鍚︽湁RequiredAttribute锛屽鏋滄湁灏辨槸蹇呭~ + if (pi.GetCustomAttributes(typeof(RequiredAttribute), false).FirstOrDefault() is RequiredAttribute required && required.AllowEmptyStrings == false) + { + isRequired = true; + } + else if (pi.GetCustomAttributes(typeof(KeyAttribute), false).FirstOrDefault() != null) + { + isRequired = true; + } + } + } + return isRequired; + } + + /// <summary> + /// 璁剧疆灞炴�у�� + /// </summary> + /// <param name="source">灞炴�ф墍鍦ㄥ疄渚�</param> + /// <param name="property">灞炴�у悕</param> + /// <param name="value">瑕佽祴鐨勫��</param> + /// <param name="prefix">灞炴�у墠缂�</param> + /// <param name="stringBasedValue">鏄惁涓哄瓧绗︿覆鏍煎紡鐨勫��</param> + public static void SetPropertyValue(this object source, string property, object value, string? prefix = null, bool stringBasedValue = false) + { + try + { + property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty); + List<string> level = new List<string>(); + if (property.Contains('.')) + { + level.AddRange(property.Split('.')); + } + else + { + level.Add(property); + } + + if (!string.IsNullOrWhiteSpace(prefix)) + { + level.Insert(0, prefix); + } + object temp = source; + Type tempType = source.GetType(); + for (int i = 0; i < level.Count - 1; i++) + { + var member = tempType.GetMember(level[i])[0]; + if (member != null) + { + var va = member.GetMemberValue(temp); + if (va != null) + { + temp = va; + } + else + { + var newInstance = member.GetMemberType().GetConstructor(Type.EmptyTypes).Invoke(null); + member.SetMemberValue(temp, newInstance, null); + temp = newInstance; + } + tempType = member.GetMemberType(); + + } + } + + var memberInfos = tempType.GetMember(level.Last()); + if (!memberInfos.Any()) + { + return; + } + var fproperty = memberInfos[0]; + if (value == null || value is StringValues s && StringValues.IsNullOrEmpty(s)) + { + fproperty.SetMemberValue(temp, null, null); + return; + } + + bool isArray = false; + if (value != null && value.GetType().IsArray == true) + { + isArray = true; + } + + if (stringBasedValue == true) + { + Type propertyType = fproperty.GetMemberType(); + if (propertyType.IsGeneric(typeof(List<>)) == true) + { + var list = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null) as IList; + + var gs = propertyType.GenericTypeArguments; + try + { + if (value.GetType() == typeof(StringValues)) + { + var strVals = (StringValues)value; + var a = strVals.ToArray(); + for (int i = 0; i < a.Length; i++) + { + list.Add(a[i].ConvertValue(gs[0])); + } + } + else if (isArray) + { + var a = value as object[]; + for (int i = 0; i < a.Length; i++) + { + list.Add(a[i].ConvertValue(gs[0])); + } + } + else + { + list = value.ConvertValue(propertyType) as IList; + } + } + catch { } + fproperty.SetMemberValue(temp, list, null); + } + else if (propertyType.IsArray) + { + try + { + var strVals = (StringValues)value; + var eletype = propertyType.GetElementType(); + if (eletype != null) + { + var arr = Array.CreateInstance(eletype, strVals.Count); + for (int i = 0; i < arr.Length; i++) + { + arr.SetValue(strVals[i].ConvertValue(eletype), i); + } + fproperty.SetMemberValue(temp, arr, null); + } + } + catch { } + } + else + { + if (isArray) + { + var a = value as object[]; + if (a.Length == 1) + { + value = a[0]; + } + } + + if (value is string) + { + value = value.ToString().Replace("\\", "/"); + } + fproperty.SetMemberValue(temp, value, null); + } + } + else + { + if (value is string) + { + value = value.ToString().Replace("\\", "/"); + } + fproperty.SetMemberValue(temp, value, null); + } + } + catch + { + } + } + + /// <summary> + /// 鏍规嵁MemberInfo鑾峰彇鍊� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <param name="obj">鎵�鍦ㄥ疄渚�</param> + /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param> + /// <returns>MemberInfo鐨勫��</returns> + public static object? GetMemberValue(this MemberInfo mi, object obj, object[]? index = null) + { + object rv = null; + if (mi.MemberType == MemberTypes.Property) + { + rv = ((PropertyInfo)mi).GetValue(obj, index); + } + else if (mi.MemberType == MemberTypes.Field) + { + rv = ((FieldInfo)mi).GetValue(obj); + } + return rv; + } + + /// <summary> + /// 璁惧畾MemberInfo鐨勫�� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <param name="obj">鎵�鍦ㄥ疄渚�</param> + /// <param name="val">瑕佽祴鐨勫��</param> + /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param> + public static void SetMemberValue(this MemberInfo mi, object obj, object val, object[]? index = null) + { + object newval = val; + if (val is string s) + { + if (string.IsNullOrEmpty(s)) + { + val = null; + } + } + if (val != null && val.GetType() != mi.GetMemberType()) + { + newval = val.ConvertValue(mi.GetMemberType()); + } + if (mi.MemberType == MemberTypes.Property) + { + ((PropertyInfo)mi).SetValue(obj, newval, index); + } + else if (mi.MemberType == MemberTypes.Field) + { + ((FieldInfo)mi).SetValue(obj, newval); + } + } + + /// <summary> + /// 鑾峰彇鏌愪釜MemberInfo鐨勭被鍨� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <returns>绫诲瀷</returns> + public static Type? GetMemberType(this MemberInfo mi) + { + Type? rv = null; + if (mi != null) + { + if (mi.MemberType == MemberTypes.Property) + { + rv = ((PropertyInfo)mi).PropertyType; + } + else if (mi.MemberType == MemberTypes.Field) + { + rv = ((FieldInfo)mi).FieldType; + } + } + return rv; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О + /// </summary> + /// <param name="enumType">鏋氫妇绫诲瀷</param> + /// <param name="value">鏋氫妇鍊�</param> + /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns> + public static string? GetEnumDisplayName(Type enumType, string value) + { + string rv = ""; + FieldInfo field = null; + + if (enumType.IsEnum()) + { + field = enumType.GetField(value); + } + //濡傛灉鏄痭ullable鐨勬灇涓� + if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum()) + { + field = enumType.GenericTypeArguments[0].GetField(value); + } + + if (field != null) + { + + var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList(); + if (attribs.Count > 0) + { + rv = ((DisplayAttribute)attribs[0]).GetName(); + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = value; + } + } + return rv; + } + + public static string? GetEnumDisplayName(Type enumType, int value) + { + string? rv = ""; + FieldInfo? field = null; + string? ename = ""; + if (enumType.IsEnum()) + { + ename = enumType.GetEnumName(value); + field = enumType.GetField(ename ?? ""); + } + //濡傛灉鏄痭ullable鐨勬灇涓� + if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum()) + { + ename = enumType.GenericTypeArguments[0].GetEnumName(value); + field = enumType.GenericTypeArguments[0].GetField(ename ?? ""); + } + + if (field != null) + { + + var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList(); + if (attribs.Count > 0) + { + rv = ((DisplayAttribute)attribs[0]).GetName(); + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = ename; + } + } + return rv; + } + + /// <summary> + /// 杞寲鍊� + /// </summary> + /// <param name="value">瑕佽浆鎹㈢殑鍊�</param> + /// <param name="propertyType">杞崲鍚庣殑绫诲瀷</param> + /// <returns>杞崲鍚庣殑鍊�</returns> + public static object? ConvertValue(this object value, Type propertyType) + { + object val = null; + if (propertyType.IsGeneric(typeof(Nullable<>)) == true) + { + var gs = propertyType.GenericTypeArguments; + try + { + val = value.ConvertValue(gs[0]); + } + catch { } + } + else if (propertyType.IsEnum()) + { + val = Enum.Parse(propertyType, value.ToString()); + } + else if (propertyType == typeof(string)) + { + val = value?.ToString().Trim(); + } + else if (propertyType == typeof(Guid)) + { + bool suc = Guid.TryParse(value?.ToString(), out Guid g); + if (suc) + { + val = g; + } + else + { + val = Guid.Empty; + } + } + + else + { + try + { + if (value.ToString().StartsWith("`") && value.ToString().EndsWith("`")) + { + string inner = value.ToString().Trim('`').TrimEnd(','); + if (!string.IsNullOrWhiteSpace(inner)) + { + val = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null); + string[] pair = inner.Split(','); + var gs = propertyType.GetGenericArguments(); + foreach (var p in pair) + { + (val as IList).Add(Convert.ChangeType(p, gs[0])); + } + } + } + else + { + val = Convert.ChangeType(value.ToString(), propertyType); + } + } + catch + { + } + } + return val; + } + + public static object MakeList(Type innerType, string propertyName, object[] values) + { + object rv = typeof(List<>).MakeGenericType(innerType).GetConstructor(Type.EmptyTypes).Invoke(null); + var mi = rv.GetType().GetMethod("Add"); + var con = innerType.GetConstructor(Type.EmptyTypes); + foreach (var item in values) + { + var newobj = con.Invoke(null); + newobj.SetPropertyValue(propertyName, item); + mi.Invoke(rv, new object[] { newobj }); + } + return rv; + } + + /// <summary> + /// 鑾峰彇 鏄惁瀹氫箟璇ユ爣绛惧睘鎬� + /// </summary> + /// <param name="pi"></param> + /// <param name="local"></param> + /// <returns></returns> + public static T? GetAttribute<T>(this MemberInfo pi) where T : Attribute + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T dis) + { + return dis; + } + else + { + return null; + } + + } + + + public static ImmutableDictionary<string, List<PropertyInfo>> _propertyCache { get; set; } = + new Dictionary<string, List<PropertyInfo>>().ToImmutableDictionary(); + /// <summary> + /// 鍒ゆ柇鏄惁鏄硾鍨� + /// </summary> + /// <param name="self">Type绫�</param> + /// <param name="innerType">娉涘瀷绫诲瀷</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsGeneric(this Type self, Type innerType) + { + if (self.GetTypeInfo().IsGenericType && self.GetGenericTypeDefinition() == innerType) + { + return true; + } + else + { + return false; + } + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篘ullable<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsNullable(this Type self) + { + return self.IsGeneric(typeof(Nullable<>)); + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsList(this Type self) + { + return self.IsGeneric(typeof(List<>)) || self.IsGeneric(typeof(IEnumerable<>)); + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsListOf<T>(this Type self) + { + if (self.IsGeneric(typeof(List<>)) && typeof(T).IsAssignableFrom(self.GenericTypeArguments[0])) + { + return true; + } + else + { + return false; + } + } + + + #region 鍒ゆ柇鏄惁涓烘灇涓� + + /// <summary> + /// 鍒ゆ柇鏄惁涓烘灇涓� + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsEnum(this Type self) + { + return self.GetTypeInfo().IsEnum; + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓烘灇涓炬垨鑰呭彲绌烘灇涓� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsEnumOrNullableEnum(this Type self) + { + if (self == null) + { + return false; + } + if (self.IsEnum) + { + return true; + } + else + { + if (self.IsGenericType && self.GetGenericTypeDefinition() == typeof(Nullable<>) && self.GetGenericArguments()[0].IsEnum) + { + return true; + } + else + { + return false; + } + } + } + + #endregion + + /// <summary> + /// 鍒ゆ柇鏄惁涓哄�肩被鍨� 鍩虹鍊肩被鍨� + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsPrimitive(this Type self) + { + return self.GetTypeInfo().IsPrimitive || self == typeof(decimal); + } + /// <summary> + /// 鍒ゆ柇鍊兼槸鍚︽槸鏁板瓧鍩虹绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsNumber(this Type self) + { + Type checktype = self; + if (self.IsNullable()) + { + checktype = self.GetGenericArguments()[0]; + } + if (checktype == typeof(int) || checktype == typeof(short) || checktype == typeof(long) || checktype == typeof(float) || checktype == typeof(decimal) || checktype == typeof(double)) + { + return true; + } + else + { + return false; + } + } + + + #region 鍒ゆ柇鏄惁鏄疊ool + /// <summary> + /// 鏄惁鏄痓ool绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsBool(this Type self) + { + return self == typeof(bool); + } + + /// <summary> + /// 鍒ゆ柇鏄惁鏄� bool or bool?绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsBoolOrNullableBool(this Type self) + { + if (self == null) + { + return false; + } + if (self == typeof(bool) || self == typeof(bool?)) + { + return true; + } + else + { + return false; + } + } + + #endregion + + /// <summary> + /// 鏍规嵁鍚嶅瓧鑾峰彇 + /// </summary> + /// <param name="self"></param> + /// <param name="name"></param> + /// <returns></returns> + public static PropertyInfo? GetSingleProperty(this Type self, string name) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties.Where(x => x.Name == name).FirstOrDefault(); + } + else + { + return _propertyCache[self.FullName].Where(x => x.Name == name).FirstOrDefault(); + } + } + /// <summary> + /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static PropertyInfo? GetSingleProperty(this Type self, Func<PropertyInfo, bool> where) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties.Where(where).FirstOrDefault(); + } + else + { + return _propertyCache[self.FullName].Where(where).FirstOrDefault(); + } + } + /// <summary> + /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static List<PropertyInfo> GetAllProperties(this Type self) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties; + } + else + { + return _propertyCache[self.FullName]; + } + } + #endregion + } +} diff --git a/Admin.NET/cylsg.utility/StaticStringDef.cs b/Admin.NET/cylsg.utility/StaticStringDef.cs new file mode 100644 index 0000000..ffccbdb --- /dev/null +++ b/Admin.NET/cylsg.utility/StaticStringDef.cs @@ -0,0 +1,24 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility +{ + /// <summary> + /// 甯哥敤瀛楃涓插畾涔� + /// </summary> + public static class StaticStringDef + { + /// <summary> + /// 鎻愮幇鑷攣KeY + /// </summary> + public static string TransferMoneyLockKey = "TransferMoneyLockKey:"; + + /// <summary> + /// 鎻愮幇缁熻绱閿� + /// </summary> + public static string TransferMoneyManKey = "TransferMoneyManKey:"; + } +} diff --git a/Admin.NET/cylsg.utility/cylsg.utility.csproj b/Admin.NET/cylsg.utility/cylsg.utility.csproj new file mode 100644 index 0000000..1dad6ca --- /dev/null +++ b/Admin.NET/cylsg.utility/cylsg.utility.csproj @@ -0,0 +1,14 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.Extensions.Primitives" Version="8.0.0" /> + <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> + </ItemGroup> + +</Project> diff --git a/Admin.NET/cylsg.utility/untilityModels.cs b/Admin.NET/cylsg.utility/untilityModels.cs new file mode 100644 index 0000000..b1ab056 --- /dev/null +++ b/Admin.NET/cylsg.utility/untilityModels.cs @@ -0,0 +1,16 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility +{ + /// <summary> + /// 閫氱敤妯″瀷 + /// </summary> + public class untilityModels + { + + } +} diff --git a/Web/src/api/ADPenalty/aDPenalty.ts b/Web/src/api/ADPenalty/aDPenalty.ts new file mode 100644 index 0000000..3a5ca94 --- /dev/null +++ b/Web/src/api/ADPenalty/aDPenalty.ts @@ -0,0 +1,50 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 琛屾斂澶勭綒鎺ュ彛鏈嶅姟 +export const useADPenaltyApi = () => { + const baseApi = useBaseApi("aDPenalty"); + return { + // 鍒嗛〉鏌ヨ琛屾斂澶勭綒 + page: baseApi.page, + // 鏌ョ湅琛屾斂澶勭綒璇︾粏 + detail: baseApi.detail, + // 鏂板琛屾斂澶勭綒 + add: baseApi.add, + // 鏇存柊琛屾斂澶勭綒 + update: baseApi.update, + // 鍒犻櫎琛屾斂澶勭綒 + delete: baseApi.delete, + // 鎵归噺鍒犻櫎琛屾斂澶勭綒 + batchDelete: baseApi.batchDelete, + } +} + +// 琛屾斂澶勭綒瀹炰綋 +export interface ADPenalty { + // id + id: string; + // 鍐冲畾鏃ユ湡 + decisionDate?: string; + // 褰撲簨浜轰俊鎭� + parties: string; + // 妗堢敱鎻忚堪 + caseReason: string; + // 澶勭悊鍐冲畾鍐呭 + disposalDecision: string; + // 閲囪喘鐩戠潱閮ㄩ棬鍚嶇О + supervisionDepartment: string; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; + // 绾夸笂鍦板潃 + url: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fBS_Customer.ts b/Web/src/api/Customer/fBS_Customer.ts new file mode 100644 index 0000000..dba7ac6 --- /dev/null +++ b/Web/src/api/Customer/fBS_Customer.ts @@ -0,0 +1,122 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛琛ㄦ帴鍙f湇鍔� +export const useFBS_CustomerApi = () => { + const baseApi = useBaseApi("fBS_Customer"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛琛� + page: baseApi.page, + // 鏌ョ湅瀹㈡埛琛ㄨ缁� + detail: baseApi.detail, + // 鏂板瀹㈡埛琛� + add: baseApi.add, + // 鏇存柊瀹㈡埛琛� + update: baseApi.update, + // 璁剧疆瀹㈡埛琛ㄧ姸鎬� + setStatus: baseApi.setStatus, + // 鍒犻櫎瀹㈡埛琛� + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛琛� + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛琛ㄦ暟鎹� + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛琛ㄦ暟鎹� + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉� + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛琛ㄥ疄浣� +export interface FBS_Customer { + // 涓婚敭Id + id: number; + // 璐﹀彿 + account?: string; + // 瀵嗙爜 + password?: string; + // 鐪熷疄濮撳悕 + realName?: string; + // 鏄电О + nickName: string; + // 澶村儚 + avatar: string; + // 鎬у埆 + sex?: number; + // 骞撮緞 + age?: number; + // 鍑虹敓鏃ユ湡 + birthday: string; + // 姘戞棌 + nation: string; + // 鎵嬫満鍙风爜 + phone: string; + // 璇佷欢绫诲瀷 + cardType?: number; + // 韬唤璇佸彿 + idCardNum: string; + // 韬唤璇� + idCardPath: string; + // 閭 + email: string; + // 鍦板潃 + address: string; + // 鏂囧寲绋嬪害 + cultureLevel?: number; + // 鏀挎不闈㈣矊 + politicalOutlook: string; + // 姣曚笟闄㈡牎 + college: string; + // 鍔炲叕鐢佃瘽 + officePhone: string; + // 绱ф�ヨ仈绯讳汉 + emergencyContact: string; + // 绱ф�ヨ仈绯讳汉鐢佃瘽 + emergencyPhone: string; + // 绱ф�ヨ仈绯讳汉鍦板潃 + emergencyAddress: string; + // 涓汉绠�浠� + introduction: string; + // 鎺掑簭 + orderNo?: number; + // 鐘舵�� + status?: number; + // 澶囨敞 + remark: string; + // 鑱岀骇 + posLevel: string; + // 鑱岀О + posTitle: string; + // 鎿呴暱棰嗗煙 + expertise: string; + // 鍔炲叕鍖哄煙 + officeZone: string; + // 鍔炲叕瀹� + office: string; + // 鍏ヨ亴鏃ユ湡 + joinDate: string; + // 鏈�鏂扮櫥褰旾p + lastLoginIp: string; + // 鏈�鏂扮櫥褰曞湴鐐� + lastLoginAddress: string; + // 鏈�鏂扮櫥褰曟椂闂� + lastLoginTime: string; + // 鏈�鏂扮櫥褰曡澶� + lastLoginDevice: string; + // 鐢靛瓙绛惧悕 + signature: string; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fBS_EnterpriseType.ts b/Web/src/api/Customer/fBS_EnterpriseType.ts new file mode 100644 index 0000000..0aa8c91 --- /dev/null +++ b/Web/src/api/Customer/fBS_EnterpriseType.ts @@ -0,0 +1,52 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 浼佷笟绫婚厤缃〃鎺ュ彛鏈嶅姟 +export const useFBS_EnterpriseTypeApi = () => { + const baseApi = useBaseApi("fBS_EnterpriseType"); + return { + // 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃 + page: baseApi.page, + // 鏌ョ湅浼佷笟绫婚厤缃〃璇︾粏 + detail: baseApi.detail, + // 鏂板浼佷笟绫婚厤缃〃 + add: baseApi.add, + // 鏇存柊浼佷笟绫婚厤缃〃 + update: baseApi.update, + // 鍒犻櫎浼佷笟绫婚厤缃〃 + delete: baseApi.delete, + // 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃 + batchDelete: baseApi.batchDelete, + // 瀵煎嚭浼佷笟绫婚厤缃〃鏁版嵁 + exportData: baseApi.exportData, + // 瀵煎叆浼佷笟绫婚厤缃〃鏁版嵁 + importData: baseApi.importData, + // 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘 + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 浼佷笟绫婚厤缃〃瀹炰綋 +export interface FBS_EnterpriseType { + // 涓婚敭Id + id: number; + // 鍚嶇О + name?: string; + // 浠g爜 + code?: string; + // 鐖� + parentId?: number; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fBS_ExRole.ts b/Web/src/api/Customer/fBS_ExRole.ts new file mode 100644 index 0000000..676adef --- /dev/null +++ b/Web/src/api/Customer/fBS_ExRole.ts @@ -0,0 +1,60 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛涓诲垎绫昏鑹叉帴鍙f湇鍔� +export const useFBS_ExRoleApi = () => { + const baseApi = useBaseApi("fBS_ExRole"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛涓诲垎绫昏鑹� + page: baseApi.page, + // 鏌ョ湅瀹㈡埛涓诲垎绫昏鑹茶缁� + detail: baseApi.detail, + // 鏂板瀹㈡埛涓诲垎绫昏鑹� + add: baseApi.add, + // 鏇存柊瀹㈡埛涓诲垎绫昏鑹� + update: baseApi.update, + // 璁剧疆瀹㈡埛涓诲垎绫昏鑹茬姸鎬� + setStatus: baseApi.setStatus, + // 鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛涓诲垎绫昏鑹� + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛涓诲垎绫昏鑹叉暟鎹� + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛涓诲垎绫昏鑹叉暟鎹� + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛涓诲垎绫昏鑹叉暟鎹鍏ユā鏉� + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛涓诲垎绫昏鑹插疄浣� +export interface FBS_ExRole { + // 涓婚敭Id + id: number; + // 鍚嶇О + name?: string; + // 缂栫爜 + code: string; + // 鎺掑簭 + orderNo?: number; + // 鏁版嵁鑼冨洿 + dataScope?: number; + // 澶囨敞 + remark: string; + // 鐘舵�� + status?: number; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fBS_Menu.ts b/Web/src/api/Customer/fBS_Menu.ts new file mode 100644 index 0000000..49db218 --- /dev/null +++ b/Web/src/api/Customer/fBS_Menu.ts @@ -0,0 +1,82 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛绯荤粺鑿滃崟琛ㄦ帴鍙f湇鍔� +export const useFBS_MenuApi = () => { + const baseApi = useBaseApi("fBS_Menu"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛绯荤粺鑿滃崟琛� + page: baseApi.page, + // 鏌ョ湅瀹㈡埛绯荤粺鑿滃崟琛ㄨ缁� + detail: baseApi.detail, + // 鏂板瀹㈡埛绯荤粺鑿滃崟琛� + add: baseApi.add, + // 鏇存柊瀹㈡埛绯荤粺鑿滃崟琛� + update: baseApi.update, + // 璁剧疆瀹㈡埛绯荤粺鑿滃崟琛ㄧ姸鎬� + setStatus: baseApi.setStatus, + // 鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛绯荤粺鑿滃崟琛� + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹� + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹� + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛绯荤粺鑿滃崟琛ㄦ暟鎹鍏ユā鏉� + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛绯荤粺鑿滃崟琛ㄥ疄浣� +export interface FBS_Menu { + // 涓婚敭Id + id: number; + // 鐖禝d + pid?: number; + // 鑿滃崟绫诲瀷 + type?: number; + // 璺敱鍚嶇О + name: string; + // 璺敱鍦板潃 + path: string; + // 缁勪欢璺緞 + component: string; + // 閲嶅畾鍚� + redirect: string; + // 鏉冮檺鏍囪瘑 + permission: string; + // 鑿滃崟鍚嶇О + title?: string; + // 鍥炬爣 + icon: string; + // 鏄惁鍐呭祵 + isIframe?: boolean; + // 澶栭摼閾炬帴 + outLink: string; + // 鏄惁闅愯棌 + isHide?: boolean; + // 鏄惁缂撳瓨 + isKeepAlive?: boolean; + // 鏄惁鍥哄畾 + isAffix?: boolean; + // 鎺掑簭 + orderNo?: number; + // 鐘舵�� + status?: number; + // 澶囨敞 + remark: string; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fBS_Role.ts b/Web/src/api/Customer/fBS_Role.ts new file mode 100644 index 0000000..cf7d987 --- /dev/null +++ b/Web/src/api/Customer/fBS_Role.ts @@ -0,0 +1,60 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛瑙掕壊鎺ュ彛鏈嶅姟 +export const useFBS_RoleApi = () => { + const baseApi = useBaseApi("fBS_Role"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛瑙掕壊 + page: baseApi.page, + // 鏌ョ湅瀹㈡埛瑙掕壊璇︾粏 + detail: baseApi.detail, + // 鏂板瀹㈡埛瑙掕壊 + add: baseApi.add, + // 鏇存柊瀹㈡埛瑙掕壊 + update: baseApi.update, + // 璁剧疆瀹㈡埛瑙掕壊鐘舵�� + setStatus: baseApi.setStatus, + // 鍒犻櫎瀹㈡埛瑙掕壊 + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛瑙掕壊 + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛瑙掕壊鏁版嵁 + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛瑙掕壊鏁版嵁 + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛瑙掕壊鏁版嵁瀵煎叆妯℃澘 + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛瑙掕壊瀹炰綋 +export interface FBS_Role { + // 涓婚敭Id + id: number; + // 鍚嶇О + name: string; + // 缂栫爜 + code: string; + // 鎺掑簭 + orderNo: number; + // 鏁版嵁鑼冨洿 + dataScope: number; + // 澶囨敞 + remark: string; + // 鐘舵�� + status: number; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fB_Customer.ts b/Web/src/api/Customer/fB_Customer.ts new file mode 100644 index 0000000..38ebc9d --- /dev/null +++ b/Web/src/api/Customer/fB_Customer.ts @@ -0,0 +1,122 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛琛ㄦ帴鍙f湇鍔� +export const useFB_CustomerApi = () => { + const baseApi = useBaseApi("fB_Customer"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛琛� + page: baseApi.page, + // 鏌ョ湅瀹㈡埛琛ㄨ缁� + detail: baseApi.detail, + // 鏂板瀹㈡埛琛� + add: baseApi.add, + // 鏇存柊瀹㈡埛琛� + update: baseApi.update, + // 璁剧疆瀹㈡埛琛ㄧ姸鎬� + setStatus: baseApi.setStatus, + // 鍒犻櫎瀹㈡埛琛� + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛琛� + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛琛ㄦ暟鎹� + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛琛ㄦ暟鎹� + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛琛ㄦ暟鎹鍏ユā鏉� + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛琛ㄥ疄浣� +export interface FB_Customer { + // 涓婚敭Id + id: number; + // 璐﹀彿 + account?: string; + // 瀵嗙爜 + password?: string; + // 鐪熷疄濮撳悕 + realName?: string; + // 鏄电О + nickName: string; + // 澶村儚 + avatar: string; + // 鎬у埆 + sex?: number; + // 骞撮緞 + age?: number; + // 鍑虹敓鏃ユ湡 + birthday: string; + // 姘戞棌 + nation: string; + // 鎵嬫満鍙风爜 + phone: string; + // 璇佷欢绫诲瀷 + cardType?: number; + // 韬唤璇佸彿 + idCardNum: string; + // 韬唤璇� + idCardPath: string; + // 閭 + email: string; + // 鍦板潃 + address: string; + // 鏂囧寲绋嬪害 + cultureLevel?: number; + // 鏀挎不闈㈣矊 + politicalOutlook: string; + // 姣曚笟闄㈡牎 + college: string; + // 鍔炲叕鐢佃瘽 + officePhone: string; + // 绱ф�ヨ仈绯讳汉 + emergencyContact: string; + // 绱ф�ヨ仈绯讳汉鐢佃瘽 + emergencyPhone: string; + // 绱ф�ヨ仈绯讳汉鍦板潃 + emergencyAddress: string; + // 涓汉绠�浠� + introduction: string; + // 鎺掑簭 + orderNo?: number; + // 鐘舵�� + status?: number; + // 澶囨敞 + remark: string; + // 鑱岀骇 + posLevel: string; + // 鑱岀О + posTitle: string; + // 鎿呴暱棰嗗煙 + expertise: string; + // 鍔炲叕鍖哄煙 + officeZone: string; + // 鍔炲叕瀹� + office: string; + // 鍏ヨ亴鏃ユ湡 + joinDate: string; + // 鏈�鏂扮櫥褰旾p + lastLoginIp: string; + // 鏈�鏂扮櫥褰曞湴鐐� + lastLoginAddress: string; + // 鏈�鏂扮櫥褰曟椂闂� + lastLoginTime: string; + // 鏈�鏂扮櫥褰曡澶� + lastLoginDevice: string; + // 鐢靛瓙绛惧悕 + signature: string; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/api/Customer/fB_CustomerRole.ts b/Web/src/api/Customer/fB_CustomerRole.ts new file mode 100644 index 0000000..278771e --- /dev/null +++ b/Web/src/api/Customer/fB_CustomerRole.ts @@ -0,0 +1,36 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 瀹㈡埛鑿滃崟琛ㄦ帴鍙f湇鍔� +export const useFB_CustomerRoleApi = () => { + const baseApi = useBaseApi("fB_CustomerRole"); + return { + // 鍒嗛〉鏌ヨ瀹㈡埛鑿滃崟琛� + page: baseApi.page, + // 鏌ョ湅瀹㈡埛鑿滃崟琛ㄨ缁� + detail: baseApi.detail, + // 鏂板瀹㈡埛鑿滃崟琛� + add: baseApi.add, + // 鏇存柊瀹㈡埛鑿滃崟琛� + update: baseApi.update, + // 鍒犻櫎瀹㈡埛鑿滃崟琛� + delete: baseApi.delete, + // 鎵归噺鍒犻櫎瀹㈡埛鑿滃崟琛� + batchDelete: baseApi.batchDelete, + // 瀵煎嚭瀹㈡埛鑿滃崟琛ㄦ暟鎹� + exportData: baseApi.exportData, + // 瀵煎叆瀹㈡埛鑿滃崟琛ㄦ暟鎹� + importData: baseApi.importData, + // 涓嬭浇瀹㈡埛鑿滃崟琛ㄦ暟鎹鍏ユā鏉� + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 瀹㈡埛鑿滃崟琛ㄥ疄浣� +export interface FB_CustomerRole { + // 涓婚敭Id + id: number; + // 鐢ㄦ埛Id + cutomerId?: number; + // 瑙掕壊Id + roleId?: number; +} \ No newline at end of file diff --git a/Web/src/assets/background.jpeg b/Web/src/assets/background.jpeg index 9478437..640bfee 100644 --- a/Web/src/assets/background.jpeg +++ b/Web/src/assets/background.jpeg Binary files differ diff --git a/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue new file mode 100644 index 0000000..a2ba6f6 --- /dev/null +++ b/Web/src/views/ADPenalty/aDPenalty/component/editDialog.vue @@ -0,0 +1,122 @@ +锘�<script lang="ts" name="aDPenalty" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const aDPenaltyApi = useADPenaltyApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + decisionDate: [{required: true, message: '璇烽�夋嫨鍐冲畾鏃ユ湡锛�', trigger: 'change',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { }; + state.ruleForm = row.id ? await aDPenaltyApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await aDPenaltyApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="aDPenalty-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍐冲畾鏃ユ湡" prop="decisionDate"> + <el-date-picker v-model="state.ruleForm.decisionDate" type="date" placeholder="鍐冲畾鏃ユ湡" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="褰撲簨浜�" prop="parties"> + <el-input v-model="state.ruleForm.parties" placeholder="璇疯緭鍏ュ綋浜嬩汉" maxlength="255" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" > + <el-form-item label="妗堢敱" prop="caseReason"> + <el-input v-model="state.ruleForm.caseReason" placeholder="璇疯緭鍏ユ鐢�" type="textarea" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20" > + <el-form-item label="澶勭悊鍐冲畾" prop="disposalDecision"> + <el-input v-model="state.ruleForm.disposalDecision" type="textarea" placeholder="璇疯緭鍏ュ鐞嗗喅瀹�" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="閲囪喘鐩戠潱閮ㄩ棬" prop="supervisionDepartment"> + <el-input v-model="state.ruleForm.supervisionDepartment" placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�" maxlength="255" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> + <el-form-item label="绾夸笂鍦板潃" prop="url"> + <el-input v-model="state.ruleForm.url" placeholder="璇疯緭鍏ョ嚎涓婂湴鍧�" maxlength="255" show-word-limit clearable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/ADPenalty/aDPenalty/index.vue b/Web/src/views/ADPenalty/aDPenalty/index.vue new file mode 100644 index 0000000..e414120 --- /dev/null +++ b/Web/src/views/ADPenalty/aDPenalty/index.vue @@ -0,0 +1,185 @@ +锘�<script lang="ts" setup name="aDPenalty"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useADPenaltyApi } from '/@/api/ADPenalty/aDPenalty'; +import editDialog from '/@/views/ADPenalty/aDPenalty/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import commonFunction from "/@/utils/commonFunction"; + +const { dateFormatYMD } = commonFunction(); +const aDPenaltyApi = useADPenaltyApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'decisionDate', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await aDPenaltyApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delADPenalty = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await aDPenaltyApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelADPenalty = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await aDPenaltyApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +handleQuery(); +</script> +<template> + <div class="aDPenalty-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> --> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10"> + <el-form-item label="鍐冲畾鏃ユ湡"> + <el-date-picker type="daterange" v-model="state.tableQueryParams.decisionDateRange" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="褰撲簨浜�"> + <el-input v-model="state.tableQueryParams.parties" clearable placeholder="璇疯緭鍏ュ綋浜嬩汉"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="閲囪喘鐩戠潱閮ㄩ棬"> + <el-input v-model="state.tableQueryParams.supervisionDepartment" clearable placeholder="璇疯緭鍏ラ噰璐洃鐫i儴闂�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="妗堢敱"> + <el-input v-model="state.tableQueryParams.caseReason" clearable placeholder="璇疯緭鍏ユ鐢�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶勭悊鍐冲畾"> + <el-input v-model="state.tableQueryParams.disposalDecision" clearable placeholder="璇疯緭鍏ュ鐞嗗喅瀹�"/> + </el-form-item> + </el-col> + + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'aDPenalty:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelADPenalty" :disabled="state.selectData.length == 0" v-auth="'aDPenalty:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板琛屾斂澶勭綒')" v-auth="'aDPenalty:add'"> 鏂板 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" :default-sort="{ prop: 'decisionDate', order: 'descending' }" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('aDPenalty:batchDelete') || auth('aDPenalty:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='decisionDate' label='鍐冲畾鏃ユ湡' width="90" show-overflow-tooltip sortable > + <template #default="{ row }"> + <span>{{dateFormatYMD(null,null,row.decisionDate)}}</span> + </template> + </el-table-column> + <el-table-column prop='parties' label='褰撲簨浜�' show-overflow-tooltip /> + <el-table-column prop='caseReason' label='妗堢敱' show-overflow-tooltip /> + <el-table-column prop='disposalDecision' label='澶勭悊鍐冲畾' show-overflow-tooltip /> + <el-table-column prop='supervisionDepartment' width="130" label='閲囪喘鐩戠潱閮ㄩ棬' show-overflow-tooltip /> + <el-table-column prop='url' label='绾夸笂鍦板潃' show-overflow-tooltip > + <template #default="{ row }"> + <el-link underline :href='row.url' target='_blank'>{{row.url}}</el-link> + </template> + </el-table-column> + <!-- <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> --> + <el-table-column label="鎿嶄綔" width="80" align="center" fixed="right" show-overflow-tooltip v-if="auth('aDPenalty:update') || auth('aDPenalty:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫琛屾斂澶勭綒')" v-auth="'aDPenalty:update'"> </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delADPenalty(scope.row)" v-auth="'aDPenalty:delete'"> </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <printDialog ref="printDialogRef" :title="'鎵撳嵃琛屾斂澶勭綒'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Customer/component/editDialog.vue b/Web/src/views/Customer/fBS_Customer/component/editDialog.vue new file mode 100644 index 0000000..6fba3ff --- /dev/null +++ b/Web/src/views/Customer/fBS_Customer/component/editDialog.vue @@ -0,0 +1,240 @@ +锘�<script lang="ts" name="fBS_Customer" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_CustomerApi } from '/@/api/Customer/fBS_Customer'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_CustomerApi = useFBS_CustomerApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + account: [{required: true, message: '璇烽�夋嫨璐﹀彿锛�', trigger: 'blur',},], + password: [{required: true, message: '璇烽�夋嫨瀵嗙爜锛�', trigger: 'blur',},], + realName: [{required: true, message: '璇烽�夋嫨鐪熷疄濮撳悕锛�', trigger: 'blur',},], + sex: [{required: true, message: '璇烽�夋嫨鎬у埆锛�', trigger: 'change',},], + age: [{required: true, message: '璇烽�夋嫨骞撮緞锛�', trigger: 'blur',},], + cardType: [{required: true, message: '璇烽�夋嫨璇佷欢绫诲瀷锛�', trigger: 'change',},], + cultureLevel: [{required: true, message: '璇烽�夋嫨鏂囧寲绋嬪害锛�', trigger: 'change',},], + orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},], + status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { status: 1,orderNo: 100, }; + state.ruleForm = row.id ? await fBS_CustomerApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_CustomerApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_Customer-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="璐﹀彿" prop="account"> + <el-input v-model="state.ruleForm.account" placeholder="璇疯緭鍏ヨ处鍙�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="瀵嗙爜" prop="password"> + <el-input v-model="state.ruleForm.password" placeholder="璇疯緭鍏ュ瘑鐮�" maxlength="512" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鐪熷疄濮撳悕" prop="realName"> + <el-input v-model="state.ruleForm.realName" placeholder="璇疯緭鍏ョ湡瀹炲鍚�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏄电О" prop="nickName"> + <el-input v-model="state.ruleForm.nickName" placeholder="璇疯緭鍏ユ樀绉�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶村儚" prop="avatar"> + <el-input v-model="state.ruleForm.avatar" placeholder="璇疯緭鍏ュご鍍�" maxlength="512" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎬у埆" prop="sex"> + <g-sys-dict v-model="state.ruleForm.sex" code="GenderEnum" render-as="select" placeholder="璇烽�夋嫨鎬у埆" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="骞撮緞" prop="age"> + <el-input-number v-model="state.ruleForm.age" placeholder="璇疯緭鍏ュ勾榫�" clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍑虹敓鏃ユ湡" prop="birthday"> + <el-date-picker v-model="state.ruleForm.birthday" type="date" placeholder="鍑虹敓鏃ユ湡" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="姘戞棌" prop="nation"> + <el-input v-model="state.ruleForm.nation" placeholder="璇疯緭鍏ユ皯鏃�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎵嬫満鍙风爜" prop="phone"> + <el-input v-model="state.ruleForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="16" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="璇佷欢绫诲瀷" prop="cardType"> + <g-sys-dict v-model="state.ruleForm.cardType" code="CardTypeEnum" render-as="select" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="韬唤璇佸彿" prop="idCardNum"> + <el-input v-model="state.ruleForm.idCardNum" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="韬唤璇�" prop="idCardPath"> + <el-input v-model="state.ruleForm.idCardPath" placeholder="璇疯緭鍏ヨ韩浠借瘉" maxlength="512" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="閭" prop="email"> + <el-input v-model="state.ruleForm.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍦板潃" prop="address"> + <el-input v-model="state.ruleForm.address" placeholder="璇疯緭鍏ュ湴鍧�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏂囧寲绋嬪害" prop="cultureLevel"> + <g-sys-dict v-model="state.ruleForm.cultureLevel" code="CultureLevelEnum" render-as="select" placeholder="璇烽�夋嫨鏂囧寲绋嬪害" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏀挎不闈㈣矊" prop="politicalOutlook"> + <el-input v-model="state.ruleForm.politicalOutlook" placeholder="璇疯緭鍏ユ斂娌婚潰璨�" maxlength="16" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="姣曚笟闄㈡牎" prop="college"> + <el-input v-model="state.ruleForm.college" placeholder="璇疯緭鍏ユ瘯涓氶櫌鏍�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍔炲叕鐢佃瘽" prop="officePhone"> + <el-input v-model="state.ruleForm.officePhone" placeholder="璇疯緭鍏ュ姙鍏數璇�" maxlength="16" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="绱ф�ヨ仈绯讳汉" prop="emergencyContact"> + <el-input v-model="state.ruleForm.emergencyContact" placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="绱ф�ヨ仈绯讳汉鐢佃瘽" prop="emergencyPhone"> + <el-input v-model="state.ruleForm.emergencyPhone" placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉鐢佃瘽" maxlength="16" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="绱ф�ヨ仈绯讳汉鍦板潃" prop="emergencyAddress"> + <el-input v-model="state.ruleForm.emergencyAddress" placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉鍦板潃" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="涓汉绠�浠�" prop="introduction"> + <el-input v-model="state.ruleForm.introduction" placeholder="璇疯緭鍏ヤ釜浜虹畝浠�" maxlength="512" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎺掑簭" prop="orderNo"> + <el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" > + <el-form-item label="鐘舵��" prop="status"> + <g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鑱岀骇" prop="posLevel"> + <el-input v-model="state.ruleForm.posLevel" placeholder="璇疯緭鍏ヨ亴绾�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鑱岀О" prop="posTitle"> + <el-input v-model="state.ruleForm.posTitle" placeholder="璇疯緭鍏ヨ亴绉�" maxlength="32" show-word-limit clearable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Customer/index.vue b/Web/src/views/Customer/fBS_Customer/index.vue new file mode 100644 index 0000000..f1eda49 --- /dev/null +++ b/Web/src/views/Customer/fBS_Customer/index.vue @@ -0,0 +1,310 @@ +锘�<script lang="ts" setup name="fBS_Customer"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_CustomerApi } from '/@/api/Customer/fBS_Customer'; +import editDialog from '/@/views/Customer/fBS_Customer/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_CustomerApi = useFBS_CustomerApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_CustomerApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_Customer = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_CustomerApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_Customer = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_CustomerApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 璁剧疆鐘舵�� +const changeFBS_CustomerStatus = async (row: any) => { + await fBS_CustomerApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�')); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_CustomerCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_CustomerApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_CustomerApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_CustomerApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_Customer-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="璐﹀彿"> + <el-input v-model="state.tableQueryParams.account" clearable placeholder="璇疯緭鍏ヨ处鍙�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐪熷疄濮撳悕"> + <el-input v-model="state.tableQueryParams.realName" clearable placeholder="璇疯緭鍏ョ湡瀹炲鍚�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏄电О"> + <el-input v-model="state.tableQueryParams.nickName" clearable placeholder="璇疯緭鍏ユ樀绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="璇佷欢绫诲瀷"> + <g-sys-dict v-model="state.tableQueryParams.cardType" code="CardTypeEnum" render-as="select" placeholder="璇烽�夋嫨璇佷欢绫诲瀷" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="韬唤璇�"> + <el-input v-model="state.tableQueryParams.idCardPath" clearable placeholder="璇疯緭鍏ヨ韩浠借瘉"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏂囧寲绋嬪害"> + <g-sys-dict v-model="state.tableQueryParams.cultureLevel" code="CultureLevelEnum" render-as="select" placeholder="璇烽�夋嫨鏂囧寲绋嬪害" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="姣曚笟闄㈡牎"> + <el-input v-model="state.tableQueryParams.college" clearable placeholder="璇疯緭鍏ユ瘯涓氶櫌鏍�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍔炲叕鐢佃瘽"> + <el-input v-model="state.tableQueryParams.officePhone" clearable placeholder="璇疯緭鍏ュ姙鍏數璇�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="绱ф�ヨ仈绯讳汉"> + <el-input v-model="state.tableQueryParams.emergencyContact" clearable placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="绱ф�ヨ仈绯讳汉鐢佃瘽"> + <el-input v-model="state.tableQueryParams.emergencyPhone" clearable placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉鐢佃瘽"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="绱ф�ヨ仈绯讳汉鍦板潃"> + <el-input v-model="state.tableQueryParams.emergencyAddress" clearable placeholder="璇疯緭鍏ョ揣鎬ヨ仈绯讳汉鍦板潃"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="涓汉绠�浠�"> + <el-input v-model="state.tableQueryParams.introduction" clearable placeholder="璇疯緭鍏ヤ釜浜虹畝浠�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鎺掑簭"> + <el-input-number v-model="state.tableQueryParams.orderNo" clearable placeholder="璇疯緭鍏ユ帓搴�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐘舵��"> + <g-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶囨敞"> + <el-input v-model="state.tableQueryParams.remark" clearable placeholder="璇疯緭鍏ュ娉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鑱岀骇"> + <el-input v-model="state.tableQueryParams.posLevel" clearable placeholder="璇疯緭鍏ヨ亴绾�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鑱岀О"> + <el-input v-model="state.tableQueryParams.posTitle" clearable placeholder="璇疯緭鍏ヨ亴绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_Customer:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_Customer" :disabled="state.selectData.length == 0" v-auth="'fBS_Customer:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛琛�')" v-auth="'fBS_Customer:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_CustomerCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Customer:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_Customer:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_Customer:batchDelete') || auth('fBS_Customer:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='account' label='璐﹀彿' sortable='custom' show-overflow-tooltip /> + <el-table-column prop='password' label='瀵嗙爜' show-overflow-tooltip /> + <el-table-column prop='realName' label='鐪熷疄濮撳悕' sortable='custom' show-overflow-tooltip /> + <el-table-column prop='nickName' label='鏄电О' sortable='custom' show-overflow-tooltip /> + <el-table-column prop='avatar' label='澶村儚' show-overflow-tooltip /> + <el-table-column prop='sex' label='鎬у埆' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.sex" code="GenderEnum" /> + </template> + </el-table-column> + <el-table-column prop='age' label='骞撮緞' show-overflow-tooltip /> + <el-table-column prop='birthday' label='鍑虹敓鏃ユ湡' show-overflow-tooltip /> + <el-table-column prop='nation' label='姘戞棌' show-overflow-tooltip /> + <el-table-column prop='phone' label='鎵嬫満鍙风爜' show-overflow-tooltip /> + <el-table-column prop='cardType' label='璇佷欢绫诲瀷' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.cardType" code="CardTypeEnum" /> + </template> + </el-table-column> + <el-table-column prop='idCardNum' label='韬唤璇佸彿' show-overflow-tooltip /> + <el-table-column prop='idCardPath' label='韬唤璇�' show-overflow-tooltip /> + <el-table-column prop='email' label='閭' show-overflow-tooltip /> + <el-table-column prop='address' label='鍦板潃' show-overflow-tooltip /> + <el-table-column prop='cultureLevel' label='鏂囧寲绋嬪害' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.cultureLevel" code="CultureLevelEnum" /> + </template> + </el-table-column> + <el-table-column prop='politicalOutlook' label='鏀挎不闈㈣矊' show-overflow-tooltip /> + <el-table-column prop='college' label='姣曚笟闄㈡牎' show-overflow-tooltip /> + <el-table-column prop='officePhone' label='鍔炲叕鐢佃瘽' show-overflow-tooltip /> + <el-table-column prop='emergencyContact' label='绱ф�ヨ仈绯讳汉' show-overflow-tooltip /> + <el-table-column prop='emergencyPhone' label='绱ф�ヨ仈绯讳汉鐢佃瘽' show-overflow-tooltip /> + <el-table-column prop='emergencyAddress' label='绱ф�ヨ仈绯讳汉鍦板潃' show-overflow-tooltip /> + <el-table-column prop='introduction' label='涓汉绠�浠�' show-overflow-tooltip /> + <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip /> + <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Customer:setStatus'" show-overflow-tooltip> + <template #default="scope"> + <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_CustomerStatus(scope.row)" /> + </template> + </el-table-column> + <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip /> + <el-table-column prop='posLevel' label='鑱岀骇' show-overflow-tooltip /> + <el-table-column prop='posTitle' label='鑱岀О' show-overflow-tooltip /> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_Customer:update') || auth('fBS_Customer:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛琛�')" v-auth="'fBS_Customer:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Customer(scope.row)" v-auth="'fBS_Customer:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_CustomerApi.importData" :download="fBS_CustomerApi.downloadTemplate" v-auth="'fBS_Customer:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃瀹㈡埛琛�'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue new file mode 100644 index 0000000..8630032 --- /dev/null +++ b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue @@ -0,0 +1,109 @@ +锘�<script lang="ts" name="fBS_EnterpriseType" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + name: [{required: true, message: '璇烽�夋嫨鍚嶇О锛�', trigger: 'blur',},], + code: [{required: true, message: '璇烽�夋嫨浠g爜锛�', trigger: 'blur',},], + parentId: [{required: true, message: '璇烽�夋嫨鐖讹紒', trigger: 'blur',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { }; + state.ruleForm = row.id ? await fBS_EnterpriseTypeApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_EnterpriseTypeApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_EnterpriseType-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍚嶇О" prop="name"> + <el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ュ悕绉�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="浠g爜" prop="code"> + <el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ヤ唬鐮�" maxlength="36" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鐖�" prop="parentId"> + <el-input-number v-model="state.ruleForm.parentId" placeholder="璇疯緭鍏ョ埗" clearable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_EnterpriseType/index.vue b/Web/src/views/Customer/fBS_EnterpriseType/index.vue new file mode 100644 index 0000000..6d421a6 --- /dev/null +++ b/Web/src/views/Customer/fBS_EnterpriseType/index.vue @@ -0,0 +1,194 @@ +锘�<script lang="ts" setup name="fBS_EnterpriseType"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType'; +import editDialog from '/@/views/Customer/fBS_EnterpriseType/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_EnterpriseTypeApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_EnterpriseType = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_EnterpriseTypeApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_EnterpriseType = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_EnterpriseTypeApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_EnterpriseTypeCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_EnterpriseType-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍚嶇О"> + <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ュ悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="浠g爜"> + <el-input v-model="state.tableQueryParams.code" clearable placeholder="璇疯緭鍏ヤ唬鐮�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐖�"> + <el-input-number v-model="state.tableQueryParams.parentId" clearable placeholder="璇疯緭鍏ョ埗"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_EnterpriseType:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_EnterpriseType" :disabled="state.selectData.length == 0" v-auth="'fBS_EnterpriseType:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_EnterpriseTypeCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_EnterpriseType:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_EnterpriseType:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_EnterpriseType:batchDelete') || auth('fBS_EnterpriseType:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='name' label='鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='code' label='浠g爜' show-overflow-tooltip /> + <el-table-column prop='parentId' label='鐖�' show-overflow-tooltip /> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_EnterpriseType:update') || auth('fBS_EnterpriseType:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_EnterpriseType(scope.row)" v-auth="'fBS_EnterpriseType:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_EnterpriseTypeApi.importData" :download="fBS_EnterpriseTypeApi.downloadTemplate" v-auth="'fBS_EnterpriseType:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃浼佷笟绫婚厤缃〃'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue b/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue new file mode 100644 index 0000000..86446b3 --- /dev/null +++ b/Web/src/views/Customer/fBS_ExRole/component/editDialog.vue @@ -0,0 +1,125 @@ +锘�<script lang="ts" name="fBS_ExRole" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_ExRoleApi } from '/@/api/Customer/fBS_ExRole'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_ExRoleApi = useFBS_ExRoleApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + name: [{required: true, message: '璇烽�夋嫨鍚嶇О锛�', trigger: 'blur',},], + orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},], + dataScope: [{required: true, message: '璇烽�夋嫨鏁版嵁鑼冨洿锛�', trigger: 'change',},], + status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { status: 1,orderNo: 100, }; + state.ruleForm = row.id ? await fBS_ExRoleApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_ExRoleApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_ExRole-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍚嶇О" prop="name"> + <el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ュ悕绉�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="缂栫爜" prop="code"> + <el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ョ紪鐮�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎺掑簭" prop="orderNo"> + <el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏁版嵁鑼冨洿" prop="dataScope"> + <g-sys-dict v-model="state.ruleForm.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" > + <el-form-item label="鐘舵��" prop="status"> + <g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_ExRole/index.vue b/Web/src/views/Customer/fBS_ExRole/index.vue new file mode 100644 index 0000000..be291b4 --- /dev/null +++ b/Web/src/views/Customer/fBS_ExRole/index.vue @@ -0,0 +1,225 @@ +锘�<script lang="ts" setup name="fBS_ExRole"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_ExRoleApi } from '/@/api/Customer/fBS_ExRole'; +import editDialog from '/@/views/Customer/fBS_ExRole/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_ExRoleApi = useFBS_ExRoleApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_ExRoleApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_ExRole = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_ExRoleApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_ExRole = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_ExRoleApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 璁剧疆鐘舵�� +const changeFBS_ExRoleStatus = async (row: any) => { + await fBS_ExRoleApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�')); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_ExRoleCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_ExRoleApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_ExRoleApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_ExRoleApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_ExRole-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍚嶇О"> + <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ュ悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="缂栫爜"> + <el-input v-model="state.tableQueryParams.code" clearable placeholder="璇疯緭鍏ョ紪鐮�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鎺掑簭"> + <el-input-number v-model="state.tableQueryParams.orderNo" clearable placeholder="璇疯緭鍏ユ帓搴�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏁版嵁鑼冨洿"> + <g-sys-dict v-model="state.tableQueryParams.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶囨敞"> + <el-input v-model="state.tableQueryParams.remark" clearable placeholder="璇疯緭鍏ュ娉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐘舵��"> + <g-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_ExRole:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_ExRole" :disabled="state.selectData.length == 0" v-auth="'fBS_ExRole:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛涓诲垎绫昏鑹�')" v-auth="'fBS_ExRole:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_ExRoleCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_ExRole:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_ExRole:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_ExRole:batchDelete') || auth('fBS_ExRole:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='name' label='鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='code' label='缂栫爜' show-overflow-tooltip /> + <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip /> + <el-table-column prop='dataScope' label='鏁版嵁鑼冨洿' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.dataScope" code="DataScopeEnum" /> + </template> + </el-table-column> + <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip /> + <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_ExRole:setStatus'" show-overflow-tooltip> + <template #default="scope"> + <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_ExRoleStatus(scope.row)" /> + </template> + </el-table-column> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_ExRole:update') || auth('fBS_ExRole:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛涓诲垎绫昏鑹�')" v-auth="'fBS_ExRole:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_ExRole(scope.row)" v-auth="'fBS_ExRole:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_ExRoleApi.importData" :download="fBS_ExRoleApi.downloadTemplate" v-auth="'fBS_ExRole:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃瀹㈡埛涓诲垎绫昏鑹�'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Menu/component/editDialog.vue b/Web/src/views/Customer/fBS_Menu/component/editDialog.vue new file mode 100644 index 0000000..bc19617 --- /dev/null +++ b/Web/src/views/Customer/fBS_Menu/component/editDialog.vue @@ -0,0 +1,185 @@ +锘�<script lang="ts" name="fBS_Menu" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_MenuApi } from '/@/api/Customer/fBS_Menu'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_MenuApi = useFBS_MenuApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + pid: [{required: true, message: '璇烽�夋嫨鐖禝d锛�', trigger: 'blur',},], + type: [{required: true, message: '璇烽�夋嫨鑿滃崟绫诲瀷锛�', trigger: 'change',},], + title: [{required: true, message: '璇烽�夋嫨鑿滃崟鍚嶇О锛�', trigger: 'blur',},], + isIframe: [{required: true, message: '璇烽�夋嫨鏄惁鍐呭祵锛�', trigger: 'blur',},], + isHide: [{required: true, message: '璇烽�夋嫨鏄惁闅愯棌锛�', trigger: 'blur',},], + isKeepAlive: [{required: true, message: '璇烽�夋嫨鏄惁缂撳瓨锛�', trigger: 'blur',},], + isAffix: [{required: true, message: '璇烽�夋嫨鏄惁鍥哄畾锛�', trigger: 'blur',},], + orderNo: [{required: true, message: '璇烽�夋嫨鎺掑簭锛�', trigger: 'blur',},], + status: [{required: true, message: '璇烽�夋嫨鐘舵�侊紒', trigger: 'change',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { status: 1,orderNo: 100, }; + state.ruleForm = row.id ? await fBS_MenuApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_MenuApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_Menu-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鐖禝d" prop="pid"> + <el-input v-model="state.ruleForm.pid" placeholder="璇疯緭鍏ョ埗Id" maxlength="19" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鑿滃崟绫诲瀷" prop="type"> + <g-sys-dict v-model="state.ruleForm.type" code="MenuTypeEnum" render-as="select" placeholder="璇烽�夋嫨鑿滃崟绫诲瀷" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="璺敱鍚嶇О" prop="name"> + <el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ヨ矾鐢卞悕绉�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="璺敱鍦板潃" prop="path"> + <el-input v-model="state.ruleForm.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="缁勪欢璺緞" prop="component"> + <el-input v-model="state.ruleForm.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="閲嶅畾鍚�" prop="redirect"> + <el-input v-model="state.ruleForm.redirect" placeholder="璇疯緭鍏ラ噸瀹氬悜" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏉冮檺鏍囪瘑" prop="permission"> + <el-input v-model="state.ruleForm.permission" placeholder="璇疯緭鍏ユ潈闄愭爣璇�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鑿滃崟鍚嶇О" prop="title"> + <el-input v-model="state.ruleForm.title" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍥炬爣" prop="icon"> + <el-input v-model="state.ruleForm.icon" placeholder="璇疯緭鍏ュ浘鏍�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏄惁鍐呭祵" prop="isIframe"> + <el-switch v-model="state.ruleForm.isIframe" active-text="鏄�" inactive-text="鍚�" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶栭摼閾炬帴" prop="outLink"> + <el-input v-model="state.ruleForm.outLink" placeholder="璇疯緭鍏ュ閾鹃摼鎺�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏄惁闅愯棌" prop="isHide"> + <el-switch v-model="state.ruleForm.isHide" active-text="鏄�" inactive-text="鍚�" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏄惁缂撳瓨" prop="isKeepAlive"> + <el-switch v-model="state.ruleForm.isKeepAlive" active-text="鏄�" inactive-text="鍚�" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏄惁鍥哄畾" prop="isAffix"> + <el-switch v-model="state.ruleForm.isAffix" active-text="鏄�" inactive-text="鍚�" /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎺掑簭" prop="orderNo"> + <el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" > + <el-form-item label="鐘舵��" prop="status"> + <g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Menu/index.vue b/Web/src/views/Customer/fBS_Menu/index.vue new file mode 100644 index 0000000..abb6e1a --- /dev/null +++ b/Web/src/views/Customer/fBS_Menu/index.vue @@ -0,0 +1,311 @@ +锘�<script lang="ts" setup name="fBS_Menu"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_MenuApi } from '/@/api/Customer/fBS_Menu'; +import editDialog from '/@/views/Customer/fBS_Menu/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_MenuApi = useFBS_MenuApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_MenuApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_Menu = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_MenuApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_Menu = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_MenuApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 璁剧疆鐘舵�� +const changeFBS_MenuStatus = async (row: any) => { + await fBS_MenuApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�')); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_MenuCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_MenuApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_MenuApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_MenuApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_Menu-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐖禝d"> + <el-input v-model="state.tableQueryParams.pid" clearable placeholder="璇疯緭鍏ョ埗Id"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鑿滃崟绫诲瀷"> + <g-sys-dict v-model="state.tableQueryParams.type" code="MenuTypeEnum" render-as="select" placeholder="璇烽�夋嫨鑿滃崟绫诲瀷" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="璺敱鍚嶇О"> + <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ヨ矾鐢卞悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="璺敱鍦板潃"> + <el-input v-model="state.tableQueryParams.path" clearable placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="缁勪欢璺緞"> + <el-input v-model="state.tableQueryParams.component" clearable placeholder="璇疯緭鍏ョ粍浠惰矾寰�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="閲嶅畾鍚�"> + <el-input v-model="state.tableQueryParams.redirect" clearable placeholder="璇疯緭鍏ラ噸瀹氬悜"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏉冮檺鏍囪瘑"> + <el-input v-model="state.tableQueryParams.permission" clearable placeholder="璇疯緭鍏ユ潈闄愭爣璇�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鑿滃崟鍚嶇О"> + <el-input v-model="state.tableQueryParams.title" clearable placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍥炬爣"> + <el-input v-model="state.tableQueryParams.icon" clearable placeholder="璇疯緭鍏ュ浘鏍�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏄惁鍐呭祵"> + <el-input v-model="state.tableQueryParams.isIframe" clearable placeholder="璇疯緭鍏ユ槸鍚﹀唴宓�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶栭摼閾炬帴"> + <el-input v-model="state.tableQueryParams.outLink" clearable placeholder="璇疯緭鍏ュ閾鹃摼鎺�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏄惁闅愯棌"> + <el-input v-model="state.tableQueryParams.isHide" clearable placeholder="璇疯緭鍏ユ槸鍚﹂殣钘�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏄惁缂撳瓨"> + <el-input v-model="state.tableQueryParams.isKeepAlive" clearable placeholder="璇疯緭鍏ユ槸鍚︾紦瀛�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏄惁鍥哄畾"> + <el-input v-model="state.tableQueryParams.isAffix" clearable placeholder="璇疯緭鍏ユ槸鍚﹀浐瀹�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鎺掑簭"> + <el-input-number v-model="state.tableQueryParams.orderNo" clearable placeholder="璇疯緭鍏ユ帓搴�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐘舵��"> + <g-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶囨敞"> + <el-input v-model="state.tableQueryParams.remark" clearable placeholder="璇疯緭鍏ュ娉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_Menu:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_Menu" :disabled="state.selectData.length == 0" v-auth="'fBS_Menu:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛绯荤粺鑿滃崟琛�')" v-auth="'fBS_Menu:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_MenuCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Menu:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_Menu:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_Menu:batchDelete') || auth('fBS_Menu:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='pid' label='鐖禝d' show-overflow-tooltip /> + <el-table-column prop='type' label='鑿滃崟绫诲瀷' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.type" code="MenuTypeEnum" /> + </template> + </el-table-column> + <el-table-column prop='name' label='璺敱鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='path' label='璺敱鍦板潃' show-overflow-tooltip /> + <el-table-column prop='component' label='缁勪欢璺緞' show-overflow-tooltip /> + <el-table-column prop='redirect' label='閲嶅畾鍚�' show-overflow-tooltip /> + <el-table-column prop='permission' label='鏉冮檺鏍囪瘑' show-overflow-tooltip /> + <el-table-column prop='title' label='鑿滃崟鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='icon' label='鍥炬爣' show-overflow-tooltip /> + <el-table-column prop='isIframe' label='鏄惁鍐呭祵' show-overflow-tooltip> + <template #default="scope"> + <el-tag v-if="scope.row.isIframe"> 鏄� </el-tag> + <el-tag type="danger" v-else> 鍚� </el-tag> + </template> + </el-table-column> + <el-table-column prop='outLink' label='澶栭摼閾炬帴' show-overflow-tooltip /> + <el-table-column prop='isHide' label='鏄惁闅愯棌' show-overflow-tooltip> + <template #default="scope"> + <el-tag v-if="scope.row.isHide"> 鏄� </el-tag> + <el-tag type="danger" v-else> 鍚� </el-tag> + </template> + </el-table-column> + <el-table-column prop='isKeepAlive' label='鏄惁缂撳瓨' show-overflow-tooltip> + <template #default="scope"> + <el-tag v-if="scope.row.isKeepAlive"> 鏄� </el-tag> + <el-tag type="danger" v-else> 鍚� </el-tag> + </template> + </el-table-column> + <el-table-column prop='isAffix' label='鏄惁鍥哄畾' show-overflow-tooltip> + <template #default="scope"> + <el-tag v-if="scope.row.isAffix"> 鏄� </el-tag> + <el-tag type="danger" v-else> 鍚� </el-tag> + </template> + </el-table-column> + <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip /> + <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Menu:setStatus'" show-overflow-tooltip> + <template #default="scope"> + <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_MenuStatus(scope.row)" /> + </template> + </el-table-column> + <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip /> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_Menu:update') || auth('fBS_Menu:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛绯荤粺鑿滃崟琛�')" v-auth="'fBS_Menu:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Menu(scope.row)" v-auth="'fBS_Menu:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_MenuApi.importData" :download="fBS_MenuApi.downloadTemplate" v-auth="'fBS_Menu:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃瀹㈡埛绯荤粺鑿滃崟琛�'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Role/component/editDialog.vue b/Web/src/views/Customer/fBS_Role/component/editDialog.vue new file mode 100644 index 0000000..97a308b --- /dev/null +++ b/Web/src/views/Customer/fBS_Role/component/editDialog.vue @@ -0,0 +1,121 @@ +锘�<script lang="ts" name="fBS_Role" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_RoleApi } from '/@/api/Customer/fBS_Role'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_RoleApi = useFBS_RoleApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { status: 1,orderNo: 100, }; + state.ruleForm = row.id ? await fBS_RoleApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_RoleApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_Role-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍚嶇О" prop="name"> + <el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ュ悕绉�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="缂栫爜" prop="code"> + <el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ョ紪鐮�" maxlength="64" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鎺掑簭" prop="orderNo"> + <el-input-number v-model="state.ruleForm.orderNo" placeholder="璇疯緭鍏ユ帓搴�" clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鏁版嵁鑼冨洿" prop="dataScope"> + <g-sys-dict v-model="state.ruleForm.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="state.ruleForm.remark" placeholder="璇疯緭鍏ュ娉�" maxlength="128" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.id" > + <el-form-item label="鐘舵��" prop="status"> + <g-sys-dict v-model="state.ruleForm.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_Role/index.vue b/Web/src/views/Customer/fBS_Role/index.vue new file mode 100644 index 0000000..84a36d6 --- /dev/null +++ b/Web/src/views/Customer/fBS_Role/index.vue @@ -0,0 +1,225 @@ +锘�<script lang="ts" setup name="fBS_Role"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_RoleApi } from '/@/api/Customer/fBS_Role'; +import editDialog from '/@/views/Customer/fBS_Role/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_RoleApi = useFBS_RoleApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_RoleApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_Role = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_RoleApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_Role = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_RoleApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 璁剧疆鐘舵�� +const changeFBS_RoleStatus = async (row: any) => { + await fBS_RoleApi.setStatus({ id: row.id, status: row.status }).then(() => ElMessage.success('鐘舵�佽缃垚鍔�')); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_RoleCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_RoleApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_RoleApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_RoleApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_Role-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍚嶇О"> + <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ュ悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="缂栫爜"> + <el-input v-model="state.tableQueryParams.code" clearable placeholder="璇疯緭鍏ョ紪鐮�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鎺掑簭"> + <el-input-number v-model="state.tableQueryParams.orderNo" clearable placeholder="璇疯緭鍏ユ帓搴�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鏁版嵁鑼冨洿"> + <g-sys-dict v-model="state.tableQueryParams.dataScope" code="DataScopeEnum" render-as="select" placeholder="璇烽�夋嫨鏁版嵁鑼冨洿" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="澶囨敞"> + <el-input v-model="state.tableQueryParams.remark" clearable placeholder="璇疯緭鍏ュ娉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐘舵��"> + <g-sys-dict v-model="state.tableQueryParams.status" code="StatusEnum" render-as="select" placeholder="璇烽�夋嫨鐘舵��" clearable filterable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_Role:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_Role" :disabled="state.selectData.length == 0" v-auth="'fBS_Role:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板瀹㈡埛瑙掕壊')" v-auth="'fBS_Role:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_RoleCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_Role:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_Role:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_Role:batchDelete') || auth('fBS_Role:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='name' label='鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='code' label='缂栫爜' show-overflow-tooltip /> + <el-table-column prop='orderNo' label='鎺掑簭' show-overflow-tooltip /> + <el-table-column prop='dataScope' label='鏁版嵁鑼冨洿' show-overflow-tooltip> + <template #default="scope"> + <g-sys-dict v-model="scope.row.dataScope" code="DataScopeEnum" /> + </template> + </el-table-column> + <el-table-column prop='remark' label='澶囨敞' show-overflow-tooltip /> + <el-table-column prop='status' label='鐘舵��' v-auth="'fBS_Role:setStatus'" show-overflow-tooltip> + <template #default="scope"> + <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small" @change="changeFBS_RoleStatus(scope.row)" /> + </template> + </el-table-column> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_Role:update') || auth('fBS_Role:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫瀹㈡埛瑙掕壊')" v-auth="'fBS_Role:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_Role(scope.row)" v-auth="'fBS_Role:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_RoleApi.importData" :download="fBS_RoleApi.downloadTemplate" v-auth="'fBS_Role:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃瀹㈡埛瑙掕壊'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/fb_p_complaints/procurementComplaint/index.vue b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue index 9aee0f8..49ad44c 100644 --- a/Web/src/views/fb_p_complaints/procurementComplaint/index.vue +++ b/Web/src/views/fb_p_complaints/procurementComplaint/index.vue @@ -154,14 +154,15 @@ <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユ姇璇変簨椤�" /> </el-form-item> </el-col> - <!-- <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> <el-form-item label="鏄惁鎴愮珛"> <el-select v-model="state.tableQueryParams.status" placeholder="璇烽�夋嫨" clearable> - <el-option label="鏄�" :value="200" /> - <el-option label="鍚�" :value="400" /> + <el-option label="鎴愮珛" value="Valid" /> + <el-option label="椹冲洖" value="Rejected" /> + <el-option label="鍏跺畠" value="Other" /> </el-select> </el-form-item> - </el-col> --> + </el-col> <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> <el-form-item label="鍏抽敭瀛�"> -- Gitblit v1.9.1