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 0f0572389..8a3d66a27 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 @@ -1,7 +1,9 @@ package cn.stylefeng.roses.kernel.sys.modular.menu.entity; +import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseExpandFieldEntity; import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import cn.stylefeng.roses.kernel.rule.tree.buildpids.BasePidBuildModel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -21,7 +23,7 @@ import java.util.List; @TableName(value = "sys_menu", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) -public class SysMenu extends BaseExpandFieldEntity { +public class SysMenu extends BaseExpandFieldEntity implements BasePidBuildModel { /** * 主键 @@ -143,4 +145,24 @@ public class SysMenu extends BaseExpandFieldEntity { @TableField(exist = false) private List children; + @Override + public String pidBuildNodeId() { + if (ObjectUtil.isEmpty(menuId)) { + return ""; + } + return menuId.toString(); + } + + @Override + public String pidBuildParentId() { + if (ObjectUtil.isEmpty(menuParentId)) { + return ""; + } + return menuParentId.toString(); + } + + @Override + public void setPidBuildPidStructure(String pids) { + this.menuPids = pids; + } } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuTreeFactory.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuTreeFactory.java index 411f7e76e..d8ef16277 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuTreeFactory.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuTreeFactory.java @@ -1,5 +1,6 @@ package cn.stylefeng.roses.kernel.sys.modular.menu.factory; +import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; import java.math.BigDecimal; @@ -54,4 +55,49 @@ public class MenuTreeFactory { } } + /** + * 将指定的树形结构,平行展开,添加到指定的参数totalMenuList + * + * @author fengshuonan + * @since 2023/6/15 15:35 + */ + public static void collectTreeTasks(List sysMenuTree, List totalMenuList) { + + if (ObjectUtil.isEmpty(sysMenuTree)) { + return; + } + + for (SysMenu sysMenu : sysMenuTree) { + + totalMenuList.add(sysMenu); + + if (ObjectUtil.isNotEmpty(sysMenu.getChildren())) { + collectTreeTasks(sysMenu.getChildren(), totalMenuList); + } + + } + } + + /** + * 填充菜单节点的父级id + * + * @author fengshuonan + * @since 2023/6/15 15:47 + */ + public static void fillParentId(Long parentMenuId, List menuTreeList) { + + if (ObjectUtil.isEmpty(menuTreeList)) { + return; + } + + for (SysMenu sysMenu : menuTreeList) { + + sysMenu.setMenuParentId(parentMenuId); + + if (ObjectUtil.isNotEmpty(sysMenu.getChildren())) { + fillParentId(sysMenu.getMenuId(), sysMenu.getChildren()); + } + } + } + } 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 383fb1725..0023ba17b 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 @@ -8,6 +8,7 @@ import cn.stylefeng.roses.kernel.db.api.DbOperatorApi; import cn.stylefeng.roses.kernel.rule.constants.SymbolConstant; import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; +import cn.stylefeng.roses.kernel.rule.tree.buildpids.PidStructureBuildUtil; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveMenuCallbackApi; import cn.stylefeng.roses.kernel.sys.modular.app.service.SysAppService; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; @@ -149,15 +150,23 @@ public class SysMenuServiceImpl extends ServiceImpl impl public void updateMenuTree(SysMenuRequest sysMenuRequest) { // 获取被更新的应用和菜单树信息 - Long appId = sysMenuRequest.getAppId(); 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