🍓 refactor(Auth): 当权限变更时,清除相关用户状态信息

This commit is contained in:
喵你个汪呀 2025-09-03 21:38:50 +08:00
parent 4bc8518199
commit eb3802c0be
14 changed files with 174 additions and 239 deletions

View File

@ -621,7 +621,7 @@ public class SysAuthService : IDynamicApiController, ITransient
if (dataScopes.All(u => u != DataScopeEnum.All) && dataScopes.Any(u => u == DataScopeEnum.DeptChild)) if (dataScopes.All(u => u != DataScopeEnum.All) && dataScopes.Any(u => u == DataScopeEnum.DeptChild))
{ {
var childOrg = db.Queryable<SysOrg>().IgnoreTenant().ToTree(u => u.Children, u => u.Pid, user.OrgId); var childOrg = db.Queryable<SysOrg>().IgnoreTenant().ToTree(u => u.Children, u => u.Pid, user.OrgId);
if (childOrg == null || childOrg.Count > 0) return orgIds; if (childOrg is not { Count: > 0 }) return orgIds;
var queue = new Queue<SysOrg>(childOrg); var queue = new Queue<SysOrg>(childOrg);
while (queue.Count > 0) while (queue.Count > 0)
{ {

View File

@ -139,6 +139,9 @@ public class SysMenuService : IDynamicApiController, ITransient
var newMenuId = await _sysMenuRep.InsertReturnSnowflakeIdAsync(sysMenu); var newMenuId = await _sysMenuRep.InsertReturnSnowflakeIdAsync(sysMenu);
// 将新增的菜单Id增加到当前账号角色菜单集合 // 将新增的菜单Id增加到当前账号角色菜单集合
await AddRoleMenuId(newMenuId); await AddRoleMenuId(newMenuId);
// 菜单按钮增加了权限标识,全部用户状态都需要更新
if (input.Type == MenuTypeEnum.Btn) LazyHelper.GetService<UserManager>().Value.RemoveAll();
} }
/// <summary> /// <summary>
@ -150,31 +153,33 @@ public class SysMenuService : IDynamicApiController, ITransient
[DisplayName("更新菜单")] [DisplayName("更新菜单")]
public async Task UpdateMenu(UpdateMenuInput input) public async Task UpdateMenu(UpdateMenuInput input)
{ {
if (input.Id == input.Pid) if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D4008);
throw Oops.Oh(ErrorCodeEnum.D4008);
var isExist = input.Type != MenuTypeEnum.Btn var isExist = input.Type != MenuTypeEnum.Btn
? await _sysMenuRep.IsAnyAsync(u => u.Title == input.Title && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id) ? await _sysMenuRep.IsAnyAsync(u => u.Title == input.Title && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id)
: await _sysMenuRep.IsAnyAsync(u => u.Pid == input.Pid && u.Permission == input.Permission && u.Id != input.Id); : await _sysMenuRep.IsAnyAsync(u => u.Pid == input.Pid && u.Permission == input.Permission && u.Id != input.Id);
if (isExist) if (isExist) throw Oops.Oh(ErrorCodeEnum.D4000);
throw Oops.Oh(ErrorCodeEnum.D4000);
if (!string.IsNullOrWhiteSpace(input.Name)) if (!string.IsNullOrWhiteSpace(input.Name))
{ {
if (await _sysMenuRep.IsAnyAsync(u => u.Id != input.Id && u.Name == input.Name)) if (await _sysMenuRep.IsAnyAsync(u => u.Id != input.Id && u.Name == input.Name)) throw Oops.Oh(ErrorCodeEnum.D4009);
throw Oops.Oh(ErrorCodeEnum.D4009);
} }
if (input.Pid != 0) if (input.Pid != 0)
{ {
if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) throw Oops.Oh(ErrorCodeEnum.D4010);
throw Oops.Oh(ErrorCodeEnum.D4010);
} }
// 校验菜单参数 // 校验菜单参数
var sysMenu = input.Adapt<SysMenu>(); var sysMenu = input.Adapt<SysMenu>();
CheckMenuParam(sysMenu); CheckMenuParam(sysMenu);
// 菜单按钮增加了权限标识,全部用户状态都需要更新
if (input.Type == MenuTypeEnum.Btn || await _sysMenuRep.IsAnyAsync(u => u.Id == input.Id && u.Type == MenuTypeEnum.Btn))
{
LazyHelper.GetService<UserManager>().Value.RemoveAll();
}
await _sysMenuRep.AsUpdateable(sysMenu).ExecuteCommandAsync(); await _sysMenuRep.AsUpdateable(sysMenu).ExecuteCommandAsync();
} }
@ -198,6 +203,9 @@ public class SysMenuService : IDynamicApiController, ITransient
// 级联删除用户收藏菜单 // 级联删除用户收藏菜单
await _sysUserMenuService.DeleteMenuList(menuIdList); await _sysUserMenuService.DeleteMenuList(menuIdList);
// 删除菜单全部数据都需要更新
if (menuTreeList.Any(u => u.Type == MenuTypeEnum.Btn)) LazyHelper.GetService<UserManager>().Value.RemoveAll();
} }
/// <summary> /// <summary>
@ -206,11 +214,11 @@ public class SysMenuService : IDynamicApiController, ITransient
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
[DisplayName("设置菜单状态")] [DisplayName("设置菜单状态")]
public async Task<int> SetStatus(BaseStatusInput input) public async Task<bool> SetStatus(BaseStatusInput input)
{ {
var menu = await _sysMenuRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); var menu = await _sysMenuRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
menu.Status = input.Status; if (menu.Type == MenuTypeEnum.Btn) LazyHelper.GetService<UserManager>().Value.RemoveAll();
return await _sysMenuRep.AsUpdateable(menu).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync(); return await _sysMenuRep.UpdateAsync(u => new() { Status = input.Status }, u => u.Id == input.Id);
} }
/// <summary> /// <summary>
@ -261,8 +269,7 @@ public class SysMenuService : IDynamicApiController, ITransient
private async Task AddRoleMenuId(long menuId) private async Task AddRoleMenuId(long menuId)
{ {
if (_userManager.SuperAdmin) return; if (_userManager.SuperAdmin) return;
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput { Id = _userManager.RoleIds[0], MenuIdList = [menuId] }, false);
var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId); LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([_userManager.RoleIds[0]]);
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = roleIdList[0], MenuIdList = [menuId] }, false);
} }
} }

