using FoodLabeling.Application.Contracts.Dtos.RbacMenu; using FoodLabeling.Application.Contracts.IServices; using FoodLabeling.Application.Services.DbModels; using Microsoft.AspNetCore.Mvc; using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Services; using Yi.Framework.SqlSugarCore.Abstractions; namespace FoodLabeling.Application.Services; /// /// 权限(Menu)管理(食品标签-美国版对外) /// public class RbacMenuAppService : ApplicationService, IRbacMenuAppService { private readonly ISqlSugarDbContext _dbContext; public RbacMenuAppService(ISqlSugarDbContext dbContext) { _dbContext = dbContext; } /// public async Task> GetListAsync([FromQuery] RbacMenuGetListInputVo input) { var query = _dbContext.SqlSugarClient.Queryable() .Where(x => x.IsDeleted == false) .WhereIF(!string.IsNullOrWhiteSpace(input.MenuName), x => x.MenuName.Contains(input.MenuName!.Trim())) .WhereIF(input.State is not null, x => x.State == input.State) .WhereIF(input.MenuSource is not null, x => x.MenuSource == input.MenuSource!.Value) .OrderBy(x => x.OrderNum, OrderByType.Desc); var entities = await query.ToListAsync(); return entities.Select(x => new RbacMenuGetListOutputDto { Id = x.Id, ParentId = x.ParentId, MenuName = x.MenuName ?? string.Empty, RouterName = x.RouterName, Router = x.Router, PermissionCode = x.PermissionCode, MenuType = x.MenuType, MenuSource = x.MenuSource, OrderNum = x.OrderNum, State = x.State }).ToList(); } /// public async Task GetAsync(string id) { var entity = await _dbContext.SqlSugarClient.Queryable() .Where(x => x.Id == id && x.IsDeleted == false) .SingleAsync(); if (entity is null) { throw new UserFriendlyException("权限不存在"); } return new RbacMenuGetListOutputDto { Id = entity.Id, ParentId = entity.ParentId, MenuName = entity.MenuName ?? string.Empty, RouterName = entity.RouterName, Router = entity.Router, PermissionCode = entity.PermissionCode, MenuType = entity.MenuType, MenuSource = entity.MenuSource, OrderNum = entity.OrderNum, State = entity.State }; } /// public async Task CreateAsync([FromBody] RbacMenuCreateInputVo input) { var name = input.MenuName?.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new UserFriendlyException("权限名称不能为空"); } var entity = new MenuDbEntity { Id = GuidGenerator.Create().ToString(), MenuName = name, ParentId = string.IsNullOrWhiteSpace(input.ParentId) ? "0" : input.ParentId.Trim(), MenuType = input.MenuType, MenuSource = input.MenuSource, PermissionCode = input.PermissionCode?.Trim(), Router = input.Router?.Trim(), Component = input.Component?.Trim(), OrderNum = input.OrderNum, State = input.State, IsDeleted = false, CreationTime = DateTime.Now, IsCache = false, IsLink = false, IsShow = true, ConcurrencyStamp = string.Empty }; await _dbContext.SqlSugarClient.Insertable(entity).ExecuteCommandAsync(); return await GetAsync(entity.Id); } /// public async Task UpdateAsync(string id, [FromBody] RbacMenuUpdateInputVo input) { var entity = await _dbContext.SqlSugarClient.Queryable() .Where(x => x.Id == id && x.IsDeleted == false) .SingleAsync(); if (entity is null) { throw new UserFriendlyException("权限不存在"); } var name = input.MenuName?.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new UserFriendlyException("权限名称不能为空"); } entity.MenuName = name; entity.ParentId = string.IsNullOrWhiteSpace(input.ParentId) ? "0" : input.ParentId.Trim(); entity.MenuType = input.MenuType; entity.MenuSource = input.MenuSource; entity.PermissionCode = input.PermissionCode?.Trim(); entity.Router = input.Router?.Trim(); entity.Component = input.Component?.Trim(); entity.OrderNum = input.OrderNum; entity.State = input.State; entity.LastModificationTime = DateTime.Now; await _dbContext.SqlSugarClient.Updateable(entity) .Where(x => x.Id == entity.Id) .ExecuteCommandAsync(); return await GetAsync(entity.Id); } /// public async Task DeleteAsync([FromBody] List ids) { var idList = ids?.Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => x.Trim()).Distinct().ToList() ?? new List(); if (idList.Count == 0) { return; } await _dbContext.SqlSugarClient.Updateable() .SetColumns(x => new MenuDbEntity { IsDeleted = true }) .Where(x => idList.Contains(x.Id)) .ExecuteCommandAsync(); } /// public async Task> GetTreeAsync() { // 返回所有字段,但过滤逻辑删除数据 var menus = await _dbContext.SqlSugarClient.Queryable() .Where(x => x.IsDeleted == false) .OrderBy(x => x.OrderNum, OrderByType.Desc) .ToListAsync(); var nodes = menus.Select(m => new RbacMenuTreeDto { Id = m.Id, IsDeleted = m.IsDeleted, CreationTime = m.CreationTime, CreatorId = m.CreatorId, LastModifierId = m.LastModifierId, LastModificationTime = m.LastModificationTime, OrderNum = m.OrderNum, State = m.State, MenuName = m.MenuName ?? string.Empty, RouterName = m.RouterName, MenuType = m.MenuType, PermissionCode = m.PermissionCode, ParentId = m.ParentId, MenuIcon = m.MenuIcon, Router = m.Router, IsLink = m.IsLink, IsCache = m.IsCache, IsShow = m.IsShow, Remark = m.Remark, Component = m.Component, MenuSource = m.MenuSource, Query = m.Query, ConcurrencyStamp = m.ConcurrencyStamp, Children = new List() }).ToList(); // TreeHelper 仅支持 Guid Id/ParentId,这里使用字符串 ParentId 自行构建树 var nodeById = nodes .Where(x => !string.IsNullOrWhiteSpace(x.Id)) .GroupBy(x => x.Id) .ToDictionary(g => g.Key, g => g.First()); foreach (var node in nodes) { node.Children ??= new List(); var parentId = string.IsNullOrWhiteSpace(node.ParentId) ? "0" : node.ParentId.Trim(); if (parentId == "0" || parentId == "00000000-0000-0000-0000-000000000000") { continue; } if (nodeById.TryGetValue(parentId, out var parent)) { parent.Children ??= new List(); parent.Children.Add(node); } } var roots = nodes .Where(n => { var pid = string.IsNullOrWhiteSpace(n.ParentId) ? "0" : n.ParentId.Trim(); return pid == "0" || pid == "00000000-0000-0000-0000-000000000000" || !nodeById.ContainsKey(pid); }) .ToList(); SortTree(roots); return roots; } private static void SortTree(List nodes) { nodes.Sort((a, b) => b.OrderNum.CompareTo(a.OrderNum)); foreach (var node in nodes) { if (node.Children is { Count: > 0 }) { SortTree(node.Children); } } } }