using NCC.Common.Entity;
using NCC.Extend.Entitys.Dto.Organize;
using NCC.Extend.Interfaces.Organize;
using NCC.System.Entitys.Permission;
using NCC.Dependency;
using NCC.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace NCC.Extend
{
///
/// 组织架构服务实现
///
[ApiDescriptionSettings(Tag = "绿纤组织架构服务", Name = "Organize", Order = 201)]
[Route("api/Extend/[controller]")]
public class OrganizeService : IOrganizeService, IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
///
/// 初始化组织架构服务
///
/// 数据库客户端
public OrganizeService(ISqlSugarClient db)
{
_db = db;
}
#region 组织架构查询
///
/// 获取组织架构列表
///
/// 查询参数
/// 组织架构列表
[HttpGet("")]
public async Task GetList([FromQuery] OrganizeListQueryInput input)
{
var query = _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.FullName), x => x.FullName.Contains(input.FullName))
.WhereIF(!string.IsNullOrEmpty(input.EnCode), x => x.EnCode.Contains(input.EnCode))
.WhereIF(!string.IsNullOrEmpty(input.Category), x => x.Category == input.Category)
.WhereIF(!string.IsNullOrEmpty(input.ParentId), x => x.ParentId == input.ParentId)
.WhereIF(input.EnabledMark.HasValue, x => x.EnabledMark == input.EnabledMark)
.Where(x => x.DeleteMark == null)
.OrderBy(x => x.SortCode, OrderByType.Asc)
.OrderBy(x => x.CreatorTime, OrderByType.Desc);
var total = await query.CountAsync();
var list = await query
.Select(x => new OrganizeListOutput
{
Id = x.Id,
FullName = x.FullName,
EnCode = x.EnCode,
Category = x.Category,
ParentId = x.ParentId,
ManagerId = x.ManagerId,
Description = x.Description,
SortCode = x.SortCode,
EnabledMark = x.EnabledMark,
CreatorTime = x.CreatorTime
})
.ToPagedListAsync(input.currentPage, input.pageSize);
// 获取父级组织名称和主管姓名
var parentIds = list.list.Where(x => !string.IsNullOrEmpty(x.ParentId)).Select(x => x.ParentId).Distinct().ToList();
var managerIds = list.list.Where(x => !string.IsNullOrEmpty(x.ManagerId)).Select(x => x.ManagerId).Distinct().ToList();
var parentMap = new Dictionary();
var managerMap = new Dictionary();
if (parentIds.Any())
{
var parents = await _db.Queryable()
.Where(x => parentIds.Contains(x.Id))
.Select(x => new { x.Id, x.FullName })
.ToListAsync();
parentMap = parents.ToDictionary(x => x.Id, x => x.FullName);
}
if (managerIds.Any())
{
var managers = await _db.Queryable()
.Where(x => managerIds.Contains(x.Id))
.Select(x => new { x.Id, x.RealName })
.ToListAsync();
managerMap = managers.ToDictionary(x => x.Id, x => x.RealName);
}
// 填充父级组织名称和主管姓名
foreach (var item in list.list)
{
if (!string.IsNullOrEmpty(item.ParentId) && parentMap.ContainsKey(item.ParentId))
{
item.ParentName = parentMap[item.ParentId];
}
if (!string.IsNullOrEmpty(item.ManagerId) && managerMap.ContainsKey(item.ManagerId))
{
item.ManagerName = managerMap[item.ManagerId];
}
// 获取子组织数量
item.ChildrenCount = await _db.Queryable()
.Where(x => x.ParentId == item.Id && x.DeleteMark == null)
.CountAsync();
}
return new { list = list.list, total };
}
///
/// 获取组织架构树形结构
///
/// 父级组织ID(可选)
/// 组织架构树形结构
[HttpGet("Tree")]
public async Task> GetTree([FromQuery] string parentId = null)
{
var query = _db.Queryable()
.Where(x => x.DeleteMark == null)
.WhereIF(!string.IsNullOrEmpty(parentId), x => x.ParentId == parentId)
.WhereIF(string.IsNullOrEmpty(parentId), x => string.IsNullOrEmpty(x.ParentId))
.OrderBy(x => x.SortCode, OrderByType.Asc)
.OrderBy(x => x.CreatorTime, OrderByType.Desc);
var list = await query
.Select(x => new OrganizeTreeOutput
{
Id = x.Id,
FullName = x.FullName,
EnCode = x.EnCode,
Category = x.Category,
ParentId = x.ParentId,
ManagerId = x.ManagerId,
Description = x.Description,
SortCode = x.SortCode,
EnabledMark = x.EnabledMark
})
.ToListAsync();
// 构建树形结构
return BuildTree(list, parentId);
}
///
/// 根据组织名称获取该机构下面的所有组织
///
/// 组织名称
/// 组织及其子组织列表
[HttpGet("GetByName")]
public async Task GetOrganizationsByName([FromQuery] string organizeName)
{
if (string.IsNullOrEmpty(organizeName))
{
throw new ArgumentException("组织名称不能为空", nameof(organizeName));
}
// 查找匹配的组织
var matchedOrganizes = await _db.Queryable().Where(x => x.FullName == organizeName && x.DeleteMark == null).FirstAsync();
if (matchedOrganizes == null)
{
throw new ArgumentException("未找到指定组织", nameof(organizeName));
}
var result = await _db.Queryable().Where(x => x.ParentId == matchedOrganizes.Id && x.DeleteMark == null).Select(x => new OrganizeTreeOutput
{
Id = x.Id,
FullName = x.FullName,
EnCode = x.EnCode,
Category = x.Category,
}).ToListAsync();
return result;
}
///
/// 获取组织选择器数据
///
/// 父级组织ID(可选)
/// 组织选择器数据
[HttpGet("Selector")]
public async Task GetSelector([FromQuery] string parentId = null)
{
var query = _db.Queryable()
.Where(x => x.DeleteMark == null && x.EnabledMark == 1)
.WhereIF(!string.IsNullOrEmpty(parentId), x => x.ParentId == parentId)
.WhereIF(string.IsNullOrEmpty(parentId), x => string.IsNullOrEmpty(x.ParentId))
.OrderBy(x => x.SortCode, OrderByType.Asc)
.OrderBy(x => x.CreatorTime, OrderByType.Desc);
var list = await query
.Select(x => new
{
id = x.Id,
fullName = x.FullName,
enCode = x.EnCode,
category = x.Category,
parentId = x.ParentId
})
.ToListAsync();
return new { list };
}
#endregion
#region 私有方法
///
/// 构建树形结构
///
/// 组织列表
/// 父级ID
/// 树形结构
private List BuildTree(List list, string parentId)
{
var result = new List();
var parentIdValue = parentId ?? "";
foreach (var item in list.Where(x => x.ParentId == parentIdValue))
{
var children = BuildTree(list, item.Id);
item.Children = children;
result.Add(item);
}
return result;
}
///
/// 获取所有子组织
///
/// 父级组织ID
/// 子组织列表
private async Task> GetAllChildren(string parentId)
{
var children = await _db.Queryable()
.Where(x => x.ParentId == parentId && x.DeleteMark == null)
.Select(x => new OrganizeTreeOutput
{
Id = x.Id,
FullName = x.FullName,
EnCode = x.EnCode,
Category = x.Category,
ParentId = x.ParentId,
ManagerId = x.ManagerId,
Description = x.Description,
SortCode = x.SortCode,
EnabledMark = x.EnabledMark
})
.ToListAsync();
var allChildren = new List(children);
foreach (var child in children)
{
var grandChildren = await GetAllChildren(child.Id);
allChildren.AddRange(grandChildren);
}
return allChildren;
}
#endregion
}
///
/// 组织比较器
///
public class OrganizeComparer : IEqualityComparer
{
///
/// 比较两个组织是否相等
///
/// 组织1
/// 组织2
/// 是否相等
public bool Equals(OrganizeTreeOutput x, OrganizeTreeOutput y)
{
return x?.Id == y?.Id;
}
///
/// 获取组织的哈希码
///
/// 组织对象
/// 哈希码
public int GetHashCode(OrganizeTreeOutput obj)
{
return obj?.Id?.GetHashCode() ?? 0;
}
}
}