You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

210 lines
7.5 KiB

7 months ago
using Common.Const;
using Common.Enum;
using Entity.Base;
using Entity.DbModel.System.SysBaseObject;
using Entity.Dto.Req;
using Entity.Dto.Resp;
using HybirdFrameworkCore.Autofac.Attribute;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Repository.System;
using Service.Mgr;
using SqlSugar;
namespace Service.System.Roles
{
/// <summary>
/// 角色
/// </summary>
[Scope("SingleInstance")]
public class SysRoleService : BaseServices<SysRole>
{
private readonly SysMenuRepository _sysMenuRep;
private readonly SysRoleRepository _sysRoleRep;
private readonly SysRoleMenuMgr _sysRoleMenuMgr;
private readonly SysUserRoleMgr _sysUserRoleMgr;
public SysRoleService(
SysMenuRepository sysMenuRepository,
SysRoleRepository sysRoleRepository,
SysRoleMenuMgr sysRoleMenuService,
SysUserRoleMgr sysUserRoleService)
{
_sysMenuRep = sysMenuRepository;
_sysRoleRep = sysRoleRepository;
_sysRoleMenuMgr = sysRoleMenuService;
_sysUserRoleMgr = sysUserRoleService;
}
/// <summary>
/// 获取角色分页列表 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<SqlSugarPagedList<SysRole>> Page(PageRoleReq input)
{
RefAsync<int> total = 0;
var items = await _sysRoleRep.QueryPageAsync(
!string.IsNullOrEmpty(input.Name), u => u.Name.Contains(input.Name),
!string.IsNullOrEmpty(input.Code), u => u.Code.Contains(input.Code),
u => u.OrderNo, input.Page, input.PageSize, total
);
return SqlSugarPagedExtensions.CreateSqlSugarPagedList(items, total, input.Page, input.PageSize);
}
/// <summary>
/// 获取角色列表 🔖
/// </summary>
/// <returns></returns>
public async Task<List<RoleResp>> GetList()
{
// 当前用户已拥有的角色集合
var roleIdList = UserManager.SuperAdmin ? new List<long>() : await _sysUserRoleMgr.GetUserRoleIdList(UserManager.UserId);
return await _sysRoleRep.QueryListByClauseAsync<RoleResp>(
!UserManager.SuperAdmin && !UserManager.SysAdmin,
u => u.CreateUserId == UserManager.UserId || roleIdList.Contains(u.Id),
u => u.OrderNo);
}
/// <summary>
/// 增加角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<string> AddRole(AddRoleReq input)
{
string result = "";
if (await _sysRoleRep.QueryByClauseAsync(u => u.Name == input.Name && u.Code == input.Code) != null)
return result = "数据已存在";
await _sysRoleRep.InsertAsync(input.Adapt<SysRole>());
SysRole newRole = await _sysRoleRep.QueryByClauseAsync(u => u.Name == input.Name);
//var newRole = await _sysRoleRep.InsertReturnEntityAsync(input.Adapt<SysRole>());
input.Id = newRole.Id;
await UpdateRoleMenu(input);
SysRole sysRole = await _sysRoleRep.QueryByClauseAsync(u => u.Name == input.Name && u.Code == input.Code);
if (sysRole != null)
return result = "增加角色成功";
return result = "增加角色失败";
}
/// <summary>
/// 更新角色菜单权限
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task UpdateRoleMenu(AddRoleReq input)
{
if (input.MenuIdList == null || input.MenuIdList.Count < 1)
return;
// 将父节点为0的菜单排除防止前端全选异常
var pMenuIds = await _sysMenuRep.QueryListByClauseAsync(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0, u => u.Id);
var menuIds = input.MenuIdList.Except(pMenuIds); // 差集
await GrantMenu(new RoleMenuReq()
{
Id = input.Id,
MenuIdList = menuIds.ToList()
});
}
/// <summary>
/// 更新角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<string> UpdateRole(AddRoleReq input)
{
string result = "";
if ((await _sysRoleRep.QueryByClauseAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) != null)
return result = "数据已存在";
bool uodateResult = await _sysRoleRep.UpdateAsync(input.Adapt<SysRole>());
if (!uodateResult)
return result = "数据更新失败";
await _sysRoleRep.UpdateAsync(input.Adapt<SysRole>(), true, u => new { u.DataScope });
await UpdateRoleMenu(input);
return result = "数据更新成功";
}
/// <summary>
/// 删除角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<string> DeleteRole(DeleteRoleReq input)
{
string result = "";
// 禁止删除系统管理员角色
var sysRole = await _sysRoleRep.QueryByClauseAsync(u => u.Id == input.Id);
if (sysRole == null)
return result = "记录不存在";
if (sysRole != null)
{
if (sysRole.Code == CommonConst.SysAdminRole)
return result = "禁止删除系统管理员角色";
}
// 若角色有用户则禁止删除
var userIds = await _sysUserRoleMgr.GetUserIdList(input.Id);
if (userIds != null && userIds.Count > 0)
return result = "此角色下面存在账号禁止删除";
await _sysRoleRep.DeleteAsync(sysRole);
await _sysRoleRep.DeleteAsync(sysRole);
// 级联删除用户角色数据
await _sysUserRoleMgr.DeleteUserRoleByRoleId(sysRole.Id);
// 级联删除角色菜单数据
await _sysRoleMenuMgr.DeleteRoleMenuByRoleId(sysRole.Id);
return result = "删除角色成功";
}
/// <summary>
/// 授权角色菜单 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task GrantMenu(RoleMenuReq input)
{
await _sysRoleMenuMgr.GrantRoleMenu(input);
}
/// <summary>
/// 根据角色Id获取菜单Id集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<List<long>> GetOwnMenuList([FromQuery] RoleReq input)
{
return await _sysRoleMenuMgr.GetRoleMenuIdList(new List<long> { input.Id });
}
/// <summary>
/// 设置角色状态 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<string> SetStatus(RoleReq input)
{
string result = "";
if (!Enum.IsDefined(typeof(StatusEnum), input.Status))
result = "字典状态错误";
int updateResult = await _sysRoleRep.UpdateAsync(
u => u.Status == input.Status,
u => u.Id == input.Id);
if (updateResult != 0)
result = "设置角色状态成功";
return result;
}
}
}