using ZhonTai.Admin.Core.Dto;
using ZhonTai.Admin.Services.Org.Input;
using ZhonTai.Admin.Services.Org.Output;
using System.Threading.Tasks;
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;
///
/// 部门服务
///
[DynamicApi(Area = AdminConsts.AreaName)]
public class OrgService : BaseService, IOrgService, IDynamicApi
{
private readonly IOrgRepository _orgRepository;
private IRepositoryBase _roleOrgRepository => LazyGetRequiredService>();
public OrgService(IOrgRepository orgRepository)
{
_orgRepository = orgRepository;
}
///
/// 查询部门
///
///
///
public async Task GetAsync(long id)
{
var result = await _orgRepository.GetAsync(id);
return ResultOutput.Ok(result);
}
///
/// 查询列表
///
///
///
public async Task GetListAsync(string key)
{
var data = await _orgRepository
.WhereIf(key.NotNull(), a => a.Name.Contains(key) || a.Code.Contains(key))
.OrderBy(a => a.ParentId)
.OrderBy(a => a.Sort)
.ToListAsync();
return ResultOutput.Ok(data);
}
///
/// 新增
///
///
///
public async Task 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(input);
var id = (await _orgRepository.InsertAsync(dictionary)).Id;
return ResultOutput.Result(id > 0);
}
///
/// 修改
///
///
///
public async Task UpdateAsync(OrgUpdateInput input)
{
if (!(input?.Id > 0))
{
return ResultOutput.NotOk();
}
var entity = await _orgRepository.GetAsync(input.Id);
if (!(entity?.Id > 0))
{
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);
await _orgRepository.UpdateAsync(entity);
return ResultOutput.Ok();
}
///
/// 彻底删除
///
///
///
[Transaction]
public async Task DeleteAsync(long 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.DeleteAsync(a => orgIdList.Contains(a.OrgId));
//删除本部门和下级部门
await _orgRepository.DeleteAsync(a => orgIdList.Contains(a.Id));
return ResultOutput.Ok();
}
///
/// 删除
///
///
///
[Transaction]
public async Task SoftDeleteAsync(long 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));
//删除本部门和下级部门
await _orgRepository.SoftDeleteAsync(a => orgIdList.Contains(a.Id));
return ResultOutput.Ok();
}
}