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); } } } }