irc-netcore-api/IRaCIS.Core.Application/Service/Management/MenuService.cs

360 lines
14 KiB
C#

using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Application.Services
{
[ApiExplorerSettings(GroupName = "Management")]
public class MenuService : BaseService, IMenuService
{
private readonly IRepository<Menu> menuRepository;
private readonly IRepository<UserTypeMenu> _userTypeMenuRepository;
public MenuService(IRepository<Menu> menuRepository, IRepository<UserTypeMenu> userTypeMenuRepository)
{
this.menuRepository = menuRepository;
this._userTypeMenuRepository = userTypeMenuRepository;
}
/// <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 = "A son node with the same name already existed under this parent node."
};
var menu = await _repository.InsertOrUpdateAsync<Menu, MenuCommand>(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("不允许直接删除父节点");
}
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;
}
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;
}
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 _repository.Where<UserType>(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
}
}