1
0
Pārlūkot izejas kodu

强化部门修改、删除判断逻辑

zhontai 2 gadi atpakaļ
vecāks
revīzija
49c52badfe

+ 23 - 1
src/platform/ZhonTai.Admin/Domain/Org/IOrgRepository.cs

@@ -1,7 +1,29 @@
-using ZhonTai.Admin.Core.Repositories;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Repositories;
 
 namespace ZhonTai.Admin.Domain.Org;
 
 public partial interface IOrgRepository : IRepositoryBase<OrgEntity>
 {
+    /// <summary>
+    /// 获得本部门和下级部门Id
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    Task<List<long>> GetChildIdListAsync(long id);
+
+    /// <summary>
+    /// 本部门下是否有员工
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    Task<bool> HasUser(long id);
+
+    /// <summary>
+    /// 本部门下是否有员工
+    /// </summary>
+    /// <param name="idList"></param>
+    /// <returns></returns>
+    Task<bool> HasUser(List<long> idList);
 }

+ 40 - 2
src/platform/ZhonTai.Admin/Repositories/Org/OrgRepository.cs

@@ -1,12 +1,50 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
+using ZhonTai.Admin.Domain;
 using ZhonTai.Admin.Domain.Org;
 
 namespace ZhonTai.Admin.Repositories;
 
 public class OrgRepository : RepositoryBase<OrgEntity>, IOrgRepository
 {
-    public OrgRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
+    private readonly IRepositoryBase<UserOrgEntity> _userOrgRepository;
+    public OrgRepository(UnitOfWorkManagerCloud uowm, IRepositoryBase<UserOrgEntity> userOrgRepository) : base(uowm)
     {
+        _userOrgRepository = userOrgRepository;
+    }
+
+    /// <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>
+    /// 本部门下是否有员工
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    public async Task<bool> HasUser(long id)
+    {
+        return await _userOrgRepository.Select.Where(a => a.OrgId == id).AnyAsync();
+    }
+
+    /// <summary>
+    /// 本部门下是否有员工
+    /// </summary>
+    /// <param name="idList"></param>
+    /// <returns></returns>
+    public async Task<bool> HasUser(List<long> idList)
+    {
+        return await _userOrgRepository.Select.Where(a => idList.Contains(a.OrgId)).AnyAsync();
     }
 }

+ 78 - 6
src/platform/ZhonTai.Admin/Services/Org/OrgService.cs

@@ -6,6 +6,9 @@ using ZhonTai.Admin.Domain.Org;
 using ZhonTai.Admin.Core.Consts;
 using ZhonTai.DynamicApi.Attributes;
 using ZhonTai.DynamicApi;
+using ZhonTai.Admin.Core.Repositories;
+using ZhonTai.Admin.Domain;
+using ZhonTai.Admin.Core.Attributes;
 
 namespace ZhonTai.Admin.Services.Org;
 
@@ -17,6 +20,8 @@ public class OrgService : BaseService, IOrgService, IDynamicApi
 {
     private readonly IOrgRepository _orgRepository;
 
+    private IRepositoryBase<RoleOrgEntity> _roleOrgRepository => LazyGetRequiredService<IRepositoryBase<RoleOrgEntity>>();
+
     public OrgService(IOrgRepository orgRepository)
     {
         _orgRepository = orgRepository;
@@ -56,6 +61,16 @@ public class OrgService : BaseService, IOrgService, IDynamicApi
     /// <returns></returns>
     public async Task<IResultOutput> AddAsync(OrgAddInput input)
     {
+        if (await _orgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Name == input.Name))
+        {
+            return ResultOutput.NotOk($"此部门已存在");
+        }
+
+        if (input.Code.NotNull() && await _orgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Code == input.Code))
+        {
+            return ResultOutput.NotOk($"此部门编码已存在");
+        }
+
         var dictionary = Mapper.Map<OrgEntity>(input);
         var id = (await _orgRepository.InsertAsync(dictionary)).Id;
         return ResultOutput.Result(id > 0);
@@ -76,7 +91,28 @@ public class OrgService : BaseService, IOrgService, IDynamicApi
         var entity = await _orgRepository.GetAsync(input.Id);
         if (!(entity?.Id > 0))
         {
-            return ResultOutput.NotOk("数据字典不存在!");
+            return ResultOutput.NotOk("部门不存在");
+        }
+
+        if (input.Id == input.ParentId)
+        {
+            return ResultOutput.NotOk("上级部门不能是本部门");
+        }
+
+        if (await _orgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Name == input.Name))
+        {
+            return ResultOutput.NotOk($"此部门已存在");
+        }
+
+        if (input.Code.NotNull() && await _orgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Code == input.Code))
+        {
+            return ResultOutput.NotOk($"此部门编码已存在");
+        }
+
+        var childIdList = await _orgRepository.GetChildIdListAsync(input.Id);
+        if (childIdList.Contains(input.ParentId))
+        {
+            return ResultOutput.NotOk($"上级部门不能是下级部门");
         }
 
         Mapper.Map(input, entity);
