组织架构树后端逻辑

public class OrgChart
        {
            public Guid id { get; set; }

            public string name { get; set; }

            public Data data { get; set; }

            public List<OrgChart> children { get; set; }
        }

        public class Data
        {
            /// <summary>
            /// 1架构,2岗位,3人员
            /// </summary>
            public int Type { get; set; }

            public string StaffId { get; set; }

            public string OrgId { get; set; }

            public string Info { get; set; }
            /// <summary>
            /// 编制人数
            /// </summary>
            public int HeadCount { get; set; }
            /// <summary>
            /// 实际人数
            /// </summary>
            public int ActualCount { get; set; }
            /// <summary>
            /// 岗位负责人
            /// </summary>
            public string IsPrimary { get; set; }
            /// <summary>
            /// 编制描述
            /// </summary>
            public string HeadCountTitle { get; set; }
            /// <summary>
            /// 性别
            /// </summary>
            public string sex { get; set; }


        }

               public void FindTreeNode(string staffNo, OrgChart _oc)
        {
            //staffNo的下级
            IList<HrStaffSupervisor> listChildren = supsers.Where<HrStaffSupervisor>(x => x.SupervisorNo != null && x.SupervisorNo.ToUpper() == staffNo.ToUpper() && x.IsMainSupervisor == true).ToList<HrStaffSupervisor>();


            if (listChildren != null && listChildren.Count > 0)
            {
                //_oc.data = new Data();

                List<OrgChart> children = new List<OrgChart>();
                _oc.children = children;
                foreach (HrStaffSupervisor item in listChildren)
                {
                    OrgChart oc = new OrgChart();
                    oc.id = Guid.NewGuid();
                    oc.name = item.StaffName;

                    OrgChartDetail data = new OrgChartDetail();
                    data.Type = 3;
                    data.StaffId = item.StaffNo;
                    data.StaffName = item.StaffName;
                    ///demo定制显示
                    OrgStaff os = GetStaffinfo(item.StaffNo);
                    if (os != null)
                    {
                        data.lvlfirst = os.OrgUnit.PathInfo == null ? "" : os.OrgUnit.PathInfo.Level1.Name;
                        data.lvllast = os.OrgUnit.OrgDictionary.Name.String;
                        data.position = os.OrgPosition.OrgDictionary.Name.String;
                    }

                    ////如果有上级
                    //IList<HrStaffSupervisor> listSuper = supsers.Where<HrStaffSupervisor>(x => x.StaffNo.ToUpper().Equals(item.StaffNo.ToUpper()) && x.IsMainSupervisor == true).ToList<HrStaffSupervisor>();
                    //if (listSuper != null && listSuper.Count > 0)
                    //{
                    //    HrStaffSupervisor super = listSuper[0];
                    //    data.SupervisorNo = super.SupervisorNo;
                    //    data.Type = 1;
                    //}
                    //如果有下级
                    IList<HrStaffSupervisor> listChi = supsers.Where<HrStaffSupervisor>(x => x.SupervisorNo != null && x.SupervisorNo.ToUpper() == item.StaffNo.ToUpper() && x.IsMainSupervisor == true).ToList<HrStaffSupervisor>();
                    data.StaffCount = listChi.Count;

                    //data.lvlfirst=item.
                    oc.data = data;

                    //是否有间接主管
                    IList<HrStaffSupervisor> listSupervisor = supsers.Where<HrStaffSupervisor>(x => x.StaffNo == item.StaffNo && x.IsMainSupervisor == false).ToList<HrStaffSupervisor>();
                    if (listSupervisor.Count > 0)
                        data.HasOtherSupervisor = true;
                    else
                        data.HasOtherSupervisor = false;
                    _oc.children.Add(oc);

                    FindTreeNode(item.StaffNo, oc);
                }
            }
        }

