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;
}
}