package com.qianwen.smartman.modules.system.service.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.secure.BladeUser; import com.qianwen.core.secure.utils.AuthUtil; import com.qianwen.core.tool.constant.BladeConstant; import com.qianwen.core.tool.node.ForestNodeMerger; import com.qianwen.core.tool.support.Kv; import com.qianwen.core.tool.utils.Func; import com.qianwen.core.tool.utils.StringUtil; import com.qianwen.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.enums.MenuCategoryEnum; import com.qianwen.smartman.modules.system.dto.MenuDTO; import com.qianwen.smartman.modules.system.entity.Menu; import com.qianwen.smartman.modules.system.entity.RoleMenu; import com.qianwen.smartman.modules.system.entity.RoleScope; import com.qianwen.smartman.modules.system.entity.TopMenuSetting; import com.qianwen.smartman.modules.system.mapper.MenuMapper; import com.qianwen.smartman.modules.system.service.IMenuService; import com.qianwen.smartman.modules.system.service.IRoleMenuService; import com.qianwen.smartman.modules.system.service.IRoleScopeService; import com.qianwen.smartman.modules.system.service.ITopMenuSettingService; import com.qianwen.smartman.modules.system.vo.MenuVO; import com.qianwen.smartman.modules.system.wrapper.MenuWrapper; @Service public class MenuServiceImpl extends ServiceImpl implements IMenuService { private static final String PARENT_ID = "parentId"; private static final Integer MENU_CATEGORY = 1; private final IRoleMenuService roleMenuService; private final IRoleScopeService roleScopeService; private final ITopMenuSettingService topMenuSettingService; public MenuServiceImpl(final IRoleMenuService roleMenuService, final IRoleScopeService roleScopeService, final ITopMenuSettingService topMenuSettingService) { this.roleMenuService = roleMenuService; this.roleScopeService = roleScopeService; this.topMenuSettingService = topMenuSettingService; } @Override // org.springblade.modules.system.service.IMenuService public List lazyList(Long parentId, Map param) { if (Func.isEmpty(Func.toStr(param.get(PARENT_ID)))) { parentId = null; } return ((MenuMapper) this.baseMapper).lazyList(parentId, param); } @Override // org.springblade.modules.system.service.IMenuService public List lazyMenuList(Long parentId, Map param) { if (Func.isEmpty(Func.toStr(param.get(PARENT_ID)))) { parentId = null; } return ((MenuMapper) this.baseMapper).lazyMenuList(parentId, param); } @Override // org.springblade.modules.system.service.IMenuService public List routes(String roleId, Long topMenuId) { List roleMenus; if (StringUtil.isBlank(roleId)) { return null; } List allMenus = ((MenuMapper) this.baseMapper).allMenu(); if (AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) { roleMenus = allMenus; } else if (!AuthUtil.isAdministrator()) { roleMenus = ((MenuMapper) this.baseMapper).roleMenuByRoleId(Func.toLongList(roleId)); } else { List roleIdMenus = ((MenuMapper) this.baseMapper).roleMenuByRoleId(Func.toLongList(roleId)); List routes = new LinkedList<>(roleIdMenus); roleIdMenus.forEach(roleMenu -> { recursion(allMenus, routes, roleMenu); }); List topIdMenus = ((MenuMapper) this.baseMapper).roleMenuByTopMenuId(topMenuId); roleMenus = topIdMenus.stream().filter(x -> { return routes.stream().anyMatch(route -> { return route.getId().longValue() == x.getId().longValue(); }); }).collect(Collectors.toList()); } return buildRoutes(allMenus, roleMenus); } @Override // org.springblade.modules.system.service.IMenuService public List routesExt(String roleId, Long topMenuId) { if (StringUtil.isBlank(roleId)) { return null; } List allMenus = ((MenuMapper) this.baseMapper).allMenuExt(); List roleMenus = ((MenuMapper) this.baseMapper).roleMenuExt(Func.toLongList(roleId), topMenuId); return buildRoutes(allMenus, roleMenus); } private List buildRoutes(List allMenus, List roleMenus) { List routes = new LinkedList<>(roleMenus); roleMenus.forEach(roleMenu -> { recursion(allMenus, routes, roleMenu); }); routes.sort(Comparator.comparing((v0) -> { return v0.getSort(); })); MenuWrapper menuWrapper = new MenuWrapper(); List collect = routes.stream().filter(x -> { return Func.equals(x.getCategory(), Integer.valueOf(MenuCategoryEnum.APP.getStatus())) || Func.equals(x.getCategory(), Integer.valueOf(MenuCategoryEnum.MENU.getStatus())); }).collect(Collectors.toList()); return menuWrapper.listNodeVO(collect); } private void recursion(List allMenus, List routes, Menu roleMenu) { Optional menu = allMenus.stream().filter(x -> { return Func.equals(x.getId(), roleMenu.getParentId()); }).findFirst(); if (menu.isPresent() && !routes.contains(menu.get())) { routes.add(menu.get()); recursion(allMenus, routes, menu.get()); } } @Override // org.springblade.modules.system.service.IMenuService public List buttons(String roleId) { List buttons = AuthUtil.isAdministrator() ? ((MenuMapper) this.baseMapper).allButtons() : ((MenuMapper) this.baseMapper).buttons(Func.toLongList(roleId)); MenuWrapper menuWrapper = new MenuWrapper(); return menuWrapper.listNodeVO(buttons); } @Override // org.springblade.modules.system.service.IMenuService public List tree() { return ForestNodeMerger.merge(((MenuMapper) this.baseMapper).tree()); } @Override // org.springblade.modules.system.service.IMenuService public List grantTree(BladeUser user) { return ForestNodeMerger.merge(user.getTenantId().equals("000000") ? ((MenuMapper) this.baseMapper).grantTree() : ((MenuMapper) this.baseMapper).grantTreeByRole(Func.toLongList(user.getRoleId()))); } @Override // org.springblade.modules.system.service.IMenuService public List grantTreeByCategory(BladeUser user, List categoryList) { return ForestNodeMerger.merge(user.getTenantId().equals("000000") ? ((MenuMapper) this.baseMapper).grantTreeByCategory(categoryList) : ((MenuMapper) this.baseMapper).grantTreeByRole(Func.toLongList(user.getRoleId()))); } @Override // org.springblade.modules.system.service.IMenuService public List grantTopTree(BladeUser user) { return ForestNodeMerger.merge(user.getTenantId().equals("000000") ? ((MenuMapper) this.baseMapper).grantTopTree() : ((MenuMapper) this.baseMapper).grantTopTreeByRole(Func.toLongList(user.getRoleId()))); } @Override // org.springblade.modules.system.service.IMenuService public List grantDataScopeTree(BladeUser user) { return ForestNodeMerger.merge(user.getTenantId().equals("000000") ? ((MenuMapper) this.baseMapper).grantDataScopeTree() : ((MenuMapper) this.baseMapper).grantDataScopeTreeByRole(Func.toLongList(user.getRoleId()))); } @Override // org.springblade.modules.system.service.IMenuService public List grantApiScopeTree(BladeUser user) { return ForestNodeMerger.merge(user.getTenantId().equals("000000") ? ((MenuMapper) this.baseMapper).grantApiScopeTree() : ((MenuMapper) this.baseMapper).grantApiScopeTreeByRole(Func.toLongList(user.getRoleId()))); } @Override // org.springblade.modules.system.service.IMenuService public List roleTreeKeys(String roleIds) { List roleMenus = this.roleMenuService.list(Wrappers.query().lambda().in(RoleMenu::getRoleId, Func.toLongList(roleIds))); /* List roleMenus = this.roleMenuService.list((Wrapper) Wrappers.query().lambda().in((v0) -> { return v0.getRoleId(); }, Func.toLongList(roleIds)));*/ return roleMenus.stream().map(roleMenu -> { return Func.toStr(roleMenu.getMenuId()); }).collect(Collectors.toList()); } @Override // org.springblade.modules.system.service.IMenuService public List topTreeKeys(String topMenuIds) { List settings = this.topMenuSettingService.list(Wrappers.query().lambda().in(TopMenuSetting::getTopMenuId, Func.toLongList(topMenuIds))); /* List settings = this.topMenuSettingService.list((Wrapper) Wrappers.query().lambda().in((v0) -> { return v0.getTopMenuId(); }, Func.toLongList(topMenuIds)));*/ return settings.stream().map(setting -> { return Func.toStr(setting.getMenuId()); }).collect(Collectors.toList()); } @Override // org.springblade.modules.system.service.IMenuService public List dataScopeTreeKeys(String roleIds) { List roleScopes = this.roleScopeService.list(Wrappers.query().lambda().eq(RoleScope::getScopeCategory, CommonConstant.DATA_SCOPE_CATEGORY).in(RoleScope::getRoleId, Func.toLongList(roleIds))); /* List roleScopes = this.roleScopeService.list((Wrapper) ((LambdaQueryWrapper) Wrappers.query().lambda().eq((v0) -> { return v0.getScopeCategory(); }, CommonConstant.DATA_SCOPE_CATEGORY)).in((v0) -> { return v0.getRoleId(); }, Func.toLongList(roleIds)));*/ return roleScopes.stream().map(roleScope -> { return Func.toStr(roleScope.getScopeId()); }).collect(Collectors.toList()); } @Override // org.springblade.modules.system.service.IMenuService public List apiScopeTreeKeys(String roleIds) { List roleScopes = this.roleScopeService.list(Wrappers.query().lambda().eq(RoleScope::getScopeCategory, CommonConstant.API_SCOPE_CATEGORY).in(RoleScope::getRoleId, Func.toLongList(roleIds))); /* List roleScopes = this.roleScopeService.list((Wrapper) ((LambdaQueryWrapper) Wrappers.query().lambda().eq((v0) -> { return v0.getScopeCategory(); }, CommonConstant.API_SCOPE_CATEGORY)).in((v0) -> { return v0.getRoleId(); }, Func.toLongList(roleIds)));*/ return roleScopes.stream().map(roleScope -> { return Func.toStr(roleScope.getScopeId()); }).collect(Collectors.toList()); } @Override // org.springblade.modules.system.service.IMenuService @Cacheable(cacheNames = {"blade:menu"}, key = "'auth:routes:' + #user.roleId") public List authRoutes(BladeUser user) { List routes = ((MenuMapper) this.baseMapper).authRoutes(Func.toLongList(user.getRoleId())); List list = new ArrayList<>(); routes.forEach(route -> { list.add(Kv.create().set(route.getPath(), Kv.create().set("authority", Func.toStrArray(route.getAlias())))); }); return list; } @Override // org.springblade.modules.system.service.IMenuService public boolean removeMenu(String ids) { Long cnt = this.baseMapper.selectCount(Wrappers.query().lambda().in(Menu::getParentId, Func.toLongList(ids))); /* Long cnt = ((MenuMapper) this.baseMapper).selectCount((Wrapper) Wrappers.query().lambda().in((v0) -> { return v0.getParentId(); }, Func.toLongList(ids)));*/ if (cnt.longValue() > 0) { throw new ServiceException("请先删除子节点!"); } return removeByIds(Func.toLongList(ids)); } @Override // org.springblade.modules.system.service.IMenuService public boolean submit(Menu menu) { Menu parentMenu; LambdaQueryWrapper menuQueryWrapper = Wrappers.lambdaQuery(); if (menu.getId() == null) { menuQueryWrapper.eq(Menu::getCode, menu.getCode()) .or(wrapper -> wrapper.eq(Menu::getName, menu.getName()).eq(Menu::getCategory, MENU_CATEGORY).eq(Menu::getBelongApplication, menu.getBelongApplication())); /* ((LambdaQueryWrapper) lambdaQuery.eq((v0) -> { return v0.getCode(); }, menu.getCode())).or(wrapper -> { LambdaQueryWrapper lambdaQueryWrapper = (LambdaQueryWrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) wrapper.eq((v0) -> { return v0.getName(); }, menu.getName())).eq((v0) -> { return v0.getCategory(); }, MENU_CATEGORY)).eq((v0) -> { return v0.getBelongApplication(); }, menu.getBelongApplication()); });*/ } else { /*Menu::getBelongApplication menuQueryWrapper.ne(Menu::getId, menu.getId()) .and(wrapper -> wrapper.eq(Menu::getCode, menu.getCode()).or(());*/ menuQueryWrapper.ne(Menu::getId, menu.getId()) .and(wrapper2 -> { wrapper2.eq(Menu::getCode, menu.getCode()).or(o -> { o.eq(Menu::getName, menu.getName()) .eq(Menu::getCategory, MENU_CATEGORY).eq(Menu::getBelongApplication, menu.getBelongApplication()); }); }); } Long cnt = this.baseMapper.selectCount(menuQueryWrapper); if (cnt.longValue() > 0) { throw new ServiceException("菜单不能保存。限制条件:菜单编号不可重复;同一个应用下不可以出现同名菜单!"); } if (menu.getParentId() == null && menu.getId() == null) { menu.setParentId(BladeConstant.TOP_PARENT_ID); } if (menu.getParentId() != null && menu.getId() == null && (parentMenu = (Menu) ((MenuMapper) this.baseMapper).selectById(menu.getParentId())) != null && parentMenu.getCategory().intValue() != 1 && parentMenu.getCategory().intValue() != 0) { throw new ServiceException("父节点只可选择App或者菜单类型!"); } menu.setIsDeleted(0); return saveOrUpdate(menu); } /* JADX WARN: Multi-variable type inference failed */ @Override // org.springblade.modules.system.service.IMenuService public List getRoleMenuByCondition(String roleIds, List categoryList) { List list = new ArrayList<>(); List menuVOList = this.baseMapper.getRoleMenuByCondition(Arrays.stream(roleIds.split(",")).collect(Collectors.toList()), categoryList); if (Func.isNotEmpty(menuVOList)) { list = menuVOList.stream().map(menuVO -> { return Func.toStr(menuVO.getId()); }).collect(Collectors.toList()); } return list; } @Override // org.springblade.modules.system.service.IMenuService public List grantTreeCard(BladeUser user, List categoryList) { List roleMenus = new ArrayList<>(); if (AuthUtil.isAdministrator()) { roleMenus = ForestNodeMerger.merge(this.baseMapper.grantTreeByCategory(categoryList)); } else { roleMenus = ForestNodeMerger.merge(this.baseMapper.getRoleMenuCardByCondition(Func.toStrList(user.getRoleId()), categoryList)); } return roleMenus; } }