using System; using System.Collections.Generic; using System.Linq; using Infrastructure; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using OpenAuth.Repository.Interface; namespace OpenAuth.App { public class OrgManagerApp : BaseTreeApp { private RevelanceManagerApp _revelanceApp; /// /// 添加部门 /// /// The org. /// System.Int32. /// 未能找到该组织的父节点信息 public string Add(SysOrg sysOrg) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) { throw new CommonException("登录已过期", Define.INVALID_TOKEN); } CaculateCascade(sysOrg); UnitWork.ExecuteWithTransaction(() => { UnitWork.Add(sysOrg); UnitWork.Save(); //如果当前账号不是SYSTEM,则直接分配 if (loginContext.User.Account != Define.SYSTEM_USERNAME) { _revelanceApp.Assign(new AssignReq { type = Define.USERORG, firstId = loginContext.User.Id, secIds = new[] { sysOrg.Id } }); } }); return sysOrg.Id; } public string Update(SysOrg sysOrg) { if (sysOrg.Id == sysOrg.ParentId) { throw new Exception("上级节点不能为自己"); } UpdateTreeObj(sysOrg); return sysOrg.Id; } /// /// 删除指定ID的部门及其所有子部门 /// public void DelOrgCascade(string[] ids) { var delOrgCascadeIds = UnitWork.Find(u => ids.Contains(u.Id)).Select(u => u.CascadeId).ToArray(); var delOrgIds = new List(); foreach (var cascadeId in delOrgCascadeIds) { delOrgIds.AddRange(UnitWork.Find(u=>u.CascadeId.Contains(cascadeId)).Select(u =>u.Id).ToArray()); } UnitWork.Delete(u =>u.Key == Define.USERORG && delOrgIds.Contains(u.SecondId)); UnitWork.Delete(u => delOrgIds.Contains(u.Id)); UnitWork.Save(); } /// /// 加载特定用户的部门 /// /// The user unique identifier. public List LoadForUser(string userId) { var result = from userorg in UnitWork.Find(null) join org in UnitWork.Find(null) on userorg.SecondId equals org.Id where userorg.FirstId == userId && userorg.Key == Define.USERORG select org; return result.ToList(); } public OrgManagerApp(IUnitWork unitWork, IRepository repository,IAuth auth, RevelanceManagerApp revelanceApp) : base(unitWork, repository, auth) { _revelanceApp = revelanceApp; } public string[] GetChairmanId(string[] orgIds) { return Repository.Find(u => orgIds.Contains(u.Id)&&u.ChairmanId!= null).Select(u => u.ChairmanId).ToArray(); } } }