From 84b646914193e57248401623cedba27df97a2345 Mon Sep 17 00:00:00 2001 From: Liyanjun Date: Sun, 2 Jul 2023 18:20:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=AF=A6=E6=83=85=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=88=B6=E7=BA=A7=E8=8F=9C=E5=8D=95=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=EF=BC=8C=E5=BA=94=E7=94=A8=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/SysAppController.java | 14 + .../sys/modular/menu/entity/SysMenu.java | 7 + .../menu/service/impl/SysMenuServiceImpl.java | 601 +++++++++--------- 3 files changed, 331 insertions(+), 291 deletions(-) diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/controller/SysAppController.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/controller/SysAppController.java index 4cbd0838d..4b009c214 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/controller/SysAppController.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/controller/SysAppController.java @@ -10,10 +10,14 @@ import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource; import cn.stylefeng.roses.kernel.sys.modular.app.entity.SysApp; import cn.stylefeng.roses.kernel.sys.modular.app.pojo.request.SysAppRequest; import cn.stylefeng.roses.kernel.sys.modular.app.service.SysAppService; +import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.response.AppGroupDetail; + import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + import javax.annotation.Resource; /** @@ -99,6 +103,16 @@ public class SysAppController { return new SuccessResponseData<>(sysAppService.findPage(sysAppRequest)); } + /** + * 分页查询-应用列表 + * + * @author liyanjun + * @date 2023/07/02 18:28 + */ + @GetResource(name = "分页查询-应用列表", path = "/sysApp/list") + public ResponseData> list(SysAppRequest sysAppRequest) { + return new SuccessResponseData<>(sysAppService.findList(sysAppRequest)); + } /** * 修改应用状态 * diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/entity/SysMenu.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/entity/SysMenu.java index 8a3d66a27..7e41fcb67 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/entity/SysMenu.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/entity/SysMenu.java @@ -145,6 +145,13 @@ public class SysMenu extends BaseExpandFieldEntity implements BasePidBuildModel @TableField(exist = false) private List children; + /** + * 父级菜单名称 + */ + @TableField("exist = false") + @ChineseDescription("父级菜单名称") + private String menuParentName; + @Override public String pidBuildNodeId() { if (ObjectUtil.isEmpty(menuId)) { diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java index f3cb10421..7beabfce4 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -39,323 +39,342 @@ import java.util.stream.Collectors; @Service public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { - @Resource - private SysAppService sysAppService; + @Resource + private SysAppService sysAppService; - @Resource - private DbOperatorApi dbOperatorApi; + @Resource + private DbOperatorApi dbOperatorApi; - @Override - public void add(SysMenuRequest sysMenuRequest) { + @Override + public void add(SysMenuRequest sysMenuRequest) { - // 校验参数合法性 - MenuValidateFactory.validateAddMenuParam(sysMenuRequest); + // 校验参数合法性 + MenuValidateFactory.validateAddMenuParam(sysMenuRequest); - SysMenu sysMenu = new SysMenu(); - BeanUtil.copyProperties(sysMenuRequest, sysMenu); + SysMenu sysMenu = new SysMenu(); + BeanUtil.copyProperties(sysMenuRequest, sysMenu); - // 组装pids集合 - String pids = this.createPids(sysMenuRequest.getMenuParentId()); - sysMenu.setMenuPids(pids); + // 组装pids集合 + String pids = this.createPids(sysMenuRequest.getMenuParentId()); + sysMenu.setMenuPids(pids); - this.save(sysMenu); - } + this.save(sysMenu); + } - @Override - @Transactional(rollbackFor = Exception.class) - public void del(SysMenuRequest sysMenuRequest) { + @Override + @Transactional(rollbackFor = Exception.class) + public void del(SysMenuRequest sysMenuRequest) { - Long menuId = sysMenuRequest.getMenuId(); + Long menuId = sysMenuRequest.getMenuId(); - // 获取所有子级的菜单id - Set totalMenuIds = this.dbOperatorApi.findSubListByParentId("sys_menu", "menu_pids", "menu_id", menuId); - totalMenuIds.add(menuId); + // 获取所有子级的菜单id + Set totalMenuIds = this.dbOperatorApi.findSubListByParentId("sys_menu", "menu_pids", "menu_id", menuId); + totalMenuIds.add(menuId); - // 删除菜单 - this.removeByIds(totalMenuIds); + // 删除菜单 + this.removeByIds(totalMenuIds); - // 删除菜单下面关联的其他业务关联表 - Map removeMenuCallbackApiMap = SpringUtil.getBeansOfType(RemoveMenuCallbackApi.class); - for (RemoveMenuCallbackApi removeMenuCallbackApi : removeMenuCallbackApiMap.values()) { - removeMenuCallbackApi.removeMenuAction(totalMenuIds); - } - } + // 删除菜单下面关联的其他业务关联表 + Map removeMenuCallbackApiMap = SpringUtil + .getBeansOfType(RemoveMenuCallbackApi.class); + for (RemoveMenuCallbackApi removeMenuCallbackApi : removeMenuCallbackApiMap.values()) { + removeMenuCallbackApi.removeMenuAction(totalMenuIds); + } + } - @Override - public void edit(SysMenuRequest sysMenuRequest) { + @Override + public void edit(SysMenuRequest sysMenuRequest) { - // 无法修改上下级结构(使用拖拽接口比修改接口更方便) - sysMenuRequest.setMenuParentId(null); + // 无法修改上下级结构(使用拖拽接口比修改接口更方便) + sysMenuRequest.setMenuParentId(null); - // 无法修改菜单的所属应用 - sysMenuRequest.setAppId(null); + // 无法修改菜单的所属应用 + sysMenuRequest.setAppId(null); - // 校验参数合法性 - MenuValidateFactory.validateAddMenuParam(sysMenuRequest); + // 校验参数合法性 + MenuValidateFactory.validateAddMenuParam(sysMenuRequest); - SysMenu sysMenu = this.querySysMenu(sysMenuRequest); - BeanUtil.copyProperties(sysMenuRequest, sysMenu); + SysMenu sysMenu = this.querySysMenu(sysMenuRequest); + BeanUtil.copyProperties(sysMenuRequest, sysMenu); - this.updateById(sysMenu); - } + this.updateById(sysMenu); + } - @Override - public SysMenu detail(SysMenuRequest sysMenuRequest) { + @Override + public SysMenu detail(SysMenuRequest sysMenuRequest) { - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuId, sysMenuRequest.getMenuId()); + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuId, sysMenuRequest.getMenuId()); - sysMenuLambdaQueryWrapper.select(SysMenu::getAppId, SysMenu::getMenuName, SysMenu::getMenuCode, SysMenu::getMenuSort, - SysMenu::getMenuType, SysMenu::getAntdvComponent, SysMenu::getAntdvRouter, SysMenu::getAntdvVisible, - SysMenu::getAntdvActiveUrl, SysMenu::getAntdvLinkUrl, SysMenu::getAntdvIcon); + sysMenuLambdaQueryWrapper.select(SysMenu::getAppId, SysMenu::getMenuName, SysMenu::getMenuCode, + SysMenu::getMenuSort, SysMenu::getMenuType, SysMenu::getAntdvComponent, SysMenu::getAntdvRouter, + SysMenu::getAntdvVisible, SysMenu::getAntdvActiveUrl, SysMenu::getAntdvLinkUrl, SysMenu::getAntdvIcon, + SysMenu::getMenuParentId); - return this.getOne(sysMenuLambdaQueryWrapper, false); - } + SysMenu sysMenu = this.getOne(sysMenuLambdaQueryWrapper, false); - @Override - public boolean validateMenuBindApp(Set appIdList) { + if (ObjectUtil.isNotEmpty(sysMenu) && ObjectUtil.isNotEmpty(sysMenu.getMenuParentId())) { + if (sysMenu.getMenuParentId().equals(TreeConstants.DEFAULT_PARENT_ID)) { + sysMenu.setMenuParentName("根节点"); + } else { + SysMenu parentMenu=this.getById(sysMenu.getMenuParentId()); + sysMenu.setMenuParentName(parentMenu.getMenuName()); + } + } - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.in(SysMenu::getAppId, appIdList); - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId); - long count = this.count(sysMenuLambdaQueryWrapper); + return sysMenu; + } - return count > 0; - } + @Override + public boolean validateMenuBindApp(Set appIdList) { - @Override - public List getTotalMenus() { - LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - menuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getMenuParentId, SysMenu::getAppId); - menuLambdaQueryWrapper.orderByAsc(SysMenu::getMenuSort); - return this.list(menuLambdaQueryWrapper); - } + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.in(SysMenu::getAppId, appIdList); + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId); + long count = this.count(sysMenuLambdaQueryWrapper); - @Override - @Transactional(rollbackFor = Exception.class) - public void updateMenuTree(SysMenuRequest sysMenuRequest) { + return count > 0; + } - // 获取被更新的应用和菜单树信息 - List updateTree = sysMenuRequest.getUpdateMenuTree(); + @Override + public List getTotalMenus() { + LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getMenuParentId, + SysMenu::getAppId); + menuLambdaQueryWrapper.orderByAsc(SysMenu::getMenuSort); + return this.list(menuLambdaQueryWrapper); + } - // 更新树节点的菜单顺序 - MenuTreeFactory.updateSort(updateTree, 1); - - // 填充树节点的parentId字段 - MenuTreeFactory.fillParentId(-1L, updateTree); - - // 平行展开树形结构,准备从新整理pids - ArrayList totalMenuList = new ArrayList<>(); - MenuTreeFactory.collectTreeTasks(updateTree, totalMenuList); - - // 从新整理上下级结构,整理id和pid关系 - PidStructureBuildUtil.createPidStructure(totalMenuList); - - // 更新菜单的sort字段、pid字段和pids字段这3个字段 - this.updateBatchById(totalMenuList); - } - - @Override - public List getTotalMenuList() { - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getAppId); - return this.list(sysMenuLambdaQueryWrapper); - } - - @Override - public List getIndexMenuInfoList(List menuIdList) { - - if (ObjectUtil.isEmpty(menuIdList)) { - return new ArrayList<>(); - } - - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - - sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); - - // 查询指定的菜单内容 - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getAppId, SysMenu::getMenuCode, - SysMenu::getMenuName, SysMenu::getMenuType, SysMenu::getAntdvIcon, SysMenu::getAntdvVisible, SysMenu::getAntdvActiveUrl, - SysMenu::getAntdvRouter, SysMenu::getAntdvComponent, SysMenu::getMenuSort); - - sysMenuLambdaQueryWrapper.orderByAsc(SysMenu::getMenuSort); - - return this.list(sysMenuLambdaQueryWrapper); - } - - @Override - public List getMenuCodeList(List menuIdList) { - - if (ObjectUtil.isEmpty(menuIdList)) { - return new ArrayList<>(); - } - - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuCode); - List sysMenuList = this.list(sysMenuLambdaQueryWrapper); - - return sysMenuList.stream().map(SysMenu::getMenuCode).collect(Collectors.toList()); - } - - @Override - public List getAppMenuGroupDetail(SysMenuRequest sysMenuRequest) { - - // 1. 获取所有应用列表 - List appList = sysAppService.getAppList(); - if (ObjectUtil.isEmpty(appList)) { - return new ArrayList<>(); - } - - // 所有的应用id - Set totalAppIds = appList.stream().map(AppGroupDetail::getAppId).collect(Collectors.toSet()); - - // 2. 获取应用对应的所有菜单 - LambdaQueryWrapper wrapper = this.createWrapper(sysMenuRequest); - wrapper.in(SysMenu::getAppId, totalAppIds); - wrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, SysMenu::getMenuName, SysMenu::getAppId, - SysMenu::getMenuType); - List sysMenuList = this.list(wrapper); - if (ObjectUtil.isEmpty(sysMenuList)) { - return appList; - } - - // 2.1 如果查询条件不为空,则需要补全被查询菜单的父级结构,否则组不成树结构 - if (StrUtil.isNotBlank(sysMenuRequest.getSearchText())) { - Set menuParentIds = MenuFactory.getMenuParentIds(sysMenuList); - if (ObjectUtil.isNotEmpty(menuParentIds)) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysMenu::getMenuId, menuParentIds); - queryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, SysMenu::getMenuName, - SysMenu::getAppId, SysMenu::getMenuType); - queryWrapper.orderByAsc(SysMenu::getMenuSort); - List parentMenus = this.list(queryWrapper); - sysMenuList.addAll(parentMenus); - } - } - - // 3. 组装应用信息和菜单信息 - return MenuFactory.createAppGroupDetailResult(appList, sysMenuList); - } - - @Override - public List getUserAppMenuDetailList(Set menuIdList) { - - // 通过id查询菜单的详情信息 - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getAntdvRouter, SysMenu::getAntdvIcon); - List sysMenuList = this.list(sysMenuLambdaQueryWrapper); - - if (ObjectUtil.isEmpty(sysMenuList)) { - return new ArrayList<>(); - } - - // 转化成响应信息 - List result = new ArrayList<>(); - for (SysMenu sysMenu : sysMenuList) { - UserAppMenuInfo userAppMenuInfo = new UserAppMenuInfo(); - userAppMenuInfo.setMenuId(sysMenu.getMenuId()); - userAppMenuInfo.setMenuName(sysMenu.getMenuName()); - userAppMenuInfo.setMenuIcon(sysMenu.getAntdvIcon()); - userAppMenuInfo.setMenuRouter(sysMenu.getAntdvRouter()); - result.add(userAppMenuInfo); - } - - return result; - } - - @Override - public Map getMenuAppId(List menuIdList) { - - // 定义返回结果 - HashMap menuIdAppIdMap = new HashMap<>(); - - if (ObjectUtil.isEmpty(menuIdList)) { - return menuIdAppIdMap; - } - - // 查询数据库菜单id对应的应用id集合 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysMenu::getMenuId, menuIdList); - queryWrapper.select(SysMenu::getAppId, SysMenu::getMenuId); - List queryList = this.list(queryWrapper); - - if (ObjectUtil.isEmpty(queryList)) { - return menuIdAppIdMap; - } - - // 制作映射关系 - for (SysMenu sysMenu : queryList) { - menuIdAppIdMap.put(sysMenu.getMenuId(), sysMenu.getAppId()); - } - - return menuIdAppIdMap; - } - - /** - * 获取信息 - * - * @author fengshuonan - * @date 2023/06/10 21:28 - */ - private SysMenu querySysMenu(SysMenuRequest sysMenuRequest) { - SysMenu sysMenu = this.getById(sysMenuRequest.getMenuId()); - if (ObjectUtil.isEmpty(sysMenu)) { - throw new ServiceException(SysMenuExceptionEnum.SYS_MENU_NOT_EXISTED); - } - return sysMenu; - } - - /** - * 创建查询wrapper - * - * @author fengshuonan - * @date 2023/06/10 21:28 - */ - private LambdaQueryWrapper createWrapper(SysMenuRequest sysMenuRequest) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - // 根据搜索条件查询菜单,根据菜单名称、编码、路由地址、组件地址 - String searchText = sysMenuRequest.getSearchText(); - if (StrUtil.isNotBlank(searchText)) { - queryWrapper.like(SysMenu::getMenuName, searchText); - queryWrapper.or().like(SysMenu::getMenuCode, searchText); - queryWrapper.or().like(SysMenu::getAntdvRouter, searchText); - queryWrapper.or().like(SysMenu::getAntdvComponent, searchText); - } - - // 根据顺序排序 - queryWrapper.orderByAsc(SysMenu::getMenuSort); - - return queryWrapper; - } - - /** - * 创建pids的值 - *

- * 如果pid是顶级节点,pids = 【[-1],】 - *

- * 如果pid不是顶级节点,pids = 【父菜单的pids,[pid],】 - * - * @author fengshuonan - * @since 2023/6/15 10:09 - */ - private String createPids(Long pid) { - if (pid.equals(TreeConstants.DEFAULT_PARENT_ID)) { - return SymbolConstant.LEFT_SQUARE_BRACKETS + TreeConstants.DEFAULT_PARENT_ID + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; - } else { - //获取父菜单 - LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuId, pid); - sysMenuLambdaQueryWrapper.select(SysMenu::getMenuPids); - SysMenu parentMenu = this.getOne(sysMenuLambdaQueryWrapper, false); - if (parentMenu == null) { - return SymbolConstant.LEFT_SQUARE_BRACKETS + TreeConstants.DEFAULT_PARENT_ID + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; - } else { - // 组装pids - return parentMenu.getMenuPids() + SymbolConstant.LEFT_SQUARE_BRACKETS + pid + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; - } - } - } + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMenuTree(SysMenuRequest sysMenuRequest) { + + // 获取被更新的应用和菜单树信息 + List updateTree = sysMenuRequest.getUpdateMenuTree(); + + // 更新树节点的菜单顺序 + MenuTreeFactory.updateSort(updateTree, 1); + + // 填充树节点的parentId字段 + MenuTreeFactory.fillParentId(-1L, updateTree); + + // 平行展开树形结构,准备从新整理pids + ArrayList totalMenuList = new ArrayList<>(); + MenuTreeFactory.collectTreeTasks(updateTree, totalMenuList); + + // 从新整理上下级结构,整理id和pid关系 + PidStructureBuildUtil.createPidStructure(totalMenuList); + + // 更新菜单的sort字段、pid字段和pids字段这3个字段 + this.updateBatchById(totalMenuList); + } + + @Override + public List getTotalMenuList() { + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getAppId); + return this.list(sysMenuLambdaQueryWrapper); + } + + @Override + public List getIndexMenuInfoList(List menuIdList) { + + if (ObjectUtil.isEmpty(menuIdList)) { + return new ArrayList<>(); + } + + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + + sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); + + // 查询指定的菜单内容 + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getAppId, + SysMenu::getMenuCode, SysMenu::getMenuName, SysMenu::getMenuType, SysMenu::getAntdvIcon, + SysMenu::getAntdvVisible, SysMenu::getAntdvActiveUrl, SysMenu::getAntdvRouter, + SysMenu::getAntdvComponent, SysMenu::getMenuSort); + + sysMenuLambdaQueryWrapper.orderByAsc(SysMenu::getMenuSort); + + return this.list(sysMenuLambdaQueryWrapper); + } + + @Override + public List getMenuCodeList(List menuIdList) { + + if (ObjectUtil.isEmpty(menuIdList)) { + return new ArrayList<>(); + } + + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuCode); + List sysMenuList = this.list(sysMenuLambdaQueryWrapper); + + return sysMenuList.stream().map(SysMenu::getMenuCode).collect(Collectors.toList()); + } + + @Override + public List getAppMenuGroupDetail(SysMenuRequest sysMenuRequest) { + + // 1. 获取所有应用列表 + List appList = sysAppService.getAppList(); + if (ObjectUtil.isEmpty(appList)) { + return new ArrayList<>(); + } + + // 所有的应用id + Set totalAppIds = appList.stream().map(AppGroupDetail::getAppId).collect(Collectors.toSet()); + + // 2. 获取应用对应的所有菜单 + LambdaQueryWrapper wrapper = this.createWrapper(sysMenuRequest); + wrapper.in(SysMenu::getAppId, totalAppIds); + wrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, SysMenu::getMenuName, + SysMenu::getAppId, SysMenu::getMenuType); + List sysMenuList = this.list(wrapper); + if (ObjectUtil.isEmpty(sysMenuList)) { + return appList; + } + + // 2.1 如果查询条件不为空,则需要补全被查询菜单的父级结构,否则组不成树结构 + if (StrUtil.isNotBlank(sysMenuRequest.getSearchText())) { + Set menuParentIds = MenuFactory.getMenuParentIds(sysMenuList); + if (ObjectUtil.isNotEmpty(menuParentIds)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysMenu::getMenuId, menuParentIds); + queryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, + SysMenu::getMenuName, SysMenu::getAppId, SysMenu::getMenuType); + queryWrapper.orderByAsc(SysMenu::getMenuSort); + List parentMenus = this.list(queryWrapper); + sysMenuList.addAll(parentMenus); + } + } + + // 3. 组装应用信息和菜单信息 + return MenuFactory.createAppGroupDetailResult(appList, sysMenuList); + } + + @Override + public List getUserAppMenuDetailList(Set menuIdList) { + + // 通过id查询菜单的详情信息 + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.in(SysMenu::getMenuId, menuIdList); + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getAntdvRouter, + SysMenu::getAntdvIcon); + List sysMenuList = this.list(sysMenuLambdaQueryWrapper); + + if (ObjectUtil.isEmpty(sysMenuList)) { + return new ArrayList<>(); + } + + // 转化成响应信息 + List result = new ArrayList<>(); + for (SysMenu sysMenu : sysMenuList) { + UserAppMenuInfo userAppMenuInfo = new UserAppMenuInfo(); + userAppMenuInfo.setMenuId(sysMenu.getMenuId()); + userAppMenuInfo.setMenuName(sysMenu.getMenuName()); + userAppMenuInfo.setMenuIcon(sysMenu.getAntdvIcon()); + userAppMenuInfo.setMenuRouter(sysMenu.getAntdvRouter()); + result.add(userAppMenuInfo); + } + + return result; + } + + @Override + public Map getMenuAppId(List menuIdList) { + + // 定义返回结果 + HashMap menuIdAppIdMap = new HashMap<>(); + + if (ObjectUtil.isEmpty(menuIdList)) { + return menuIdAppIdMap; + } + + // 查询数据库菜单id对应的应用id集合 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysMenu::getMenuId, menuIdList); + queryWrapper.select(SysMenu::getAppId, SysMenu::getMenuId); + List queryList = this.list(queryWrapper); + + if (ObjectUtil.isEmpty(queryList)) { + return menuIdAppIdMap; + } + + // 制作映射关系 + for (SysMenu sysMenu : queryList) { + menuIdAppIdMap.put(sysMenu.getMenuId(), sysMenu.getAppId()); + } + + return menuIdAppIdMap; + } + + /** + * 获取信息 + * + * @author fengshuonan + * @date 2023/06/10 21:28 + */ + private SysMenu querySysMenu(SysMenuRequest sysMenuRequest) { + SysMenu sysMenu = this.getById(sysMenuRequest.getMenuId()); + if (ObjectUtil.isEmpty(sysMenu)) { + throw new ServiceException(SysMenuExceptionEnum.SYS_MENU_NOT_EXISTED); + } + return sysMenu; + } + + /** + * 创建查询wrapper + * + * @author fengshuonan + * @date 2023/06/10 21:28 + */ + private LambdaQueryWrapper createWrapper(SysMenuRequest sysMenuRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 根据搜索条件查询菜单,根据菜单名称、编码、路由地址、组件地址 + String searchText = sysMenuRequest.getSearchText(); + if (StrUtil.isNotBlank(searchText)) { + queryWrapper.like(SysMenu::getMenuName, searchText); + queryWrapper.or().like(SysMenu::getMenuCode, searchText); + queryWrapper.or().like(SysMenu::getAntdvRouter, searchText); + queryWrapper.or().like(SysMenu::getAntdvComponent, searchText); + } + + // 根据顺序排序 + queryWrapper.orderByAsc(SysMenu::getMenuSort); + + return queryWrapper; + } + + /** + * 创建pids的值 + *

+ * 如果pid是顶级节点,pids = 【[-1],】 + *

+ * 如果pid不是顶级节点,pids = 【父菜单的pids,[pid],】 + * + * @author fengshuonan + * @since 2023/6/15 10:09 + */ + private String createPids(Long pid) { + if (pid.equals(TreeConstants.DEFAULT_PARENT_ID)) { + return SymbolConstant.LEFT_SQUARE_BRACKETS + TreeConstants.DEFAULT_PARENT_ID + + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; + } else { + // 获取父菜单 + LambdaQueryWrapper sysMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysMenuLambdaQueryWrapper.eq(SysMenu::getMenuId, pid); + sysMenuLambdaQueryWrapper.select(SysMenu::getMenuPids); + SysMenu parentMenu = this.getOne(sysMenuLambdaQueryWrapper, false); + if (parentMenu == null) { + return SymbolConstant.LEFT_SQUARE_BRACKETS + TreeConstants.DEFAULT_PARENT_ID + + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; + } else { + // 组装pids + return parentMenu.getMenuPids() + SymbolConstant.LEFT_SQUARE_BRACKETS + pid + + SymbolConstant.RIGHT_SQUARE_BRACKETS + SymbolConstant.COMMA; + } + } + } } \ No newline at end of file