package com.sandu.ximon.admin.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; private MenuMapper menuMapper; /** * 获取角色下的菜单 */ 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 menuMapper.listMenuById(menuIdList); } public boolean addMenu(MenuParam param) { Menu menu = new Menu(); BeanUtils.copyProperties(param, menu); return save(menu); } 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.setType(one.getType()); menu.setId(menuId); return updateById(menu); } public List treeList() { LambdaQueryWrapper menuLambdaQueryWrapper = Wrappers.lambdaQuery(Menu.class).orderByAsc(Menu::getSeq); List list = list(menuLambdaQueryWrapper); return list.stream() .filter(menu -> menu.getPid().equals(0L)) .map(menu -> covertMenuNode(menu, list)).collect(Collectors.toList()); } 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("菜单正在使用,请勿删除"); } } /** * 通过菜单ID集合获取菜单实体列表 * * @param menuIds 菜单ID集合 */ public List getUserPermissionListById(List menuIds) { List menuList = menuMapper.getUserPermissionListById(menuIds); List resultList = menuList.stream() .filter(menu -> menu.getPid().equals(0L)) .map(menu -> covertMenuNode(menu, menuList)).collect(Collectors.toList()); return resultList; } }