Pārlūkot izejas kodu

😁1、优化增加、删除机构时删除与之相关的用户机构缓存 2、优化缓存类

zuohuaijun 2 gadi atpakaļ
vecāks
revīzija
5a1877bd91

+ 17 - 6
Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

@@ -39,9 +39,9 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="value"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(false)]
-    public void Set(string key, object value)
+    public bool Set(string key, object value)
     {
-        _cache.Set(key, value);
+        return _cache.Set(key, value);
     }
 
     /// <summary>
@@ -52,9 +52,9 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="expire"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(false)]
-    public void Set(string key, object value, TimeSpan expire)
+    public bool Set(string key, object value, TimeSpan expire)
     {
-        _cache.Set(key, value, expire);
+        return _cache.Set(key, value, expire);
     }
 
     /// <summary>
@@ -76,9 +76,9 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete"), HttpPost]
     [DisplayName("删除缓存")]
-    public void Remove(string key)
+    public int Remove(string key)
     {
-        _cache.Remove(key);
+        return _cache.Remove(key);
     }
 
     /// <summary>
@@ -106,6 +106,17 @@ public class SysCacheService : IDynamicApiController, ISingleton
         return _cache.Remove(delKeys);
     }
 
+    /// <summary>
+    /// 根据键名前缀获取键名集合
+    /// </summary>
+    /// <param name="prefixKey">键名前缀</param>
+    /// <returns></returns>
+    [DisplayName("根据键名前缀获取键名集合")]
+    public List<string> GetKeysByPrefixKey(string prefixKey)
+    {
+        return _cache.Keys.Where(u => u.StartsWith(prefixKey)).ToList();
+    }
+
     /// <summary>
     /// 获取缓存值
     /// </summary>

+ 40 - 17
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -7,6 +7,8 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
+using NewLife;
+
 namespace Admin.NET.Core.Service;
 
 /// <summary>
@@ -79,28 +81,35 @@ public class SysOrgService : IDynamicApiController, ITransient
     [DisplayName("增加机构")]
     public async Task<long> AddOrg(AddOrgInput input)
     {
-        var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code);
-        if (isExist)
+        if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code))
             throw Oops.Oh(ErrorCodeEnum.D2002);
 
-        var orgIdList = await GetUserOrgIdList();
-        if (!_userManager.SuperAdmin)
+        if (!_userManager.SuperAdmin && input.Pid != 0)
         {
             // 新增机构父Id不是0,则进行权限校验
-            if (input.Pid != 0)
+            var orgIdList = await GetUserOrgIdList();
+            // 新增机构的父机构不在自己的数据范围内
+            if (orgIdList.Count < 1 || !orgIdList.Contains(input.Pid))
+                throw Oops.Oh(ErrorCodeEnum.D2003);
+
+            // 删除与此父机构有关的用户机构缓存
+            var userOrgKeyList = _sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserOrg);
+            if (userOrgKeyList != null && userOrgKeyList.Count > 0)
             {
-                // 新增机构的父机构不在自己的数据范围内
-                if (orgIdList.Count < 1 || !orgIdList.Contains(input.Pid))
-                    throw Oops.Oh(ErrorCodeEnum.D2003);
+                var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
+                foreach (var userOrgKey in userOrgKeyList)
+                {
+                    var userOrgs = _sysCacheService.Get<List<long>>(userOrgKey);
+                    if (userOrgs.Contains(pOrg.Id))
+                    {
+                        var userId = long.Parse(userOrgKey.Substring(CacheConst.KeyUserOrg));
+                        SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId);
+                    }
+                }
             }
-            //else
-            //    throw Oops.Oh(ErrorCodeEnum.D2006);
-
-            // 删除当前用户机构缓存
-            _sysCacheService.Remove($"{CacheConst.KeyUserOrg}{_userManager.UserId}");
         }
-        var sysOrg = input.Adapt<SysOrg>();
-        var newOrg = await _sysOrgRep.AsInsertable(sysOrg).ExecuteReturnEntityAsync();
+
+        var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
         return newOrg.Id;
     }
 
@@ -122,8 +131,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         if (input.Id == input.Pid)
             throw Oops.Oh(ErrorCodeEnum.D2001);
 
-        var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id);
-        if (isExist)
+        if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
             throw Oops.Oh(ErrorCodeEnum.D2002);
 
         // 父Id不能为自己的子节点
@@ -186,6 +194,21 @@ public class SysOrgService : IDynamicApiController, ITransient
         if (cOrgHasEmp)
             throw Oops.Oh(ErrorCodeEnum.D2007);
 
+        // 删除与此机构、父机构有关的用户机构缓存
+        var userOrgKeyList = _sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserOrg);
+        if (userOrgKeyList != null && userOrgKeyList.Count > 0)
+        {
+            foreach (var userOrgKey in userOrgKeyList)
+            {
+                var userOrgs = _sysCacheService.Get<List<long>>(userOrgKey);
+                if (userOrgs.Contains(sysOrg.Id) || userOrgs.Contains(sysOrg.Pid))
+                {
+                    var userId = long.Parse(userOrgKey.Substring(CacheConst.KeyUserOrg));
+                    SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId);
+                }
+            }
+        }
+
         // 级联删除机构子节点
         await _sysOrgRep.DeleteAsync(u => orgIdList.Contains(u.Id));
 

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -168,7 +168,7 @@ public class SysRoleService : IDynamicApiController, ITransient
         var userIdList = await _sysUserRoleService.GetUserIdList(input.Id);
         foreach (var userId in userIdList)
         {
-            SqlSugarFilter.DeleteUserOrgCache(input.Id, _sysRoleRep.Context.CurrentConnectionConfig.ConfigId);
+            SqlSugarFilter.DeleteUserOrgCache(userId, _sysRoleRep.Context.CurrentConnectionConfig.ConfigId);
         }
 
         var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);