View File

@ -132,15 +132,15 @@ public class SysOrgService : IDynamicApiController, ITransient
} }
// 删除与此父机构有关的用户机构缓存 // 删除与此父机构有关的用户机构缓存
var userManager = LazyHelper.GetService<UserManager>().Value;
if (input.Pid == 0) if (input.Pid == 0)
{ {
DeleteAllUserOrgCache(0, 0); userManager.RemoveAll();
} }
else else
{ {
var pOrg = await _sysOrgRep.GetByIdAsync(input.Pid); var pOrg = await _sysOrgRep.GetByIdAsync(input.Pid);
if (pOrg != null) if (pOrg != null) userManager.RemoveByOrgId([pOrg.Id, input.Pid]);
DeleteAllUserOrgCache(pOrg.Id, pOrg.Pid);
} }
var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync(); var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
@ -158,6 +158,7 @@ public class SysOrgService : IDynamicApiController, ITransient
DeleteAllUserOrgCache(0, 0); DeleteAllUserOrgCache(0, 0);
await _sysOrgRep.AsDeleteable().ExecuteCommandAsync(); await _sysOrgRep.AsDeleteable().ExecuteCommandAsync();
await _sysOrgRep.AsInsertable(orgs).ExecuteCommandAsync(); await _sysOrgRep.AsInsertable(orgs).ExecuteCommandAsync();
LazyHelper.GetService<UserManager>().Value.RemoveAll();
} }
/// <summary> /// <summary>
@ -170,42 +171,30 @@ public class SysOrgService : IDynamicApiController, ITransient
[DisplayName("更新机构")] [DisplayName("更新机构")]
public async Task UpdateOrg(UpdateOrgInput input) public async Task UpdateOrg(UpdateOrgInput input)
{ {
if (!_userManager.SuperAdmin && input.Pid == 0) if (!_userManager.SuperAdmin && input.Pid == 0) throw Oops.Oh(ErrorCodeEnum.D2010);
throw Oops.Oh(ErrorCodeEnum.D2010); if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D2001);
if (input.Pid != 0) if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) throw Oops.Oh(ErrorCodeEnum.D2002);
{
//var pOrg = await _sysOrgRep.GetByIdAsync(input.Pid);
//_ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000);
// 若父机构发生变化则清空用户机构缓存
var sysOrg = await _sysOrgRep.GetByIdAsync(input.Id);
if (sysOrg != null && sysOrg.Pid != input.Pid)
{
// 删除与此机构、新父机构有关的用户机构缓存
DeleteAllUserOrgCache(sysOrg.Id, input.Pid);
}
}
if (input.Id == input.Pid)
throw Oops.Oh(ErrorCodeEnum.D2001);
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
throw Oops.Oh(ErrorCodeEnum.D2002);
// 父Id不能为自己的子节点 // 父Id不能为自己的子节点
var childIdList = await GetChildIdListWithSelfById(input.Id); var childIdList = await GetChildIdListWithSelfById(input.Id);
if (childIdList.Contains(input.Pid)) if (childIdList.Contains(input.Pid)) throw Oops.Oh(ErrorCodeEnum.D2001);
throw Oops.Oh(ErrorCodeEnum.D2001);
// 是否有权限操作此机构 // 是否有权限操作此机构
if (!_userManager.SuperAdmin) if (!_userManager.SuperAdmin)
{ {
var orgIdList = await GetUserOrgIdList(); var orgIdList = _userManager.OrgIds;
if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id)) if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id)) throw Oops.Oh(ErrorCodeEnum.D2003);
throw Oops.Oh(ErrorCodeEnum.D2003);
} }
await _sysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync(); await _sysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync();
if (input.Pid != 0)
{
// 若父机构发生变化则清空用户机构缓存
var sysOrg = await _sysOrgRep.GetByIdAsync(input.Id);
if (sysOrg != null && sysOrg.Pid != input.Pid) LazyHelper.GetService<UserManager>().Value.RemoveByOrgId([input.Pid, input.Id]);
}
} }
/// <summary> /// <summary>
@ -224,26 +213,22 @@ public class SysOrgService : IDynamicApiController, ITransient
if (!_userManager.SuperAdmin) if (!_userManager.SuperAdmin)
{ {
var orgIdList = await GetUserOrgIdList(); var orgIdList = await GetUserOrgIdList();
if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id)) if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id)) throw Oops.Oh(ErrorCodeEnum.D2003);
throw Oops.Oh(ErrorCodeEnum.D2003);
} }
// 若机构为租户默认机构禁止删除 // 若机构为租户默认机构禁止删除
var isTenantOrg = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysTenant>>() var isTenantOrg = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysTenant>>()
.IsAnyAsync(u => u.OrgId == input.Id); .IsAnyAsync(u => u.OrgId == input.Id);
if (isTenantOrg) if (isTenantOrg) throw Oops.Oh(ErrorCodeEnum.D2008);
throw Oops.Oh(ErrorCodeEnum.D2008);
// 若机构有用户则禁止删除 // 若机构有用户则禁止删除
var orgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>() var orgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
.IsAnyAsync(u => u.OrgId == input.Id); .IsAnyAsync(u => u.OrgId == input.Id);
if (orgHasEmp) if (orgHasEmp) throw Oops.Oh(ErrorCodeEnum.D2004);
throw Oops.Oh(ErrorCodeEnum.D2004);
// 若扩展机构有用户则禁止删除 // 若扩展机构有用户则禁止删除
var hasExtOrgEmp = await _sysUserExtOrgService.HasUserOrg(sysOrg.Id); var hasExtOrgEmp = await _sysUserExtOrgService.HasUserOrg(sysOrg.Id);
if (hasExtOrgEmp) if (hasExtOrgEmp) throw Oops.Oh(ErrorCodeEnum.D2005);
throw Oops.Oh(ErrorCodeEnum.D2005);
// 若子机构有用户则禁止删除 // 若子机构有用户则禁止删除
var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
@ -252,8 +237,7 @@ public class SysOrgService : IDynamicApiController, ITransient
// 若子机构有用户则禁止删除 // 若子机构有用户则禁止删除
var cOrgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>() var cOrgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
.IsAnyAsync(u => childOrgIdList.Contains(u.OrgId)); .IsAnyAsync(u => childOrgIdList.Contains(u.OrgId));
if (cOrgHasEmp) if (cOrgHasEmp) throw Oops.Oh(ErrorCodeEnum.D2007);
throw Oops.Oh(ErrorCodeEnum.D2007);
// 删除与此机构、父机构有关的用户机构缓存 // 删除与此机构、父机构有关的用户机构缓存
DeleteAllUserOrgCache(sysOrg.Id, sysOrg.Pid); DeleteAllUserOrgCache(sysOrg.Id, sysOrg.Pid);
@ -266,6 +250,8 @@ public class SysOrgService : IDynamicApiController, ITransient
// 级联删除用户机构数据 // 级联删除用户机构数据
await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(childOrgIdList); await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(childOrgIdList);
LazyHelper.GetService<UserManager>().Value.RemoveByOrgId([sysOrg.Pid, sysOrg.Id]);
} }
/// <summary> /// <summary>
@ -343,26 +329,6 @@ public class SysOrgService : IDynamicApiController, ITransient
return await GetUserOrgIdList(roleList, userId, userOrgId); return await GetUserOrgIdList(roleList, userId, userOrgId);
} }
/// <summary>
/// 判定用户是否有某角色权限
/// </summary>
/// <param name="userId"></param>
/// <param name="role">角色代码</param>
/// <returns></returns>
[NonAction]
public async Task<bool> GetUserHasRole(long userId, SysRole role)
{
if (_userManager.SuperAdmin) return true;
var userOrgId = _userManager.OrgId;
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
if (roleList != null && roleList.Exists(r => r.Code == role.Code)) return true;
roleList = [role];
var orgIds = await GetUserOrgIdList(roleList, userId, userOrgId);
return orgIds.Contains(userOrgId);
}
/// <summary> /// <summary>
/// 根据角色Id集合获取机构Id集合 /// 根据角色Id集合获取机构Id集合
/// </summary> /// </summary>
@ -400,8 +366,8 @@ public class SysOrgService : IDynamicApiController, ITransient
}); });
} }
// 缓存当前用户最大角色数据范围 // // 缓存当前用户最大角色数据范围
_sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + userId, strongerDataScopeType, TimeSpan.FromDays(7)); // _sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + userId, strongerDataScopeType, TimeSpan.FromDays(7));
// 根据角色集合获取机构集合 // 根据角色集合获取机构集合
var roleOrgIdList = await _sysRoleOrgService.GetRoleOrgIdList(customDataScopeRoleIdList); var roleOrgIdList = await _sysRoleOrgService.GetRoleOrgIdList(customDataScopeRoleIdList);