demo2

 /// <summary>
    /// 部门表
    /// </summary>
    [TableInfo("DeptInfo")]
    public class DepartInfo : BaseIntModel
    {
        /// <summary>        
        ///部门ID
        /// </summary>
        [KeyInfo("DeptId")]
        public override int Id { get; set; }
        /// <summary>        
        ///部门名称
        /// </summary>
        public string DeptName { get; set; }
        /// <summary>        
        ///部门名称简写
        /// </summary>
        public string ShortName { get; set; }
        /// <summary>        
        ///组织机构代码
        /// </summary>
        public string DeptCode { get; set; }
        /// <summary>        
        ///上级ID
        /// </summary>
        [ColumnInfo("Upperid")]
        public int? ParentId { get; set; }
        /// <summary>        
        ///排序
        /// </summary>
        public int? Sequence { get; set; }
        public DateTime? CreateTime { get; set; }
        /// <summary>        
        ///部门简称
        /// </summary>
        public string DeptJc { get; set; }
        /// <summary>        
        ///备注
        /// </summary>
        public string Description { get; set; }
 
        /// <summary>        
        ///添加人
        /// </summary>
        public int? CreateUser { get; set; }
        /// <summary>        
        ///修改时间
        /// </summary>
        public DateTime? UpdateTime { get; set; }
        /// <summary>        
        ///是否删除
        /// </summary>
        public int? DelFlag { get; set; }
        /// <summary>        
        ///是否在前台显示
        /// </summary>
        public int? Activeflag { get; set; }
        /// <summary>        
        ///树状图结构
        /// </summary>
        public string Path { get; set; }


        /// <summary>
        /// 父节点ID集合
        /// </summary>
        [Ignore]
        public List<int> ParentIdList { get; set; }
        /// <summary>
        /// 父节点集合
        /// </summary>
        [Ignore]
        public List<DepartInfo> Children { get; set; }
        /// <summary>
        /// 当前及子部门人员统计数
        /// </summary>
        [Ignore]
        public int DeptUsersCount { get; set; }
    }
 public async Task<RespondView<IEnumerable<DepartInfo>>> DepartList()
        {
            var result = new RespondView<IEnumerable<DepartInfo>>() { Data = new List<DepartInfo>()};
            var _list =   await this._repository.GetListAll(); 
            if (_list != null && _list.Any())
            {
                result.Status = true;

                var parentNodeList = _list.Where(m => m.ParentId == -1).ToList();
                if (parentNodeList != null && parentNodeList.Any())
                {
                    foreach (var parentNode in parentNodeList)
                    {
                        SetParentChildren(_list.ToList(), parentNode);
                    }
                }
                result.Data = parentNodeList;
            }
            else
            {
                result.Status = false;
                result.Message = "暂无数据";
            }
            return result;
        }

        /// <summary>
        /// 遍历子结点
        /// </summary>
        /// <param name="departInfos">全部节点</param>
        /// <param name="parentNode">父级节点</param>
        public void SetParentChildren(List<DepartInfo> departInfos, DepartInfo parentNode)
        {
            if (departInfos != null && departInfos.Any() && parentNode != null)
            {
                #region 当前部门及子部门总人数
                var deptUsersCount = 0;
                var deptId = parentNode.Id;
                var deptCurWithChildIds = Task.Run(() => CurrentDeptWithChild(new List<int>() { deptId }).Result).Result;
                if (deptCurWithChildIds != null && deptCurWithChildIds.Any())
                {
                    deptUsersCount = Task.Run(() => _userRepository.IsDeptCmsUserCount(deptCurWithChildIds.ToList()).Result).Result;
                }
                parentNode.DeptUsersCount = deptUsersCount;
                #endregion

                parentNode.Children = departInfos.Where(o => o.ParentId == deptId).OrderBy(o=>o.DeptName).ToList();
                if (parentNode.Children != null && parentNode.Children.Any())
                {
                    foreach (var nextChild in parentNode.Children)
                    {
                        SetParentChildren(departInfos, nextChild);
                    }
                }
            }
        }

        #region 获取当前部门及其子部门ID集合
        /// <summary>
        /// 获取当前部门及其子部门ID集合
        /// </summary>
        /// <param name="deptIds"></param>
        /// <returns></returns>
        public async Task<IList<int>> CurrentDeptWithChild(List<int> deptIds)
        {
            var result = new List<int>();
            var deptId = deptIds.FirstOrDefault();
            if (deptId > 0)
            {
                var _list = await this._repository.GetListAll();
                if (_list != null && _list.Any())
                {
                    result = deptIds;
                    var parentNodeList = _list.Where(m => m.ParentId == deptId).ToList();
                    if (parentNodeList != null && parentNodeList.Any())
                    {
                        foreach (var parentNode in parentNodeList)
                        {
                            SetNextDeptIds(_list.ToList(), parentNode, ref result);
                        }
                    }
                }
            }
            return result;
        }

        public void SetNextDeptIds(List<DepartInfo> departInfos, DepartInfo parentNode, ref List<int> deptIds)
        {
            if (departInfos != null && departInfos.Any() && parentNode != null)
            {
                deptIds.Add(parentNode.Id);     //添加当前子节点
                parentNode.Children = departInfos.Where(o => o.ParentId == parentNode.Id).ToList();
                if (parentNode.Children != null && parentNode.Children.Any())
                {
                    foreach (var nextChild in parentNode.Children)
                    {
                        SetNextDeptIds(departInfos, nextChild, ref deptIds);
                    }
                }
            }
        }
原文地址:https://www.cnblogs.com/shy1766IT/p/14000725.html