// using Microsoft.Extensions.Logging; using NewLife.Serialization; namespace SafeCampus.Application; /// public class RoleService : IRoleService { private readonly ILogger _logger; private readonly ISysUserService _sysUserService; private readonly ISysRoleService _sysRoleService; private readonly IResourceService _resourceService; private readonly IRelationService _relationService; public RoleService(ILogger logger, ISysUserService sysUserService, ISysRoleService sysRoleService, IResourceService resourceService, IRelationService relationService) { _logger = logger; _sysUserService = sysUserService; _sysRoleService = sysRoleService; _resourceService = resourceService; _relationService = relationService; } #region 查询 /// public async Task OwnResource(BaseIdInput input, string category) { return await _sysRoleService.OwnResource(input, category); } /// public async Task> OwnUser(BaseIdInput input) { return await _sysRoleService.OwnUser(input); } /// public async Task> Page(RolePageInput input) { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); input.OrgIds = dataScope; input.Category = CateGoryConst.ROLE_ORG;//只查询机构角色 //分页查询 var pageInfo = await _sysRoleService.Page(input); return pageInfo; } /// public async Task> RoleSelector(RoleSelectorInput input) { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); input.OrgIds = dataScope; return await _sysRoleService.RoleSelector(input); } /// public async Task> Tree(RoleTreeInput input) { var dataScope = await _sysUserService.GetLoginUserApiDataScope(); input.OrgIds = dataScope; return await _sysRoleService.Tree(input); } /// public async Task Detail(BaseIdInput input) { var role = await _sysRoleService.Detail(input); var errorMessage = "您没有权限查看该角色"; await _sysUserService.CheckApiDataScope(role.OrgId, role.CreateUserId, errorMessage); return role; } /// public async Task> ResourceTreeSelector() { var resourceTreeSelectors = new List();//定义结果 var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户 //获取角色资源关系 var relations = await _relationService.GetRelationListByObjectIdListAndCategory(user.RoleIdList, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); var menuIds = new HashSet();//菜单ID集合 var buttonIds = new HashSet();//按钮ID集合 relations.ForEach(it => { var resources = it.ExtJson.ToJsonEntity();//转换为对象获取资源 menuIds.Add(resources.MenuId);//添加菜单ID resources.ButtonInfo.ForEach(b => buttonIds.Add(b));//添加按钮ID }); var menuList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU);//获取所有菜单 var buttonList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_BUTTON);//获取所有按钮 var moduleList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE);//获取所有模块 var ownMenuList = menuList.Where(it => menuIds.Contains(it.Id)).ToList();//已拥有的菜单 var parentMenuList = menuList.Where(it => ownMenuList.Select(m => m.ParentId).Contains(it.Id)).ToList();//获取所有父级菜单 ownMenuList.AddRange(parentMenuList);//将父级菜单加入到拥有菜单列表 var ownButtonList = buttonList.Where(it => buttonIds.Contains(it.Id)).ToList();//已拥有的按钮 var moduleIds = ownMenuList.Select(it => it.Module.GetValueOrDefault()).Distinct().ToList();//模块ID集合 var ownModuleList = moduleList.Where(it => moduleIds.Contains(it.Id)).ToList();//已拥有的模块 //遍历模块 foreach (var module in ownModuleList) { //将实体转换为ResourceTreeSelectorOutPut获取基本信息 var resourceTreeSelector = module.Adapt(); resourceTreeSelector.Menu = await GetRoleGrantResourceMenus(module.Id, ownMenuList, ownButtonList);//获取授权菜单 resourceTreeSelectors.Add(resourceTreeSelector); } return resourceTreeSelectors; } #endregion #region 增加 /// public async Task Add(RoleAddInput input) { await CheckInput(input);//检查参数 await _sysRoleService.Add(input); } #endregion #region 编辑 /// public async Task Edit(RoleEditInput input) { await CheckInput(input);//检查参数 await _sysRoleService.Edit(input); } /// public async Task GrantResource(GrantResourceInput input) { await _sysRoleService.GrantResource(input); } /// public async Task GrantUser(GrantUserInput input) { await _sysRoleService.GrantUser(input); } #endregion #region 删除 /// public async Task Delete(BaseIdListInput input) { //获取所有ID var ids = input.Ids; //获取要删除的机构列表 var roleList = (await _sysRoleService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); if (roleList.Any(it => it.Category == CateGoryConst.ROLE_GLOBAL))//如果有全局角色 throw Oops.Bah("不能删除全局角色"); //检查数据范围 var orgIds = roleList.Select(it => it.OrgId.GetValueOrDefault()).ToList(); var createUserIds = roleList.Select(it => it.CreateUserId.GetValueOrDefault()).ToList(); await _sysUserService.CheckApiDataScope(orgIds, createUserIds, "您没有权限删除这些角色"); await _sysRoleService.Delete(input); } #endregion #region 方法 /// /// 检查输入参数 /// /// private async Task CheckInput(SysRole sysRole) { sysRole.Category = CateGoryConst.ROLE_ORG; if (sysRole.DefaultDataScope.ScopeCategory == CateGoryConst.SCOPE_ALL) throw Oops.Bah("不能添加全局数据范围的角色"); await _sysUserService.CheckApiDataScope(sysRole.OrgId, sysRole.CreateUserId.GetValueOrDefault(), "您没有权限添加该角色"); } /// /// 获取授权菜单 /// /// 模块Id /// 拥有菜单列表 /// 拥有权限按钮列表 /// public async Task> GetRoleGrantResourceMenus(long moduleId, List ownMenuList, List ownButtonList) { var roleGrantResourceMenus = new List();//定义结果 var parentMenuList = ownMenuList.Where(it => it.ParentId == SafeCampusConst.ZERO).ToList();//获取一级目录 //遍历一级目录 foreach (var parent in parentMenuList) { //如果是目录则去遍历下级 if (parent.MenuType == SysResourceConst.CATALOG) { //获取所有下级菜单 var menuList = _resourceService.GetChildListById(ownMenuList, parent.Id, false); if (menuList.Count > 0)//如果有菜单 { //遍历下级菜单 foreach (var menu in menuList) { //如果菜单类型是菜单 if (menu.MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET) { //获取菜单下按钮集合并转换成对应实体 var buttonList = ownButtonList.Where(it => it.ParentId == menu.Id).ToList(); var buttons = buttonList.Adapt>(); roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu { Id = menu.Id, ParentId = parent.Id, ParentName = parent.Title, Module = moduleId, Title = _resourceService.GetRoleGrantResourceMenuTitle(menuList, menu),//菜单名称需要特殊处理因为有二级菜单 Button = buttons }); } else if (menu.MenuType == SysResourceConst.LINK || menu.MenuType == SysResourceConst.IFRAME)//如果是内链或者外链 { //直接加到资源列表 roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu { Id = menu.Id, ParentId = parent.Id, ParentName = parent.Title, Module = moduleId, Title = menu.Title }); } } } else { //否则就将自己加到一级目录里面 roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu { Id = parent.Id, ParentId = parent.Id, ParentName = parent.Title, Module = moduleId }); } } else { //就将自己加到一级目录里面 var roleGrantResourcesButtons = new ResTreeSelector.RoleGrantResourceMenu { Id = parent.Id, ParentId = parent.Id, ParentName = parent.Title, Module = moduleId, Title = parent.Title }; //如果菜单类型是菜单 if (parent.MenuType == SysResourceConst.MENU) { //获取菜单下按钮集合并转换成对应实体 var buttonList = ownButtonList.Where(it => it.ParentId == parent.Id).ToList(); roleGrantResourcesButtons.Button = buttonList.Adapt>(); } roleGrantResourceMenus.Add(roleGrantResourcesButtons); } } return roleGrantResourceMenus; } #endregion }