using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.FriendlyException; using Microsoft.AspNetCore.Http; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using Ewide.Core.Service; using System; using System.Data; namespace Ewide.Core { /// /// 用户管理 /// public class UserManager : IUserManager, IScoped { private readonly IRepository _sysUserRep; // 用户表仓储 private readonly IRepository _sysRoleRep; private readonly IRepository _sysUserRoleRep; private readonly IRepository _sysEmpRep; // 员工表 private readonly IRepository _sysOrgRep; private readonly IRepository _sysRoleMenuRep; private readonly IRepository _sysMenuRep; private readonly IRepository _sysUserDataScopeRep; private readonly IRepository _sysUserAreaRep; private readonly IRepository _sysRoleDataRep; private readonly IRepository _sysRoleAreaRep; private readonly IRepository _sysAreaCodeRep; private readonly IHttpContextAccessor _httpContextAccessor; private readonly ISysCacheService _sysCacheService; public string UserId { get => _httpContextAccessor.HttpContext.User.FindFirst(ClaimConst.CLAINM_USERID)?.Value; } public string Account { get => _httpContextAccessor.HttpContext.User.FindFirst(ClaimConst.CLAINM_ACCOUNT)?.Value; } public string Name { get => _httpContextAccessor.HttpContext.User.FindFirst(ClaimConst.CLAINM_NAME)?.Value; } public bool SuperAdmin { get => _httpContextAccessor.HttpContext.User.FindFirst(ClaimConst.CLAINM_SUPERADMIN)?.Value == ((int)AdminType.SuperAdmin).ToString(); } public SysUser User { get => _sysUserRep.Find(UserId); } public UserManager( IHttpContextAccessor httpContextAccessor, ISysCacheService sysCacheService, IRepository sysUserRep, IRepository sysRoleRep, IRepository sysUserRoleRep, IRepository sysEmpRep, IRepository sysOrgRep, IRepository sysRoleMenuRep, IRepository sysMenuRep, IRepository sysUserDataScopeRep, IRepository sysUserAreaRep, IRepository sysRoleDataRep, IRepository sysRoleAreaRep, IRepository sysAreaCodeRep) { _sysUserRep = sysUserRep; _sysRoleRep = sysRoleRep; _sysUserRoleRep = sysUserRoleRep; _sysEmpRep = sysEmpRep; _sysOrgRep = sysOrgRep; _httpContextAccessor = httpContextAccessor; _sysCacheService = sysCacheService; _sysRoleMenuRep = sysRoleMenuRep; _sysMenuRep = sysMenuRep; _sysUserDataScopeRep = sysUserDataScopeRep; _sysUserAreaRep = sysUserAreaRep; _sysRoleDataRep = sysRoleDataRep; _sysRoleAreaRep = sysRoleAreaRep; _sysAreaCodeRep = sysAreaCodeRep; } /// /// 获取用户信息 /// /// /// public async Task CheckUserAsync(string userId) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == userId, false); return user ?? throw Oops.Oh(ErrorCode.D1002); } /// /// 获取用户信息 /// /// public async Task CheckUserAsync() { return await CheckUserAsync(UserId); } /// /// 获取用户员工信息 /// /// /// public async Task GetUserEmpInfo(string userId) { var emp = await _sysEmpRep.FirstOrDefaultAsync(u => u.Id == userId, false); return emp ?? throw Oops.Oh(ErrorCode.D1002); } /// /// 获取用户员工信息 /// /// public async Task GetUserEmpInfo() { return await GetUserEmpInfo(UserId); } /// /// 获取用户部门信息 /// /// /// public async Task GetUserOrgInfo(string userId) { var emp = await GetUserEmpInfo(userId); var org = await _sysOrgRep.FirstOrDefaultAsync(u => u.Id == emp.OrgId, false); return org ?? throw Oops.Oh(ErrorCode.D1002); } /// /// 获取用户部门信息 /// /// public async Task GetUserOrgInfo() { return await GetUserOrgInfo(UserId); } /// /// 获取用户角色Id列表 /// /// /// public async Task> GetUserRoleIdList(string userId) { var roleIds = await _sysUserRoleRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.SysRoleId).ToListAsync(); return roleIds; } /// /// 获取用户角色Id列表 /// /// public async Task> GetUserRoleIdList() { return await GetUserRoleIdList(UserId); } /// /// 获取用户角色列表 /// /// /// public async Task> GetUserRoleList(string userId) { var roleIds = await GetUserRoleIdList(userId); var roles = await _sysRoleRep.DetachedEntities.Where(u => roleIds.Contains(u.Id)).ToListAsync(); return roles; } /// /// 获取用户角色列表 /// /// public async Task> GetUserRoleList() { return await GetUserRoleList(UserId); } public async Task> GetLoginPermissionList() { var permissions = await _sysCacheService.GetPermission(UserId); // 先从缓存里面读取 if (permissions == null || permissions.Count < 1) { var roleIdList = await GetUserRoleIdList(); var menuIdList = await _sysRoleMenuRep.DetachedEntities .Where(u => roleIdList.Contains(u.SysRoleId)) .Select(u => u.SysMenuId).ToListAsync(); permissions = await _sysMenuRep.DetachedEntities.Where(u => menuIdList.Contains(u.Id)) .Where(u => u.Type == (int)MenuType.FUNCTION) .Where(u => u.Status == (int)CommonStatus.ENABLE) .Select(u => u.Permission).ToListAsync(); #if DEBUG #else await _sysCacheService.SetPermission(UserId, permissions); // 缓存结果 #endif } return permissions; } public Task> GetUserExtraDataScopeList() { return GetUserExtraDataScopeList(UserId); } public async Task> GetUserExtraDataScopeList(string userId) { return await _sysUserDataScopeRep.DetachedEntities .Where(u => u.SysUserId == userId) .Select(u => u.SysOrgId).ToListAsync(); } public Task> GetUserExtraAreaScopeList() { return GetUserExtraAreaScopeList(UserId); } public async Task> GetUserExtraAreaScopeList(string userId) { return await _sysUserAreaRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.AreaCode).ToListAsync(); } public Task> GetRoleExtraDataScopeList(string roleId) { return _sysRoleDataRep.DetachedEntities.Where(u => u.SysRoleId == roleId).Select(u => u.SysOrgId).ToListAsync(); } public Task> GetRoleExtraAreaScopeList(string roleId) { return _sysRoleAreaRep.DetachedEntities.Where(u => u.SysRoleId == roleId).Select(u => u.AreaCode).ToListAsync(); } public Task> GetUserAllDataScopeList() { return GetUserAllDataScopeList(UserId); } public async Task> GetDataScopeListByDataScopeType(int dataScopeType, string orgId) { var orgIdList = new List(); if (string.IsNullOrEmpty(orgId)) return orgIdList; // 如果是范围类型是全部数据,则获取当前所有的组织架构Id if (dataScopeType == (int)DataScopeType.ALL) { orgIdList = await _sysOrgRep.DetachedEntities.Where(u => u.Status == (int)CommonStatus.ENABLE).Select(u => u.Id).ToListAsync(); } // 如果范围类型是本部门及以下部门,则查询本节点和子节点集合,包含本节点 else if (dataScopeType == (int)DataScopeType.DEPT_WITH_CHILD) { orgIdList = await _sysOrgRep.DetachedEntities .Where(u => u.Pids.Contains(orgId)) .Select(u => u.Id).ToListAsync(); orgIdList.Add(orgId); } // 如果数据范围是本部门,不含子节点,则直接返回本部门 else if (dataScopeType == (int)DataScopeType.DEPT) { orgIdList.Add(orgId); } return orgIdList; } public async Task> GetUserAllDataScopeList(string userId) { var dataScopes = await _sysCacheService.GetDataScope(userId); // 先从缓存里面读取 if (dataScopes != null && dataScopes.Count > 0) { return dataScopes; } var orgId = await _sysEmpRep.DetachedEntities.Where(e => e.Id == userId).Select(u => u.OrgId).SingleAsync(); var orgAreaCode = await _sysOrgRep.Where(o => o.Id == orgId).Select(o => o.AreaCode).SingleAsync(); //获取用户额外授权数据 var userExtraDataScope = await (from org in _sysOrgRep.DetachedEntities join ua in _sysUserAreaRep.DetachedEntities on org.AreaCode equals ua.AreaCode where ua.SysUserId == userId select org.Id).Concat(from ud in _sysUserDataScopeRep.DetachedEntities where ud.SysUserId == userId select ud.SysOrgId).ToListAsync(); //获取用户所有角色 //获取其他类型中最大的角色 var areaScopeTypes = new[] { DataScopeType.AREA, DataScopeType.AREA_WITH_CHILD }.Cast(); var strongerDataScopeType = (int)DataScopeType.SELF; var strongerAreaType = (int)DataScopeType.SELF; //获取区域相关的角色类型中最大的区域角色 var customDataScopeRoleIdList = new List(); var roleList = from role in _sysRoleRep.DetachedEntities join ur in _sysUserRoleRep.DetachedEntities on role.Id equals ur.SysRoleId where ur.SysUserId == userId select role; foreach (var role in await roleList.ToListAsync()) { if (role.DataScopeType == (int)DataScopeType.DEFINE) customDataScopeRoleIdList.Add(role.Id); if ((role.DataScopeType == (int)DataScopeType.AREA || role.DataScopeType == (int)DataScopeType.AREA_WITH_CHILD) && strongerAreaType < role.DataScopeType) { strongerAreaType = role.DataScopeType; } else if (role.DataScopeType <= strongerDataScopeType) strongerDataScopeType = role.DataScopeType; } // 自定义数据范围的角色对应的数据范围 var roleDataScopeIdList = await _sysRoleDataRep.DetachedEntities.Where(rd => customDataScopeRoleIdList.Contains(rd.SysRoleId)).Select(rd => orgId).ToListAsync(); // 角色中拥有最大数据范围类型的数据范围 var dataScopeIdList = await GetDataScopeListByDataScopeType(strongerDataScopeType, orgId); //角色区域数据范围 var areaOrgIdList = new List(); if (strongerAreaType == (int)DataScopeType.AREA_WITH_CHILD) areaOrgIdList = await _sysOrgRep.DetachedEntities.Where(p => p.AreaCode.StartsWith(orgAreaCode)).Select(p => p.Id).ToListAsync(); if (strongerAreaType == (int)DataScopeType.AREA) areaOrgIdList = await _sysOrgRep.DetachedEntities.Where(p => p.AreaCode == orgAreaCode).Select(p => p.Id).ToListAsync(); //获取 var scope = userExtraDataScope.Concat(roleDataScopeIdList).Concat(dataScopeIdList).Concat(areaOrgIdList).Distinct().ToList(); #if DEBUG #else await _sysCacheService.SetDataScope(userId, scope); #endif return scope; } /// /// 获取用户可以访问的区域权限 /// /// public Task> GetUserAllAreaList() { return GetUserAllAreaList(UserId); } public async Task> GetUserAllAreaList(string userId) { var orgId = await _sysEmpRep.DetachedEntities.Where(e => e.Id == userId).Select(u => u.OrgId).SingleAsync(); var orgAreaCode = await _sysOrgRep.Where(o => o.Id == orgId).Select(o => o.AreaCode).SingleAsync(); //本部门 或者 本部门区域 树结构只显示本级区域 //本部门及以下 或者 本部门区域及以下 树结构显示本级和以下所有区域 var extraUserArea = await GetUserExtraAreaScopeList(userId); var roles = await _sysUserRoleRep.DetachedEntities.Include(ur => ur.SysRole).Where(ur => ur.SysUserId == userId).Select(ur => ur.SysRole).ToListAsync(); var customAreaRole = roles.Where(r => r.DataScopeType == (int)DataScopeType.DEFINE).Select(r => r.Id); var extraRoleArea = await _sysRoleAreaRep.DetachedEntities.Where(ra => customAreaRole.Contains(ra.SysRoleId)).Select(ra => ra.AreaCode).ToListAsync(); var roleTypeArea = await GetUserDataScopeTypeAreaList(orgAreaCode, roles.Select(r => r.DataScopeType).ToList()); var extraArea = await GetUserExtraAreaList(extraRoleArea.Concat(extraUserArea).Distinct().ToList()); return extraArea.Concat(roleTypeArea).Distinct().ToList(); } private async Task> GetUserExtraAreaList(List extraAreaCode) { var cachedAreaCode = await GetCachedAreaCode(); return cachedAreaCode.Select(a => a.Code).Where(a => extraAreaCode.Any(e => a.StartsWith(e))).ToList(); } private async Task> GetUserDataScopeTypeAreaList(string orgAreaCode, List roleDataTypeList) { var areaCode = await GetCachedAreaCode(); if (roleDataTypeList.Any(r => r == (int)DataScopeType.ALL)) { return areaCode.Select(a => a.Code).ToList(); } if (roleDataTypeList.Any(r => new[] { DataScopeType.DEPT_WITH_CHILD, DataScopeType.AREA_WITH_CHILD }.Cast().Contains(r))) { return areaCode.Where(a => a.Code.StartsWith(orgAreaCode)).Select(a => a.Code).ToList(); } if (roleDataTypeList.Any(r => new[] { DataScopeType.DEPT, DataScopeType.AREA }.Cast().Contains(r))) { return areaCode.Where(a => a.Code == orgAreaCode).Select(a => a.Code).ToList(); } return new List(); } private async Task> GetCachedAreaCode() { var areaCodeList = await _sysCacheService.GetAreaCode(); if (areaCodeList == null || areaCodeList.Count < 1) { areaCodeList = await _sysAreaCodeRep.DetachedEntities.ToListAsync(); } return areaCodeList; } } }