View File

@ -78,7 +78,6 @@ public class SysPosService : IDynamicApiController, ITransient
public async Task AddPos(AddPosInput input) public async Task AddPos(AddPosInput input)
{ {
if (await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) throw Oops.Oh(ErrorCodeEnum.D6000); if (await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) throw Oops.Oh(ErrorCodeEnum.D6000);
await _sysPosRep.InsertAsync(input.Adapt<SysPos>()); await _sysPosRep.InsertAsync(input.Adapt<SysPos>());
} }
@ -97,6 +96,7 @@ public class SysPosService : IDynamicApiController, ITransient
if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId) throw Oops.Oh(ErrorCodeEnum.D6002); if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId) throw Oops.Oh(ErrorCodeEnum.D6002);
await _sysPosRep.AsUpdateable(input.Adapt<SysPos>()).IgnoreColumns(true).ExecuteCommandAsync(); await _sysPosRep.AsUpdateable(input.Adapt<SysPos>()).IgnoreColumns(true).ExecuteCommandAsync();
LazyHelper.GetService<UserManager>().Value.RemoveByPosId([input.Id]);
} }
/// <summary> /// <summary>
@ -121,6 +121,7 @@ public class SysPosService : IDynamicApiController, ITransient
if (hasExtPosEmp) throw Oops.Oh(ErrorCodeEnum.D6001); if (hasExtPosEmp) throw Oops.Oh(ErrorCodeEnum.D6001);
await _sysPosRep.DeleteByIdAsync(input.Id); await _sysPosRep.DeleteByIdAsync(input.Id);
LazyHelper.GetService<UserManager>().Value.RemoveByPosId([input.Id]);
} }
/// <summary> /// <summary>

