fengshuonan 4 лет назад
Родитель
Сommit
10fc78103a

+ 2 - 2
guns-base-support/guns-system/src/main/java/cn/stylefeng/guns/sys/modular/menu/enums/SysMenuExceptionEnum.java

@ -85,9 +85,9 @@ public enum SysMenuExceptionEnum implements AbstractBaseExceptionEnum {
    MENU_PERMISSION_NOT_EXIST(9, "权限不存在,请检查permission参数"),
    /**
     * 编辑失败
     * 不能移动根节点
     */
    MENU_PARENT_APPLICATION_ERROR(10, "编辑失败,菜单所属应用应与父菜单所属应用一致");
    CANT_MOVE_APP(10, "父节点不是根节点不能移动应用");
    private final Integer code;

+ 61 - 34
guns-base-support/guns-system/src/main/java/cn/stylefeng/guns/sys/modular/menu/service/impl/SysMenuServiceImpl.java

@ -24,6 +24,7 @@ Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意
 */
package cn.stylefeng.guns.sys.modular.menu.service.impl;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
@ -246,46 +247,75 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void edit(SysMenuParam sysMenuParam) {
        SysMenu sysMenu = this.querySysMenu(sysMenuParam);
        //校验参数
        // 校验参数
        checkParam(sysMenuParam, true);
        //如果应用有变化
        if (!sysMenuParam.getApplication().equals(sysMenu.getApplication())) {
        SysMenu oldMenu = this.querySysMenu(sysMenuParam);
        // 本菜单旧的pids
        String oldPids = oldMenu.getPids();
        // 填充新的pids
        oldMenu.setPid(sysMenuParam.getPid());
        this.fillPids(oldMenu);
        // 是否更新子应用的标识
        boolean updateSubAppsFlag = false;
        // 是否更新子节点的pids的标识
        boolean updateSubPidsFlag = false;
        // 如果应用有变化
        if (!sysMenuParam.getApplication().equals(oldMenu.getApplication())) {
            // 父节点不是根节点不能移动应用
            if (!oldMenu.getPid().equals(0L)) {
                throw new ServiceException(SysMenuExceptionEnum.CANT_MOVE_APP);
            }
            updateSubAppsFlag = true;
        }
        // 父节点有变化
        if (!sysMenuParam.getPid().equals(oldMenu.getPid())) {
            updateSubPidsFlag = true;
        }
        // 开始更新所有子节点的配置
        if (updateSubAppsFlag || updateSubPidsFlag) {
            // 查找所有叶子节点,包含子节点的子节点
            LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.like(SysMenu::getPids, sysMenu.getId());
            queryWrapper.like(SysMenu::getPids, oldMenu.getId());
            List<SysMenu> list = this.list(queryWrapper);
            // 更新所有子节点的应用为当前菜单的应用
            if (ObjectUtil.isNotEmpty(list)) {
                list.forEach(child -> child.setApplication(sysMenuParam.getApplication()));
                this.updateBatchById(list);
            }
            // 如果没有子几点,查询父节点
            else {
                Long pid = sysMenu.getPid();
                // 如果父节点不是根节点
                if (!pid.equals(0L)) {
                    SysMenu pSysMenu = this.getById(pid);
                    // 如果父节点不属于该应用,则无法修改其为该应用
                    if (!pSysMenu.getApplication().equals(sysMenu.getApplication())) {
                        throw new ServiceException(SysMenuExceptionEnum.MENU_PARENT_APPLICATION_ERROR);
                    }
                // 更新所有子节点的application
                if (updateSubAppsFlag) {
                    list.forEach(child -> child.setApplication(sysMenuParam.getApplication()));
                }
                // 更新所有子节点的pids
                if (updateSubPidsFlag) {
                    list.forEach(child -> {
                        // 子节点pids组成 = 当前菜单新pids + 当前菜单id + 子节点自己的pids后缀
                        String oldPcodesPrefix = oldPids + "[" + oldMenu.getId() + "],";
                        String oldPcodesSuffix = child.getPids().substring(oldPcodesPrefix.length());
                        String menuPcodes = oldMenu.getPids() + "[" + oldMenu.getId() + "]," + oldPcodesSuffix;
                        child.setPids(menuPcodes);
                    });
                }
                this.updateBatchById(list);
            }
        }
        BeanUtil.copyProperties(sysMenuParam, sysMenu);
        this.fillPids(sysMenu);
        // 拷贝参数到实体中
        BeanUtil.copyProperties(sysMenuParam, oldMenu);
        this.updateById(sysMenu);
        this.updateById(oldMenu);
    }
    @Override
@ -467,17 +497,14 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
     */
    private void fillPids(SysMenu sysMenu) {
        if (sysMenu.getPid().equals(0L)) {
            sysMenu.setPids(SymbolConstant.LEFT_SQUARE_BRACKETS +
                    0 +
                    SymbolConstant.RIGHT_SQUARE_BRACKETS +
                    SymbolConstant.COMMA);
            sysMenu.setPids(SymbolConstant.LEFT_SQUARE_BRACKETS + 0 + SymbolConstant.RIGHT_SQUARE_BRACKETS
                    + SymbolConstant.COMMA);
        } else {
            //获取父组织机构
            SysMenu pSysMenu = this.getById(sysMenu.getPid());
            sysMenu.setPids(pSysMenu.getPids() +
                    SymbolConstant.LEFT_SQUARE_BRACKETS + pSysMenu.getId() +
                    SymbolConstant.RIGHT_SQUARE_BRACKETS +
                    SymbolConstant.COMMA);
            //获取父菜单
            SysMenu parentMenu = this.getById(sysMenu.getPid());
            sysMenu.setPids(parentMenu.getPids()
                    + SymbolConstant.LEFT_SQUARE_BRACKETS + parentMenu.getId() + SymbolConstant.RIGHT_SQUARE_BRACKETS
                    + SymbolConstant.COMMA);
        }
    }