Просмотр исходного кода

修复角色彻底删除、假删除、批量彻底删除、批量假删除没有删除角色下所有角色关联的数据
角色仓储新增GetChildIdListAsync获得本角色和下级角色Id方法

zhontai 2 лет назад
Родитель
Сommit
592bb78153

+ 16 - 1
src/platform/ZhonTai.Admin/Domain/Role/IRoleRepository.cs

@@ -1,7 +1,22 @@
-using ZhonTai.Admin.Core.Repositories;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Repositories;
 
 namespace ZhonTai.Admin.Domain.Role;
 
 public interface IRoleRepository : IRepositoryBase<RoleEntity>
 {
+    /// <summary>
+    /// 获得本角色和下级角色Id
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    Task<List<long>> GetChildIdListAsync(long id);
+
+    /// <summary>
+    /// 获得当前角色和下级角色Id
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    Task<List<long>> GetChildIdListAsync(long[] ids);
 }

+ 30 - 1
src/platform/ZhonTai.Admin/Repositories/Role/RoleRepository.cs

@@ -1,4 +1,7 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Domain.Role;
 
 namespace ZhonTai.Admin.Repositories;
@@ -8,4 +11,30 @@ public class RoleRepository : AdminRepositoryBase<RoleEntity>, IRoleRepository
     public RoleRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
+
+    /// <summary>
+    /// 获得本角色和下级角色Id
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    public async Task<List<long>> GetChildIdListAsync(long id)
+    {
+        return await Select
+        .Where(a => a.Id == id)
+        .AsTreeCte()
+        .ToListAsync(a => a.Id);
+    }
+
+    /// <summary>
+    /// 获得当前角色和下级角色Id
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    public async Task<List<long>> GetChildIdListAsync(long[] ids)
+    {
+        return await Select
+        .Where(a => ids.Contains(a.Id))
+        .AsTreeCte()
+        .ToListAsync(a => a.Id);
+    }
 }

+ 20 - 14
src/platform/ZhonTai.Admin/Services/Role/RoleService.cs

@@ -16,6 +16,7 @@ using ZhonTai.Admin.Domain;
 using ZhonTai.Admin.Domain.Org;
 using ZhonTai.Admin.Domain.RoleOrg;
 using System.Collections.Generic;
+using ZhonTai.Admin.Repositories;
 
 namespace ZhonTai.Admin.Services.Role;
 
@@ -250,14 +251,15 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [AdminTransaction]
     public virtual async Task DeleteAsync(long id)
     {
-        var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == id).ToListAsync(a => a.UserId);
+        var roleIdList = await _roleRepository.GetChildIdListAsync(id);
+        var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId);
 
         //删除用户角色
         await _userRoleRepository.DeleteAsync(a => a.UserId == id);
         //删除角色权限
-        await _rolePermissionRepository.DeleteAsync(a => a.RoleId == id);
+        await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
         //删除角色
-        await _roleRepository.DeleteAsync(m => m.Id == id);
+        await _roleRepository.DeleteAsync(a => roleIdList.Contains(a.Id));
         
         foreach (var userId in userIds)
         {
@@ -273,13 +275,15 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [AdminTransaction]
     public virtual async Task BatchDeleteAsync(long[] ids)
     {
-        var userIds = await _userRoleRepository.Select.Where(a => ids.Contains(a.RoleId)).ToListAsync(a => a.UserId);
+        var roleIdList = await _roleRepository.GetChildIdListAsync(ids);
+        var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId);
+
         //删除用户角色
-        await _userRoleRepository.DeleteAsync(a => ids.Contains(a.RoleId));
+        await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
         //删除角色权限
-        await _rolePermissionRepository.DeleteAsync(a => ids.Contains(a.RoleId));
+        await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
         //删除角色
-        await _roleRepository.DeleteAsync(a => ids.Contains(a.Id));
+        await _roleRepository.Where(a => roleIdList.Contains(a.Id)).AsTreeCte().ToDelete().ExecuteAffrowsAsync();
 
         foreach (var userId in userIds)
         {
@@ -295,10 +299,11 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [AdminTransaction]
     public virtual async Task SoftDeleteAsync(long id)
     {
-        var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == id).ToListAsync(a => a.UserId);
-        await _userRoleRepository.DeleteAsync(a => a.RoleId == id);
-        await _rolePermissionRepository.DeleteAsync(a => a.RoleId == id);
-        await _roleRepository.SoftDeleteAsync(id);
+        var roleIdList = await _roleRepository.GetChildIdListAsync(id);
+        var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId);
+        await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
+        await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
+        await _roleRepository.SoftDeleteRecursiveAsync(a => roleIdList.Contains(a.Id));
         foreach (var userId in userIds)
         {
             await Cache.DelAsync(CacheKeys.DataPermission + userId);
@@ -313,10 +318,11 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [AdminTransaction]
     public virtual async Task BatchSoftDeleteAsync(long[] ids)
     {
+        var roleIdList = await _roleRepository.GetChildIdListAsync(ids);
         var userIds = await _userRoleRepository.Select.Where(a => ids.Contains(a.RoleId)).ToListAsync(a => a.UserId);
-        await _userRoleRepository.DeleteAsync(a => ids.Contains(a.RoleId));
-        await _rolePermissionRepository.DeleteAsync(a => ids.Contains(a.RoleId));
-        await _roleRepository.SoftDeleteAsync(ids);
+        await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
+        await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId));
+        await _roleRepository.SoftDeleteRecursiveAsync(a => roleIdList.Contains(a.Id));
         foreach (var userId in userIds)
         {
             await Cache.DelAsync(CacheKeys.DataPermission + userId);

+ 28 - 0
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -2438,6 +2438,20 @@
             角色Id
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Domain.Role.IRoleRepository.GetChildIdListAsync(System.Int64)">
+            <summary>
+            获得本角色和下级角色Id
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Domain.Role.IRoleRepository.GetChildIdListAsync(System.Int64[])">
+            <summary>
+            获得当前角色和下级角色Id
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Role.RoleEntity">
             <summary>
             角色
@@ -3065,6 +3079,20 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Repositories.RoleRepository.GetChildIdListAsync(System.Int64)">
+            <summary>
+            获得本角色和下级角色Id
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Repositories.RoleRepository.GetChildIdListAsync(System.Int64[])">
+            <summary>
+            获得当前角色和下级角色Id
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
+        </member>
         <member name="M:ZhonTai.Admin.Repositories.UserOrgRepository.HasUser(System.Int64)">
             <summary>
             本部门下是否有员工