View File

@ -11,6 +11,7 @@ public class RoleInput : BaseIdInput
/// <summary> /// <summary>
/// 状态 /// 状态
/// </summary> /// </summary>
[Enum]
public virtual StatusEnum Status { get; set; } public virtual StatusEnum Status { get; set; }
} }

View File

@ -36,6 +36,7 @@ public class SysRoleApiService : ITransient
Route = u Route = u
}).ToList(); }).ToList();
await _sysRoleApiRep.InsertRangeAsync(roleApis); await _sysRoleApiRep.InsertRangeAsync(roleApis);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -58,6 +59,7 @@ public class SysRoleApiService : ITransient
public async Task DeleteRoleApiByRoleId(long roleId) public async Task DeleteRoleApiByRoleId(long roleId)
{ {
await _sysRoleApiRep.DeleteAsync(u => u.RoleId == roleId); await _sysRoleApiRep.DeleteAsync(u => u.RoleId == roleId);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
} }
/// <summary> /// <summary>
@ -75,5 +77,6 @@ public class SysRoleApiService : ITransient
u.RoleId = newRoleId; u.RoleId = newRoleId;
}); });
await _sysRoleApiRep.InsertRangeAsync(roleApiList); await _sysRoleApiRep.InsertRangeAsync(roleApiList);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
} }
} }

View File

@ -47,6 +47,7 @@ public class SysRoleMenuService : ITransient
MenuId = u MenuId = u
}).ToList(); }).ToList();
await _sysRoleMenuRep.InsertRangeAsync(menus); await _sysRoleMenuRep.InsertRangeAsync(menus);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -56,7 +57,9 @@ public class SysRoleMenuService : ITransient
/// <returns></returns> /// <returns></returns>
public async Task DeleteRoleMenuByMenuIdList(List<long> menuIdList) public async Task DeleteRoleMenuByMenuIdList(List<long> menuIdList)
{ {
var roleIds = await _sysRoleMenuRep.AsQueryable().Where(u => menuIdList.Contains(u.MenuId)).Select(u => u.RoleId).Distinct().ToListAsync();
await _sysRoleMenuRep.DeleteAsync(u => menuIdList.Contains(u.MenuId)); await _sysRoleMenuRep.DeleteAsync(u => menuIdList.Contains(u.MenuId));
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId(roleIds);
} }
/// <summary> /// <summary>
@ -67,6 +70,7 @@ public class SysRoleMenuService : ITransient
public async Task DeleteRoleMenuByRoleId(long roleId) public async Task DeleteRoleMenuByRoleId(long roleId)
{ {
await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == roleId); await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == roleId);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
} }
/// <summary> /// <summary>
@ -84,5 +88,6 @@ public class SysRoleMenuService : ITransient
u.RoleId = newRoleId; u.RoleId = newRoleId;
}); });
await _sysRoleMenuRep.InsertRangeAsync(roleMenuList); await _sysRoleMenuRep.InsertRangeAsync(roleMenuList);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
} }
} }

View File

