/// <summary> /// 根据权限拥有者类别ID重新设定权限 /// </summary> /// <param name="sysId"></param> /// <param name="privilegeMaster"></param> /// <param name="IDs">包括菜单、按钮编号</param> /// <param name="userName">当前操作用户</param> /// <returns></returns> public bool SetMenuPrivilege(string sysId, PrivilegeMaster privilegeMaster, string[] IDs, string userName) { //获取所有菜单 IEnumerable <SysMenu> allMenus = menuRepository.GetList(); //获取所有按钮 IEnumerable <SysButton> allButtons = buttonRepository.GetList(); //存储传入的menuId集合 List <string> menus = (from menu in allMenus where IDs.Contains(menu.SysId) select menu.SysId).ToList(); //存储传入的buttonId集合 List <string> buttons = (from button in allButtons where IDs.Contains(button.SysId) select button.SysId).ToList(); using (IDbTransaction tran = privilegeRepository.Connection.BeginTransaction()) { //根据用户ID获取原来用户可用菜单 //用于和现在选中的菜单进行判断,是否屏蔽原来可用菜单 IEnumerable <SysMenu> userMenus = ServiceFactory.MenuService.GetPrivilegedSysMenuByUserId(sysId); this.privilegeRepository.DeleteSysPrivilegeByMaster(sysId, privilegeMaster, tran); #region 如果是用户权限,先将用户和角色的权限进行对比,将用户禁用而角色启用的菜单和按钮设置为禁用 if (privilegeMaster == PrivilegeMaster.User) { #region 设置菜单禁用 foreach (SysMenu userMenu in userMenus) { if (!menus.Contains(userMenu.SysId)) { SysPrivilege sysPrivilege = new SysPrivilege { PrivilegeAccess = PrivilegeAccess.Menu, PrivilegeAccessKey = userMenu.SysId, PrivilegeMaster = privilegeMaster, PrivilegeMasterKey = sysId, PrivilegeOperation = PrivilegeOperation.Disable, RecordStatus = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName) }; int addResult = privilegeRepository.Add(sysPrivilege, tran); if (addResult == 0) { tran.Rollback(); return(false); } #region 设置按钮禁用 if (userMenu.Buttons != null) { foreach (SysButton button in userMenu.Buttons) { if (!buttons.Contains(button.SysId)) { SysPrivilege sysPrivilegeBt = new SysPrivilege { PrivilegeAccess = PrivilegeAccess.Button, PrivilegeAccessKey = button.SysId, PrivilegeMaster = privilegeMaster, PrivilegeMasterKey = sysId, PrivilegeOperation = PrivilegeOperation.Disable, RecordStatus = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName) }; addResult = privilegeRepository.Add(sysPrivilege, tran); if (addResult == 0) { tran.Rollback(); return(false); } } } } #endregion } } #endregion } #endregion #region 角色权限,只存储可用菜单,不进行和现在选中菜单判断 foreach (string menu in menus) { SysPrivilege sysPrivilege = new SysPrivilege { PrivilegeAccess = PrivilegeAccess.Menu, PrivilegeAccessKey = menu, PrivilegeMaster = privilegeMaster, PrivilegeMasterKey = sysId, PrivilegeOperation = PrivilegeOperation.Enable, RecordStatus = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName) }; int addResult = privilegeRepository.Add(sysPrivilege, tran); if (addResult == 0) { tran.Rollback(); return(false); } #region 存储菜单下不可用按钮 var menuBts = allButtons.Where(x => x.MenuId == menu); menuBts = menuBts.Where(x => (!buttons.Contains(x.SysId))); foreach (SysButton sysButton in menuBts) { sysPrivilege = new SysPrivilege { PrivilegeAccess = PrivilegeAccess.Button, PrivilegeAccessKey = sysButton.SysId, PrivilegeMaster = privilegeMaster, PrivilegeMasterKey = sysId, PrivilegeOperation = PrivilegeOperation.Disable, RecordStatus = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName) }; addResult = privilegeRepository.Add(sysPrivilege, tran); if (addResult == 0) { tran.Rollback(); return(false); } } #endregion } #endregion tran.Commit(); return(true); } }