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 }