@ -35,6 +35,7 @@ public class SysRoleOrgService : ITransient
}).ToList(); }).ToList();
await _sysRoleOrgRep.InsertRangeAsync(roleOrgList); await _sysRoleOrgRep.InsertRangeAsync(roleOrgList);
} }
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -50,7 +51,7 @@ public class SysRoleOrgService : ITransient
.Where(u => roleIdList.Contains(u.RoleId)) .Where(u => roleIdList.Contains(u.RoleId))
.Select(u => u.OrgId).ToListAsync(); .Select(u => u.OrgId).ToListAsync();
} }
else return new List<long>(); return new List<long>();
} }
/// <summary> /// <summary>
@ -60,7 +61,9 @@ public class SysRoleOrgService : ITransient
/// <returns></returns> /// <returns></returns>
public async Task DeleteRoleOrgByOrgIdList(List<long> orgIdList) public async Task DeleteRoleOrgByOrgIdList(List<long> orgIdList)
{ {
var roleIdList = await _sysRoleOrgRep.AsQueryable().Where(u => orgIdList.Contains(u.OrgId)).Select(u => u.RoleId).Distinct().ToListAsync();
await _sysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId)); await _sysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId(roleIdList);
} }
/// <summary> /// <summary>
@ -71,6 +74,7 @@ public class SysRoleOrgService : ITransient
public async Task DeleteRoleOrgByRoleId(long roleId) public async Task DeleteRoleOrgByRoleId(long roleId)
{ {
await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId); await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
} }
/// <summary> /// <summary>
@ -88,5 +92,8 @@ public class SysRoleOrgService : ITransient
u.RoleId = newRoleId; u.RoleId = newRoleId;
}); });
await _sysRoleOrgRep.InsertRangeAsync(roleOrgList); await _sysRoleOrgRep.InsertRangeAsync(roleOrgList);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
} }
} }

View File

@ -126,6 +126,8 @@ public class SysRoleService : IDynamicApiController, ITransient
await _sysRoleRep.AsUpdateable(input.Adapt<SysRole>()).IgnoreColumns(true) await _sysRoleRep.AsUpdateable(input.Adapt<SysRole>()).IgnoreColumns(true)
.IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync(); .IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync();
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -162,6 +164,9 @@ public class SysRoleService : IDynamicApiController, ITransient
// 级联删除角色表格数据 // 级联删除角色表格数据
await _sysRoleTableService.DeleteRolTableByRoleId(sysRole.Id); await _sysRoleTableService.DeleteRolTableByRoleId(sysRole.Id);
// 删除关联的用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -201,6 +206,9 @@ public class SysRoleService : IDynamicApiController, ITransient
// 复制角色表格数据 // 复制角色表格数据
await _sysRoleTableService.CopyRolTableByRoleId(input.Id, newRoleId); await _sysRoleTableService.CopyRolTableByRoleId(input.Id, newRoleId);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
} }
/// <summary> /// <summary>
@ -213,18 +221,8 @@ public class SysRoleService : IDynamicApiController, ITransient
{ {
if (input.MenuIdList == null || input.MenuIdList.Count < 1) return; if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
//// 将父节点为0的菜单排除防止前端全选异常
//var pMenuIds = await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id);
//var menuIds = input.MenuIdList.Except(pMenuIds); // 差集
//await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput()
//{
// Id = input.Id,
// MenuIdList = menuIds.ToList()
//});
await _sysRoleMenuService.GrantRoleMenu(input); await _sysRoleMenuService.GrantRoleMenu(input);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
await ClearUserApiCache(input.Id);
} }
/// <summary> /// <summary>
@ -269,7 +267,7 @@ public class SysRoleService : IDynamicApiController, ITransient
var grantOrgIdList = input.OrgIdList; var grantOrgIdList = input.OrgIdList;
if (grantOrgIdList.Count > 0) if (grantOrgIdList.Count > 0)
{ {
var orgIdList = await _sysOrgService.GetUserOrgIdList(); var orgIdList = _userManager.OrgIds;
if (orgIdList.Count < 1) throw Oops.Oh(ErrorCodeEnum.D1016); if (orgIdList.Count < 1) throw Oops.Oh(ErrorCodeEnum.D1016);
if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) throw Oops.Oh(ErrorCodeEnum.D1016); if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) throw Oops.Oh(ErrorCodeEnum.D1016);
} }
@ -285,6 +283,8 @@ public class SysRoleService : IDynamicApiController, ITransient
role.DataScope = (DataScopeEnum)dataScope; role.DataScope = (DataScopeEnum)dataScope;
await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync(); await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync();
await _sysRoleOrgService.GrantRoleOrg(input); await _sysRoleOrgService.GrantRoleOrg(input);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -296,8 +296,8 @@ public class SysRoleService : IDynamicApiController, ITransient
[DisplayName("授权角色接口")] [DisplayName("授权角色接口")]
public async Task GrantApi(RoleApiInput input) public async Task GrantApi(RoleApiInput input)
{ {
await ClearUserApiCache(input.Id);
await _sysRoleApiService.GrantRoleApi(input); await _sysRoleApiService.GrantRoleApi(input);
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -310,6 +310,10 @@ public class SysRoleService : IDynamicApiController, ITransient
public async Task GrantUser(RoleUserInput input) public async Task GrantUser(RoleUserInput input)
{ {
await _sysUserRoleService.GrantRoleUser(input); await _sysUserRoleService.GrantRoleUser(input);
// 清除关联用户状态
var userManager = LazyHelper.GetService<UserManager>().Value;
foreach (var userId in input.UserIdList) userManager.Remove(userId);
} }
/// <summary> /// <summary>
@ -322,10 +326,15 @@ public class SysRoleService : IDynamicApiController, ITransient
{ {
if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005); if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005);
return await _sysRoleRep.AsUpdateable() var result = await _sysRoleRep.AsUpdateable()
.SetColumns(u => u.Status == input.Status) .SetColumns(u => u.Status, input.Status)
.Where(u => u.Id == input.Id) .Where(u => u.Id == input.Id)
.ExecuteCommandAsync(); .ExecuteCommandAsync();
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
return result;
} }
/// <summary> /// <summary>
@ -390,101 +399,8 @@ public class SysRoleService : IDynamicApiController, ITransient
public async Task<List<string>> GetRoleApiList([FromQuery] RoleInput input) public async Task<List<string>> GetRoleApiList([FromQuery] RoleInput input)
{ {
return await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id }); return await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
//var roleButtons = await GetRoleButtonList(new List<long> { input.Id });
//return roleApis.Union(roleButtons).ToList();
} }
/// <summary>
/// 获取用户接口集合
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[NonAction]
public async Task<List<string>> GetUserApiList(long userId)
{
List<string> apiList = [];
// 超管账号获取所有接口
if (await _sysRoleRep.Context.Queryable<SysUser>().IgnoreTenant().AnyAsync(u => u.Id == userId && u.AccountType == AccountTypeEnum.SuperAdmin))
{
// 获取所有接口
var queue = new Queue<ApiOutput>(_sysCommonService.GetApiList());
var item = queue.Dequeue();
while (item != null)
{
if (item.Children is { Count: > 0 }) queue.EnqueueRange(item.Children);
else apiList.Add(item.Route);
item = queue.Count > 0 ? queue.Dequeue() : null;
}
var allButtonList = await GetButtonList();
apiList.AddRange(allButtonList);
}
else
{
// 获取账号所有权限集
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(await _sysUserRoleService.GetUserRoleIdList(userId));
apiList = await GetButtonList(menuIdList, false);
}
apiList = apiList.Distinct().ToList();
apiList.Sort();
return apiList;
}
/// <summary>
/// 获取无权访问接口集合 🔖
/// </summary>
[NonAction]
public async Task<List<string>> GetUnAuthApiList(long userId)
{
if (await _sysRoleRep.Context.Queryable<SysUser>().IgnoreTenant().AnyAsync(u => u.Id == userId && u.AccountType == AccountTypeEnum.SuperAdmin)) return [];
// 所有按钮权限集合
var allButtonList = await GetButtonList();
// 当前账号所有角色集合
var roleIds = await _sysUserRoleService.GetUserRoleIdList(userId);
// 菜单中已有的权限集与当前用户的权限集差集,就是无权访问的权限集
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
var apiList = await GetButtonList(menuIdList, false);
var blackList = allButtonList.Except(apiList).ToList(); // 差集
// 角色接口黑名单集合
blackList.AddRange(await _sysRoleApiService.GetRoleApiList(roleIds));
blackList = blackList.Distinct().ToList();
blackList.Sort();
return blackList;
}
///// <summary>
///// 获取用户按钮权限集合
///// </summary>
///// <returns></returns>
//[NonAction]
//public async Task<List<string>> GetUserButtonList()
//{
// var menuIdList = new List<long>();
// if (!_userManager.SuperAdmin)
// {
// var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
// menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
// }
// return await GetButtonList(menuIdList);
//}
///// <summary>
///// 获取角色按钮权限集合
///// </summary>
///// <param name="roleIds"></param>
///// <returns></returns>
//[NonAction]
//public async Task<List<string>> GetRoleButtonList(List<long> roleIds)
//{
// var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
// return await GetButtonList(menuIdList);
//}
/// <summary> /// <summary>
/// 根据菜单Id集合获取按钮集合 /// 根据菜单Id集合获取按钮集合
/// </summary> /// </summary>
@ -500,16 +416,4 @@ public class SysRoleService : IDynamicApiController, ITransient
.Select(u => u.Permission) .Select(u => u.Permission)
.ToListAsync(); .ToListAsync();
} }
/// <summary>
/// 删除与该角色相关的用户接口缓存
/// </summary>
/// <param name="roleId"></param>
/// <returns></returns>
[NonAction]
public async Task ClearUserApiCache(long roleId)
{
var userIdList = await _sysUserRoleService.GetUserIdList(roleId);
foreach (var userId in userIdList) _sysCacheService.Remove(CacheConst.KeyUserManager + userId);
}
} }

