using System.Linq.Expressions;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.JsonSerialization;
using JNPF.LinqBuilder;
using JNPF.Systems.Entitys.Dto.Organize;
using JNPF.Systems.Entitys.Dto.SysConfig;
using JNPF.Systems.Entitys.Dto.User;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.Permission;
using JNPF.Systems.Interfaces.System;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Yitter.IdGenerator;
namespace JNPF.Systems;
///
/// 机构管理.
/// 组织架构:公司》部门》岗位》用户
/// 版 本:V3.2.0
/// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com)
/// 日 期:2021.06.07.
///
[ApiDescriptionSettings(Tag = "Permission", Name = "Organize", Order = 165)]
[Route("api/permission/[controller]")]
public class OrganizeService : IOrganizeService, IDynamicApiController, ITransient
{
///
/// 基础仓储.
///
private readonly ISqlSugarRepository _repository;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
///
/// 系统配置.
///
private readonly ISysConfigService _sysConfigService;
///
/// 第三方同步.
///
private readonly ISynThirdInfoService _synThirdInfoService;
///
/// 多租户事务.
///
private readonly ITenant _db;
///
/// 初始化一个类型的新实例.
///
public OrganizeService(
ISqlSugarRepository repository,
ISysConfigService sysConfigService,
ISynThirdInfoService synThirdInfoService,
IUserManager userManager,
ISqlSugarClient context)
{
_repository = repository;
_sysConfigService = sysConfigService;
_synThirdInfoService = synThirdInfoService;
_userManager = userManager;
_db = context.AsTenant();
}
#region GET
///
/// 获取机构列表.
///
/// 关键字参数.
///
[HttpGet("")]
public async Task GetList([FromQuery] KeywordInput input)
{
StructureOrganizeIdTree(); // 构造组织树 id.
// 获取分级管理组织
var dataScope = _userManager.DataScope.Where(x => x.Select).Select(x => x.organizeId).Distinct().ToList();
//modified by ly on 20230421 查询区域类型数据字典
var dic = await _repository.AsSugarClient().Queryable().Where(it => it.DictionaryTypeId == "24754619407381").ToDictionaryAsync(x => x.EnCode, x => x.FullName);
List? data = await _repository.AsQueryable().Where(t => t.DeleteMark == null)
.WhereIF(!_userManager.IsAdministrator, a => dataScope.Contains(a.Id))
.OrderBy(a => a.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc)
.Select(x => new OrganizeListOutput()
{
category = x.Category,
creatorTime = x.CreatorTime,
enCode = x.EnCode,
enabledMark = x.EnabledMark,
fullName = x.FullName,
id = x.Id,
organizeIdTree = x.OrganizeIdTree,
parentId = x.ParentId,
sortCode = x.SortCode,
icon = SqlFunc.IIF(x.Category.Equals("company"), "icon-ym icon-ym-tree-organization3", "icon-ym icon-ym-tree-department1"),
type = x.Category
})
.Mapper(x => x.categoryName = dic.ContainsKey(x.category) ? dic[x.category].ToString() : "")
.ToListAsync();
if (!string.IsNullOrEmpty(input.keyword))
data = data.TreeWhere(t => t.fullName.Contains(input.keyword) || t.enCode.Contains(input.keyword), t => t.id, t => t.parentId);
data.ForEach(item =>
{
if (!data.Any(x => x.id.Equals(item.parentId)))
item.parentId = item.parentId.Equals("-1") ? "-1" : "0";
});
// 获取组织树
var orgTree = GetOrgListTreeName();
data.ForEach(item =>
{
item.fullName = orgTree.FirstOrDefault(x => x.Id.Equals(item.id))?.Description;
item.organizeIds = item.organizeIdTree.Split(",").ToList();
});
// 组织断层处理
data.Where(x => x.parentId != "0").OrderByDescending(x => x.organizeIdTree.Length).ToList().ForEach(item =>
{
if (!data.Any(x => x.id.Equals(item.parentId)))
{
var pItem = data.Find(x => x.id != item.id && item.organizeIdTree.Contains(x.organizeIdTree));
if (pItem != null)
{
item.parentId = pItem.id;
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
else
{
item.parentId = item.parentId.Equals("-1") ? "-1" : "0";
}
}
else
{
var pItem = data.Find(x => x.id.Equals(item.parentId));
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
});
return data.Any(x => x.parentId.Equals("-1")) ? new { list = data.OrderBy(x => x.sortCode).ToList().ToTree("-1") } : new { list = data.OrderBy(x => x.sortCode).ToList().ToTree("0") };
}
///
/// 获取下拉框.
///
///
[HttpGet("Selector/{id}")]
public async Task GetSelector(string id)
{
// 获取组织树
var orgTree = GetOrgListTreeName();
List? data = await _repository.AsQueryable().Where(t => t.Category.Equals("company") && t.DeleteMark == null).OrderBy(a => a.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc).ToListAsync();
if (!"0".Equals(id))
{
OrganizeEntity? info = data.Find(it => it.Id == id);
data.Remove(info);
}
List? treeList = data.Adapt>();
treeList.ForEach(item =>
{
item.type = item.category;
if (item != null && item.category.Equals("company")) item.icon = "icon-ym icon-ym-tree-organization3";
item.organize = orgTree.FirstOrDefault(x => x.Id.Equals(item.id))?.Description;
item.organizeIds = item.organizeIdTree.Split(",").ToList();
});
return new { list = treeList.OrderBy(x => x.sortCode).ToList().ToTree("-1") };
}
///
/// 获取下拉框根据权限.
///
///
[HttpGet("SelectorByAuth/{id}")]
public async Task GetSelectorByAuth(string id)
{
// 获取组织树
var orgTree = GetOrgListTreeName();
// 获取分级管理组织
var dataScope = _userManager.DataScope.Where(x => x.Select).Select(x => x.organizeId).Distinct().ToList();
List? data = await _repository.AsQueryable().Where(t => t.Category.Equals("company") && t.DeleteMark == null)
.WhereIF(!_userManager.IsAdministrator, x => dataScope.Contains(x.Id))
.OrderBy(a => a.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc).ToListAsync();
List? treeList = data.Adapt>();
treeList.ForEach(item =>
{
item.type = item.category;
if (item != null && item.category.Equals("company")) item.icon = "icon-ym icon-ym-tree-organization3";
item.fullName = orgTree.FirstOrDefault(x => x.Id.Equals(item.id))?.Description;
item.organize = item.fullName;
item.organizeIds = item.organizeIdTree.Split(",").ToList();
});
if (treeList.Count > 0 && !treeList.Any(x => x.organizeIdTree.Equals(x.id)))
{
var pItems = treeList.Select(x => x.organizeIds.FirstOrDefault()).Distinct().ToList();
pItems.ForEach(item =>
{
if (treeList.Select(x => x.id).Contains(item))
{
var addItem = orgTree.Find(x => x.Id.Equals(item)).Adapt();
if (addItem.type != null && addItem.type.Equals("company")) addItem.icon = "icon-ym icon-ym-tree-organization3";
addItem.fullName = orgTree.FirstOrDefault(x => x.Id.Equals(addItem.id))?.Description;
addItem.organize = addItem.fullName;
addItem.organizeIds = addItem.organizeIdTree.Split(",").ToList();
addItem.disabled = true;
if (!treeList.Any(x => x.id.Equals(addItem.id))) treeList.Add(addItem);
}
});
}
// 组织断层处理
treeList.Where(x => x.parentId != "-1").OrderByDescending(x => x.organizeIdTree.Length).ToList().ForEach(item =>
{
if (!treeList.Any(x => x.id.Equals(item.parentId)))
{
var pItem = treeList.Find(x => x.id != item.id && item.organizeIdTree.Contains(x.organizeIdTree));
if (pItem != null)
{
item.parentId = pItem.id;
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
else
{
item.parentId = "-1";
}
}
else
{
var pItem = treeList.Find(x => x.id.Equals(item.parentId));
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
});
return new { list = treeList.OrderBy(x => x.sortCode).ToList().ToTree("-1") };
}
///
/// 获取树形.
///
///
[HttpGet("Tree")]
public async Task GetTree()
{
List? data = await _repository.AsQueryable().Where(t => t.Category.Equals("company") && t.DeleteMark == null).OrderBy(a => a.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc).ToListAsync();
List? treeList = data.Adapt>();
return new { list = treeList.OrderBy(x => x.sortCode).ToList().ToTree("-1") };
}
///
/// 获取信息.
///
///
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
OrganizeEntity? entity = await _repository.GetSingleAsync(p => p.Id == id);
var res = entity.Adapt();
if (entity.ParentId.Equals("-1")) res.organizeIdTree = new List() { "-1" };
else res.organizeIdTree = (await _repository.GetSingleAsync(p => p.Id == entity.ParentId)).OrganizeIdTree.Split(",").ToList();
return res;
}
#endregion
#region POST
///
/// 根据组织Id List 获取当前所属组织(部门).
///
///
[HttpPost("getDefaultCurrentValueDepartmentId")]
public async Task GetDefaultCurrentValueDepartmentId([FromBody] GetDefaultCurrentValueInput input)
{
var depId = _repository.AsSugarClient().Queryable().Where(x => x.Id.Equals(_userManager.UserId)).Select(x => x.OrganizeId).First();
if (input.DepartIds == null || !input.DepartIds.Any()) return new { departmentId = depId };
var userRelationList = _repository.AsSugarClient().Queryable().Where(x => input.DepartIds.Contains(x.ObjectId))
.Select(x => x.UserId).ToList();
if (userRelationList.Contains(_userManager.UserId)) return new { userId = depId };
else return new { departmentId = string.Empty };
}
///
/// 通过部门id获取部门列表.
///
/// 参数.
///
[HttpPost("OrganizeCondition")]
public async Task OrganizeCondition([FromBody] OrganizeConditionInput input)
{
var queryWhere = LinqExpression.Or();
input.departIds.ForEach(id => queryWhere = queryWhere.Or(x => x.OrganizeIdTree.Contains(id)));
queryWhere = queryWhere.And(x => x.DeleteMark == null);
List? data = await _repository.AsQueryable().Where(queryWhere)
.WhereIF(input.keyword.IsNotEmptyOrNull(), a => a.FullName.Contains(input.keyword) || a.EnCode.Contains(input.keyword)).Select(a => new OrganizeListOutput
{
id = a.Id,
organizeIdTree = a.OrganizeIdTree,
type = a.Category,
parentId = a.ParentId,
lastFullName = a.FullName,
fullName = a.FullName,
enabledMark = a.EnabledMark,
creatorTime = a.CreatorTime,
icon = a.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1",
sortCode = a.SortCode,
isLeaf = true
}).ToListAsync();
// 获取所有组织
List? allOrgList = GetOrgListTreeName();
data.ForEach(item =>
{
if (!data.Any(x => x.id.Equals(item.parentId)))
{
item.parentId = "0";
item.fullName = allOrgList.FirstOrDefault(x => x.Id == item.id)?.Description;
}
});
return new { list = data.ToTree("0") };
}
///
/// 新建.
///
/// 参数.
///
[HttpPost("")]
public async Task Create([FromBody] OrganizeCrInput input)
{
if (!_userManager.DataScope.Any(it => it.organizeId == input.parentId && it.Add) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
if (await _repository.IsAnyAsync(o => o.EnCode == input.enCode && o.DeleteMark == null))
throw Oops.Oh(ErrorCode.D2008);
if (await _repository.IsAnyAsync(o => o.ParentId == input.parentId && o.FullName == input.fullName && o.Category == "company" && o.DeleteMark == null))
throw Oops.Oh(ErrorCode.D2009);
OrganizeEntity? entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.EnabledMark = input.enabledMark;
entity.Category = "company";
entity.PropertyJson = JSON.Serialize(input.propertyJson);
#region 处理 上级ID列表 存储
List? idList = new List();
idList.Add(entity.Id);
if (entity.ParentId != "-1")
{
List? ids = _repository.AsSugarClient().Queryable().ToParentList(it => it.ParentId, entity.ParentId).Select(x => x.Id).ToList();
idList.AddRange(ids);
}
idList.Reverse();
entity.OrganizeIdTree = string.Join(",", idList);
#endregion
OrganizeEntity? isOk = await _repository.AsSugarClient().Insertable(entity).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync();
_ = isOk ?? throw Oops.Oh(ErrorCode.D2012);
#region 默认赋予分级管理权限
var adminlist = new List();
if (!_userManager.IsAdministrator)
{
adminlist.Add(new OrganizeAdministratorEntity()
{
UserId = _userManager.UserId,
OrganizeId = isOk.Id,
ThisLayerAdd = 1,
ThisLayerDelete = 1,
ThisLayerEdit = 1,
ThisLayerSelect = 1,
SubLayerAdd = 0,
SubLayerDelete = 0,
SubLayerEdit = 0,
SubLayerSelect = 0
});
}
var adminUserIds = _repository.AsSugarClient().Queryable().Where(x => !x.UserId.Equals(_userManager.UserId)).Select(x => x.UserId).Distinct().ToList();
adminUserIds.ForEach(userid =>
{
adminlist.Add(new OrganizeAdministratorEntity()
{
UserId = userid,
OrganizeId = isOk.Id,
ThisLayerAdd = 0,
ThisLayerDelete = 0,
ThisLayerEdit = 0,
ThisLayerSelect = 0,
SubLayerAdd = 0,
SubLayerDelete = 0,
SubLayerEdit = 0,
SubLayerSelect = 0
});
});
if (adminlist.Any()) await _repository.AsSugarClient().Insertable(adminlist).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync();
#endregion
#region 第三方同步
try
{
SysConfigOutput? sysConfig = await _sysConfigService.GetInfo();
List? orgList = new List();
orgList.Add(entity.Adapt());
if (sysConfig.dingSynIsSynOrg)
await _synThirdInfoService.SynDep(2, 1, sysConfig, orgList);
if (sysConfig.qyhIsSynOrg)
await _synThirdInfoService.SynDep(1, 1, sysConfig, orgList);
}
catch (Exception)
{
}
#endregion
}
///
/// 更新.
///
/// 主键.
/// 参数.
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] OrganizeUpInput input)
{
OrganizeEntity? oldEntity = await _repository.GetSingleAsync(it => it.Id == id);
if (oldEntity.ParentId != input.parentId && !_userManager.DataScope.Any(it => it.organizeId == oldEntity.ParentId && it.Edit) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
if (oldEntity.ParentId != input.parentId && !_userManager.DataScope.Any(it => it.organizeId == input.parentId && it.Edit) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
if (!_userManager.DataScope.Any(it => it.organizeId == id && it.Edit == true) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
if (input.parentId.Equals(id))
throw Oops.Oh(ErrorCode.D2001);
if (input.parentId.Equals("-1") && !oldEntity.ParentId.Equals("-1") && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
// 父id不能为自己的子节点
List? childIdListById = await GetChildIdListWithSelfById(id);
if (childIdListById.Contains(input.parentId))
throw Oops.Oh(ErrorCode.D2001);
if (await _repository.IsAnyAsync(o => o.EnCode == input.enCode && o.Id != id && o.DeleteMark == null && o.Id != id))
throw Oops.Oh(ErrorCode.D2008);
if (await _repository.IsAnyAsync(o => o.ParentId == input.parentId && o.FullName == input.fullName && o.Id != id && o.Category == "company" && o.DeleteMark == null && o.Id != id))
throw Oops.Oh(ErrorCode.D2009);
OrganizeEntity? entity = input.Adapt();
entity.LastModifyTime = DateTime.Now;
entity.LastModifyUserId = _userManager.UserId;
entity.PropertyJson = JSON.Serialize(input.propertyJson);
try
{
// 开启事务
_db.BeginTran();
#region 处理 上级ID列表 存储
if (string.IsNullOrWhiteSpace(oldEntity.OrganizeIdTree) || entity.ParentId != oldEntity.ParentId)
{
List? idList = new List();
idList.Add(entity.Id);
if (entity.ParentId != "-1")
{
List? ids = _repository.AsSugarClient().Queryable().ToParentList(it => it.ParentId, entity.ParentId).Select(x => x.Id).ToList();
idList.AddRange(ids);
}
idList.Reverse();
entity.OrganizeIdTree = string.Join(",", idList);
// 如果上级结构 变动 ,需要更改所有包含 该组织的id 的结构
if (entity.OrganizeIdTree != oldEntity.OrganizeIdTree)
{
List? oldEntityList = await _repository.AsQueryable().Where(x => x.OrganizeIdTree.Contains(oldEntity.Id) && x.Id != oldEntity.Id).ToListAsync();
oldEntityList.ForEach(item =>
{
string? childList = item.OrganizeIdTree.Split(oldEntity.Id).LastOrDefault();
item.OrganizeIdTree = entity.OrganizeIdTree + childList;
});
await _repository.AsSugarClient().Updateable(oldEntityList).UpdateColumns(x => x.OrganizeIdTree).ExecuteCommandAsync(); // 批量修改 父级组织
}
}
#endregion
await _repository.AsSugarClient().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
_db.CommitTran();
}
catch (Exception)
{
_db.RollbackTran();
throw Oops.Oh(ErrorCode.D2010);
}
#region 第三方同步
try
{
SysConfigOutput? sysConfig = await _sysConfigService.GetInfo();
List? orgList = new List();
entity.Category = "company";
orgList.Add(entity.Adapt());
if (sysConfig.dingSynIsSynOrg) await _synThirdInfoService.SynDep(2, 1, sysConfig, orgList);
if (sysConfig.qyhIsSynOrg) await _synThirdInfoService.SynDep(1, 1, sysConfig, orgList);
}
catch (Exception)
{
}
#endregion
}
///
/// 删除.
///
/// 主键.
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
if (!_userManager.DataScope.Any(it => it.organizeId == id && it.Delete == true) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
// 该机构下有机构,则不能删
if (await _repository.IsAnyAsync(o => o.ParentId.Equals(id) && o.DeleteMark == null))
throw Oops.Oh(ErrorCode.D2005);
// 该机构下有岗位,则不能删
if (await _repository.AsSugarClient().Queryable().AnyAsync(p => p.OrganizeId.Equals(id) && p.DeleteMark == null))
throw Oops.Oh(ErrorCode.D2006);
// 该机构下有用户,则不能删
if (await _repository.AsSugarClient().Queryable().Where(x => x.ObjectType == "Organize" && x.ObjectId == id).AnyAsync())
throw Oops.Oh(ErrorCode.D2004);
// 该机构下有角色,则不能删
if (await _repository.AsSugarClient().Queryable().Where(x => x.OrganizeId == id && x.ObjectType == "Role").AnyAsync())
throw Oops.Oh(ErrorCode.D2020);
try
{
// 开启事务
_db.BeginTran();
await _repository.AsSugarClient().Updateable().SetColumns(it => new OrganizeEntity()
{
DeleteMark = 1,
DeleteTime = SqlFunc.GetDate(),
DeleteUserId = _userManager.UserId,
}).Where(it => it.Id == id && it.DeleteMark == null).ExecuteCommandAsync();
// 删除该组织和角色关联数据
await _repository.AsSugarClient().Deleteable().Where(x => x.OrganizeId == id && x.ObjectType == "Role").ExecuteCommandAsync();
await _repository.AsSugarClient().Deleteable().Where(x => x.OrganizeId == id && x.ObjectType == "Eqp").ExecuteCommandAsync();
_db.CommitTran();
}
catch (Exception)
{
_db.RollbackTran();
throw Oops.Oh(ErrorCode.D2012);
}
#region 第三方同步
try
{
SysConfigOutput? sysConfig = await _sysConfigService.GetInfo();
if (sysConfig.dingSynIsSynOrg)
await _synThirdInfoService.DelSynData(2, 1, sysConfig, id);
if (sysConfig.qyhIsSynOrg)
await _synThirdInfoService.DelSynData(1, 1, sysConfig, id);
}
catch (Exception)
{
}
#endregion
}
///
/// 更新状态.
///
/// 主键
///
[HttpPut("{id}/Actions/State")]
public async Task UpdateState(string id)
{
if (!_userManager.DataScope.Any(it => it.organizeId == id && it.Edit == true) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013);
if (!await _repository.IsAnyAsync(u => u.Id == id && u.DeleteMark == null))
throw Oops.Oh(ErrorCode.D2002);
int isOk = await _repository.AsSugarClient().Updateable().SetColumns(it => new OrganizeEntity()
{
EnabledMark = SqlFunc.IIF(it.EnabledMark == 1, 0, 1),
LastModifyUserId = _userManager.UserId,
LastModifyTime = SqlFunc.GetDate()
}).Where(it => it.Id == id).ExecuteCommandAsync();
if (!(isOk > 0))
throw Oops.Oh(ErrorCode.D2011);
}
#endregion
#region PublicMethod
///
/// 是否机构主管.
///
/// 用户ID.
///
[NonAction]
public async Task GetIsManagerByUserId(string userId)
{
return await _repository.IsAnyAsync(o => o.EnabledMark == 1 && o.DeleteMark == null && o.ManagerId == userId);
}
///
/// 获取机构列表(其他服务使用).
///
///
[NonAction]
public async Task> GetListAsync(Expression> expression = null)
{
var query = _repository.AsQueryable().Where(t => t.EnabledMark == 1 && t.DeleteMark == null).WhereIF(expression != null, expression);
return await query.OrderBy(o => o.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc).ToListAsync();
}
///
/// 获取公司列表(其他服务使用).
///
///
[NonAction]
public async Task> GetCompanyListAsync()
{
return await _repository.AsQueryable().Where(t => t.Category.Equals("company") && t.EnabledMark == 1 && t.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync();
}
///
/// 下属机构.
///
/// 机构ID.
/// 是否管理员.
///
[NonAction]
public async Task GetSubsidiary(string organizeId, bool isAdmin)
{
List? data = await _repository.AsQueryable().Where(o => o.DeleteMark == null && o.EnabledMark == 1).OrderBy(o => o.SortCode).ToListAsync();
if (!isAdmin)
data = data.TreeChildNode(organizeId, t => t.Id, t => t.ParentId);
return data.Select(m => m.Id).ToArray();
}
///
/// 下属机构.
///
/// 机构ID.
///
[NonAction]
public async Task> GetSubsidiary(string organizeId)
{
List? data = await _repository.AsQueryable().Where(o => o.DeleteMark == null && o.EnabledMark == 1).OrderBy(o => o.SortCode).ToListAsync();
data = data.TreeChildNode(organizeId, t => t.Id, t => t.ParentId);
return data.Select(m => m.Id).ToList();
}
///
/// 根据节点Id获取所有子节点Id集合,包含自己.
///
///
///
[NonAction]
public async Task> GetChildIdListWithSelfById(string id)
{
List? childIdList = await _repository.AsQueryable().Where(u => u.ParentId.Contains(id) && u.DeleteMark == null).Select(u => u.Id).ToListAsync();
childIdList.Add(id);
return childIdList;
}
///
/// 获取机构成员列表 .
///
/// 机构ID.
///
[NonAction]
public async Task> GetOrganizeMemberList(string organizeId)
{
List? output = new List();
if (organizeId.Equals("0"))
{
List? data = await _repository.AsQueryable()
.Where(o => o.DeleteMark == null && o.EnabledMark == 1 && o.ParentId.Equals("-1")).OrderBy(o => o.SortCode).ToListAsync();
data.ForEach(o =>
{
output.Add(new OrganizeMemberListOutput
{
id = o.Id,
parentId = o.ParentId,
fullName = o.FullName,
enabledMark = o.EnabledMark,
type = o.Category,
organize = o.FullName,
icon = o.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1",
organizeIdTree = o.OrganizeIdTree,
hasChildren = true,
isLeaf = false
});
});
}
else
{
var relationList = await _repository.AsSugarClient().Queryable().Where(x => x.ObjectType.Equals("Organize") && x.ObjectId.Equals(organizeId)).Select(x => x.UserId).ToListAsync();
List? userList = await _repository.AsSugarClient().Queryable().Where(u => relationList.Contains(u.Id) && u.EnabledMark > 0 && u.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync();
userList.ForEach(u =>
{
output.Add(new OrganizeMemberListOutput()
{
id = u.Id,
fullName = u.RealName + "/" + u.Account,
enabledMark = u.EnabledMark,
type = "user",
icon = "icon-ym icon-ym-tree-user2",
headIcon = "/api/File/Image/userAvatar/" + u.HeadIcon,
hasChildren = false,
isLeaf = true
});
});
List? departmentList = await _repository.AsQueryable()
.Where(o => o.ParentId.Equals(organizeId) && o.DeleteMark == null && o.EnabledMark == 1).OrderBy(o => o.SortCode).ToListAsync();
departmentList.ForEach(o =>
{
output.Add(new OrganizeMemberListOutput()
{
id = o.Id,
parentId = o.ParentId,
fullName = o.FullName,
enabledMark = o.EnabledMark,
type = o.Category,
icon = o.Category.Equals("company") ? "icon-ym icon-ym-tree-organization3" : "icon-ym icon-ym-tree-department1",
hasChildren = true,
organizeIdTree = o.OrganizeIdTree,
isLeaf = false
});
});
}
// 获取组织树
var orgTree = GetOrgListTreeName();
// 组织断层处理
output.Where(x => x.parentId != "-1" && x.organizeIdTree.IsNotEmptyOrNull()).OrderByDescending(x => x.organizeIdTree.Length).ToList().ForEach(item =>
{
item.fullName = orgTree.FirstOrDefault(x => x.Id.Equals(item.id))?.Description;
item.organize = item.fullName;
if (!output.Any(x => x.id.Equals(item.parentId)))
{
var pItem = output.Find(x => x.organizeIdTree.IsNotEmptyOrNull() && x.id != item.id && item.organizeIdTree.Contains(x.organizeIdTree));
if (pItem != null)
{
item.parentId = pItem.id;
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
else
{
item.parentId = "-1";
}
}
else
{
var pItem = output.Find(x => x.id.Equals(item.parentId));
item.fullName = item.fullName.Replace(pItem.fullName + "/", string.Empty);
}
});
if (!organizeId.Equals("0"))
{
var pOrgTreeName = orgTree.Find(x => x.Id.Equals(organizeId)).Description;
output.ForEach(item => item.fullName = item.fullName.Replace(pOrgTreeName + "/", string.Empty));
}
return output;
}
///
/// 信息.
///
///
///
[NonAction]
public async Task GetInfoById(string Id)
{
return await _repository.GetSingleAsync(p => p.Id == Id);
}
///
/// 获取组织下所有子组织.
///
///
///
public async Task> GetChildOrgId(string id)
{
return (await _repository.GetListAsync(x => x.OrganizeIdTree.Contains(id) && x.EnabledMark == 1 && x.DeleteMark == null)).Select(x => x.Id).ToList();
}
public async Task GetAnyParentByWorkstationId(string id, string type)
{
return await _repository.AsQueryable()
.LeftJoin((a, b) => a.OrganizeIdTree.Contains(b.Id) && b.Category == type)
.Where((a, b) => a.Id == id)
.Select((a, b) => b).FirstAsync();
}
///
/// 处理组织树 名称.
///
///
[NonAction]
public List GetOrgListTreeName()
{
List? orgTreeNameList = new List();
List? orgList = _repository.AsSugarClient().Queryable().Where(x => x.DeleteMark == null && x.EnabledMark == 1).ToList();
orgList.ForEach(item =>
{
if (item.OrganizeIdTree.IsNullOrEmpty()) item.OrganizeIdTree = item.Id;
OrganizeEntity? newItem = item.Adapt();
newItem.Id = item.Id;
var orgNameList = new List();
item.OrganizeIdTree.Split(",").ToList().ForEach(it =>
{
var org = orgList.Find(x => x.Id == it);
if (org != null) orgNameList.Add(org.FullName);
});
newItem.Description = string.Join("/", orgNameList);
orgTreeNameList.Add(newItem);
});
return orgTreeNameList;
}
///
/// 构造 OrganizeIdTree.
///
private void StructureOrganizeIdTree()
{
if (_repository.IsAny(x => SqlFunc.IsNullOrEmpty(SqlFunc.ToString(x.OrganizeIdTree))))
{
var orgList = _repository.GetList(x => SqlFunc.IsNullOrEmpty(x.OrganizeIdTree));
orgList.ForEach(item =>
{
if (item.ParentId == "-1")
{
item.OrganizeIdTree = item.Id;
}
else
{
var plist = _repository.AsQueryable().ToParentList(it => it.ParentId, item.Id).Select(x => x.Id);
plist = plist.Reverse();
item.OrganizeIdTree = string.Join(",", plist);
}
});
_repository.AsUpdateable(orgList).ExecuteCommand();
}
}
#endregion
}