using JNPF.Common.Const; using JNPF.Common.Core.Handlers; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Manager; using JNPF.Common.Models.User; using JNPF.Common.Security; using JNPF.DatabaseAccessor; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Systems.Entitys.Dto.Authorize; using JNPF.Systems.Entitys.Model.Authorize; using JNPF.Systems.Entitys.Model.Menu; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.Permission; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace JNPF.Systems; /// /// 业务实现:操作权限. /// [ApiDescriptionSettings(Tag = "Permission", Name = "Authority", Order = 170)] [Route("api/permission/[controller]")] public class AuthorizeService : IAuthorizeService, IDynamicApiController, ITransient { /// /// 权限操作表仓储. /// private readonly ISqlSugarRepository _authorizeRepository; /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// 缓存管理器. /// private readonly ICacheManager _cacheManager; /// /// IM中心处理程序. /// private IMHandler _imHandler; /// /// 初始化一个类型的新实例. /// public AuthorizeService( ISqlSugarRepository authorizeRepository, ICacheManager cacheManager, IUserManager userManager, IMHandler imHandler) { _authorizeRepository = authorizeRepository; _cacheManager = cacheManager; _userManager = userManager; _imHandler = imHandler; } #region Get /// /// 获取功能权限数据. /// /// 模块ID. /// 对象类型. /// [HttpGet("Model/{itemId}/{objectType}")] public async Task GetModelList(string itemId, string objectType) { IEnumerable ids = await _authorizeRepository.AsQueryable().Where(a => a.ItemId == itemId && a.ObjectType == objectType).Select(s => s.ObjectId).ToListAsync(); return new { ids }; } /// /// 获取模块列表展示字段权限. /// /// 模块主键. /// [HttpGet("GetColumnsByModuleId/{moduleId}")] public async Task GetColumnsByModuleId(string moduleId) { string? data = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ModuleId == moduleId).Select(x => x.FieldList).FirstAsync(); if (!string.IsNullOrEmpty(data)) return data.ToObject>(); else return new List(); } #endregion #region Post /// /// 权限数据. /// /// 对象主键. /// 参数. /// [HttpPost("Data/{objectId}/Values")] public async Task GetDataValues(string objectId, [FromBody] AuthorizeDataQuery input) { AuthorizeDataOutput? output = new AuthorizeDataOutput(); AuthorizeModel? authorizeData = new AuthorizeModel(); string? userId = _userManager.UserId; bool isAdmin = _userManager.IsAdministrator; UserInfoModel? user = await _userManager.GetUserInfo(); List? menuList = await GetCurrentUserModuleAuthorize(userId, isAdmin, user.roleIds, input.moduleIds.Split(",").ToArray()); var systemIds = input.moduleIds.Split(",").ToList(); var systemList = await _authorizeRepository.AsSugarClient().Queryable() .Where(x => x.DeleteMark == null && x.EnabledMark.Equals(1) && systemIds.Contains(x.Id)) .Select(x => new ModuleEntity() { Id = x.Id, ParentId = "-1", FullName = x.FullName, Icon = x.Icon, SystemId = "-1", SortCode = x.SortCode, }).ToListAsync(); systemList.ForEach(item => { if (menuList.Any(it => it.Category.Equals("App") && it.SystemId.Equals(item.Id))) { var rId = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); menuList.Where(it => it.Category.Equals("App") && it.ParentId.Equals("-1") && it.SystemId.Equals(item.Id)).ToList().ForEach(it => { it.ParentId = rId; }); menuList.Add(new ModuleEntity() { Id = rId, FullName = "app菜单", Icon = "ym-custom ym-custom-cellphone", ParentId = item.Id, Category = "App", EnCode = "app菜单", Type = 1, SystemId = item.Id, SortCode = 99999 }); } menuList.Where(it => it.Category.Equals("Web") && it.SystemId.Equals(item.Id) && it.ParentId.Equals("-1")).ToList().ForEach(it => { it.ParentId = item.Id; }); }); menuList.AddRange(systemList); List? moduleButtonList = await GetCurrentUserButtonAuthorize(userId, isAdmin, user.roleIds); List? moduleColumnList = await GetCurrentUserColumnAuthorize(userId, isAdmin, user.roleIds); List? moduleFormList = await GetCurrentUserFormAuthorize(userId, isAdmin, user.roleIds); List? moduleDataSchemeList = await GetCurrentUserResourceAuthorize(userId, isAdmin, user.roleIds); authorizeData.FunctionList = menuList.Adapt>(); authorizeData.ButtonList = moduleButtonList.Adapt>(); authorizeData.ColumnList = moduleColumnList.Adapt>(); authorizeData.FormList = moduleFormList.Adapt>(); authorizeData.ResourceList = moduleDataSchemeList.Adapt>(); #region 已勾选的权限id List? authorizeList = await this.GetAuthorizeListByObjectId(objectId); List? checkSystemList = authorizeList.Where(o => o.ItemType.Equals("system")).Select(m => m.ItemId).ToList(); List? checkModuleList = authorizeList.Where(o => o.ItemType.Equals("module")).Select(m => m.ItemId).ToList(); List? checkButtonList = authorizeList.Where(o => o.ItemType.Equals("button")).Select(m => m.ItemId).ToList(); List? checkColumnList = authorizeList.Where(o => o.ItemType.Equals("column")).Select(m => m.ItemId).ToList(); List? checkFormList = authorizeList.Where(o => o.ItemType.Equals("form")).Select(m => m.ItemId).ToList(); List? checkResourceList = authorizeList.Where(o => o.ItemType.Equals("resource")).Select(m => m.ItemId).ToList(); #endregion List? moduleList = new List(); List? childNodesIds = new List(); switch (input.type) { case "system": systemIds = await _authorizeRepository.AsQueryable().Where(o => o.ItemType.Equals("system") && user.roleIds.Contains(o.ObjectId)).Select(o => o.ItemId).ToListAsync(); output.list = await _authorizeRepository.AsSugarClient().Queryable() .Where(x => x.DeleteMark == null && x.EnabledMark.Equals(1)) .WhereIF(!user.isAdministrator, x => systemIds.Contains(x.Id)) .Select(x => new AuthorizeDataModelOutput() { id = x.Id, fullName = x.FullName, icon = x.Icon, sortCode = x.SortCode }).ToListAsync(); output.all = output.list.Select(x => x.id).ToList(); output.ids = checkSystemList; return output; case "module": List? authorizeDataModuleList = authorizeData.FunctionList.Adapt>(); GetOutPutResult(ref output, authorizeDataModuleList, checkModuleList); return GetResult(output); case "button": if (string.IsNullOrEmpty(input.moduleIds)) { return output; } else { List? moduleIdList = new List(input.moduleIds.Split(",")); moduleIdList.ForEach(ids => { ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids); if (moduleEntity != null) moduleList.Add(moduleEntity); }); // 勾选的菜单末级节点菜单id集合 childNodesIds = GetChildNodesId(moduleList); } moduleList = await GetModuleAndSystemScheme(moduleList, menuList); output = GetButton(moduleList, moduleButtonList, childNodesIds, checkButtonList); return GetResult(output); case "column": if (string.IsNullOrEmpty(input.moduleIds)) { return output; } else { List? moduleIdList = new List(input.moduleIds.Split(",")); moduleIdList.ForEach(ids => { ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids); if (moduleEntity != null) moduleList.Add(moduleEntity); }); // 子节点菜单id集合 childNodesIds = GetChildNodesId(moduleList); } moduleList = await GetModuleAndSystemScheme(moduleList, menuList); output = GetColumn(moduleList, moduleColumnList, childNodesIds, checkColumnList); return GetResult(output); case "form": if (string.IsNullOrEmpty(input.moduleIds)) { return output; } else { List? moduleIdList = new List(input.moduleIds.Split(",")); moduleIdList.ForEach(ids => { ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids); if (moduleEntity != null) moduleList.Add(moduleEntity); }); // 子节点菜单id集合 childNodesIds = GetChildNodesId(moduleList); } moduleList = await GetModuleAndSystemScheme(moduleList, menuList); output = GetForm(moduleList, moduleFormList, childNodesIds, checkFormList); return GetResult(output); case "resource": if (string.IsNullOrEmpty(input.moduleIds)) { return output; } else { List? moduleIdList = new List(input.moduleIds.Split(",")); moduleIdList.ForEach(ids => { ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids); if (moduleEntity != null) moduleList.Add(moduleEntity); }); // 子节点菜单id集合 childNodesIds = GetChildNodesId(moduleList); } moduleList = await GetModuleAndSystemScheme(moduleList, menuList); output = GetResource(moduleList, moduleDataSchemeList, childNodesIds, checkResourceList); return GetResult(output); default: return output; } } /// /// 设置或更新岗位/角色/用户权限. /// /// 参数. /// 参数. /// [HttpPut("Data/{objectId}")] public async Task UpdateData(string objectId, [FromBody] AuthorizeDataUpInput input) { #region 分级权限验证 if (input.objectType.Equals("Role") && !_userManager.IsAdministrator) { RoleEntity? oldRole = await _authorizeRepository.AsSugarClient().Queryable().FirstAsync(x => x.Id.Equals(objectId)); if (oldRole.GlobalMark == 1) throw Oops.Oh(ErrorCode.D1612); // 全局角色 只能超管才能变更 } if (input.objectType.Equals("Position") || input.objectType.Equals("Role")) { var orgIds = new List(); if (input.objectType.Equals("Position")) orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.Id.Equals(objectId)).Select(x => x.OrganizeId).ToListAsync(); if (input.objectType.Equals("Role")) orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ObjectId.Equals(objectId) && x.ObjectType == input.objectType).Select(x => x.OrganizeId).ToListAsync(); if (!_userManager.DataScope.Any(it => orgIds.Contains(it.organizeId) && it.Edit) && !_userManager.IsAdministrator) throw Oops.Oh(ErrorCode.D1013); // 分级管控 } #endregion input.button = input.button.Except(input.module).ToList(); input.column = input.column.Except(input.module).ToList(); input.form = input.form.Except(input.module).ToList(); input.resource = input.resource.Except(input.module).ToList(); List? authorizeList = new List(); AddAuthorizeEntity(ref authorizeList, input.systemIds, objectId, input.objectType, "system"); AddAuthorizeEntity(ref authorizeList, input.module, objectId, input.objectType, "module"); AddAuthorizeEntity(ref authorizeList, input.button, objectId, input.objectType, "button"); AddAuthorizeEntity(ref authorizeList, input.column, objectId, input.objectType, "column"); AddAuthorizeEntity(ref authorizeList, input.form, objectId, input.objectType, "form"); AddAuthorizeEntity(ref authorizeList, input.resource, objectId, input.objectType, "resource"); // 删除除了门户外的相关权限 await _authorizeRepository.DeleteAsync(a => a.ObjectId == objectId && !a.ItemType.Equals("portal")); if (authorizeList.Count > 0) { // 新增权限 await _authorizeRepository.AsSugarClient().Insertable(authorizeList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } // 编辑角色权限退出角色的登录用户 if (input.objectType.Equals("Role")) await ForcedOffline(new List() { objectId }); } /// /// 批量设置权限. /// /// 参数. /// [HttpPost("Data/Batch")] public async Task BatchData([FromBody] AuthorizeDataBatchInput input) { #region 分级权限验证 // 获取所有角色 var allRole = await _authorizeRepository.AsSugarClient().Queryable().Where(x => input.roleIds.Contains(x.Id)).ToListAsync(); if (allRole.Any(x => x.GlobalMark.Equals(1)) && !_userManager.IsAdministrator) throw Oops.Oh(ErrorCode.D1612); // 全局角色 只能超管才能变更 // 获取组织角色 所属组织 var orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => allRole.Select(x => x.Id).Contains(x.ObjectId) && x.ObjectType.Equals("Role")).Select(x => x.OrganizeId).ToListAsync(); if (!_userManager.DataScope.Any(it => orgIds.Contains(it.organizeId) && it.Edit) && !_userManager.IsAdministrator) throw Oops.Oh(ErrorCode.D1013); // 分级管控 #endregion // 计算按钮、列表、资源三个集合内不包含菜单ID的差 input.button = input.button.Except(input.module).ToList(); input.column = input.column.Except(input.module).ToList(); input.form = input.form.Except(input.module).ToList(); input.resource = input.resource.Except(input.module).ToList(); // 拼装权限集合 List? authorizeItemList = new List(); List? authorizeObejctList = new List(); BatchAddAuthorizeEntity(ref authorizeItemList, input.systemIds, "system", true); BatchAddAuthorizeEntity(ref authorizeItemList, input.module, "module", true); BatchAddAuthorizeEntity(ref authorizeItemList, input.button, "button", true); BatchAddAuthorizeEntity(ref authorizeItemList, input.column, "column", true); BatchAddAuthorizeEntity(ref authorizeItemList, input.form, "form", true); BatchAddAuthorizeEntity(ref authorizeItemList, input.resource, "resource", true); BatchAddAuthorizeEntity(ref authorizeObejctList, input.positionIds, "Position", false); BatchAddAuthorizeEntity(ref authorizeObejctList, input.roleIds, "Role", false); BatchAddAuthorizeEntity(ref authorizeObejctList, input.userIds, "User", false); List? data = new List(); SeveBatch(ref data, authorizeObejctList, authorizeItemList); // 获取已有权限集合 List? existingRoleData = await _authorizeRepository.AsQueryable().Where(x => input.roleIds.Contains(x.ObjectId) && x.ObjectType.Equals("Role")).ToListAsync(); // 计算新增菜单集合与已有权限集合差 data = data.Except(existingRoleData).ToList(); // 数据不为空添加 if (data.Count > 0) { // 新增权限 int num = await _authorizeRepository.AsSugarClient().Insertable(data).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } // 编辑角色权限退出角色的登录用户 await ForcedOffline(input.roleIds); } /// /// 设置/更新功能权限. /// /// /// /// [HttpPut("Model/{itemId}")] public async Task UpdateModel(string itemId, [FromBody] AuthorizeModelInput input) { List? authorizeList = new List(); try { _authorizeRepository.AsSugarClient().Ado.BeginTran(); // 角色ID不为空 if (input.objectId.Count > 0) { input.objectId.ForEach(item => { AuthorizeEntity? entity = new AuthorizeEntity(); entity.Id = SnowflakeIdHelper.NextId(); entity.CreatorTime = DateTime.Now; entity.CreatorUserId = _userManager.UserId; entity.ItemId = itemId; entity.ItemType = input.itemType; entity.ObjectId = item; entity.ObjectType = input.objectType; entity.SortCode = input.objectId.IndexOf(item); authorizeList.Add(entity); }); // 删除除了门户外的相关权限 await _authorizeRepository.DeleteAsync(a => a.ItemId == itemId); // 新增权限 await _authorizeRepository.AsSugarClient().Insertable(authorizeList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } else { // 删除除了门户外的相关权限 await _authorizeRepository.DeleteAsync(a => a.ItemId == itemId); } _authorizeRepository.AsSugarClient().Ado.CommitTran(); } catch { _authorizeRepository.AsSugarClient().Ado.RollbackTran(); } if(input.objectId.Any()) await ForcedOffline(input.objectId); // 编辑角色权限退出角色的登录用户 } /// /// 设置模块列表展示字段权限. /// /// 参数. /// [HttpPut("SetColumnsByModuleId")] public async Task SetColumnsByModuleId([FromBody] ColumnsPurviewDataUpInput input) { ColumnsPurviewEntity? entity = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ModuleId == input.moduleId).FirstAsync(); if (entity == null) entity = new ColumnsPurviewEntity(); entity.FieldList = input.fieldList; entity.ModuleId = input.moduleId; if (entity.Id.IsNotEmptyOrNull()) { // 更新 int newEntity = await _authorizeRepository.AsSugarClient().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); } else { entity.Id = SnowflakeIdHelper.NextId(); entity.CreatorTime = DateTime.Now; entity.CreatorUserId = _userManager.UserId; await _authorizeRepository.AsSugarClient().Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } } #endregion #region PrivateMethod /// /// 添加权限接口参数组装. /// /// 返回参数. /// 权限数据id. /// 对象ID. /// 分类. /// 权限分类. private void AddAuthorizeEntity(ref List list, List itemIds, string objectId, string objectType, string itemType) { foreach (string? item in itemIds) { AuthorizeEntity? entity = new AuthorizeEntity(); entity.Id = SnowflakeIdHelper.NextId(); entity.CreatorTime = DateTime.Now; entity.CreatorUserId = _userManager.UserId; entity.ItemId = item; entity.ObjectId = objectId; entity.ItemType = itemType; entity.ObjectType = objectType; entity.SortCode = itemIds.IndexOf(item); list.Add(entity); } } /// /// 批量添加权限接口参数组装. /// /// 返回参数. /// 来源数据. /// 来源类型. /// 是否是权限数据. private void BatchAddAuthorizeEntity(ref List list, List ids, string type, bool isData) { if (ids != null && ids.Count != 0) { if (isData) { foreach (string? item in ids) { AuthorizeEntity? entity = new AuthorizeEntity(); entity.ItemId = item; entity.ItemType = type; list.Add(entity); } } else { foreach (string? item in ids) { AuthorizeEntity? entity = new AuthorizeEntity(); entity.ObjectId = item; entity.ObjectType = type; list.Add(entity); } } } } /// /// 保存批量权限. /// /// 返回list. /// 对象数据. /// 权限数据. private void SeveBatch(ref List list, List objectList, List authorizeList) { foreach (AuthorizeEntity? objectItem in objectList) { foreach (AuthorizeEntity entityItem in authorizeList) { AuthorizeEntity? entity = new AuthorizeEntity(); entity.Id = SnowflakeIdHelper.NextId(); entity.CreatorTime = DateTime.Now; entity.CreatorUserId = _userManager.UserId; entity.ItemId = entityItem.ItemId; entity.ItemType = entityItem.ItemType; entity.ObjectId = objectItem.ObjectId; entity.ObjectType = objectItem.ObjectType; entity.SortCode = authorizeList.IndexOf(entityItem); list.Add(entity); } } } /// /// 返回参数处理. /// /// 返回参数. /// 返回参数数据. /// 已勾选的id. /// private void GetOutPutResult(ref AuthorizeDataOutput output, List list, List checkList, string parentId = "-1") { output.all = list.Select(l => l.id).ToList(); output.ids = checkList.Intersect(output.all).ToList(); output.list = list.OrderBy(x => x.sortCode).ToList().ToTree(parentId); } /// /// 获取子节点菜单id. /// /// /// private List GetChildNodesId(List moduleEntitiesList) { List? ids = moduleEntitiesList.Select(m => m.Id).ToList(); List? pids = moduleEntitiesList.Select(m => m.ParentId).ToList(); List? childNodesIds = ids.Where(x => !pids.Contains(x) && moduleEntitiesList.Find(m => m.Id == x).ParentId != "-1").ToList(); return childNodesIds.Union(ids).ToList(); } /// /// 过滤菜单权限数据. /// /// 其他权限数据菜单id集合. /// 勾选菜单权限数据. /// 返回值. private void GetParentsModuleList(List childNodesIds, List moduleList, ref List output) { // 获取有其他权限的菜单末级节点id List? authorizeModuleData = moduleList.Adapt>(); foreach (string? item in childNodesIds) { GteModuleListById(item, authorizeModuleData, output); } output = output.Distinct().ToList(); } /// /// 根据菜单id递归获取authorizeDataOutputModel的父级菜单. /// /// 菜单id. /// 选中菜单集合. /// 返回数据. private void GteModuleListById(string id, List authorizeDataOutputModel, List output) { AuthorizeDataModelOutput? data = authorizeDataOutputModel.Find(l => l.id == id); if (data != null) { if (data.parentId != "-1") { if (!output.Contains(data)) output.Add(data); GteModuleListById(data.parentId, authorizeDataOutputModel, output); } else { if (!output.Contains(data)) output.Add(data); } } } /// /// 按钮权限. /// /// 选中的菜单. /// 所有的按钮. /// /// /// private AuthorizeDataOutput GetButton(List moduleList, List moduleButtonList, List childNodesIds, List checkList) { AuthorizeDataOutput? output = new AuthorizeDataOutput(); List? buttonList = new List(); childNodesIds.ForEach(ids => { List? buttonEntity = moduleButtonList.FindAll(m => m.ModuleId == ids); if (buttonEntity.Count != 0) { buttonEntity.ForEach(bt => { bt.Icon = string.Empty; if (bt.ParentId.Equals("-1")) { bt.ParentId = ids; } }); buttonList = buttonList.Union(buttonEntity).ToList(); } }); List? authorizeDataButtonList = buttonList.Adapt>(); List? authorizeDataModuleList = new List(); // 末级菜单id集合 List? moduleIds = buttonList.Select(b => b.ModuleId).ToList().Distinct().ToList(); GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList); List? list = authorizeDataModuleList.Union(authorizeDataButtonList).ToList(); GetOutPutResult(ref output, list, checkList); return output; } /// /// 列表权限. /// /// 选中的菜单. /// 所有的列表. /// /// /// private AuthorizeDataOutput GetColumn(List moduleList, List moduleColumnEntity, List childNodesIds, List checkList) { AuthorizeDataOutput? output = new AuthorizeDataOutput(); List? columnList = new List(); childNodesIds.ForEach(ids => { List? columnEntity = moduleColumnEntity.FindAll(m => m.ModuleId == ids); if (columnEntity.Count != 0) { columnEntity.ForEach(bt => { bt.ParentId = ids; }); columnList = columnList.Union(columnEntity).ToList(); } }); List? authorizeDataColumnList = columnList.Adapt>(); List? authorizeDataModuleList = new List(); List? moduleIds = columnList.Select(b => b.ModuleId).ToList().Distinct().ToList(); GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList); List? list = authorizeDataModuleList.Union(authorizeDataColumnList).ToList(); GetOutPutResult(ref output, list, checkList); return output; } /// /// 表单权限. /// /// private AuthorizeDataOutput GetForm(List moduleList, List moduleFormEntity, List childNodesIds, List checkList) { AuthorizeDataOutput? output = new AuthorizeDataOutput(); List? formList = new List(); childNodesIds.ForEach(ids => { List? formEntity = moduleFormEntity.FindAll(m => m.ModuleId == ids); if (formEntity.Count != 0) { formEntity.ForEach(bt => { bt.ParentId = ids; }); formList = formList.Union(formEntity).ToList(); } }); List? authorizeDataFormList = formList.Adapt>(); List? authorizeDataModuleList = new List(); List? moduleIds = formList.Select(b => b.ModuleId).ToList().Distinct().ToList(); GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList); List? list = authorizeDataModuleList.Union(authorizeDataFormList).ToList(); GetOutPutResult(ref output, list, checkList); return output; } /// /// 数据权限. /// /// /// /// /// /// private AuthorizeDataOutput GetResource(List moduleList, List moduleResourceEntity, List childNodesIds, List checkList) { List? moduleIds = new List(); AuthorizeDataOutput? output = new AuthorizeDataOutput(); List? authorizeDataResourceList = new List(); childNodesIds.ForEach(ids => { List? resourceEntity = moduleResourceEntity.FindAll(m => m.ModuleId == ids); if (resourceEntity.Count != 0) { moduleIds.Add(ids); List? entity = resourceEntity.Adapt>(); entity.ForEach(e => e.parentId = ids); authorizeDataResourceList = authorizeDataResourceList.Union(entity).ToList(); } }); List? authorizeDataModuleList = new List(); GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList); List? list = authorizeDataModuleList.Union(authorizeDataResourceList).ToList(); GetOutPutResult(ref output, list, checkList); return output; } /// /// 强制角色下的所有用户下线. /// /// 角色Id. /// private async Task ForcedOffline(List roleId) { // 查找该角色下的所有成员id var roleUserIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ObjectType == "Role" && roleId.Contains(x.ObjectId)).Select(x => x.UserId).ToListAsync(); roleUserIds.ForEach(async id => { var tenantId = _userManager.TenantId; var list = await GetOnlineUserList(tenantId); var user = list.Find(it => it.tenantId == tenantId && it.userId == id); if (user != null) { await _imHandler.SendMessageAsync(user.connectionId, new { method = "logout", msg = "此账号已在其他地方登陆" }.ToJsonString()); await DelOnlineUser(tenantId, user.userId); await DelUserInfo(tenantId, user.userId); } }); } #endregion #region PublicMethod /// /// 当前用户模块权限. /// /// 用户ID. /// 是否超管. /// 用户角色Ids. /// 当前系统Ids . /// [NonAction] public async Task> GetCurrentUserModuleAuthorize(string userId, bool isAdmin, string[] roleIds, string[] systemIds) { List? output = new List(); if (!isAdmin) { var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "module" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return output; output = await _authorizeRepository.AsSugarClient().Queryable() .Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null) .Where(a => systemIds.Contains(a.SystemId)).OrderBy(o => o.SortCode).ToListAsync(); } else { output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null) .Where(a => systemIds.Contains(a.SystemId)).OrderBy(o => o.SortCode).ToListAsync(); } return output; } /// /// 当前用户模块按钮权限. /// /// 用户ID. /// 是否超管. /// 用户角色Ids. /// [NonAction] public async Task> GetCurrentUserButtonAuthorize(string userId, bool isAdmin, string[] roleIds) { List? output = new List(); if (!isAdmin) { var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "button" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return output; output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ParentId.Equals("-1") ? a.ModuleId : a.ParentId; }).ToListAsync(); } else { output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ParentId.Equals("-1") ? a.ModuleId : a.ParentId; }).ToListAsync(); } return output; } /// /// 当前用户模块列权限. /// /// 用户ID. /// 是否超管. /// 用户角色Ids. /// [NonAction] public async Task> GetCurrentUserColumnAuthorize(string userId, bool isAdmin, string[] roleIds) { List? output = new List(); if (!isAdmin) { var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "column" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return output; output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ModuleId; }).ToListAsync(); } else { output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ModuleId; }).ToListAsync(); } return output; } /// /// 当前用户模块表单权限. /// /// 用户ID. /// 是否超管. /// 用户角色Ids. /// [NonAction] public async Task> GetCurrentUserFormAuthorize(string userId, bool isAdmin, string[] roleIds) { List? output = new List(); if (!isAdmin) { var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "form" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return output; output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ModuleId; }).ToListAsync(); } else { output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode) .Mapper(a => { a.ParentId = a.ModuleId; }).ToListAsync(); } return output; } /// /// 当前用户模块权限资源. /// /// 用户ID. /// 是否超管. /// 用户角色Ids. /// [NonAction] public async Task> GetCurrentUserResourceAuthorize(string userId, bool isAdmin, string[] roleIds) { List? output = new List(); if (!isAdmin) { var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "resource" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return output; output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync(); } else { output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync(); } return output; } /// /// 获取权限项ids. /// /// 角色id. /// 项类型. /// [NonAction] public async Task> GetAuthorizeItemIds(string roleId, string itemType) { var data = await _authorizeRepository.AsQueryable().Where(a => a.ObjectId == roleId && a.ItemType == itemType).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); return data.Select(it => it.ItemId).ToList(); } /// /// 是否存在权限资源. /// /// /// [NonAction] public async Task GetIsExistModuleDataAuthorizeScheme(string[] ids) { return await _authorizeRepository.AsSugarClient().Queryable().AnyAsync(m => ids.Contains(m.Id) && m.DeleteMark == null); } /// /// 获取权限列表. /// /// 对象主键. /// [NonAction] public async Task> GetAuthorizeListByObjectId(string objectId) { return await _authorizeRepository.AsQueryable().Where(a => a.ObjectId == objectId).ToListAsync(); } /// /// 处理菜单+系统. /// /// /// /// public async Task> GetModuleAndSystemScheme(List moduleList, List systemList) { var moduleSystemList = systemList.Where(x => x.SystemId != null && x.SystemId.Equals("-1")).ToList(); moduleSystemList.ForEach(item => { if (moduleList.Any(it => it.Category != null && it.Category.Equals("App") && it.SystemId.Equals(item.Id))) { var appMenu = systemList.FirstOrDefault(it => it.ParentId.Equals(item.Id) && it.Category.Equals("App")); moduleList.Where(it => it.Category != null && it.Category.Equals("App") && it.ParentId.Equals("-1") && it.SystemId.Equals(item.Id)).ToList().ForEach(it => { it.ParentId = appMenu.Id; }); moduleList.Add(appMenu); } moduleList.Where(it => it.Category != null && it.Category.Equals("Web") && it.SystemId.Equals(item.Id) && it.ParentId.Equals("-1")).ToList().ForEach(it => { it.ParentId = item.Id; }); }); moduleList.Where(x => x.ParentId.Equals("-1")).ToList().ForEach(item => item.ParentId = item.SystemId); moduleList.AddRange(moduleSystemList); return moduleList; } /// /// 处理app菜单 勾选问题,返回最终结果. /// /// /// public AuthorizeDataOutput GetResult(AuthorizeDataOutput output) { if (output.list.Any()) { output.list.ForEach(item => { var appItem = item.children?.Adapt>().FirstOrDefault(x => !output.ids.Contains(x.id) && x.fullName.Equals("app菜单")); if (appItem != null) { foreach (var it in output.ids) { if (appItem.ToJsonString().Contains(it)) { output.ids.Add(appItem.id); break; } } } }); } return output; } /// /// 获取在线用户列表. /// /// 租户ID. /// public async Task> GetOnlineUserList(string tenantId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); return await _cacheManager.GetAsync>(cacheKey); } /// /// 删除在线用户ID. /// /// 租户ID. /// 用户ID. /// private async Task DelOnlineUser(string tenantId, string userId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); var list = await _cacheManager.GetAsync>(cacheKey); var online = list.Find(it => it.userId == userId); list.RemoveAll((x) => x.connectionId == online.connectionId); return await _cacheManager.SetAsync(cacheKey, list); } /// /// 删除用户登录信息缓存. /// /// 租户ID. /// 用户ID. /// private async Task DelUserInfo(string tenantId, string userId) { var cacheKey = string.Format("{0}{1}_{2}", CommonConst.CACHEKEYUSER, tenantId, userId); return await _cacheManager.DelAsync(cacheKey); } #endregion }