|
@@ -138,29 +138,29 @@ public class KwsMenuService {
|
|
|
throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
|
|
throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- List<FindEntListResVo> list = kwsEnterpriseDao.findList(new FindListReqVo());
|
|
|
|
|
- if (CollectionUtils.isNotEmpty(list)) {
|
|
|
|
|
- List<Long> entIds = list.stream().map(FindEntListResVo::getId).distinct().toList();
|
|
|
|
|
- List<KwsMenuRights> kwsMenuRightsList = new ArrayList<>();
|
|
|
|
|
- Date date = new Date();
|
|
|
|
|
- for (Long entId : entIds) {
|
|
|
|
|
- KwsMenuRights kwsMenuRights = new KwsMenuRights();
|
|
|
|
|
- kwsMenuRights.setEntId(entId);
|
|
|
|
|
- kwsMenuRights.setMenuId(menuId);
|
|
|
|
|
- kwsMenuRights.setId(new IdWorker(1L).nextId());
|
|
|
|
|
- kwsMenuRights.setDelFlag(Global.NO);
|
|
|
|
|
- kwsMenuRights.setStatus(Global.NO);
|
|
|
|
|
- kwsMenuRights.setCreateBy(LoginUserHolder.getUserId());
|
|
|
|
|
- kwsMenuRights.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
- kwsMenuRights.setCreateTime(date);
|
|
|
|
|
- kwsMenuRights.setUpdateTime(date);
|
|
|
|
|
- kwsMenuRightsList.add(kwsMenuRights);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (kwsMenuRightsDao.saveBatch(kwsMenuRightsList) < kwsMenuRightsList.size()) {
|
|
|
|
|
- throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+// List<FindEntListResVo> list = kwsEnterpriseDao.findList(new FindListReqVo());
|
|
|
|
|
+// if (CollectionUtils.isNotEmpty(list)) {
|
|
|
|
|
+// List<Long> entIds = list.stream().map(FindEntListResVo::getId).distinct().toList();
|
|
|
|
|
+// List<KwsMenuRights> kwsMenuRightsList = new ArrayList<>();
|
|
|
|
|
+// Date date = new Date();
|
|
|
|
|
+// for (Long entId : entIds) {
|
|
|
|
|
+// KwsMenuRights kwsMenuRights = new KwsMenuRights();
|
|
|
|
|
+// kwsMenuRights.setEntId(entId);
|
|
|
|
|
+// kwsMenuRights.setMenuId(menuId);
|
|
|
|
|
+// kwsMenuRights.setId(new IdWorker(1L).nextId());
|
|
|
|
|
+// kwsMenuRights.setDelFlag(Global.NO);
|
|
|
|
|
+// kwsMenuRights.setStatus(Global.NO);
|
|
|
|
|
+// kwsMenuRights.setCreateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+// kwsMenuRights.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
|
|
+// kwsMenuRights.setCreateTime(date);
|
|
|
|
|
+// kwsMenuRights.setUpdateTime(date);
|
|
|
|
|
+// kwsMenuRightsList.add(kwsMenuRights);
|
|
|
|
|
+// }
|
|
|
|
|
+//
|
|
|
|
|
+// if (kwsMenuRightsDao.saveBatch(kwsMenuRightsList) < kwsMenuRightsList.size()) {
|
|
|
|
|
+// throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -665,10 +665,13 @@ public class KwsMenuService {
|
|
|
finalList = menuList;
|
|
finalList = menuList;
|
|
|
}
|
|
}
|
|
|
if (Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.COMPANY.getCode()) ) {
|
|
if (Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.COMPANY.getCode()) ) {
|
|
|
-// if (Boolean.TRUE.equals(reqVo.getIncludeButton())) {
|
|
|
|
|
-//
|
|
|
|
|
-// }
|
|
|
|
|
- finalList = supplementButtons(finalList, findMenuTreePojo.getEntTypeList(),Integer.valueOf(reqVo.getClientType()));
|
|
|
|
|
|
|
+ if (needRightsBasedButtons(reqVo)) {
|
|
|
|
|
+ log.info("企业端 PC 且未指定菜单类型,按钮需基于 kws_menu_rights 权限查询");
|
|
|
|
|
+ finalList = supplementButtonsWithRights(finalList, findMenuTreePojo, Global.NUMERICAL_TWO);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.info("企业端 PC 菜单类型,菜单权限查询");
|
|
|
|
|
+ finalList = supplementButtons(finalList, findMenuTreePojo.getEntTypeList(), Integer.valueOf(reqVo.getClientType()));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -747,6 +750,108 @@ public class KwsMenuService {
|
|
|
findMenuTreePojo.setRoleIds(Collections.singletonList(LoginUserHolder.getCurrentRoleId()));
|
|
findMenuTreePojo.setRoleIds(Collections.singletonList(LoginUserHolder.getCurrentRoleId()));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 企业端 PC 且未指定菜单类型时,按钮需基于 kws_menu_rights 权限查询。
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean needRightsBasedButtons(FindMenuTreeReqVo reqVo) {
|
|
|
|
|
+ return reqVo.getType() == null
|
|
|
|
|
+ && org.apache.commons.lang3.StringUtils.equals(reqVo.getClientType(), String.valueOf(Global.NUMERICAL_TWO));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 基于菜单权限表补充按钮节点(企业端 PC 场景专用)。
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 适用场景:{@link #findTree(FindMenuTreeReqVo)} 中企业端(systemType=2)、PC 端(clientType=2)、
|
|
|
|
|
+ * 且未指定菜单类型(type 为空)时调用,与 {@link #supplementButtons} 的区别在于:
|
|
|
|
|
+ * <ul>
|
|
|
|
|
+ * <li>supplementButtons:直接从 kws_menu 查按钮,不做权限过滤</li>
|
|
|
|
|
+ * <li>本方法:先查 kws_menu_rights 获取有权 menuId,再关联 kws_menu 查按钮</li>
|
|
|
|
|
+ * </ul>
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ * <p>处理步骤:</p>
|
|
|
|
|
+ * <ol>
|
|
|
|
|
+ * <li>从已有菜单列表中提取目录节点(type=1)作为按钮父级</li>
|
|
|
|
|
+ * <li>按 roleIds / entId 查询 kws_menu_rights,得到有权限的 menuId 集合</li>
|
|
|
|
|
+ * <li>在 kws_menu 中查询 type=2、clientType 匹配、parentId 属于目录且 id 在权限集合内的按钮</li>
|
|
|
|
|
+ * <li>按 using_roles 过滤企业类型后,去重合并到菜单列表</li>
|
|
|
|
|
+ * </ol>
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param menuList 已查询出的菜单列表(不含或已含部分按钮)
|
|
|
|
|
+ * @param pojo 查询条件,含 roleIds、entId、entTypeList
|
|
|
|
|
+ * @param clientType 客户端类型(企业端 PC 为 2)
|
|
|
|
|
+ * @return 合并按钮后的菜单列表
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<KwsMenuResVo> supplementButtonsWithRights(List<KwsMenuResVo> menuList, FindMenuTreePojo pojo, Integer clientType) {
|
|
|
|
|
+ log.info("开始基于权限表补充按钮,clientType={}, entId={}, roleIds={}, 原菜单数={}",
|
|
|
|
|
+ clientType, pojo.getEntId(), pojo.getRoleIds(), menuList.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 提取目录节点 id,作为按钮的 parentId 查询范围
|
|
|
|
|
+ List<Long> menuTypeIds = menuList.stream()
|
|
|
|
|
+ .filter(m -> Objects.equals(m.getType(), MenuTypeEnum.DIRECTORY.getCode()))
|
|
|
|
|
+ .map(KwsMenuResVo::getId)
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ if (CollectionUtils.isEmpty(menuTypeIds)) {
|
|
|
|
|
+ log.info("基于权限表补充按钮结束,未找到目录节点,跳过按钮查询");
|
|
|
|
|
+ return menuList;
|
|
|
|
|
+ }
|
|
|
|
|
+ log.debug("基于权限表补充按钮,目录节点数={}, directoryIds={}", menuTypeIds.size(), menuTypeIds);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查询 kws_menu_rights,获取当前用户/角色有权限的 menuId
|
|
|
|
|
+ LambdaQueryWrapper<KwsMenuRights> rightsWrapper = Wrappers.lambdaQuery(KwsMenuRights.class)
|
|
|
|
|
+ .eq(KwsMenuRights::getDelFlag, Global.NO)
|
|
|
|
|
+ .select(KwsMenuRights::getMenuId);
|
|
|
|
|
+ if (CollectionUtils.isNotEmpty(pojo.getRoleIds())) {
|
|
|
|
|
+ rightsWrapper.in(KwsMenuRights::getRoleId, pojo.getRoleIds());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (pojo.getEntId() != null) {
|
|
|
|
|
+ rightsWrapper.eq(KwsMenuRights::getEntId, pojo.getEntId());
|
|
|
|
|
+ }
|
|
|
|
|
+ List<KwsMenuRights> rightsRows = kwsMenuRightsMpMapper.selectList(rightsWrapper);
|
|
|
|
|
+ Set<Long> authorizedMenuIds = rightsRows.stream()
|
|
|
|
|
+ .map(KwsMenuRights::getMenuId)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+ if (authorizedMenuIds.isEmpty()) {
|
|
|
|
|
+ log.info("基于权限表补充按钮结束,kws_menu_rights 未查到授权菜单,entId={}, roleIds={}",
|
|
|
|
|
+ pojo.getEntId(), pojo.getRoleIds());
|
|
|
|
|
+ return menuList;
|
|
|
|
|
+ }
|
|
|
|
|
+ log.debug("基于权限表补充按钮,授权菜单数={}", authorizedMenuIds.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 关联 kws_menu 查询有权限的按钮节点
|
|
|
|
|
+ LambdaQueryWrapper<KwsMenu> buttonWrapper = Wrappers.lambdaQuery(KwsMenu.class)
|
|
|
|
|
+ .eq(KwsMenu::getDelFlag, Global.NO)
|
|
|
|
|
+ .eq(KwsMenu::getType, MenuTypeEnum.BUTTON.getCode())
|
|
|
|
|
+ .eq(KwsMenu::getClientType, clientType)
|
|
|
|
|
+ .in(KwsMenu::getParentId, menuTypeIds)
|
|
|
|
|
+ .in(KwsMenu::getId, authorizedMenuIds)
|
|
|
|
|
+ .orderByAsc(KwsMenu::getSort);
|
|
|
|
|
+ appendUsingRolesFilter(buttonWrapper, pojo.getEntTypeList());
|
|
|
|
|
+
|
|
|
|
|
+ List<KwsMenu> buttons = kwsMenuMpMapper.selectList(buttonWrapper);
|
|
|
|
|
+ if (CollectionUtils.isEmpty(buttons)) {
|
|
|
|
|
+ log.info("基于权限表补充按钮结束,kws_menu 未匹配到按钮,clientType={}, entTypeList={}",
|
|
|
|
|
+ clientType, pojo.getEntTypeList());
|
|
|
|
|
+ return menuList;
|
|
|
|
|
+ }
|
|
|
|
|
+ log.debug("基于权限表补充按钮,查询到按钮数={}", buttons.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 去重合并,避免与 findList 已返回的按钮重复
|
|
|
|
|
+ Set<Long> existingIds = menuList.stream().map(KwsMenuResVo::getId).collect(Collectors.toSet());
|
|
|
|
|
+ List<KwsMenuResVo> result = new ArrayList<>(menuList);
|
|
|
|
|
+ int addedCount = 0;
|
|
|
|
|
+ for (KwsMenu btn : buttons) {
|
|
|
|
|
+ if (!existingIds.contains(btn.getId())) {
|
|
|
|
|
+ KwsMenuResVo vo = new KwsMenuResVo();
|
|
|
|
|
+ BeanUtils.copyProperties(btn, vo);
|
|
|
|
|
+ result.add(vo);
|
|
|
|
|
+ addedCount++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("基于权限表补充按钮完成,新增按钮数={}, 合并后菜单总数={}", addedCount, result.size());
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 补充按钮节点到菜单列表中
|
|
* 补充按钮节点到菜单列表中
|
|
|
* <p>
|
|
* <p>
|