using YD_Event.Application.Role.Dtos; using YD_Event.Core.Shared; namespace YD_Event.Application.Role; /// /// 角色管理 /// public class SysRoleService : BaseService, ITransient { private readonly ISqlSugarRepository _sysRoleRepository; private readonly ISqlSugarRepository _sysRoleMenuRepository; private readonly IEasyCachingProvider _easyCachingProvider; private readonly IIdGenerator _idGenerator; public SysRoleService(ISqlSugarRepository sysRoleRepository, ISqlSugarRepository sysRoleMenuRepository, IEasyCachingProvider easyCachingProvider, IIdGenerator idGenerator) : base(sysRoleRepository) { _sysRoleRepository = sysRoleRepository; _sysRoleMenuRepository = sysRoleMenuRepository; _easyCachingProvider = easyCachingProvider; _idGenerator = idGenerator; } /// /// 角色分页查询 /// /// /// [DisplayName("角色分页查询")] [HttpGet("page")] public async Task> Page([FromQuery] SysRoleQueryInput dto) { return await _sysRoleRepository.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(dto.Name), x => x.Name.Contains(dto.Name)) .OrderBy(x => x.Sort) .OrderByDescending(x => x.Id) .Select(x => new SysRolePageOutput { Id = x.Id, Name = x.Name, CreatedTime = x.CreatedTime, Status = x.Status, Code = x.Code, Sort = x.Sort, Remark = x.Remark }).ToPagedListAsync(dto); } /// /// 添加角色 /// /// /// [DisplayName("添加角色")] [HttpPost("add")] [UnitOfWork] public async Task AddRole(AddSysRoleInput dto) { var role = dto.Adapt(); role.Id = _idGenerator.NewLong(); // 自动生成Code,避免重复 role.Code = $"Role_{role.Id}"; if (await _sysRoleRepository.IsAnyAsync(x => x.Name == dto.Name)) { throw new InvalidOperationException($"角色名称 {dto.Name} 已存在"); } await _sysRoleRepository.InsertAsync(role); // 保存角色权限 var menuIds = dto.MenuIds ?? dto.Menus; if (menuIds != null && menuIds.Any()) { var roleMenus = menuIds.Select(x => new SysRoleMenu() { MenuId = x, RoleId = role.Id }).ToList(); await _sysRoleMenuRepository.InsertRangeAsync(roleMenus); } } /// /// 更新角色 /// /// /// [DisplayName("更新角色")] [HttpPut("edit")] [UnitOfWork] public async Task UpdateRole(UpdateSysRoleInput dto) { var sysRole = await _sysRoleRepository.GetByIdAsync(dto.Id); if (sysRole == null) { throw new InvalidOperationException("角色不存在"); } if (await _sysRoleRepository.IsAnyAsync(x => x.Id != dto.Id && x.Name == dto.Name)) { throw new InvalidOperationException($"角色名称 {dto.Name} 已存在"); } dto.Adapt(sysRole); await _sysRoleRepository.UpdateAsync(sysRole); // 更新角色权限 await _sysRoleMenuRepository.DeleteAsync(x => x.RoleId == dto.Id); var menuIds = dto.MenuIds ?? dto.Menus; if (menuIds != null && menuIds.Any()) { var roleMenus = menuIds.Select(x => new SysRoleMenu() { MenuId = x, RoleId = dto.Id }).ToList(); await _sysRoleMenuRepository.InsertRangeAsync(roleMenus); } await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey); } /// /// 授权角色权限 /// /// /// [DisplayName("授权角色权限")] [HttpPost("grantPermission")] [UnitOfWork] public async Task GrantPermission(GrantRolePermissionInput input) { var sysRole = await _sysRoleRepository.GetByIdAsync(input.Id); if (sysRole == null) throw new InvalidOperationException("角色不存在"); var roleMenus = input.MenuIds.Select(x => new SysRoleMenu() { MenuId = x, RoleId = input.Id }).ToList(); await _sysRoleMenuRepository.DeleteAsync(x => x.RoleId == input.Id); if (roleMenus.Any()) { await _sysRoleMenuRepository.InsertRangeAsync(roleMenus); } await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey); } /// /// 获取角色可访问的菜单和按钮id /// /// 角色id /// [DisplayName("获取角色可访问的菜单和按钮id")] [HttpGet("getRoleMenu")] public async Task> GetRoleMenu([FromQuery] long id) { return await _sysRoleRepository.AsQueryable() .InnerJoin((role, roleMenu) => role.Id == roleMenu.RoleId) .InnerJoin((role, roleMenu, menu) => roleMenu.MenuId == menu.Id) .Where((role, roleMenu, menu) => role.Id == id && menu.Status == AvailabilityStatus.Enable) .Select((role, roleMenu) => roleMenu.MenuId) .ToListAsync(); } /// /// 修改角色状态 /// /// /// [DisplayName("修改角色状态")] [HttpPut("setStatus")] public override async Task SetStatus(AvailabilityDto dto) { await base.SetStatus(dto); await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey); } /// /// 删除角色 /// /// /// [DisplayName("删除角色")] [HttpDelete("delete")] public override async Task Delete(KeyDto dto) { await base.Delete(dto); // 物理删除关联权限 await _sysRoleMenuRepository.DeleteAsync(x => x.RoleId == dto.Id); await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey); } /// /// 角色下拉选项 /// /// [DisplayName("角色下拉选项")] [HttpGet("select")] public async Task> RoleSelect() { return await _sysRoleRepository.AsQueryable().Where(x => x.Status == AvailabilityStatus.Enable) .OrderBy(x => x.Sort) .OrderBy(x => x.Id) .Select(x => new SelectOutput() { Value = x.Id, Label = x.Name }).ToListAsync(); } /// /// 角色下拉选项(兼容接口) /// /// [DisplayName("角色下拉选项(兼容接口)")] [HttpGet("roleselect")] public async Task> RoleSelectCompat() { return await RoleSelect(); } }