Parcourir la source

保存角色数据范围

zhontai il y a 2 ans
Parent
commit
a485ba8c58

+ 16 - 0
src/platform/ZhonTai.Admin/Domain/Org/OrgEntity.cs

@@ -3,6 +3,7 @@ using FreeSql.DataAnnotations;
 using System.Collections.Generic;
 using ZhonTai.Admin.Domain.Staff;
 using ZhonTai.Admin.Domain.User;
+using ZhonTai.Admin.Domain.Role;
 
 namespace ZhonTai.Admin.Domain.Org;
 
@@ -63,12 +64,27 @@ public partial class OrgEntity : EntityFull, ITenant
     /// </summary>
 	public int Sort { get; set; }
 
+    /// <summary>
+    /// 员工列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(UserOrgEntity))]
     public ICollection<StaffEntity> Staffs { get; set; }
 
+    /// <summary>
+    /// 用户列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(UserOrgEntity))]
     public ICollection<UserEntity> Users { get; set; }
 
+    /// <summary>
+    /// 角色列表
+    /// </summary>
+    [Navigate(ManyToMany = typeof(RoleOrgEntity))]
+    public ICollection<RoleEntity> Roles { get; set; }
+
+    /// <summary>
+    /// 子级列表
+    /// </summary>
     [Navigate(nameof(ParentId))]
     public List<OrgEntity> Childs { get; set; }
 }

+ 12 - 0
src/platform/ZhonTai.Admin/Domain/Role/RoleEntity.cs

@@ -65,9 +65,21 @@ public partial class RoleEntity : EntityFull, ITenant
     /// </summary>
 	public int Sort { get; set; }
 
+    /// <summary>
+    /// 用户列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(UserRoleEntity))]
     public ICollection<UserEntity> Users { get; set; }
 
+    /// <summary>
+    /// 部门列表
+    /// </summary>
+    [Navigate(ManyToMany = typeof(RoleOrgEntity))]
+    public ICollection<OrgEntity> Orgs { get; set; }
+
+    /// <summary>
+    /// 权限列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(RolePermissionEntity))]
     public ICollection<PermissionEntity> Permissions { get; set; }
 }

+ 3 - 0
src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs

@@ -99,6 +99,9 @@ public partial class UserEntity : EntityFull, ITenant
     [Navigate(ManyToMany = typeof(UserRoleEntity))]
     public ICollection<RoleEntity> Roles { get; set; }
 
+    /// <summary>
+    /// 部门列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(UserOrgEntity))]
     public ICollection<OrgEntity> Orgs { get; set; }
 

+ 22 - 1
src/platform/ZhonTai.Admin/Services/Role/Dto/RoleAddInput.cs

@@ -1,4 +1,9 @@
-namespace ZhonTai.Admin.Services.Role.Dto;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using ZhonTai.Admin.Domain.Org;
+using ZhonTai.Admin.Domain.Role;
+
+namespace ZhonTai.Admin.Services.Role.Dto;
 
 /// <summary>
 /// 添加
@@ -20,6 +25,22 @@ public class RoleAddInput
     /// </summary>
     public string Code { get; set; }
 
+    /// <summary>
+    /// 数据范围
+    /// </summary>
+    public DataScope DataScope { get; set; }
+
+    /// <summary>
+    /// 指定部门
+    /// </summary>
+    public long[] OrgIds { get; set; }
+
+    /// <summary>
+    /// 部门列表
+    /// </summary>
+    [JsonIgnore]
+    public ICollection<OrgEntity> Orgs { get; set; }
+
     /// <summary>
     /// 说明
     /// </summary>

+ 35 - 4
src/platform/ZhonTai.Admin/Services/Role/RoleService.cs

@@ -13,6 +13,9 @@ using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Attributes;
 using ZhonTai.Admin.Domain.UserRole;
 using ZhonTai.Admin.Domain.User;
+using ZhonTai.Admin.Domain;
+using ZhonTai.Admin.Domain.Org;
+using ZhonTai.Admin.Services.User.Dto;
 
 namespace ZhonTai.Admin.Services.Role;
 
