using Admin.NET.Core; using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Microsoft.EntityFrameworkCore; using Admin.NET.Core.Entity.WmsBase; using System.Text.RegularExpressions; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; namespace Admin.NET.Application { /// /// 角色菜单 /// public class SysRoleMenuService : ISysRoleMenuService, ITransient { private readonly IRepository _sysRoleMenuRep; // 角色菜单表仓储 private readonly IRepository _wmsRolePdaMenu; // 角色菜单表仓储 private readonly IRepository _sysMenuRep; // 菜单表仓储 private readonly ISysCacheService _sysCacheService; /// /// 构造函数 /// /// /// /// public SysRoleMenuService( IRepository sysRoleMenuRep, IRepository wmsRolePdaMenu, IRepository sysMenuRep, ISysCacheService sysCacheService) { _sysRoleMenuRep = sysRoleMenuRep; _wmsRolePdaMenu = wmsRolePdaMenu; _sysMenuRep = sysMenuRep; _sysCacheService = sysCacheService; } /// /// 获取角色的菜单Id集合 /// /// /// public async Task> GetRoleMenuIdList(List roleIdList) { return await _sysRoleMenuRep.DetachedEntities .Where(u => roleIdList.Contains(u.SysRoleId)) .Select(u => u.SysMenuId).ToListAsync(); } /// /// 授权角色菜单 /// /// /// [UnitOfWork] public async Task GrantMenu(GrantRoleMenuInput input) { var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync(); await _sysRoleMenuRep.DeleteAsync(roleMenus); // 确保对按钮菜单的父级菜单能正确的授权,发现前端构造的数据会丢弃了按钮菜单的父级菜单 var roleMenuPidsList = await _sysMenuRep.DetachedEntities.Where(u => input.GrantMenuIdList.Contains(u.Id)) .Select(u => u.Pids).ToListAsync(); var roleMenuSplitPids = roleMenuPidsList .SelectMany(u => u.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(v => long.Parse(v[1..^1])) .Where(v => v != 0)) .Union(input.GrantMenuIdList); var menus = roleMenuSplitPids.Select(u => new SysRoleMenu { SysRoleId = input.Id, SysMenuId = u }).ToList(); //ly-0415 过滤表sys_menu不存在的id List menusFilters = new List(); foreach (var item in menus) { var _details = _sysMenuRep.Where(x => x.Id == item.SysMenuId).ToList(); if (_details.Count>0) { menusFilters.Add(item); } } await _sysRoleMenuRep.InsertAsync(menusFilters); // 清除缓存 await _sysCacheService.DelByPatternAsync(CommonConst.CACHE_KEY_MENU); await _sysCacheService.DelByPatternAsync(CommonConst.CACHE_KEY_PERMISSION); } [UnitOfWork] public async Task GrantPdaMenu(GrantRoleMenuInput input) { var roleMenus = await _wmsRolePdaMenu.DetachedEntities.Where(u => u.SysRoleId == input.Id).ToListAsync(); await _wmsRolePdaMenu.DeleteAsync(roleMenus); foreach (var item in input.GrantMenuIdList) { await _wmsRolePdaMenu.InsertAsync(new WmsRolePdaMenu { SysRoleId = input.Id, PdaMenuId = item }); } } /// /// 根据菜单Id集合删除对应的角色-菜单表信息 /// /// /// public async Task DeleteRoleMenuListByMenuIdList(List menuIdList) { var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => menuIdList.Contains(u.SysMenuId)).ToListAsync(); await _sysRoleMenuRep.DeleteAsync(roleMenus); } /// /// 根据角色Id删除对应的角色-菜单表关联信息 /// /// /// public async Task DeleteRoleMenuListByRoleId(long roleId) { var roleMenus = await _sysRoleMenuRep.DetachedEntities.Where(u => u.SysRoleId == roleId).ToListAsync(); await _sysRoleMenuRep.DeleteAsync(roleMenus); } } }