You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

205 lines
9.0 KiB

using BaseService.BaseData.OrganizationManagement.Dto;
using BaseService.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace BaseService.BaseData.OrganizationManagement
{
[Authorize(BaseServicePermissions.Organization.Default)]
public class OrganizationAppService : ApplicationService, IOrganizationAppService
{
private readonly IRepository<Organization, Guid> _repository;
private readonly IRepository<UserOrganization> _userOrgRepository;
public OrganizationAppService(IRepository<Organization, Guid> repository, IRepository<UserOrganization> userOrgRepository)
{
_repository = repository;
_userOrgRepository = userOrgRepository;
}
[Authorize(BaseServicePermissions.Organization.Create)]
public async Task<OrganizationDto> Create(CreateOrUpdateOrganizationDto input)
{
var exist = await _repository.FirstOrDefaultAsync(_ => _.Name == input.Name);
if (exist != null) throw new BusinessException("名称:" + input.Name + "机构已存在");
var organization = new Organization(GuidGenerator.Create(),
CurrentTenant.Id,
input.CategoryId,
input.Pid,
input.Name,
"",
input.Sort,
true,
input.Enabled
);
var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
await ChangeOrganizationModel(organization, parent);
await _repository.InsertAsync(organization);
return ObjectMapper.Map<Organization, OrganizationDto>(organization);
}
[Authorize(BaseServicePermissions.Organization.Delete)]
public async Task Delete(List<Guid> ids)
{
foreach (var id in ids)
{
var org = await _repository.GetAsync(id);
var parentOrg = await _repository.FirstOrDefaultAsync(_ => _.Id == org.Pid);
await _repository.DeleteAsync(_ => _.CascadeId.Contains(org.CascadeId));
if (parentOrg != null)
parentOrg.Leaf = true;
}
}
public async Task<OrganizationDto> Get(Guid id)
{
var result = await _repository.GetAsync(id);
return ObjectMapper.Map<Organization, OrganizationDto>(result);
}
/// <summary>
/// 获取组织列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<PagedResultDto<OrganizationDto>> GetAll(GetOrganizationInputDto input)
{
var query = (await _repository.GetQueryableAsync())
.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter))
.WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId);
//var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id);
//var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList();
//foreach (var id in CascadeIds)
//{
// query = query.Where(_ => _.CascadeId.Contains(id));
//}
if (input.Pid.HasValue)
{
var org = await _repository.GetAsync(input.Pid.Value);
query = query.Where(_ => _.CascadeId.Contains(org.CascadeId));
}
var items = await query.OrderBy(input.Sorting ?? "Sort")
.Skip(input.SkipCount)
.Take(input.MaxResultCount)
.ToListAsync();
var totalCount = await query.CountAsync();
var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
return new PagedResultDto<OrganizationDto>(totalCount, dtos);
}
/// <summary>
/// 懒加载组织树,无数据权限过滤
/// </summary>
/// <param name="id"></param>
/// <param name="filter"></param>
/// <returns></returns>
public async Task<ListResultDto<OrganizationDto>> LoadAll(Guid? id, string filter)
{
var queryable = await _repository.GetQueryableAsync();
//var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id);
//var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList();
//foreach (var cscade in CascadeIds)
//{
// queryable = queryable.Where(_ => _.CascadeId.Contains(cscade));
//}
var items = new List<Organization>();
if (!string.IsNullOrWhiteSpace(filter))
{
items = await queryable.Where(_ => _.Name.Contains(filter)).OrderBy(_ => _.Sort).ToListAsync();
}
else
{
var query = id.HasValue ? queryable.Where(_ => _.Pid == id) :
queryable.Where(_ => _.Pid == null);
items = await query.OrderBy(_ => _.Sort).ToListAsync();
}
var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
return new ListResultDto<OrganizationDto>(dtos);
}
public async Task<ListResultDto<OrganizationDto>> LoadAllNodes()
{
var items = await _repository.GetListAsync();
var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
return new ListResultDto<OrganizationDto>(dtos);
}
[Authorize(BaseServicePermissions.Organization.Update)]
public async Task<OrganizationDto> Update(Guid id, CreateOrUpdateOrganizationDto input)
{
if (input.Pid == id) throw new BusinessException("机构上级不能为当前机构!");
var organization = await _repository.FirstOrDefaultAsync(_ => _.Id == id);
if (organization.Pid != input.Pid)
{
var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
var orgs = await (await _repository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(organization.CascadeId) && _.Id != organization.Id)
.OrderBy(_ => _.CascadeId).ToListAsync();
organization.Pid = input.Pid;
await ChangeOrganizationModel(organization, parent);
foreach (var org in orgs)
{
if (org.Pid == organization.Id)
{
await ChangeOrganizationModel(org, organization, false);
}
else
{
var orgParent = orgs.FirstOrDefault(_ => _.Id == org.Pid);
await ChangeOrganizationModel(org, orgParent, false);
}
}
}
organization.Name = input.Name;
organization.Sort = input.Sort;
organization.Enabled = input.Enabled;
return ObjectMapper.Map<Organization, OrganizationDto>(organization);
}
private async Task ChangeOrganizationModel(Organization org, Organization parent, bool checkLevel = true)
{
var cascadeId = org.CascadeId == null ? 1 : int.Parse(org.CascadeId.TrimEnd('.').Split('.').Last());
if (checkLevel)
{
if (parent != null && parent.Leaf) parent.Leaf = false;
var lastLevel = (await _repository.GetQueryableAsync()).Where(_ => _.Pid == org.Pid && _.Id != org.Id)
.OrderByDescending(_ => _.CascadeId)
.FirstOrDefault();
cascadeId = lastLevel == null ? 1 : int.Parse(lastLevel.CascadeId.TrimEnd('.').Split('.').Last()) + 1;
}
if (org.Pid.HasValue)
{
if (parent == null) throw new BusinessException("上级机构查询错误!");
//TODO:限制层级数
org.CascadeId = parent.CascadeId + cascadeId.ToString("000") + ".";
org.FullName = parent.FullName + "/" + org.Name;
}
else
{
//TODO:限制层级数
org.CascadeId = ".0." + cascadeId.ToString("000") + ".";
org.FullName = org.Name;
}
}
}
}