package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.enums.RoleLevelStatus; import com.sandu.common.execption.BusinessException; import com.sandu.common.execption.EntityExistException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.param.MenuParam; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.dao.bo.MenuNode; import com.sandu.ximon.dao.domain.AdminRoleRelation; import com.sandu.ximon.dao.domain.Menu; import com.sandu.ximon.dao.domain.Role; import com.sandu.ximon.dao.domain.RoleMenuRelation; import com.sandu.ximon.dao.mapper.AdminRoleRelationMapper; import com.sandu.ximon.dao.mapper.MenuMapper; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * @author chenjiantian * @date 2021/11/24 11:15 */ @Service @AllArgsConstructor public class MenuService extends BaseServiceImpl { private final RoleMenuRelationService roleMenuRelationService; /** * 获取角色下的菜单 */ public List listByRoleIds(List roleIdList) { List menuIdList = roleMenuRelationService.list(Wrappers.lambdaQuery(RoleMenuRelation.class).in(RoleMenuRelation::getRoleId, roleIdList).select(RoleMenuRelation::getMenuId)) .stream().map(RoleMenuRelation::getMenuId).distinct().collect(Collectors.toList()); if (CollectionUtil.isEmpty(menuIdList)) { return null; } return listByIds(menuIdList); } public boolean addMenu(MenuParam param) { Menu menu = new Menu(); BeanUtils.copyProperties(param, menu); menu.setPermission(param.getRouterName()); return save(menu); } // public Set listMenuByRoles(Set roles) { // List roleIds = roles.stream().map(Role::getId).collect(Collectors.toList()); // Set menus = menuDao.listMenuByRoleIds(roleIds); // return menus; // } // // /** // * 把菜单转成树形结构 // */ // public List buildTree(List menuList) { // return menuList.stream() // .filter(menu -> menu.getPid().equals(0L)) // .map(menu -> covertMenuNode(menu, menuList)).collect(Collectors.toList()); // } private MenuNode covertMenuNode(Menu menu, List menuList) { MenuNode node = new MenuNode(); BeanUtils.copyProperties(menu, node); List children = menuList.stream() .filter(subMenu -> subMenu.getPid().equals(menu.getId())) .map(subMenu -> covertMenuNode(subMenu, menuList)).collect(Collectors.toList()); node.setChildren(children); return node; } public boolean updateMenu(Long menuId, MenuParam param) { Menu one = getById(menuId); if (one == null) { throw new BusinessException("找不到菜单信息"); } List roles = SpringContextHolder.getBean(RoleService.class).listByAdminId(SecurityUtils.getUserId()); Integer roleLevel = roles.stream().map(Role::getLevel).min(Integer::compareTo).orElse(RoleLevelStatus.COMMON.getCode()); if (!RoleLevelStatus.SUPER.getCode().equals(roleLevel)) { throw new BusinessException("超级管理员才可以编辑菜单"); } Menu menu = new Menu(); BeanUtils.copyProperties(param, menu); menu.setPermission(param.getRouterName()); menu.setId(menuId); return updateById(menu); } public List treeList() { List list = list(); return list.stream() .filter(menu -> menu.getPid().equals(0L)) .map(menu -> covertMenuNode(menu, list)).collect(Collectors.toList()); } private MenuMapper menuMapper; public boolean delMenu(Long menuId) { Menu one = getById(menuId); if (one == null) { throw new BusinessException("找不到菜单信息"); } List roles = SpringContextHolder.getBean(RoleService.class).listByAdminId(SecurityUtils.getUserId()); Integer roleLevel = roles.stream().map(Role::getLevel).min(Integer::compareTo).orElse(RoleLevelStatus.COMMON.getCode()); if (!RoleLevelStatus.SUPER.getCode().equals(roleLevel)) { throw new BusinessException("超级管理员才可以删除菜单"); } List list = menuMapper.listMenuIfBinding(menuId); List list1 = menuMapper.listMenuIfBinding1(menuId); if (list.size() == 0 && list1.size() == 0) { return removeById(menuId); } else { throw new BusinessException("菜单正在使用,请勿删除"); } } }