|
45 | 45 | import top.continew.starter.core.util.validation.CheckUtils;
|
46 | 46 | import top.continew.starter.extension.crud.model.query.SortQuery;
|
47 | 47 |
|
| 48 | +import java.util.ArrayList; |
48 | 49 | import java.util.List;
|
49 | 50 | import java.util.Set;
|
50 | 51 |
|
@@ -98,8 +99,9 @@ public void update(MenuReq req, Long id) {
|
98 | 99 | @Override
|
99 | 100 | @Transactional(rollbackFor = Exception.class)
|
100 | 101 | public void delete(List<Long> ids) {
|
101 |
| - baseMapper.lambdaUpdate().in(MenuDO::getParentId, ids).remove(); |
102 |
| - super.delete(ids); |
| 102 | + // 级联删除菜单(包含子菜单) |
| 103 | + List<Long> allDeleteIdList = this.listCascadingDeleteMenuIds(ids); |
| 104 | + baseMapper.deleteByIds(allDeleteIdList); |
103 | 105 | RedisUtils.deleteByPattern(CacheConstants.ROLE_MENU_KEY_PREFIX + StringConstants.ASTERISK);
|
104 | 106 | }
|
105 | 107 |
|
@@ -156,4 +158,26 @@ private void checkNameRepeat(String name, Long id) {
|
156 | 158 | .ne(id != null, MenuDO::getId, id)
|
157 | 159 | .exists(), "组件名称为 [{}] 的菜单已存在", name);
|
158 | 160 | }
|
| 161 | + |
| 162 | + /** |
| 163 | + * 级联获取所有待删除菜单 ID 列表(包含自身及所有子菜单) |
| 164 | + * |
| 165 | + * @param ids ID 列表 |
| 166 | + * @return 待删除菜单 ID 列表(包含自身及所有子菜单) |
| 167 | + */ |
| 168 | + private List<Long> listCascadingDeleteMenuIds(List<Long> ids) { |
| 169 | + List<Long> menuIds = new ArrayList<>(ids); |
| 170 | + List<Long> childIdList = baseMapper.lambdaQuery() |
| 171 | + .select(MenuDO::getId) |
| 172 | + .in(MenuDO::getParentId, menuIds) |
| 173 | + .list() |
| 174 | + .stream() |
| 175 | + .map(MenuDO::getId) |
| 176 | + .toList(); |
| 177 | + if (childIdList.isEmpty()) { |
| 178 | + return menuIds; |
| 179 | + } |
| 180 | + menuIds.addAll(this.listCascadingDeleteMenuIds(childIdList)); |
| 181 | + return menuIds; |
| 182 | + } |
159 | 183 | }
|
0 commit comments