@@ -24,8 +27,10 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
 {
     private IRoleRepository _roleRepository => LazyGetRequiredService<IRoleRepository>();
     private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
+
     private IRepositoryBase<UserRoleEntity> _userRoleRepository => LazyGetRequiredService<IRepositoryBase<UserRoleEntity>>();
     private IRepositoryBase<RolePermissionEntity> _rolePermissionRepository => LazyGetRequiredService<IRepositoryBase<RolePermissionEntity>>();
+    private IRepositoryBase<RoleOrgEntity> _roleOrgRepository => LazyGetRequiredService<IRepositoryBase<RoleOrgEntity>>();
 
     public RoleService()
     {
@@ -38,8 +43,14 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     /// <returns></returns>
     public async Task<IResultOutput> GetAsync(long id)
     {
-        var result = await _roleRepository.GetAsync<RoleGetOutput>(id);
-        return ResultOutput.Ok(result);
+        var roleEntity = await _roleRepository.Select
+        .WhereDynamic(id)
+        .IncludeMany(a => a.Orgs.Select(b => new OrgEntity { Id = b.Id }))
+        .ToOneAsync(a => new RoleGetOutput { Orgs = a.Orgs });
+
+        var output = Mapper.Map<RoleGetOutput>(roleEntity);
+
+        return ResultOutput.Ok(output);
     }
 
     /// <summary>
@@ -138,6 +149,15 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
         return ResultOutput.Ok();
     }
 
+    private async Task AddRoleOrgAsync(long roleId, long[] orgIds)
+    {
+        if (orgIds != null && orgIds.Any())
+        {
+            var roleOrgs = orgIds.Select(orgId => new RoleOrgEntity { RoleId = roleId, OrgId = orgId }).ToList();
+            await _roleOrgRepository.InsertAsync(roleOrgs);
+        }
+    }
+
     /// <summary>
     /// 添加
     /// </summary>
@@ -161,9 +181,14 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
             var sort = await _roleRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort);
             entity.Sort = sort + 1;
         }
-        var id = (await _roleRepository.InsertAsync(entity)).Id;
 
-        return ResultOutput.Result(id > 0);
+        await _roleRepository.InsertAsync(entity);
+        if (input.DataScope == DataScope.Custom)
+        {
+            await AddRoleOrgAsync(entity.Id, input.OrgIds);
+        }
+
+        return ResultOutput.Ok();
     }
 
     /// <summary>
@@ -186,6 +211,12 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
 
         Mapper.Map(input, entity);
         await _roleRepository.UpdateAsync(entity);
+        await _roleOrgRepository.DeleteAsync(a => a.RoleId == entity.Id);
+        if (input.DataScope == DataScope.Custom)
+        {
+            await AddRoleOrgAsync(entity.Id, input.OrgIds);
+        }
+
         return ResultOutput.Ok();
     }
 

+ 18 - 0
src/platform/ZhonTai.Admin/Services/Role/_MapConfig.cs

@@ -0,0 +1,18 @@
+using Mapster;
+using System.Linq;
+using ZhonTai.Admin.Services.Role.Dto;
+
+namespace ZhonTai.Admin.Services.Role;
+
+/// <summary>
+/// 映射配置
+/// </summary>
+public class MapConfig : IRegister
+{
+    public void Register(TypeAdapterConfig config)
+    {
+        config
+        .NewConfig<RoleGetOutput, RoleGetOutput>()
+        .Map(dest => dest.OrgIds, src => src.Orgs.Select(a => a.Id));
+    }
+}

+ 7 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/UserGetOrgDto.cs

@@ -0,0 +1,7 @@
+namespace ZhonTai.Admin.Services.User.Dto;
+
+public class UserGetOrgDto
+{
+    public long Id { get; set; }
+    public string Name { get; set; }
+}

+ 7 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/UserGetRoleDto.cs

@@ -0,0 +1,7 @@
+namespace ZhonTai.Admin.Services.User.Dto;
+
+public class UserGetRoleDto
+{
+    public long Id { get; set; }
+    public string Name { get; set; }
+}

+ 5 - 4
src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateInput.cs

@@ -1,7 +1,5 @@
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using ZhonTai.Admin.Domain.Org;
-using ZhonTai.Admin.Domain.Role;
 using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Services.User.Dto;
@@ -46,14 +44,17 @@ public partial class UserUpdateInput
     /// <summary>
     /// 角色
     /// </summary>
-    public ICollection<RoleEntity> Roles { get; set; }
+    public ICollection<UserGetRoleDto> Roles { get; set; }
 
     /// <summary>
     /// 所属部门
     /// </summary>
     public long[] OrgIds { get; set; }
 
-    public ICollection<OrgEntity> Orgs { get; set; }
+    /// <summary>
+    /// 部门列表
+    /// </summary>
+    public ICollection<UserGetOrgDto> Orgs { get; set; }
 
     /// <summary>
     /// 主属部门Id

+ 25 - 8
src/platform/ZhonTai.Admin/Services/User/UserService.cs

@@ -56,11 +56,11 @@ public class UserService : BaseService, IUserService, IDynamicApi
     /// <returns></returns>
     public async Task<IResultOutput> GetAsync(long id)
     {
-        var output = await _userRepository.Select
+        var userEntity = await _userRepository.Select
         .WhereDynamic(id)
         .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Id = b.Id, Name = b.Name }))
         .IncludeMany(a => a.Orgs.Select(b => new OrgEntity { Id = b.Id, Name = b.Name }))
-        .ToOneAsync(a=>new
+        .ToOneAsync(a => new
         {
             a.Id,
             a.Version,
@@ -81,6 +81,8 @@ public class UserService : BaseService, IUserService, IDynamicApi
             }
         });
 
