using IRaCIS.Application.Contracts; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Core.Application.Service { [ApiExplorerSettings(GroupName = "Management")] public class MenuService(IRepository<Menu> _menuRepository, IRepository<UserTypeMenu> _userTypeMenuRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IMenuService { /// <summary> /// 添加菜单 New /// </summary> /// <param name="menuAddOrUpdateModel"></param> /// <returns></returns> public async Task<IResponseOutput> AddOrUpdateMenu(MenuCommand menuAddOrUpdateModel) { var exp = new EntityVerifyExp<Menu>() { VerifyExp = u => u.ParentId == menuAddOrUpdateModel.ParentId && u.MenuName == menuAddOrUpdateModel.MenuName, //---该父节点下已经存在同名的子节点。 VerifyMsg = _localizer["Menu_ParentDupChild"] }; var menu = await _menuRepository.InsertOrUpdateAsync(menuAddOrUpdateModel, true, exp); return ResponseOutput.Ok(menu.Id.ToString()); #region 废弃前 //if (menuAddOrUpdateModel.Id == null) //{ // bool exist = _menuFunctionRepository.Any(u => u.ParentId == menuAddOrUpdateModel.ParentId && u.MenuName == menuAddOrUpdateModel.MenuName); // if (exist) // { // return ResponseOutput.NotOk("A son node with the same name already existed under this parent node."); // } // if (!string.IsNullOrWhiteSpace(menuAddOrUpdateModel.FunctionName)) // { // menuAddOrUpdateModel.IsFunction = true; // } // var result = _menuFunctionRepository.Add(_mapper.Map<MenuFunction>(menuAddOrUpdateModel)); // if (_menuFunctionRepository.SaveChanges()) // { // return ResponseOutput.Ok(result.Id.ToString()); // } // return ResponseOutput.NotOk(); //} //else //{ // var menuUpdateModel = menuAddOrUpdateModel; // bool exist = _menuFunctionRepository.Any(u => u.ParentId == menuUpdateModel.ParentId && // u.MenuName == menuUpdateModel.MenuName && u.Id != menuUpdateModel.Id); // if (exist) // { // return ResponseOutput.NotOk("A son node with the same name already existed under this parent node."); // } // var updateModel = _mapper.Map<MenuFunction>(menuUpdateModel); // if (!string.IsNullOrWhiteSpace(updateModel.FunctionName)) // { // updateModel.IsFunction = true; // } // _menuFunctionRepository.Update(updateModel); // var success = _menuFunctionRepository.SaveChanges(); // return ResponseOutput.Result(success); //} #endregion } /// <summary> /// 删除菜单 已验证 父节点不允许删除 New /// </summary> /// <param name="menuId"></param> /// <returns></returns> [HttpDelete("{menuId:guid}")] public async Task<IResponseOutput> DeleteMenu(Guid menuId) { if (await _menuRepository.AnyAsync(t => t.ParentId == menuId)) { //---该节点存在子节点,请在删除子节点后,再删除该节点。 return ResponseOutput.NotOk(_localizer["Menu_ChildExist"]); } var success = await _menuRepository.BatchDeleteNoTrackingAsync(u => u.Id == menuId); return ResponseOutput.Result(success); } /// <summary> /// 所有的菜单树 包括禁用的 New /// </summary> /// <returns></returns> [HttpGet] public async Task<List<MenuTreeNode>> GetMenuTree() { var allMenuList = (await _menuRepository.ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).ToListAsync()).IfNullThrowException(); var list = allMenuList.ToTree((root, child) => child.ParentId == Guid.Empty, (root, child) => child.ParentId == root.MenuId, (child, datalist) => { child.Children ??= new List<MenuTreeNode>(); child.Children.AddRange(datalist); }, item => item.ShowOrder); return list; } /// <summary> /// 菜单列表 参数都是可传的 根据需要传递 New /// </summary> /// <param name="menuQueyDTO"></param> /// <returns></returns> [HttpPost] public async Task<List<MenuDTO>> GetMenuList(MenuQueyDTO menuQueyDTO) { return await _menuRepository .WhereIf(menuQueyDTO.ParentId != null, t => t.ParentId == menuQueyDTO.ParentId) .WhereIf(menuQueyDTO.IsEnable != null, t => t.IsEnable == menuQueyDTO.IsEnable) .WhereIf(menuQueyDTO.IsCache != null, t => t.IsCache == menuQueyDTO.IsCache) .WhereIf(menuQueyDTO.IsDisplay != null, t => t.IsDisplay == menuQueyDTO.IsDisplay) .WhereIf(menuQueyDTO.IsExternalLink != null, t => t.IsExternalLink == menuQueyDTO.IsExternalLink) .WhereIf(menuQueyDTO.IsInTabDisplay != null, t => t.IsInTabDisplay == menuQueyDTO.IsInTabDisplay) .WhereIf(menuQueyDTO.MenuType != null, t => t.MenuType == menuQueyDTO.MenuType) .ProjectTo<MenuDTO>(_mapper.ConfigurationProvider).OrderBy(t => t.ShowOrder).ToListAsync(); } /// <summary> /// 获取某用户类型(角色) 菜单树 勾选情况 New /// </summary> /// <param name="userTypeId"></param> /// <returns></returns> [HttpGet("{userTypeId:guid}")] public async Task<List<MenuTreeNodeSelect>> GetUserTypeMenuTree(Guid userTypeId) { var menuFunctionlist = (await _menuRepository .ProjectTo<MenuTreeNodeSelect>(_mapper.ConfigurationProvider, new { userTypeId = userTypeId }).ToListAsync()).IfNullThrowException(); var list = menuFunctionlist.ToTree((root, child) => child.ParentId == Guid.Empty, (root, child) => child.ParentId == root.MenuId, (child, datalist) => { child.Children ??= new List<MenuTreeNodeSelect>(); child.Children.AddRange(datalist); }, item => item.ShowOrder); return list; } [AllowAnonymous] public async Task<List<MenuTreeNode>> GetUserMenuTree() { var menuFunctionlist = await _userTypeMenuRepository .Where(t => t.UserTypeId == _userInfo.UserTypeId && (t.Menu.MenuType == "M" || t.Menu.MenuType == "C") && t.Menu.IsEnable) .ProjectTo<MenuTreeNode>(_mapper.ConfigurationProvider).ToListAsync(); var list = menuFunctionlist!.ToTree((root, child) => child!.ParentId == Guid.Empty, (root, child) => child!.ParentId == root!.MenuId, (child, datalist) => { child!.Children ??= new List<MenuTreeNode>(); child.Children.AddRange(datalist); }, item => item!.ShowOrder); return list; } [AllowAnonymous] public async Task<List<string>> GetUserPermissions() { var list = await _userTypeMenuRepository .Where(t => t.UserTypeId == _userInfo.UserTypeId && t.Menu.MenuType == "F") .Select(t => t.Menu.PermissionStr).ToListAsync(); //var str = await _userTypeRepository.Where(t => t.Id == _userInfo.UserTypeId).Select(t => t.PermissionStr).FirstOrDefaultAsync(); list.Add(_userInfo.PermissionStr); return list; } #region 废弃 生成树废弃前 //public List<MenuTreeNode> GetMenuFunction() //{ // var allMenuList = _menuFunctionRepository.ProjectTo<MenuFunctionDTO>(_mapper.ConfigurationProvider).ToList(); // return GetTreeList(Guid.Empty, allMenuList); //} ///// <summary> ///// 根据父节点ID递归生成树 ///// </summary> ///// <param name="parentId"></param> ///// <param name="allMenuList"></param> ///// <returns></returns> //[NonDynamicMethod] //public List<MenuTreeNode> GetTreeList(Guid? parentId, List<MenuFunctionDTO> allMenuList) //{ // //树节点集合 每个节点包含一个菜单项 和一个子菜单集合 // List<MenuTreeNode> treeList = new List<MenuTreeNode>(); // // 根据父菜单节点获取子菜单节点 并且进行排序 // List<MenuFunctionDTO> menuList = allMenuList.Where(x => x.ParentId == parentId).OrderBy(t => t.ShowOrder).ToList(); // foreach (var menuItem in menuList) // { // MenuTreeNode treeItem = new MenuTreeNode() // { // Id = menuItem.Id, // ParentId = menuItem.ParentId, // RouteName = menuItem.RouteName, // MenuName = menuItem.MenuName, // Path = menuItem.Path, // Hidden = menuItem.Hidden, // Component = menuItem.Component, // FunctionName = menuItem.FunctionName, // IsFunction = menuItem.IsFunction, // MetaActiveMenu = menuItem.MetaActiveMenu, // MetaBreadcrumb = menuItem.MetaBreadcrumb, // MetaIcon = menuItem.MetaIcon, // MetaTitle = menuItem.MetaTitle, // Redirect = menuItem.Redirect, // ShowOrder = menuItem.ShowOrder, // Note = menuItem.Note, // Status = menuItem.Status, // Children = GetTreeList(menuItem.Id, allMenuList) // }; // treeList.Add(treeItem); // } // return treeList; //} ///// <summary> ///// 获取某角色 菜单树 勾选情况 和 功能勾选情况 ///// </summary> ///// <param name="roleId"></param> ///// <returns></returns> //[HttpGet("{roleId:guid}")] //public List<MenuTreeNodeSelect> GetRoleMenuFunction(Guid roleId) //{ // var menuFuncQuery = from function in _menuFunctionRepository.Where(u => !u.IsFunction) // join roleMenuFunctionItem in _roleMenuFunctionRepository.AsQueryable() // .Where(t => t.UserTypeId == roleId) // on function.Id equals roleMenuFunctionItem.MenuFunctionId into t // from roleFunction in t.DefaultIfEmpty() // select new MenuTreeNodeSelect() // { // IsSelect = roleFunction != null, // ShowOrder = function.ShowOrder, // MenuName = function.MenuName, // Note = function.Note, // FunctionName = function.FunctionName, // ParentId = function.ParentId, // Id = function.Id, // }; // var list = menuFuncQuery.ToList(); // return GetSelectTreeList(Guid.Empty, list); //} //[NonDynamicMethod] //private List<MenuTreeNodeSelect> GetSelectTreeList(Guid parentId, List<MenuTreeNodeSelect> allMenuList) //{ // List<MenuTreeNodeSelect> TreeList = new List<MenuTreeNodeSelect>(); // List<MenuTreeNodeSelect> menuList = allMenuList.Where(x => x.ParentId == parentId).OrderBy(t => t.ShowOrder).ToList(); // foreach (var menuItem in menuList) // { // MenuTreeNodeSelect treeItem = new MenuTreeNodeSelect() // { // Id = menuItem.Id, // ParentId = menuItem.ParentId, // RouteName = menuItem.RouteName, // MenuName = menuItem.MenuName, // Note = menuItem.Note, // IsSelect = menuItem.IsSelect, // ShowOrder = menuItem.ShowOrder, // Children = GetSelectTreeList(menuItem.Id, allMenuList) // }; // TreeList.Add(treeItem); // } // return TreeList; //} //[NonDynamicMethod] //private List<MenuTreeNode> GetTreeList(Guid? parentId, List<MenuTreeNode> allMenuList) //{ // List<MenuTreeNode> TreeList = new List<MenuTreeNode>(); // List<MenuTreeNode> menuList = allMenuList.Where(x => x.ParentId == parentId).OrderBy(t => t.ShowOrder).ToList(); // foreach (var menuItem in menuList) // { // MenuTreeNode treeItem = new MenuTreeNode() // { // Id = menuItem.Id, // ParentId = menuItem.ParentId, // RouteName = menuItem.RouteName, // MenuName = menuItem.MenuName, // Path = menuItem.Path, // Hidden = menuItem.Hidden, // Component = menuItem.Component, // FunctionName = menuItem.FunctionName, // IsFunction = menuItem.IsFunction, // MetaActiveMenu = menuItem.MetaActiveMenu, // MetaBreadcrumb = menuItem.MetaBreadcrumb, // MetaIcon = menuItem.MetaIcon, // MetaTitle = menuItem.MetaTitle, // Redirect = menuItem.Redirect, // ShowOrder = menuItem.ShowOrder, // Note = menuItem.Note, // Status = menuItem.Status, // Children = GetTreeList(menuItem.Id, allMenuList) // }; // TreeList.Add(treeItem); // } // return TreeList; //} #endregion } }