using Microsoft.AspNetCore.Mvc; using SqlSugar; using Volo.Abp.Application.Dtos; using Yi.Framework.Ddd.Application; using Yi.Framework.Rbac.Application.Contracts.Dtos.Dept; using Yi.Framework.Rbac.Application.Contracts.IServices; using Yi.Framework.Rbac.Domain.Entities; using Yi.Framework.Rbac.Domain.Repositories; using Yi.Framework.Rbac.Domain.Shared.Consts; using Yi.Framework.Rbac.Domain.Shared.Dtos; namespace Yi.Framework.Rbac.Application.Services.System { /// /// Dept服务实现 /// public class DeptService : YiCrudAppService, IDeptService { private IDeptRepository _repository; public DeptService(IDeptRepository repository) : base(repository) { _repository = repository; } [RemoteService(false)] public async Task> GetChildListAsync(Guid deptId) { return await _repository.GetChildListAsync(deptId); } /// /// 通过角色id查询该角色全部部门 /// /// //[Route("{roleId}")] public async Task> GetRoleIdAsync(Guid roleId) { var entities = await _repository.GetListRoleIdAsync(roleId); return await MapToGetListOutputDtosAsync(entities); } /// /// 多查 /// /// /// public override async Task> GetListAsync(DeptGetListInputVo input) { RefAsync total = 0; var entities = await _repository._DbQueryable .WhereIF(!string.IsNullOrEmpty(input.DeptName), u => u.DeptName.Contains(input.DeptName!)) .WhereIF(input.State is not null, u => u.State == input.State) .OrderBy(u => u.OrderNum, OrderByType.Asc) .ToListAsync(); return new PagedResultDto { Items = await MapToGetListOutputDtosAsync(entities), TotalCount = total }; } protected override async Task CheckCreateInputDtoAsync(DeptCreateInputVo input) { var isExist = await _repository.IsAnyAsync(x => x.DeptCode == input.DeptCode); if (isExist) { throw new UserFriendlyException(DeptConst.Exist); } } protected override async Task CheckUpdateInputDtoAsync(DeptAggregateRoot entity, DeptUpdateInputVo input) { var isExist = await _repository._DbQueryable.Where(x => x.Id != entity.Id) .AnyAsync(x => x.DeptCode == input.DeptCode); if (isExist) { throw new UserFriendlyException(DeptConst.Exist); } } /// /// 多查 /// /// /// [Route("dept/list")] public async Task> GetAllListAsync(DeptGetListInputVo input) { var entities = await _repository._DbQueryable .WhereIF(!string.IsNullOrEmpty(input.DeptName), u => u.DeptName.Contains(input.DeptName!)) .WhereIF(input.State is not null, u => u.State == input.State) .OrderBy(u => u.OrderNum, OrderByType.Asc) .ToListAsync(); return await MapToGetListOutputDtosAsync(entities); } /// /// 获取树形结构的部门列表 /// /// 树形结构的部门列表 public async Task> GetTreeAsync() { // 获取所有启用的部门 var entities = await _repository._DbQueryable .Where(x => x.State == true) .OrderBy(x => x.OrderNum, OrderByType.Asc) .ToListAsync(); return entities.DeptTreeBuild(); } /// /// 获取排除指定部门及其子孙部门的部门列表 /// /// 要排除的部门ID /// 排除后的部门列表 [HttpGet] [Route("dept/list/exclude/{id}")] public async Task> GetListExcludeAsync(Guid id) { // 获取要排除的部门及其所有子孙部门的ID var excludeIds = await GetAllChildrenIdsAsync(id); excludeIds.Add(id); // 同时排除自己 // 查询并过滤掉排除的部门 var result = await _repository._DbQueryable .Where(x => !excludeIds.Contains(x.Id)) .OrderBy(dept => dept.OrderNum, OrderByType.Asc) .Select(dept => new DeptGetListOutputDto { Id = dept.Id, CreationTime = dept.CreationTime, CreatorId = dept.CreatorId, State = dept.State, DeptName = dept.DeptName, DeptCode = dept.DeptCode, Leader = dept.Leader, ParentId = dept.ParentId, Remark = dept.Remark, OrderNum = dept.OrderNum }) .ToListAsync(); return result; } /// /// 递归获取指定部门的所有子孙部门ID /// /// 部门ID /// 所有子孙部门ID列表 private async Task> GetAllChildrenIdsAsync(Guid deptId) { var result = new List(); // 获取所有部门 var allDepts = await _repository._DbQueryable.ToListAsync(); // 递归获取子孙部门ID GetChildrenIdsRecursive(deptId, allDepts, result); return result; } /// /// 递归辅助方法:获取子孙部门ID /// /// 父部门ID /// 所有部门列表 /// 结果列表 private void GetChildrenIdsRecursive(Guid parentId, List allDepts, List result) { // 查找直接子部门 var children = allDepts.Where(x => x.ParentId == parentId).ToList(); foreach (var child in children) { // 添加子部门ID result.Add(child.Id); // 递归获取子部门的子部门 GetChildrenIdsRecursive(child.Id, allDepts, result); } } } }