+        var output = Mapper.Map<UserGetOutput>(userEntity);
+
         return ResultOutput.Ok(output);
     }
 
@@ -119,10 +121,13 @@ public class UserService : BaseService, IUserService, IDynamicApi
     public async Task<ResultOutput<AuthLoginOutput>> GetLoginUserAsync(long id)
     {
         var output = new ResultOutput<AuthLoginOutput>();
-        var entityDto = await _userRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(id).ToOneAsync<AuthLoginOutput>();
+        var entityDto = await _userRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
+            .WhereDynamic(id).ToOneAsync<AuthLoginOutput>();
+
         if (_appConfig.Tenant && entityDto?.TenantId.Value > 0)
         {
-            var tenant = await _tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(entityDto.TenantId).ToOneAsync(a => new { a.TenantType, a.DbKey });
+            var tenant = await _tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
+                .WhereDynamic(entityDto.TenantId).ToOneAsync(a => new { a.TenantType, a.DbKey });
             entityDto.TenantType = tenant.TenantType;
             entityDto.DbKey = tenant.DbKey;
         }
@@ -220,7 +225,11 @@ public class UserService : BaseService, IUserService, IDynamicApi
         //用户角色
         if (input.RoleIds != null && input.RoleIds.Any())
         {
-            var roles = input.RoleIds.Select(roleId => new UserRoleEntity { UserId = userId, RoleId = roleId }).ToList();
+            var roles = input.RoleIds.Select(roleId => new UserRoleEntity 
+            { 
+                UserId = userId, 
+                RoleId = roleId 
+            }).ToList();
             await _userRoleRepository.InsertAsync(roles);
         }
 
@@ -281,7 +290,11 @@ public class UserService : BaseService, IUserService, IDynamicApi
         await _userRoleRepository.DeleteAsync(a => a.UserId == userId);
         if (input.RoleIds != null && input.RoleIds.Any())
         {
-            var roles = input.RoleIds.Select(roleId => new UserRoleEntity { UserId = userId, RoleId = roleId }).ToList();
+            var roles = input.RoleIds.Select(roleId => new UserRoleEntity 
+            { 
+                UserId = userId, 
+                RoleId = roleId 
+            }).ToList();
             await _userRoleRepository.InsertAsync(roles);
         }
 
@@ -393,7 +406,9 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public virtual async Task<IResultOutput> BatchDeleteAsync(long[] ids)
     {
-        var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync();
+        var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && 
+        (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync();
+
         if (admin)
         {
             return ResultOutput.NotOk("平台管理员禁止删除");
@@ -446,7 +461,9 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public virtual async Task<IResultOutput> BatchSoftDeleteAsync(long[] ids)
     {
-        var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync();
+        var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && 
+        (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync();
+
         if (admin)
         {
             return ResultOutput.NotOk("平台管理员禁止删除");

+ 0 - 1
src/platform/ZhonTai.Admin/Services/User/_MapConfig.cs

@@ -1,6 +1,5 @@
 using Mapster;
 using System.Linq;
-using ZhonTai.Admin.Domain.User;
 using ZhonTai.Admin.Services.User.Dto;
 
 namespace ZhonTai.Admin.Services.User;

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

@@ -1962,6 +1962,26 @@
             排序
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.Org.OrgEntity.Staffs">
+            <summary>
+            员工列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Org.OrgEntity.Users">
+            <summary>
+            用户列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Org.OrgEntity.Roles">
+            <summary>
+            角色列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Org.OrgEntity.Childs">
+            <summary>
+            子级列表
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.PermissionApi.PermissionApiEntity">
             <summary>
             权限接口
@@ -2232,6 +2252,21 @@
             排序
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.Role.RoleEntity.Users">
+            <summary>
+            用户列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Role.RoleEntity.Orgs">
+            <summary>
+            部门列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Role.RoleEntity.Permissions">
+            <summary>
+            权限列表
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Staff.Input.StaffAddInput">
             <summary>
             添加
@@ -2612,6 +2647,11 @@
             角色列表
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Orgs">
+            <summary>
+            部门列表
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Staff">
             <summary>
             员工
@@ -4715,6 +4755,21 @@
             编码
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.Role.Dto.RoleAddInput.DataScope">
+            <summary>
+            数据范围
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Role.Dto.RoleAddInput.OrgIds">
+            <summary>
+            指定部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Role.Dto.RoleAddInput.Orgs">
+            <summary>
+            部门列表
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.Role.Dto.RoleAddInput.Description">
             <summary>
             说明
@@ -4904,6 +4959,11 @@
             <param name="ids"></param>
             <returns></returns>
         </member>
+        <member name="T:ZhonTai.Admin.Services.Role.MapConfig">
+            <summary>
+            映射配置
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.TaskScheduler.Dto.TaskAddInput">
             <summary>
             添加
@@ -5447,6 +5507,11 @@
             所属部门
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Orgs">
+            <summary>
+            部门列表
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.MainOrgId">
             <summary>
             主属部门Id