using Mapster; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YY.Admin.Core.Session; using YY.Admin.Services.Service.Role; using YY.Admin.Services.Service.User; namespace YY.Admin.Services.Service.Menu { public class SysMenuService : ISysMenuService, ISingletonDependency { private readonly ISqlSugarClient _dbContext; private readonly SysUserRoleService _sysUserRoleService; private readonly SysRoleMenuService _sysRoleMenuService; public SysMenuService( ISqlSugarClient context, SysRoleMenuService sysRoleMenuService, SysUserRoleService sysUserRoleService) { _dbContext=context; _sysUserRoleService=sysUserRoleService; _sysRoleMenuService=sysRoleMenuService; } /// /// 获取登录菜单树 /// /// public async Task> GetLoginMenuTree() { var currentUser = AppSession.CurrentUser; if (currentUser == null) { return new List(); } var tenantId = currentUser.TenantId ?? 0; var (query, _) = GetSugarQueryableAndTenantId(tenantId); if (currentUser.IsSuperAdmin || currentUser.IsSysAdmin) { var menuList = await query.Where(u => u.Type != MenuTypeEnum.Btn && u.Status == StatusEnum.Enable) .OrderBy(u => new { u.OrderNo, u.Id }) .ToTreeAsync(u => u.Children, u => u.Pid, 0); return menuList.Adapt>(); } var menuIdList = await GetMenuIdList(); if (menuIdList == null || menuIdList.Count == 0) { // Jeecg自动建档用户可能暂未分配本地角色,这里回退显示基础菜单 var fallbackMenus = await GetFallbackMenuTreeAsync(); return fallbackMenus.Adapt>(); } var menuTree = await query.Where(u => u.Type != MenuTypeEnum.Btn && u.Status == StatusEnum.Enable) .OrderBy(u => new { u.OrderNo, u.Id }).ToTreeAsync(u => u.Children, u => u.Pid, 0, menuIdList.Select(d => (object)d).ToArray()); // 角色或租户菜单未配置时,避免左侧功能列表全空白 if (menuTree == null || menuTree.Count == 0) { menuTree = await GetFallbackMenuTreeAsync(); } return menuTree.Adapt>(); } /// /// 获取当前用户菜单Id集合 /// /// public async Task> GetMenuIdList() { var currentUser = AppSession.CurrentUser; if (currentUser == null) { return new List(); } var roleIdList = await _sysUserRoleService.GetUserRoleIdList(currentUser.Id); return await _sysRoleMenuService.GetRoleMenuIdList(roleIdList); } /// /// 根据租户id获取构建菜单联表查询实例 /// /// /// public (ISugarQueryable query, long tenantId) GetSugarQueryableAndTenantId(long tenantId) { if (!AppSession.CurrentUser!.IsSuperAdmin) tenantId = AppSession.CurrentUser.TenantId!.Value; // 超管用户菜单范围:种子菜单 + 租户id菜单 ISugarQueryable query; if (AppSession.CurrentUser.IsSuperAdmin) { if (tenantId <= 0) { query = _dbContext.Queryable().InnerJoinIF(false, (u, t) => true); } else { // 指定租户的菜单 var menuIds = _dbContext.Queryable().Where(u => u.TenantId == tenantId).ToList(u => u.MenuId) ?? new(); // 种子菜单 //menuIds.AddRange(new SysMenuSeedData().HasData().Select(u => u.Id).ToList()); menuIds = menuIds.Distinct().ToList(); query = _dbContext.Queryable().InnerJoinIF(false, (u, t) => true).Where(u => menuIds.Contains(u.Id)); } } else if (AppSession.CurrentUser.IsSysAdmin) { // 系统管理员直接读取全量启用菜单,不依赖租户菜单关联表 query = _dbContext.Queryable().InnerJoinIF(false, (u, t) => true); } else { query = _dbContext.Queryable().InnerJoinIF(tenantId > 0, (u, t) => t.TenantId == tenantId && u.Id == t.MenuId); } return (query, tenantId); } /// /// 菜单兜底:当角色/租户未完成绑定时返回可用基础菜单,避免界面空白 /// private async Task> GetFallbackMenuTreeAsync() { return await _dbContext.Queryable() .Where(u => u.Type != MenuTypeEnum.Btn && u.Status == StatusEnum.Enable) .OrderBy(u => new { u.OrderNo, u.Id }) .ToTreeAsync(u => u.Children, u => u.Pid, 0); } } }