From 05fb11d4e7ac26d40ae9db23c0dd4bb8a666e06c Mon Sep 17 00:00:00 2001 From: hy001 Date: Mon, 27 Apr 2026 15:09:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=8E=A8=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/app/sys/SysPushServiceImpl.java | 6 +- .../service/admin/impl/MenuServiceImpl.java | 60 ++++++++++++++++++- .../admin/impl/RoleMenuServiceImpl.java | 41 ++++++++++++- 3 files changed, 101 insertions(+), 6 deletions(-) diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysPushServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysPushServiceImpl.java index 568218e0..66cd190e 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysPushServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysPushServiceImpl.java @@ -89,7 +89,7 @@ public class SysPushServiceImpl implements SysPushService { createRecordParam.getTitle(), ex); throw ex; } finally { - ResponseAssert.isTrue(CommonErrorCode.OPERATING_FAILURE, !sysPushRecordLogService.save(pushLog)); + ResponseAssert.isTrue(CommonErrorCode.OPERATING_FAILURE, sysPushRecordLogService.save(pushLog)); createRecordParam.setId(pushLog.getId()); } } @@ -157,7 +157,7 @@ public class SysPushServiceImpl implements SysPushService { ResponseAssert.notNull(ResponseErrorCode.REQUEST_PARAMETER_ERROR, SysOriginPlatformEnum.toEnum(createRecordParam.getSysOrigin())); ResponseAssert.isTrue(ResponseErrorCode.REQUEST_PARAMETER_ERROR, - !createRecordParam.isGoogleDevice()); + createRecordParam.isGoogleDevice()); } private void pushGoogle(CreateRecordCmd createRecordParam, @@ -176,7 +176,7 @@ public class SysPushServiceImpl implements SysPushService { } ResponseAssert.isTrue(ResponseErrorCode.REQUEST_PARAMETER_ERROR, - !pushCmd.isNotEmptyAndroidDevices() && !pushCmd.isNotEmptyIosDevices()); + pushCmd.isNotEmptyAndroidDevices() || pushCmd.isNotEmptyIosDevices()); ResponseAssert.checkSuccess(googleFirebasePushClient.broadcast(pushCmd)); } diff --git a/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/MenuServiceImpl.java b/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/MenuServiceImpl.java index 713b0682..e93c43df 100644 --- a/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/MenuServiceImpl.java +++ b/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/MenuServiceImpl.java @@ -11,9 +11,12 @@ import com.red.circle.console.infra.database.rds.service.admin.MenuService; import com.red.circle.console.infra.database.util.TreeUtils; import com.red.circle.framework.mybatis.service.impl.BaseServiceImpl; import com.red.circle.tool.core.collection.CollectionUtils; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -101,12 +104,65 @@ public class MenuServiceImpl extends BaseServiceImpl implements M @Override public List listUserPermMenu(Integer uid) { - List menus = baseDAO.findUserPermMenus(uid, StatusEnum.NORMAL, - Arrays.asList(MenuTypeEnum.CATALOG, MenuTypeEnum.MENU)); + List menus = appendMissingAncestorMenus( + baseDAO.findUserPermMenus(uid, StatusEnum.NORMAL, + Arrays.asList(MenuTypeEnum.CATALOG, MenuTypeEnum.MENU))); return menus.stream().filter(e -> !parentIdNotNull(e.getParentId())) .map(e -> TreeUtils.findChildren(e, menus)).collect(Collectors.toList()); } + private List appendMissingAncestorMenus(List menus) { + if (CollectionUtils.isEmpty(menus)) { + return menus; + } + + Map menuMap = new LinkedHashMap<>(); + menus.stream() + .filter(menu -> Objects.nonNull(menu.getId())) + .forEach(menu -> menuMap.put(menu.getId(), menu)); + + Set missingParentIds = findMissingParentIds(menuMap); + while (CollectionUtils.isNotEmpty(missingParentIds)) { + List parentMenus = query() + .eq(Menu::getStatus, StatusEnum.NORMAL) + .in(Menu::getMenuType, Arrays.asList(MenuTypeEnum.CATALOG, MenuTypeEnum.MENU)) + .in(Menu::getId, missingParentIds) + .list(); + if (CollectionUtils.isEmpty(parentMenus)) { + break; + } + + parentMenus.stream() + .filter(menu -> Objects.nonNull(menu.getId())) + .filter(menu -> !menuMap.containsKey(menu.getId())) + .forEach(menu -> menuMap.put(menu.getId(), toMenuTreeDTO(menu))); + missingParentIds = findMissingParentIds(menuMap); + } + + return new ArrayList<>(menuMap.values()); + } + + private Set findMissingParentIds(Map menuMap) { + return menuMap.values().stream() + .map(MenuTreeDTO::getParentId) + .filter(this::parentIdNotNull) + .filter(parentId -> !menuMap.containsKey(parentId)) + .collect(Collectors.toSet()); + } + + private MenuTreeDTO toMenuTreeDTO(Menu menu) { + MenuTreeDTO dto = new MenuTreeDTO(); + dto.setId(menu.getId()); + dto.setParentId(menu.getParentId()); + dto.setMenuName(menu.getMenuName()); + dto.setMenuType(menu.menuTypeToInt()); + dto.setRouter(menu.getRouter()); + dto.setPath(menu.getPath()); + dto.setIcon(menu.getIcon()); + dto.setAlias(menu.getAlias()); + return dto; + } + @Override public Set getUserPermButtonAliases(Integer uid) { return baseDAO diff --git a/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/RoleMenuServiceImpl.java b/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/RoleMenuServiceImpl.java index 4605c76f..477654df 100644 --- a/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/RoleMenuServiceImpl.java +++ b/rc-service/rc-service-console/console-infrastructure/src/main/java/com/red/circle/console/infra/database/rds/service/admin/impl/RoleMenuServiceImpl.java @@ -1,14 +1,20 @@ package com.red.circle.console.infra.database.rds.service.admin.impl; import com.red.circle.console.infra.database.rds.dao.admin.RoleMenuDAO; +import com.red.circle.console.infra.database.rds.entity.admin.Menu; import com.red.circle.console.infra.database.rds.entity.admin.RoleMenu; +import com.red.circle.console.infra.database.rds.service.admin.MenuService; import com.red.circle.console.infra.database.rds.service.admin.RoleMenuService; import com.red.circle.framework.mybatis.service.impl.BaseServiceImpl; import com.red.circle.tool.core.collection.CollectionUtils; +import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,14 +26,47 @@ import org.springframework.transaction.annotation.Transactional; * @author pengliang */ @Service +@RequiredArgsConstructor public class RoleMenuServiceImpl extends BaseServiceImpl implements RoleMenuService { + private final MenuService menuService; + @Override public void saveRoleMenu(Integer roleId, List menuIds) { delete().eq(RoleMenu::getRoleId, roleId).execute(); + if (CollectionUtils.isEmpty(menuIds)) { + return; + } + Set normalizedMenuIds = collectMenuIdsWithAncestors(menuIds); saveBatch( - menuIds.stream().map(menuId -> new RoleMenu(roleId, menuId)).collect(Collectors.toList())); + normalizedMenuIds.stream() + .map(menuId -> new RoleMenu(roleId, menuId)) + .collect(Collectors.toList())); + } + + private Set collectMenuIdsWithAncestors(List menuIds) { + Set result = menuIds.stream() + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + Set pendingIds = new HashSet<>(result); + + while (CollectionUtils.isNotEmpty(pendingIds)) { + List menus = menuService.query() + .select(Menu::getId, Menu::getParentId) + .in(Menu::getId, pendingIds) + .list(); + pendingIds.clear(); + + for (Menu menu : menus) { + Integer parentId = menu.getParentId(); + if (parentId != null && parentId != 0 && result.add(parentId)) { + pendingIds.add(parentId); + } + } + } + + return result; } @Override