From c99879559560a59d29f578f71f0c875ea8470337 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 26 Dec 2023 11:02:04 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/BusinessPlacesController.cs | 2 +- .../Device/Controllers/DevicesController.cs | 15 +- .../Device/Request/DeviceSaveRequest.cs | 23 +-- .../Request/DeviceTemplateSaveRequest.cs | 2 +- .../Device/Services/IDeviceService.cs | 2 +- .../Services/Implements/DeviceService.cs | 64 +++++- .../Implements/DeviceTemplateService.cs | 33 ++- Src/Dlhis.Basic/Dlhis.Basic.csproj | 3 +- Src/Dlhis.Basic/SqlSugarPack.cs | 12 +- Src/Dlhis.Canteen/Dlhis.Canteen.csproj | 2 +- Src/Dlhis.Common/Dlhis.Common.csproj | 2 +- .../Device/Entities/DeviceTemplateEntity.cs | 7 +- .../Entities/MenuPermissionEntity.cs | 7 +- Src/Dlhis.Permission/Dlhis.Permission.csproj | 9 +- .../MenuPermissionAssignmentRequest.cs | 25 +++ .../Menu/Request/SaveMenuRequest.cs | 102 ++++++++++ .../Menu/Response/MenuResponse.cs | 81 ++++++++ .../Menu/Services/IMenuService.cs | 24 +++ .../Menu/Services/Implements/MenuService.cs | 191 ++++++++++++++++++ .../Dlhis.ScheduledTask.csproj | 2 +- 20 files changed, 566 insertions(+), 42 deletions(-) create mode 100644 Src/Dlhis.Permission/Menu/Request/MenuPermissionAssignmentRequest.cs create mode 100644 Src/Dlhis.Permission/Menu/Request/SaveMenuRequest.cs create mode 100644 Src/Dlhis.Permission/Menu/Response/MenuResponse.cs create mode 100644 Src/Dlhis.Permission/Menu/Services/IMenuService.cs create mode 100644 Src/Dlhis.Permission/Menu/Services/Implements/MenuService.cs diff --git a/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs b/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs index c27ad203..a7ef7272 100644 --- a/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs +++ b/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs @@ -38,7 +38,7 @@ public class BusinessPlacesController : ControllerBase [HttpGet("page")] public async Task> GetPageAsync([FromQuery] BusinessPlacePageRequest request) { - var enums = await _enumSettingApi.GetEnums(); + //var enums = await _enumSettingApi.GetEnums(); return await _businessPlaceService.GetPageAsync(request); } diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs index b1fda0b0..c4134552 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs @@ -25,7 +25,7 @@ public class DevicesController : ControllerBase } /// - /// 获取设备模板 + /// 设备模板分页 /// /// /// @@ -47,7 +47,7 @@ public class DevicesController : ControllerBase } /// - /// 获取设备分页 + /// 设备分页 /// /// /// @@ -56,4 +56,15 @@ public class DevicesController : ControllerBase { return await _deviceService.GetPageAsync(request); } + + /// + /// 设备保存 + /// + /// + /// + [HttpPost("save")] + public async Task SaveAsync(DeviceSaveRequest request) + { + await _deviceService.SaveAsync(request); + } } diff --git a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs index 08fdcb09..bf96e51e 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs @@ -1,4 +1,5 @@ -using Dlhis.Entity.Device.Enums; +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Device.Enums; namespace Dlhis.Basic.Device.Request; @@ -6,32 +7,29 @@ public class DeviceSaveRequest { public long? Id { get; set; } - - public string Sno { get; set; } - /// - /// mac地址 + /// 设备唯一号 /// - public string Mac { get; set; } + [Required(ErrorMessage = "设备唯一号不能为空")] + public string UniqueNo { get; set; } /// /// 模板code /// - public string TemplateCode { get; set; } - - /// - /// 品牌 - /// - public string Brand { get; set; } + [Required(ErrorMessage = "模板不能为空")] + public Guid TemplateCode { get; set; } /// /// 供应商信息 /// + [Required(ErrorMessage = "供应商信息不能为空")] public string Supplier { get; set; } /// /// 设备功能 /// + [MinLength(1, ErrorMessage = "设备功能不能为空")] + [Required(ErrorMessage = "设备功能不能为空")] public List Funcs { get; set; } /// @@ -52,6 +50,7 @@ public class DeviceSaveRequest /// /// 连接信息 /// + [Required(ErrorMessage = "连接信息不能为空")] public string ConnectionInfo { get; set; } /// diff --git a/Src/Dlhis.Basic/Device/Request/DeviceTemplateSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceTemplateSaveRequest.cs index 8e6d84a1..9792356e 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceTemplateSaveRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceTemplateSaveRequest.cs @@ -10,7 +10,7 @@ public class DeviceTemplateSaveRequest public string Brand { get; set; } /// - /// 模板名称 + /// 型号 /// public string Name { get; set; } diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs index dc1af3e6..a9a84773 100644 --- a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs @@ -4,7 +4,7 @@ using Kurisu.Core.DataAccess.Dto; namespace Dlhis.Basic.Device.Services; -public interface IDeviceService +public interface IDeviceService : IScopeDependency { Task> GetPageAsync(DevicePageRequest request); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index ec5e2831..4a49e07e 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -1,11 +1,15 @@ using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Device.Entities; +using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; using Mapster; +using NetTaste; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Dlhis.Basic.Device.Services.Implements; @@ -30,20 +34,72 @@ public class DeviceService : IDeviceService public async Task SaveAsync(DeviceSaveRequest request) { + var template = await CheckTemplateExistsAsync(request.TemplateCode); + await CheckTemplateFieldAsync(request.TemplateCode, request.ConnectionInfo); + if (!request.Id.HasValue) { var entity = request.Adapt(); entity.Code = Guid.NewGuid(); + entity.Brand = template.Brand; await _dbContext.InsertAsync(entity); } else { - var device = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); - device.ThrowIfNull("设备不存在,无法更新"); + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); + entity.ThrowIfNull("设备不存在,无法更新"); - request.Adapt(device); + request.Adapt(entity); + entity.Brand = template.Brand; - await _dbContext.UpdateAsync(device); + await _dbContext.UpdateAsync(entity); + } + } + + //******************************************************** help method ********************************************************** + + /// + /// 检查设备模板是否存在 + /// + /// + /// + private async Task CheckTemplateExistsAsync(Guid templateCode) + { + var entity = await _dbContext.Queryable().Where(x => x.Code == templateCode).FirstAsync(); + entity.ThrowIfNull("设备模板不存在"); + + return entity; + } + + /// + /// 检查设备连接参数是否与模板设定一致 + /// + /// + /// + /// + private async Task CheckTemplateFieldAsync(Guid templateCode, string jsonContent) + { + var template = await _dbContext.Queryable().Where(x => x.Code == templateCode).FirstAsync(); + template.ThrowIfNull("设备模板不存在"); + + try + { + var templateJobj = JObject.Parse(template.Template); + var jobj = JObject.Parse(jsonContent); + (templateJobj.Count == jobj.Count).ThrowIfFalse("连接参数字段数不一致"); + + foreach (var item in templateJobj) + { + jobj.ContainsKey(item.Key).ThrowIfFalse($"设备连接参数需要和模板一致.缺失{item.Key}"); + } + } + catch (Exception ex) when (ex is JsonReaderException) + { + throw new UserFriendlyException("连接信息参数格式不正确"); + } + catch (Exception) + { + throw; } } } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs index 063f2d71..9c48da6e 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs @@ -1,11 +1,14 @@ using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Device.Entities; +using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; using Mapster; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Dlhis.Basic.Device.Services.Implements; @@ -30,6 +33,9 @@ public class DeviceTemplateService : IDeviceTemplateService public async Task SaveTemplateAsync(DeviceTemplateSaveRequest request) { + CheckJsonFormat(request.Template); + await CheckDuplicateAsync(request); + if (!request.Id.HasValue) { var entity = request.Adapt(); @@ -44,7 +50,6 @@ public class DeviceTemplateService : IDeviceTemplateService } } - //**********************************************************************************************************/ @@ -58,4 +63,30 @@ public class DeviceTemplateService : IDeviceTemplateService var existsUsing = await _dbContext.Queryable().Where(x => x.TemplateCode == templateCode).AnyAsync(); existsUsing.ThrowIfTrue("存在使用中的设备信息,无法修改"); } + + private async Task CheckDuplicateAsync(DeviceTemplateSaveRequest request) + { + var duplicate = await _dbContext.Queryable().Where(x => x.Brand == request.Brand && x.Name == request.Name) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id) + .AnyAsync(); + + duplicate.ThrowIfTrue("品牌和型号重复"); + } + + private void CheckJsonFormat(string template) + { + try + { + var jobj = JObject.Parse(template); + (jobj.Count == 0).ThrowIfTrue("模板至少需要一个参数"); + } + catch (Exception ex) when (ex is JsonReaderException) + { + throw new UserFriendlyException("模板格式有误"); + } + catch (Exception) + { + throw; + } + } } diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index 075efa3c..4e19b0cd 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -17,8 +17,7 @@ - - + diff --git a/Src/Dlhis.Basic/SqlSugarPack.cs b/Src/Dlhis.Basic/SqlSugarPack.cs index b120d233..3145a868 100644 --- a/Src/Dlhis.Basic/SqlSugarPack.cs +++ b/Src/Dlhis.Basic/SqlSugarPack.cs @@ -16,10 +16,12 @@ public class SqlSugarPack : BaseAppPack public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - //using var scope = app.ApplicationServices.CreateScope(); - //var db = scope.ServiceProvider.GetService(); - //var tables = App.ActiveTyps.Where(x => x.IsDefined(typeof(SugarTable), false)).ToArray(); - //db.DbMaintenance.CreateDatabase(); - //db.CodeFirst.InitTables(tables); +#if DEBUG + using var scope = app.ApplicationServices.CreateScope(); + var db = scope.ServiceProvider.GetService(); + var tables = App.ActiveTyps.Where(x => x.IsDefined(typeof(SugarTable), false)).ToArray(); + db.DbMaintenance.CreateDatabase(); + db.CodeFirst.InitTables(tables); +#endif } } diff --git a/Src/Dlhis.Canteen/Dlhis.Canteen.csproj b/Src/Dlhis.Canteen/Dlhis.Canteen.csproj index ea0849b9..89bffcb9 100644 --- a/Src/Dlhis.Canteen/Dlhis.Canteen.csproj +++ b/Src/Dlhis.Canteen/Dlhis.Canteen.csproj @@ -39,7 +39,7 @@ - + diff --git a/Src/Dlhis.Common/Dlhis.Common.csproj b/Src/Dlhis.Common/Dlhis.Common.csproj index 59f6cc51..c1a1e7bb 100644 --- a/Src/Dlhis.Common/Dlhis.Common.csproj +++ b/Src/Dlhis.Common/Dlhis.Common.csproj @@ -25,7 +25,7 @@ - + diff --git a/Src/Dlhis.Entity/Device/Entities/DeviceTemplateEntity.cs b/Src/Dlhis.Entity/Device/Entities/DeviceTemplateEntity.cs index 800d33a9..c395334d 100644 --- a/Src/Dlhis.Entity/Device/Entities/DeviceTemplateEntity.cs +++ b/Src/Dlhis.Entity/Device/Entities/DeviceTemplateEntity.cs @@ -1,4 +1,5 @@ -using Kurisu.Core.DataAccess.Entity; +using System; +using Kurisu.Core.DataAccess.Entity; using SqlSugar; namespace Dlhis.Entity.Device.Entities; @@ -18,13 +19,13 @@ public class DeviceTemplateEntity : SugarBaseEntity, ITenantId /// /// 品牌 /// - [SugarColumn(ColumnDescription = "品牌")] + [SugarColumn(ColumnDescription = "品牌", UniqueGroupNameList = new string[] { "idx_DeviceTemplate_brand_name" })] public string Brand { get; set; } /// /// 模板名称 /// - [SugarColumn(ColumnDescription = "模板名称")] + [SugarColumn(ColumnDescription = "型号", UniqueGroupNameList = new string[] { "idx_DeviceTemplate_brand_name" })] public string Name { get; set; } /// diff --git a/Src/Dlhis.Entity/Permission/Entities/MenuPermissionEntity.cs b/Src/Dlhis.Entity/Permission/Entities/MenuPermissionEntity.cs index cac0df0e..01f34b98 100644 --- a/Src/Dlhis.Entity/Permission/Entities/MenuPermissionEntity.cs +++ b/Src/Dlhis.Entity/Permission/Entities/MenuPermissionEntity.cs @@ -1,6 +1,7 @@ using Dlhis.Entity.Permission.Enums; using Kurisu.Core.DataAccess.Entity; using SqlSugar; +using SqlSugar.DbConvert; namespace Dlhis.Entity.Permission.Entities; @@ -8,12 +9,12 @@ namespace Dlhis.Entity.Permission.Entities; /// 菜单权限 /// [SugarTable(TableName = "MenuPermission", TableDescription = "菜单权限")] -public class MenuPermissionEntity : SugarBaseEntity, ITenantId +public class MenuPermissionEntity : SugarBaseEntity, ITenantId, ISoftDeleted { /// /// 权限类型 /// - [SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "权限类型")] + [SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "权限类型", SqlParameterDbType = typeof(EnumToStringConvert))] public MenuPermissionTypeEnumType UniqueType { get; set; } /// @@ -30,4 +31,6 @@ public class MenuPermissionEntity : SugarBaseEntity, ITenantId public string TenantId { get; set; } + + public bool IsDeleted { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Permission/Dlhis.Permission.csproj b/Src/Dlhis.Permission/Dlhis.Permission.csproj index b5512aec..0b6a01cb 100644 --- a/Src/Dlhis.Permission/Dlhis.Permission.csproj +++ b/Src/Dlhis.Permission/Dlhis.Permission.csproj @@ -1,8 +1,8 @@ - + net6.0 - enable + disable enable Linux ..\.. @@ -17,8 +17,7 @@ - - + @@ -26,7 +25,7 @@ - + diff --git a/Src/Dlhis.Permission/Menu/Request/MenuPermissionAssignmentRequest.cs b/Src/Dlhis.Permission/Menu/Request/MenuPermissionAssignmentRequest.cs new file mode 100644 index 00000000..661801c7 --- /dev/null +++ b/Src/Dlhis.Permission/Menu/Request/MenuPermissionAssignmentRequest.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Permission.Enums; + +namespace Dlhis.Permission.Menu.Request; + +public class MenuPermissionAssignmentRequest +{ + /// + /// 权限类型 + /// + [EnumDataType(typeof(MenuPermissionTypeEnumType))] + public MenuPermissionTypeEnumType UniqueType { get; set; } + + /// + /// 唯一值 + /// + [Required] + public string UniqueValue { get; set; } + + + /// + /// 权限code + /// + public List Codes { get; set; } = new List(); +} diff --git a/Src/Dlhis.Permission/Menu/Request/SaveMenuRequest.cs b/Src/Dlhis.Permission/Menu/Request/SaveMenuRequest.cs new file mode 100644 index 00000000..2541cb50 --- /dev/null +++ b/Src/Dlhis.Permission/Menu/Request/SaveMenuRequest.cs @@ -0,0 +1,102 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Permission.Enums; + +namespace Dlhis.Permission.Menu.Request; + +public class SaveMenuRequest : IValidatableObject +{ + public int? Id { get; set; } + + /// + /// code + /// + public string Code { get; set; } + + /// + /// 上级 + /// + public string PCode { get; set; } + + /// + /// Name + /// + [Required(ErrorMessage = "Name不能为空")] + public string Name { get; set; } + + /// + /// 标题 + /// + [Required(ErrorMessage = "标题不能为空")] + public string Title { get; set; } + + /// + /// 图标 + /// + public string Icon { get; set; } + + /// + /// 路由地址 + /// + public string Route { get; set; } + + /// + /// 权限标识 + /// + public string Permission { get; set; } + + /// + /// 是否可见 + /// + public bool? Visible { get; set; } + + /// + /// 是否为外链 + /// + public bool IsLink { get; set; } + + /// + /// 序号 + /// + public int Sequence { get; set; } + + /// + /// 菜单类型 + /// + [EnumDataType(typeof(MenuEnumType))] + public MenuEnumType MenuType { get; set; } + + /// + /// 平台 + /// + [EnumDataType(typeof(PlatformEnumType))] + public PlatformEnumType Platform { get; set; } + + /// + /// 兼容reset处理 + /// + public List Items { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if ((MenuType == MenuEnumType.Menu || MenuType == MenuEnumType.Button) && string.IsNullOrEmpty(Permission)) + { + yield return new ValidationResult("当类型为菜单或者按钮时,权限标识不能为空", new[] { nameof(Permission) }); + } + + if (MenuType == MenuEnumType.Folder && !string.IsNullOrEmpty(PCode)) + { + yield return new ValidationResult("目录类型无需传入上级code", new[] { nameof(PCode) }); + } + + //自动生成code + if (string.IsNullOrEmpty(Code)) + { + Code = Guid.NewGuid().ToString(); + } + + if (!Visible.HasValue) + { + Visible = true; + } + } +} diff --git a/Src/Dlhis.Permission/Menu/Response/MenuResponse.cs b/Src/Dlhis.Permission/Menu/Response/MenuResponse.cs new file mode 100644 index 00000000..660b9d94 --- /dev/null +++ b/Src/Dlhis.Permission/Menu/Response/MenuResponse.cs @@ -0,0 +1,81 @@ +using Dlhis.Entity.Permission.Enums; + +namespace Dlhis.Permission.Menu.Response; + +public class MenuResponse +{ + public int Id { get; set; } + + /// + /// code + /// + public string Code { get; set; } + + /// + /// 上级 + /// + public string PCode { get; set; } + + /// + /// 标题 + /// + public string Title { get; set; } + + /// + /// Name + /// + public string Name { get; set; } + + + /// + /// 图标 + /// + public string Icon { get; set; } + + + /// + /// 路由地址 + /// + public string Route { get; set; } + + /// + /// 序号 + /// + public int Sequence { get; set; } + + /// + /// 菜单类型 + /// + public MenuEnumType MenuType { get; set; } + + /// + /// 是否外链 + /// + public bool IsLink { get; set; } + + /// + /// 权限标识 + /// + public string Permission { get; set; } + + /// + /// 是否可见 + /// + public bool Visible { get; set; } + + /// + /// 平台 + /// + public PlatformEnumType Platform { get; set; } + + + /// + /// 手机端才会有 + /// + public List HotelIds { get; set; } = new List(); + + /// + /// 子菜单 + /// + public List Items { get; set; } +} diff --git a/Src/Dlhis.Permission/Menu/Services/IMenuService.cs b/Src/Dlhis.Permission/Menu/Services/IMenuService.cs new file mode 100644 index 00000000..fdd22903 --- /dev/null +++ b/Src/Dlhis.Permission/Menu/Services/IMenuService.cs @@ -0,0 +1,24 @@ +using Dlhis.Entity.Permission.Enums; +using Dlhis.Permission.Menu.Request; +using Dlhis.Permission.Menu.Response; + +namespace Dlhis.Permission.Menu.Services; + +public interface IMenuService +{ + Task> GetListAsync(PlatformEnumType platform); + + Task SaveMenuAsync(SaveMenuRequest request); + + Task AssignmentAsync(MenuPermissionAssignmentRequest request); + + Task> GetAssignmentCodesAsync(MenuPermissionTypeEnumType permissionType, string uniqueData); + + Task> GetAllAssignmentPermissionsAsync(); + + Task> GetCurrentMenusAsync(); + + Task IsPass(IEnumerable p); + + Task ResetAsync(List request); +} diff --git a/Src/Dlhis.Permission/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Permission/Menu/Services/Implements/MenuService.cs new file mode 100644 index 00000000..4d804ad4 --- /dev/null +++ b/Src/Dlhis.Permission/Menu/Services/Implements/MenuService.cs @@ -0,0 +1,191 @@ +using Dlhis.Entity.Permission.Entities; +using Dlhis.Entity.Permission.Enums; +using Dlhis.Permission.Menu.Request; +using Dlhis.Permission.Menu.Response; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.User.Abstractions; +using Kurisu.SqlSugar.Services; +using Mapster; + +namespace Dlhis.Permission.Menu.Services.Implements; + +public class MenuService : IMenuService +{ + private readonly IDbContext _dbContext; + private readonly ICurrentUser _currentUser; + + public MenuService(IDbContext dbContext, ICurrentUser currentUser) + { + _dbContext = dbContext; + _currentUser = currentUser; + } + + public async Task> GetListAsync(PlatformEnumType platform) + { + var result = await _dbContext.Queryable() + .Where(x => x.Platform == platform) + .OrderBy(x => x.Sequence) + .Select() + .ToListAsync(); + + var top = result.Where(x => x.PCode.IsEmpty()).ToList(); + foreach (var menu in top) + { + RecursionGetNext(menu, result); + } + + return top; + } + + public async Task SaveMenuAsync(SaveMenuRequest request) + { + await CheckAsync(request); + + if (!request.Id.HasValue) + { + var entity = request.Adapt(); + await _dbContext.InsertAsync(entity); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); + await ChangeIfCodeEditAsync(entity.Code, request.Code); + + request.Adapt(entity); + + await _dbContext.UpdateAsync(entity); + } + } + + + private async Task ChangeIfCodeEditAsync(string beforeCode, string pcode) + { + if (beforeCode != pcode) + { + //修改下级的PCode为当前的code + var menus = await _dbContext.Queryable().Where(x => x.PCode == beforeCode).ToListAsync(); + menus.ForEach(x => + { + x.PCode = pcode; + }); + + //修改权限code为当前的code,避免权限丢失 + var permissions = await _dbContext.Queryable().Where(x => x.Code == beforeCode).ToListAsync(); + permissions.ForEach(x => + { + x.Code = pcode; + }); + + await _dbContext.UpdateAsync(menus); + await _dbContext.UpdateAsync(permissions); + } + } + + public async Task AssignmentAsync(MenuPermissionAssignmentRequest request) + { + (request.UniqueType == MenuPermissionTypeEnumType.Role).ThrowIfTrue("暂不支持角色分配"); + + //清空覆盖 + var permissionsToDelete = await _dbContext.Queryable() + .Where(x => x.UniqueType == request.UniqueType) + .Where(x => x.UniqueValue == request.UniqueValue) + .ToListAsync(); + //触发日志记录 + await _dbContext.DeleteAsync(permissionsToDelete); + + var permissions = request.Codes.Select(x => new MenuPermissionEntity + { + Code = x, + UniqueType = request.UniqueType, + UniqueValue = request.UniqueValue + + }).ToList(); + + + await _dbContext.InsertAsync(permissions); + } + + public Task> GetAssignmentCodesAsync(MenuPermissionTypeEnumType permissionType, string uniqueData) + { + throw new NotImplementedException(); + } + + public Task> GetAllAssignmentPermissionsAsync() + { + throw new NotImplementedException(); + } + + public Task> GetCurrentMenusAsync() + { + throw new NotImplementedException(); + } + + public Task IsPass(IEnumerable p) + { + throw new NotImplementedException(); + } + + public Task ResetAsync(List request) + { + throw new NotImplementedException(); + } + + + private void RecursionGetNext(MenuResponse current, List menus) + { + var nextMenus = menus.Where(x => x.PCode == current.Code).ToList(); + current.Items = nextMenus; + foreach (var menu in nextMenus) + { + RecursionGetNext(menu, menus); + } + } + + private async Task CheckAsync(SaveMenuRequest request) + { + //检查重复code + var exists = await _dbContext.Queryable() + .Where(x => x.Code == request.Code) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id).AnyAsync(); + exists.ThrowIfTrue($"{request.Title}存在重复code"); + + //检查name + exists = await _dbContext.Queryable() + .Where(x => x.Name == request.Name) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id).AnyAsync(); + exists.ThrowIfTrue($"{request.Title}存在重复name"); + + //判断权限重复 + if (request.Permission.IsPresent()) + { + exists = await _dbContext.Queryable() + .Where(x => x.Permission == request.Permission && (request.MenuType == MenuEnumType.Menu || request.MenuType == MenuEnumType.Button)) + .WhereIF(request.Id.HasValue, x => x.Id != request.Id).AnyAsync(); + exists.ThrowIfTrue($"{request.Title}存在重复权限标识"); + } + + //request.PCode + var menu = await _dbContext.Queryable().Where(x => x.Code == request.PCode).FirstAsync(); + (menu == null && request.MenuType != MenuEnumType.Folder).ThrowIfTrue($"{request.Title}上级不存在"); + + if (request.MenuType == MenuEnumType.Folder) + { + request.PCode = null; + } + else if (request.MenuType == MenuEnumType.Menu) + { + if (menu.MenuType != MenuEnumType.Folder) + { + throw new Exception($"{request.Title}菜单上级需要为目录"); + } + } + else + { + //button + if (menu.MenuType != MenuEnumType.Menu) + { + throw new Exception($"{request.Title}按钮上级需要为菜单"); + } + } + } +} diff --git a/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj b/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj index 2096c148..d38ca1a1 100644 --- a/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj +++ b/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj @@ -17,7 +17,7 @@ - +