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.

218 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Common.Const;
using Common.Enum;
using Entity.Base;
using Entity.DbModel.System;
using Entity.Dto.Req;
using Entity.Dto.Resp;
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkCore.Entity;
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<PageResult<SysRole>> Page(PageRoleReq input)
{
RefAsync<int> total = 0;
var items = await _sysRoleRep.QueryPageAsync(
entity => true, false, entity => true,
!string.IsNullOrEmpty(input.Name), u => u.Name.Contains(input.Name),
!string.IsNullOrEmpty(input.Code), u => u.Code.Contains(input.Code),
u => u.OrderNo, input.PageNum, input.PageSize, total
);
return new PageResult<SysRole>()
{
PageNum = input.PageNum,
PageSize = input.PageSize,
ToTal = total,
Rows = items,
};
}
/// <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;
}
}
}