using Infrastructure; using OpenAuth.App.ViewModel; using OpenAuth.Domain; using OpenAuth.Domain.Interface; using System; using System.Collections.Generic; using System.Linq; namespace OpenAuth.App { public class ModuleManagerApp { private IModuleRepository _repository; private IRelevanceRepository _relevanceRepository; public ModuleManagerApp(IModuleRepository repository, IRelevanceRepository relevanceRepository) { _repository = repository; _relevanceRepository = relevanceRepository; } /// /// 加载一个节点下面的所有 /// public dynamic Load(int parentId, int pageindex, int pagesize) { IEnumerable Modules; int total = 0; if (parentId == 0) { Modules = _repository.LoadModules(pageindex, pagesize); total = _repository.GetCount(); } else { Modules = _repository.LoadInOrgs(pageindex, pagesize, GetSubOrgIds(parentId)); total = _repository.GetModuleCntInOrgs(parentId); } return new { total = total, list = Modules, pageCurrent = pageindex }; } /// /// 为树型结构提供数据 /// public List LoadForTree() { return _repository.Find(null).ToList(); } /// /// 以组合的方式显示所有的模块信息 /// /// The parent unique identifier. /// List{ModuleView}. public List LoadByParent(int parentId) { var modules = new List(); var roots = _repository.Find(u => u.ParentId == parentId); foreach (var module in roots) { ModuleView mv = module; mv.Childern = LoadByParent(module.Id); modules.Add(mv); } return modules; } public Module Find(int id) { var module = _repository.FindSingle(u => u.Id == id); if (module == null) return new Module(); return module; } public void Delete(int id) { var del = _repository.FindSingle(u => u.Id == id); if (del == null) return; _repository.Delete(u => u.CascadeId.Contains(del.CascadeId)); } public void AddOrUpdate(Module vm) { Module model = new Module(); vm.CopyTo(model); //copy一次,防止成员为null的情况 ChangeModuleCascade(model); if (model.Id == 0) { _repository.Add(model); } else { _repository.Update(model); } } #region 用户/角色分配模块 /// /// 加载特定用户的模块 /// TODO:这里会加载用户及用户角色的所有模块,“为用户分配模块”功能会给人一种混乱的感觉,但可以接受 /// /// The user unique identifier. public List LoadForUser(int userId) { //用户角色 var userRoleIds = _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserRole").Select(u => u.SecondId).ToList(); //用户角色与自己分配到的模块ID var moduleIds = _relevanceRepository.Find( u => (u.FirstId == userId && u.Key == "UserModule") || (u.Key == "RoleModule" && userRoleIds.Contains(u.FirstId))).Select(u => u.SecondId).ToList(); //var moduleIds = // _relevanceRepository.Find(u => u.FirstId == userId && u.Key == "UserModule") // .Select(u => u.SecondId) // .ToList(); if (!moduleIds.Any()) return new List(); return _repository.Find(u => moduleIds.Contains(u.Id)).ToList(); } /// /// 为特定的用户分配模块 /// /// The user unique identifier. /// 模块ID public void AssignModuleForUser(int userId, int[] ids) { _relevanceRepository.DeleteBy("UserModule", userId); _relevanceRepository.AddRelevance("UserModule", ids.ToLookup(u => userId)); } /// /// 加载特定角色的模块 /// /// The role unique identifier. public List LoadForRole(int roleId) { var moduleIds = _relevanceRepository.Find(u => u.FirstId == roleId && u.Key == "RoleModule") .Select(u => u.SecondId) .ToList(); if (!moduleIds.Any()) return new List(); return _repository.Find(u => moduleIds.Contains(u.Id)).ToList(); } /// /// 为特定的角色分配模块 /// /// The user unique identifier. /// 模块ID public void AssignModuleForRole(int roleId, int[] ids) { _relevanceRepository.DeleteBy("RoleModule", roleId); _relevanceRepository.AddRelevance("RoleModule", ids.ToLookup(u => roleId)); } #endregion 用户/角色分配模块 #region 私有方法 //根据同一级中最大的语义ID private int[] GetSubOrgIds(int parentId) { var parent = _repository.FindSingle(u => u.Id == parentId); var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray(); return orgs; } //修改对象的级联ID private void ChangeModuleCascade(Module module) { string cascadeId; int currentCascadeId = 1; //当前结点的级联节点最后一位 var sameLevels = _repository.Find(o => o.ParentId == module.ParentId && o.Id != module.Id); foreach (var obj in sameLevels) { int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1; } if (module.ParentId != 0) { var parentOrg = _repository.FindSingle(o => o.Id == module.ParentId); if (parentOrg != null) { cascadeId = parentOrg.CascadeId + "." + currentCascadeId; module.ParentName = parentOrg.Name; } else { throw new Exception("未能找到该组织的父节点信息"); } } else { cascadeId = "0." + currentCascadeId; module.ParentName = "根节点"; } module.CascadeId = cascadeId; } #endregion 私有方法 } }