using YD_Event.Application.Auth;
using YD_Event.Application.Role.Dtos;
using YD_Event.Core.Options;
using YD_Event.Core.Shared;
using Microsoft.Extensions.Options;
namespace YD_Event.Application.Role;
///
/// 角色管理
///
public class SysRoleService : BaseService, ITransient
{
private readonly ISqlSugarRepository _sysRoleRepository;
private readonly ISqlSugarRepository _sysRoleMenuRepository;
private readonly ISqlSugarRepository _sysUserRoleRepository;
private readonly IEasyCachingProvider _easyCachingProvider;
private readonly IIdGenerator _idGenerator;
private readonly AuthManager _authManager;
private readonly IOptionsMonitor _roleOptionsMonitor;
public SysRoleService(ISqlSugarRepository sysRoleRepository,
ISqlSugarRepository sysRoleMenuRepository,
ISqlSugarRepository sysUserRoleRepository,
IEasyCachingProvider easyCachingProvider,
IIdGenerator idGenerator,
AuthManager authManager,
IOptionsMonitor roleOptionsMonitor) : base(sysRoleRepository)
{
_sysRoleRepository = sysRoleRepository;
_sysRoleMenuRepository = sysRoleMenuRepository;
_sysUserRoleRepository = sysUserRoleRepository;
_easyCachingProvider = easyCachingProvider;
_idGenerator = idGenerator;
_authManager = authManager;
_roleOptionsMonitor = roleOptionsMonitor;
}
///
/// 角色分页查询
///
///
///
[DisplayName("角色分页查询")]
[HttpGet("page")]
public async Task> Page([FromQuery] SysRoleQueryInput dto)
{
var isAdmin = await IsCurrentUserAdminAsync();
var query = _sysRoleRepository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(dto.Name), x => x.Name.Contains(dto.Name));
if (!isAdmin)
{
// 非管理员用户,过滤掉管理员和单位用户角色
query = query.Where(x => x.Id != _roleOptionsMonitor.CurrentValue.AdminRoleId && x.Id != _roleOptionsMonitor.CurrentValue.UnitUserRoleId);
}
return await query
.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);
}
///
/// 检查当前登录用户是否是管理员
///
///
private async Task IsCurrentUserAdminAsync()
{
var userId = _authManager.UserId;
// 首先检查是否是超级管理员(用户ID为1000)
if (_authManager.IsSuperAdmin)
{
return true;
}
// 检查用户是否拥有管理员角色
return await _sysUserRoleRepository.IsAnyAsync(x => x.UserId == userId && x.RoleId == _roleOptionsMonitor.CurrentValue.AdminRoleId);
}
///
/// 添加角色
///
///
///
[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.SoftDeleteAsync(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.SoftDeleteAsync(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.SoftDeleteAsync(x => x.RoleId == dto.Id);
await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey);
}
///
/// 角色下拉选项
///
///
[DisplayName("角色下拉选项")]
[HttpGet("select")]
public async Task> RoleSelect()
{
var isAdmin = await IsCurrentUserAdminAsync();
var query = _sysRoleRepository.AsQueryable().Where(x => x.Status == AvailabilityStatus.Enable);
if (!isAdmin)
{
// 非管理员用户,过滤掉管理员和单位用户角色
query = query.Where(x => x.Id != _roleOptionsMonitor.CurrentValue.AdminRoleId && x.Id != _roleOptionsMonitor.CurrentValue.UnitUserRoleId);
}
return await query
.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();
}
}