View File

@ -61,6 +61,9 @@ public class SysRoleTableService : ITransient
} }
await _sysRoleTableRep.InsertRangeAsync(sysRoleTableList); await _sysRoleTableRep.InsertRangeAsync(sysRoleTableList);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>
@ -167,6 +170,9 @@ public class SysRoleTableService : ITransient
public async Task DeleteRolTableByRoleId(long roleId) public async Task DeleteRolTableByRoleId(long roleId)
{ {
await _sysRoleTableRep.DeleteAsync(u => u.RoleId == roleId); await _sysRoleTableRep.DeleteAsync(u => u.RoleId == roleId);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
} }
/// <summary> /// <summary>
@ -184,5 +190,8 @@ public class SysRoleTableService : ITransient
u.RoleId = newRoleId; u.RoleId = newRoleId;
}); });
await _sysRoleTableRep.InsertRangeAsync(roleTableList); await _sysRoleTableRep.InsertRangeAsync(roleTableList);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
} }
} }

View File

@ -347,7 +347,8 @@ public class SysTenantService : IDynamicApiController, ITransient
input.Id = adminRole.Id; // 重置租户管理员角色Id input.Id = adminRole.Id; // 重置租户管理员角色Id
await _sysRoleMenuService.GrantRoleMenu(input); await _sysRoleMenuService.GrantRoleMenu(input);
await _sysRoleService.ClearUserApiCache(input.Id); // 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
} }
/// <summary> /// <summary>

