ソースを参照

😁优化机构变化时-删除对应的用户机构缓存代码

zuohuaijun 2 年 前
コミット
205f22ca79
1 ファイル変更43 行追加34 行削除
  1. 43 34
      Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

+ 43 - 34
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -93,20 +93,8 @@ public class SysOrgService : IDynamicApiController, ITransient
                 throw Oops.Oh(ErrorCodeEnum.D2003);
 
             // 删除与此父机构有关的用户机构缓存
-            var userOrgKeyList = _sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserOrg);
-            if (userOrgKeyList != null && userOrgKeyList.Count > 0)
-            {
-                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);
-                    }
-                }
-            }
+            var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
+            DeleteUserOrgCache(pOrg.Id, pOrg.Pid);
         }
 
         var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
@@ -125,8 +113,16 @@ public class SysOrgService : IDynamicApiController, ITransient
     {
         if (input.Pid != 0)
         {
-            var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
-            _ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000);
+            //var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid);
+            //_ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000);
+
+            // 若父机构发生变化则清空用户机构缓存
+            var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id);
+            if (sysOrg != null && sysOrg.Pid != input.Pid)
+            {
+                // 删除与此机构、新父机构有关的用户机构缓存
+                DeleteUserOrgCache(sysOrg.Id, input.Pid);
+            }
         }
         if (input.Id == input.Pid)
             throw Oops.Oh(ErrorCodeEnum.D2001);
@@ -140,9 +136,12 @@ public class SysOrgService : IDynamicApiController, ITransient
             throw Oops.Oh(ErrorCodeEnum.D2001);
 
         // 是否有权限操作此机构
-        var dataScopes = await GetUserOrgIdList();
-        if (!_userManager.SuperAdmin && (dataScopes.Count < 1 || !dataScopes.Contains(input.Id)))
-            throw Oops.Oh(ErrorCodeEnum.D2003);
+        if (!_userManager.SuperAdmin)
+        {
+            var orgIdList = await GetUserOrgIdList();
+            if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id))
+                throw Oops.Oh(ErrorCodeEnum.D2003);
+        }
 
         await _sysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync();
     }
@@ -162,8 +161,8 @@ public class SysOrgService : IDynamicApiController, ITransient
         // 是否有权限操作此机构
         if (!_userManager.SuperAdmin)
         {
-            var dataScopes = await GetUserOrgIdList();
-            if (dataScopes.Count < 1 || !dataScopes.Contains(sysOrg.Id))
+            var orgIdList = await GetUserOrgIdList();
+            if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id))
                 throw Oops.Oh(ErrorCodeEnum.D2003);
         }
 
@@ -185,38 +184,48 @@ public class SysOrgService : IDynamicApiController, ITransient
             throw Oops.Oh(ErrorCodeEnum.D2005);
 
         // 若子机构有用户则禁止删除
-        var orgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
-        var orgIdList = orgTreeList.Select(u => u.Id).ToList();
+        var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
+        var childOrgIdList = childOrgTreeList.Select(u => u.Id).ToList();
 
         // 若子机构有用户则禁止删除
         var cOrgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
-            .IsAnyAsync(u => orgIdList.Contains(u.OrgId));
+            .IsAnyAsync(u => childOrgIdList.Contains(u.OrgId));
         if (cOrgHasEmp)
             throw Oops.Oh(ErrorCodeEnum.D2007);
 
         // 删除与此机构、父机构有关的用户机构缓存
+        DeleteUserOrgCache(sysOrg.Id, sysOrg.Pid);
+
+        // 级联删除机构子节点
+        await _sysOrgRep.DeleteAsync(u => childOrgIdList.Contains(u.Id));
+
+        // 级联删除角色机构数据
+        await _sysRoleOrgService.DeleteRoleOrgByOrgIdList(childOrgIdList);
+
+        // 级联删除用户机构数据
+        await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(childOrgIdList);
+    }
+
+    /// <summary>
+    /// 删除与此机构、父机构有关的用户机构缓存
+    /// </summary>
+    /// <param name="orgId"></param>
+    /// <param name="orgPid"></param>
+    private void DeleteUserOrgCache(long orgId, long orgPid)
+    {
         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))
+                if (userOrgs.Contains(orgId) || userOrgs.Contains(orgPid))
                 {
                     var userId = long.Parse(userOrgKey.Substring(CacheConst.KeyUserOrg));
                     SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId);
                 }
             }
         }
-
-        // 级联删除机构子节点
-        await _sysOrgRep.DeleteAsync(u => orgIdList.Contains(u.Id));
-
-        // 级联删除角色机构数据
-        await _sysRoleOrgService.DeleteRoleOrgByOrgIdList(orgIdList);
-
-        // 级联删除用户机构数据
-        await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(orgIdList);
     }
 
     /// <summary>