package com.fdkankan.manage.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.request.RequestBase; import com.fdkankan.common.response.PageInfo; import com.fdkankan.manage.entity.SysMenu; import com.fdkankan.manage.entity.SysRoleMenu; import com.fdkankan.manage.entity.SysUser; import com.fdkankan.manage.mapper.ISysMenuMapper; import com.fdkankan.manage.service.ISysMenuService; import com.fdkankan.manage.service.ISysRoleMenuService; import com.fdkankan.manage.service.ISysUserService; import com.fdkankan.manage.vo.response.SysMenuVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author * @since 2022-06-09 */ @Service public class SysMenuServiceImpl extends ServiceImpl implements ISysMenuService { @Autowired ISysRoleMenuService roleMenuService; @Autowired ISysUserService userService; @Override public List getListByUserId(Object loginId) { return getBaseMapper().getListByUserId(loginId); } @Override public PageInfo pageList(RequestBase param) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.isNull(SysMenu::getParentId); wrapper.orderByAsc(SysMenu::getSort); Page page = this.page(new Page<>(param.getPageNum(),param.getPageSize()), wrapper); // List voList = getByParentId(null,page.getRecords(),false,null); List allVos = setTreeMenuVo(false,null); List ids = page.getRecords().parallelStream().map(SysMenu::getId).collect(Collectors.toList()); List voList = allVos.parallelStream().filter(vo -> ids.contains(vo.getId())).collect(Collectors.toList()); Page resultPage = new Page<>(page.getCurrent(),page.getSize()); resultPage.setRecords(voList); resultPage.setTotal(page.getTotal()); return PageInfo.PageInfo(resultPage); } @Override public List allShowList() { return setTreeMenuVo(true,null); } @Override public List getByUserId(Long userId) { SysUser user = userService.getById(userId); List menuList = this.getListByUserId(userId); List menuIds = menuList.parallelStream().map(SysMenu::getId).collect(Collectors.toList()); menuList.forEach(sysMenu -> setMenuIds(menuIds,sysMenu)); return getByRoleId(menuIds,user.getRoleId()); } private void setMenuIds( List menuIds ,SysMenu sysMenu){ if(sysMenu.getParentId()!= null && !menuIds.contains(sysMenu.getParentId())) { menuIds.add(sysMenu.getParentId()); SysMenu menu = this.getById(sysMenu.getParentId()); this.setMenuIds(menuIds,menu); } } @Override public List getByRoleId(List menuIds ,Long roleId) { if(menuIds == null){ List roleMenus = roleMenuService.getByRoleId(roleId); menuIds = roleMenus.parallelStream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()); } return setTreeMenuVo(true,menuIds); } //递归设置menuTree private List getByParentId(Long parentId, List list, boolean show ,List menuIds){ if(list == null){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if(show){ wrapper.eq(SysMenu::getIsShow,1); } if(parentId == null){ wrapper.isNull(SysMenu::getParentId); }else { wrapper.eq(SysMenu::getParentId,parentId); } if(menuIds != null){ wrapper.in(SysMenu::getId,menuIds); } list = this.list(wrapper); } List sysMenuVos = new ArrayList<>(); if(list.size() <=0){ return sysMenuVos; } for (SysMenu record : list) { SysMenuVo vo = new SysMenuVo(); BeanUtils.copyProperties(record,vo); sysMenuVos.add(vo); List children = getByParentId(record.getId(),null,show,menuIds); vo.setChildren(children); } return sysMenuVos; } //查询到全部list ,根据parentId组装树形结构 private List setTreeMenuVo( boolean show ,List menuIds){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if(show){ wrapper.eq(SysMenu::getIsShow,1); } if(menuIds != null){ wrapper.in(SysMenu::getId,menuIds); } List list = this.list(wrapper); List voList = new ArrayList<>(); HashMap voMap = new HashMap<>(); for (SysMenu sysMenu : list) { SysMenuVo menuVo = new SysMenuVo(); BeanUtils.copyProperties(sysMenu,menuVo); voMap.put(sysMenu.getId(),menuVo); } for (SysMenu sysMenu : list) { if(sysMenu.getParentId() !=null){ SysMenuVo menuVo = voMap.get(sysMenu.getId()); List children = voMap.get(sysMenu.getParentId()).getChildren(); children.add(menuVo); }else { voList.add(voMap.get(sysMenu.getId())); } } return voList; } }