View File

@ -57,12 +57,6 @@ public class SysUserRoleService : ITransient
RoleId = input.Id RoleId = input.Id
}).ToList(); }).ToList();
await _sysUserRoleRep.InsertRangeAsync(userRoles); await _sysUserRoleRep.InsertRangeAsync(userRoles);
// 清除缓存
foreach (var userId in input.UserIdList)
{
_sysCacheService.Remove(CacheConst.KeyUserManager + userId);
}
} }
/// <summary> /// <summary>
@ -72,18 +66,10 @@ public class SysUserRoleService : ITransient
/// <returns></returns> /// <returns></returns>
public async Task DeleteUserRoleByRoleId(long roleId) public async Task DeleteUserRoleByRoleId(long roleId)
{ {
var userIdList = await _sysUserRoleRep.AsQueryable()
.Where(u => u.RoleId == roleId)
.Select(u => u.UserId)
.ToListAsync();
// 清除缓存
foreach (var userId in userIdList)
{
_sysCacheService.Remove(CacheConst.KeyUserManager + userId);
}
await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId); await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId);
// 清除关联用户状态
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
} }
/// <summary> /// <summary>
@ -95,8 +81,8 @@ public class SysUserRoleService : ITransient
{ {
await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId); await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId);
// 清除缓存 // 清除关联用户状态
_sysCacheService.Remove(CacheConst.KeyUserManager + userId); LazyHelper.GetService<UserManager>().Value.Remove(userId);
} }
/// <summary> /// <summary>

View File

