using OpenAuth.Domain; using OpenAuth.Domain.Interface; using System; using System.Collections.Generic; using System.Linq; namespace OpenAuth.App { public class OrgManagerApp { private IOrgRepository _repository; public OrgManagerApp(IOrgRepository repository) { _repository = repository; } public IList GetAll() { return _repository.LoadOrgs().ToList(); } /// /// 部门的直接子部门 /// TODO:可以根据用户的喜好决定选择LoadAllChildren或LoadDirectChildren /// /// The org unique identifier. /// IEnumerable{Org}. public IList LoadDirectChildren(int orgId) { return _repository.Find(u => u.ParentId == orgId).ToList(); } /// /// 得到部门的所有子部门 /// 如果orgId为0,表示取得所有部门 /// public IList LoadAllChildren(int orgId) { string cascadeId = "0."; if (orgId != 0) { var org = _repository.FindSingle(u => u.Id == orgId); if (org == null) throw new Exception("未能找到指定对象信息"); cascadeId = org.CascadeId; } return _repository.Find(u => u.CascadeId.Contains(cascadeId) && u.Id != orgId).ToList(); } /// /// 添加部门 /// /// The org. /// System.Int32. /// 未能找到该组织的父节点信息 public int AddOrg(Org org) { string cascadeId; int currentCascadeId = GetMaxCascadeId(org.ParentId); if (org.ParentId != 0) { var parentOrg = _repository.FindSingle(o => o.Id == org.ParentId); if (parentOrg != null) { cascadeId = parentOrg.CascadeId + "." + currentCascadeId; org.ParentName = parentOrg.Name; } else { throw new Exception("未能找到该组织的父节点信息"); } } else { cascadeId = "0." + currentCascadeId; org.ParentName = ""; } org.CascadeId = cascadeId; org.CreateTime = DateTime.Now; _repository.Add(org); _repository.Save(); return org.Id; } public void ModifyOrg(Org org) { _repository.Update(org); } /// /// 删除指定ID的部门及其所有子部门 /// public void DelOrg(int id) { var delOrg = _repository.FindSingle(u => u.Id == id); if (delOrg == null) return; _repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId)); } #region 私有方法 //根据同一级中最大的语义ID private int GetMaxCascadeId(int parentId) { int currentCascadeId = 1; var maxCascadeIdOrg = _repository.Find(o => o.ParentId == parentId) .OrderByDescending(o => o.CascadeId).FirstOrDefault(); if (maxCascadeIdOrg != null) { var cascades = maxCascadeIdOrg.CascadeId.Split('.'); currentCascadeId = int.Parse(cascades[cascades.Length - 1]) + 1; } return currentCascadeId; } #endregion 私有方法 } }