/*
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
*
|
* https://www.mall4j.com/
|
*
|
* 未经允许,不可做商业用途!
|
*
|
* 版权所有,侵权必究!
|
*/
|
|
package com.yami.trading.sys.service.impl;
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.yami.trading.sys.constant.Constant;
|
import com.yami.trading.sys.dao.SysMenuMapper;
|
import com.yami.trading.sys.dao.SysRoleMenuMapper;
|
import com.yami.trading.sys.model.SysMenu;
|
import com.yami.trading.sys.service.SysMenuService;
|
import lombok.AllArgsConstructor;
|
import org.springframework.stereotype.Service;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author lgh
|
*/
|
@Service("sysMenuService")
|
@AllArgsConstructor
|
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
|
|
private final SysRoleMenuMapper sysRoleMenuMapper;
|
|
private final SysMenuMapper sysMenuMapper;
|
|
@Override
|
public List<SysMenu> listMenuByUserId(Long userId,String appType) {
|
List<SysMenu> sysMenus ;
|
if(userId == Constant.SUPER_ADMIN_ID||userId == Constant.SUPER_ROOT_ID){
|
sysMenus = sysMenuMapper.listMenu(appType);
|
}else {
|
sysMenus = sysMenuMapper.listMenuByUserId(userId,appType);
|
|
Map<Long,SysMenu> mapSysMenu = new HashMap<>();
|
for (SysMenu sysMenu : sysMenus) {
|
mapSysMenu.put(sysMenu.getMenuId(), sysMenu);
|
}
|
|
List<Long> bigIntArrays = new Vector<>();
|
|
List<SysMenu> sysMenus3 = sysMenuMapper.queryAllPerms2(userId);
|
for (SysMenu sysMenu : sysMenus3) {
|
if (!mapSysMenu.containsKey(sysMenu.getParentId())
|
&& !bigIntArrays.contains(sysMenu.getParentId())
|
&& sysMenu.getParentId() != 0) {
|
bigIntArrays.add(sysMenu.getParentId());
|
}
|
}
|
|
if(!bigIntArrays.isEmpty()){
|
List<SysMenu> sysMenus2 = sysMenuMapper.listMenuByUserId2(bigIntArrays,appType);
|
for (SysMenu sysMenu : sysMenus2) {
|
mapSysMenu.put(sysMenu.getMenuId(), sysMenu);
|
}
|
sysMenus.addAll(sysMenus2);
|
}
|
|
appendMissingMenuAncestors(sysMenus, mapSysMenu, appType);
|
}
|
|
Map<Long, List<SysMenu>> sysMenuLevelMap = sysMenus.stream()
|
.sorted(Comparator.comparing(SysMenu::getOrderNum))
|
.collect(Collectors.groupingBy(SysMenu::getParentId));
|
|
List<SysMenu> rootMenu = sysMenuLevelMap.get(0L);
|
if (CollectionUtil.isEmpty(rootMenu)) {
|
return Collections.emptyList();
|
}
|
|
for (SysMenu sysMenu : rootMenu) {
|
attachMenuChildren(sysMenu, sysMenuLevelMap);
|
}
|
|
return rootMenu;
|
}
|
|
private void appendMissingMenuAncestors(List<SysMenu> sysMenus, Map<Long, SysMenu> mapSysMenu, String appType) {
|
while (true) {
|
List<Long> missingParents = new ArrayList<>();
|
for (SysMenu sysMenu : sysMenus) {
|
Long parentId = sysMenu.getParentId();
|
if (parentId != null && parentId != 0
|
&& !mapSysMenu.containsKey(parentId)
|
&& !missingParents.contains(parentId)) {
|
missingParents.add(parentId);
|
}
|
}
|
if (missingParents.isEmpty()) {
|
return;
|
}
|
List<SysMenu> parents = sysMenuMapper.listMenuByUserId2(missingParents, appType);
|
if (CollectionUtil.isEmpty(parents)) {
|
return;
|
}
|
for (SysMenu parent : parents) {
|
mapSysMenu.put(parent.getMenuId(), parent);
|
}
|
sysMenus.addAll(parents);
|
}
|
}
|
|
private void attachMenuChildren(SysMenu menu, Map<Long, List<SysMenu>> sysMenuLevelMap) {
|
List<SysMenu> children = sysMenuLevelMap.get(menu.getMenuId());
|
menu.setList(children);
|
if (CollectionUtil.isEmpty(children)) {
|
return;
|
}
|
for (SysMenu child : children) {
|
attachMenuChildren(child, sysMenuLevelMap);
|
}
|
}
|
|
@Override
|
public void deleteMenuAndRoleMenu(Long menuId){
|
this.removeById(menuId);
|
sysRoleMenuMapper.deleteByMenuId(menuId);
|
}
|
|
|
@Override
|
public List<Long> listMenuIdByRoleId(Long roleId,String appType) {
|
return sysMenuMapper.listMenuIdByRoleId(roleId,appType);
|
}
|
|
|
@Override
|
public List<SysMenu> listSimpleMenuNoButton(String appType) {
|
return sysMenuMapper.listSimpleMenuNoButton(appType);
|
}
|
|
@Override
|
public List<SysMenu> listRootMenu() {
|
return sysMenuMapper.listRootMenu();
|
}
|
|
@Override
|
public List<SysMenu> listChildrenMenuByParentId(Long parentId) {
|
return sysMenuMapper.listChildrenMenuByParentId(parentId);
|
}
|
|
@Override
|
public List<SysMenu> listMenuAndBtn( String appType) {
|
return sysMenuMapper.listMenuAndBtn(appType);
|
}
|
|
}
|