@ -61,7 +61,7 @@ public class SysUserService : IDynamicApiController, ITransient
public virtual async Task<SqlSugarPagedList<UserOutput>> Page(PageUserInput input) public virtual async Task<SqlSugarPagedList<UserOutput>> Page(PageUserInput input)
{ {
// 获取用户拥有的机构集合 // 获取用户拥有的机构集合
var userOrgIdList = await _sysOrgService.GetUserOrgIdList(); var userOrgIdList = _userManager.OrgIds;
List<long> orgList = null; List<long> orgList = null;
List<long> extOrgUserIdList = null; List<long> extOrgUserIdList = null;
if (input.OrgId > 0) // 指定机构查询时 if (input.OrgId > 0) // 指定机构查询时
@ -149,12 +149,12 @@ public class SysUserService : IDynamicApiController, ITransient
// 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新 // 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新
var user = await _sysUserRep.GetByIdAsync(input.Id); var user = await _sysUserRep.GetByIdAsync(input.Id);
var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.Id); // var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.Id);
if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u))) // if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u)))
{ // {
// 强制下线账号和失效Token // // 强制下线账号和失效Token
await OfflineAndExpireToken(user); // await OfflineAndExpireToken(user);
} // }
// 更新用户 // 更新用户
await _sysUserRep.AsUpdateable(input.Adapt<SysUser>()).IgnoreColumns(true).IgnoreColumns(u => new { u.Password, u.Status, u.TenantId }).ExecuteCommandAsync(); await _sysUserRep.AsUpdateable(input.Adapt<SysUser>()).IgnoreColumns(true).IgnoreColumns(u => new { u.Password, u.Status, u.TenantId }).ExecuteCommandAsync();
@ -183,7 +183,6 @@ public class SysUserService : IDynamicApiController, ITransient
private async Task UpdateRoleAndExtOrg(AddUserInput input) private async Task UpdateRoleAndExtOrg(AddUserInput input)
{ {
await GrantRole(new UserRoleInput { UserId = input.Id, RoleIdList = input.RoleIdList }); await GrantRole(new UserRoleInput { UserId = input.Id, RoleIdList = input.RoleIdList });
await _sysUserExtOrgService.UpdateUserExtOrg(input.Id, input.ExtOrgIdList); await _sysUserExtOrgService.UpdateUserExtOrg(input.Id, input.ExtOrgIdList);
} }
@ -229,6 +228,8 @@ public class SysUserService : IDynamicApiController, ITransient
// 发布删除用户事件 // 发布删除用户事件
await _eventPublisher.PublishAsync(UserEventTypeEnum.Delete, input); await _eventPublisher.PublishAsync(UserEventTypeEnum.Delete, input);
LazyHelper.GetService<UserManager>().Value.Remove(user.Id);
} }
/// <summary> /// <summary>
@ -249,8 +250,7 @@ public class SysUserService : IDynamicApiController, ITransient
[DisplayName("更新用户基本信息")] [DisplayName("更新用户基本信息")]
public virtual async Task<int> UpdateBaseInfo(SysUser user) public virtual async Task<int> UpdateBaseInfo(SysUser user)
{ {
var count = await _sysUserRep.AsUpdateable(user) var count = await _sysUserRep.AsUpdateable(user).IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync();
.IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync();
// 清除用户状态 // 清除用户状态
_userManager.Remove(user.Id); _userManager.Remove(user.Id);
return count; return count;
@ -265,14 +265,12 @@ public class SysUserService : IDynamicApiController, ITransient
[DisplayName("设置用户状态")] [DisplayName("设置用户状态")]
public virtual async Task<int> SetStatus(BaseStatusInput input) public virtual async Task<int> SetStatus(BaseStatusInput input)
{ {
if (_userManager.UserId == input.Id) if (_userManager.UserId == input.Id) throw Oops.Oh(ErrorCodeEnum.D1026);
throw Oops.Oh(ErrorCodeEnum.D1026);
var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009); var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
user.ValidateIsSuperAdminAccountType(ErrorCodeEnum.D1015); user.ValidateIsSuperAdminAccountType(ErrorCodeEnum.D1015);
if (!Enum.IsDefined(input.Status)) if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005);
throw Oops.Oh(ErrorCodeEnum.D3005);
if (input.Status != StatusEnum.Enable) if (input.Status != StatusEnum.Enable)
{ {
@ -286,6 +284,8 @@ public class SysUserService : IDynamicApiController, ITransient
// 发布设置用户状态事件 // 发布设置用户状态事件
await _eventPublisher.PublishAsync(UserEventTypeEnum.SetStatus, input); await _eventPublisher.PublishAsync(UserEventTypeEnum.SetStatus, input);
_userManager.Remove(user.Id);
return rows; return rows;
} }
@ -298,16 +298,14 @@ public class SysUserService : IDynamicApiController, ITransient
[DisplayName("授权用户角色")] [DisplayName("授权用户角色")]
public async Task GrantRole(UserRoleInput input) public async Task GrantRole(UserRoleInput input)
{ {
var user = await _sysUserRep.GetByIdAsync(input.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
// 若角色发生改变则进行更新 // 若角色发生改变则进行更新
var roles = await _sysUserRoleService.GetUserRoleIdList(input.UserId); var roles = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
if (!roles.SequenceEqual(input.RoleIdList)) if (!roles.SequenceEqual(input.RoleIdList))
{ {
// 更新用户角色 // 更新用户角色
await _sysUserRoleService.GrantUserRole(input); await _sysUserRoleService.GrantUserRole(input);
// 强制下线账号和失效Token // // 强制下线账号和失效Token
await OfflineAndExpireToken(user); // await OfflineAndExpireToken(user);
// 发布更新用户角色事件 // 发布更新用户角色事件
await _eventPublisher.PublishAsync(UserEventTypeEnum.UpdateRole, input); await _eventPublisher.PublishAsync(UserEventTypeEnum.UpdateRole, input);
} }
@ -418,10 +416,10 @@ public class SysUserService : IDynamicApiController, ITransient
if (int.TryParse(sysConfig.Value, out int expirationTime) && expirationTime > 0) if (int.TryParse(sysConfig.Value, out int expirationTime) && expirationTime > 0)
{ {
var user = await _sysUserRep.GetByIdAsync(_userManager.UserId); var user = await _sysUserRep.GetByIdAsync(_userManager.UserId);
if (user.LastChangePasswordTime == null)
return false; if (user.LastChangePasswordTime == null) return false;
if ((DateTime.Now - user.LastChangePasswordTime.Value).Days > expirationTime)
return false; if ((DateTime.Now - user.LastChangePasswordTime.Value).Days > expirationTime) return false;
} }
return true; return true;
} }

View File

@ -189,6 +189,44 @@ public class UserManager(
sysCacheService.Remove(CacheConst.KeyUserManager + userId); sysCacheService.Remove(CacheConst.KeyUserManager + userId);
} }
/// <summary>
/// 清除所有用户状态
/// </summary>
public void RemoveAll()
{
sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserManager);
}
/// <summary>
/// 根据角色Id集删除用户状态
/// </summary>
public void RemoveByRoleId(List<long> roleIds)
{
if (roleIds == null || roleIds.Count == 0) return;
var list = GetUserManagerList();
foreach (var id in roleIds) list?.Where(x => x.RoleIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
}
/// <summary>
/// 根据机构Id集删除用户状态
/// </summary>
public void RemoveByOrgId(List<long> orgIds)
{
if (orgIds == null || orgIds.Count == 0) return;
var list = GetUserManagerList();
foreach (var id in orgIds) list?.Where(x => x.OrgIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
}
/// <summary>
/// 根据职位Id集删除用户状态
/// </summary>
public void RemoveByPosId(List<long> posIds)
{
if (posIds == null || posIds.Count == 0) return;
var list = GetUserManagerList();
foreach (var id in posIds) list?.Where(x => x.PosIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
}
/// <summary> /// <summary>
/// 获取指定用户状态 /// 获取指定用户状态
/// </summary> /// </summary>
@ -197,6 +235,15 @@ public class UserManager(
return sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + userId); return sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + userId);
} }
/// <summary>
/// 获取用户状态列表
/// </summary>
public List<UserManagerDao> GetUserManagerList()
{
var keys = sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserManager);
return keys?.Select(x => sysCacheService.Get<UserManagerDao>(x)).ToList();
}
/// <summary> /// <summary>
/// 获取指定用户状态,如果不存在则刷新 /// 获取指定用户状态,如果不存在则刷新
/// </summary> /// </summary>