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.Meta;
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.Arrays;
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,null);
// List allVos = setTreeMenuVo(false,null,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 getByParentId(null,null,true,null,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);
if(roleMenus == null || roleMenus.size() <=0){
return new ArrayList<>();
}
menuIds = roleMenus.parallelStream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
}
return getByParentId(null,null,true,menuIds,2);
}
//递归设置menuTree
private List getByParentId(Long parentId, List list, boolean show ,List menuIds,Integer notType){
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);
}
if(notType!=null){
wrapper.notIn(SysMenu::getType, Arrays.asList(notType));
}
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);
Meta meta = new Meta();
meta.setIcon(record.getIcon());
meta.setTitle(record.getName());
meta.setHideMenu(record.getHideMenu() == 1);
meta.setFrameSrc(null);
vo.setMeta(meta);
sysMenuVos.add(vo);
List children = getByParentId(record.getId(),null,show,menuIds,notType);
vo.setChildren(children);
}
return sysMenuVos;
}
@Override
public List getButtonByUserId(Long userId) {
SysUser user = userService.getById(userId);
List roleMenus = roleMenuService.getByRoleId(user.getRoleId());
List menuId = roleMenus.parallelStream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(SysMenu::getId,menuId);
wrapper.eq(SysMenu::getType,2);
return this.list(wrapper);
}
}