@@ -89,22 +125,58 @@ public class OrgService : BaseService, IOrgService, IDynamicApi
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
+    [Transaction]
     public async Task<IResultOutput> DeleteAsync(long id)
     {
-        var result = await _orgRepository.DeleteRecursiveAsync(a => a.Id == id);
+        //本部门下是否有员工
+        if(await _orgRepository.HasUser(id))
+        {
+            return ResultOutput.NotOk($"当前部门有员工无法删除");
+        }
 
-        return ResultOutput.Result(result);
+        var orgIdList = await _orgRepository.GetChildIdListAsync(id);
+        //本部门的下级部门下是否有员工
+        if (await _orgRepository.HasUser(orgIdList))
+        {
+            return ResultOutput.NotOk($"本部门的下级部门有员工无法删除");
+        }
+
+        //删除部门角色
+        await _roleOrgRepository.DeleteAsync(a => orgIdList.Contains(a.OrgId));
+
+        //删除本部门和下级部门
+        await _orgRepository.DeleteAsync(a => orgIdList.Contains(a.Id));
+
+        return ResultOutput.Ok();
     }
 
     /// <summary>
-    /// 批量删除
+    /// 删除
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
+    [Transaction]
     public async Task<IResultOutput> SoftDeleteAsync(long id)
     {
-        var result = await _orgRepository.SoftDeleteRecursiveAsync(a => a.Id == id);
+        //本部门下是否有员工
+        if (await _orgRepository.HasUser(id))
+        {
+            return ResultOutput.NotOk($"当前部门有员工无法删除");
+        }
+
+        var orgIdList = await _orgRepository.GetChildIdListAsync(id);
+        //本部门的下级部门下是否有员工
+        if (await _orgRepository.HasUser(orgIdList))
+        {
+            return ResultOutput.NotOk($"本部门的下级部门有员工无法删除");
+        }
+
+        //删除部门角色
+        await _roleOrgRepository.SoftDeleteAsync(a => orgIdList.Contains(a.OrgId));
 
-        return ResultOutput.Result(result);
+        //删除本部门和下级部门
+        await _orgRepository.SoftDeleteAsync(a => orgIdList.Contains(a.Id));
+
+        return ResultOutput.Ok();
     }
 }

+ 17 - 2
src/platform/ZhonTai.Admin/Services/Role/RoleService.cs

@@ -15,7 +15,6 @@ 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;
 
@@ -206,7 +205,17 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
         var entity = await _roleRepository.GetAsync(input.Id);
         if (!(entity?.Id > 0))
         {
-            return ResultOutput.NotOk("角色不存在!");
+            return ResultOutput.NotOk("角色不存在");
+        }
+
+        if (await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Name == input.Name))
+        {
+            return ResultOutput.NotOk($"此{(input.ParentId == 0 ? "分组" : "角色")}已存在");
+        }
+
+        if (input.Code.NotNull() && await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Code == input.Code))
+        {
+            return ResultOutput.NotOk($"此{(input.ParentId == 0 ? "分组" : "角色")}编码已存在");
         }
 
         Mapper.Map(input, entity);
@@ -228,8 +237,11 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [Transaction]
     public virtual async Task<IResultOutput> DeleteAsync(long id)
     {
+        //删除用户角色
         await _userRoleRepository.DeleteAsync(a => a.UserId == id);
+        //删除角色权限
         await _rolePermissionRepository.DeleteAsync(a => a.RoleId == id);
+        //删除角色
         await _roleRepository.DeleteAsync(m => m.Id == id);
 
         return ResultOutput.Ok();
@@ -243,8 +255,11 @@ public class RoleService : BaseService, IRoleService, IDynamicApi
     [Transaction]
     public virtual async Task<IResultOutput> BatchDeleteAsync(long[] ids)
     {
+        //删除用户角色
         await _userRoleRepository.DeleteAsync(a => ids.Contains(a.RoleId));
+        //删除角色权限
         await _rolePermissionRepository.DeleteAsync(a => ids.Contains(a.RoleId));
+        //删除角色
         await _roleRepository.DeleteAsync(a => ids.Contains(a.Id));
 
         return ResultOutput.Ok();

+ 43 - 1
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -2009,6 +2009,27 @@
             操作参数
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Domain.Org.IOrgRepository.GetChildIdListAsync(System.Int64)">
+            <summary>
+            获得本部门和下级部门Id
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Domain.Org.IOrgRepository.HasUser(System.Int64)">
+            <summary>
+            本部门下是否有员工
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Domain.Org.IOrgRepository.HasUser(System.Collections.Generic.List{System.Int64})">
+            <summary>
+            本部门下是否有员工
+            </summary>
+            <param name="idList"></param>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Org.OrgEntity">
             <summary>
             组织架构
@@ -2934,6 +2955,27 @@
             任务名称名称
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Repositories.OrgRepository.GetChildIdListAsync(System.Int64)">
+            <summary>
+            获得本部门和下级部门Id
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Repositories.OrgRepository.HasUser(System.Int64)">
+            <summary>
+            本部门下是否有员工
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:ZhonTai.Admin.Repositories.OrgRepository.HasUser(System.Collections.Generic.List{System.Int64})">
+            <summary>
+            本部门下是否有员工
+            </summary>
+            <param name="idList"></param>
+            <returns></returns>
+        </member>
         <member name="M:ZhonTai.Admin.Repositories.UserRepository.GetCurrentUserAsync">
             <summary>
             获得当前登录用户
@@ -4408,7 +4450,7 @@
         </member>
         <member name="M:ZhonTai.Admin.Services.Org.OrgService.SoftDeleteAsync(System.Int64)">
             <summary>
-            批量删除
+            删除
             </summary>
             <param name="id"></param>
             <returns></returns>