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);
}
}
}
}