diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/PermissionAssignResultFactory.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/PermissionAssignResultFactory.java index 05ef35a4b..8a768a804 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/PermissionAssignResultFactory.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/factory/PermissionAssignResultFactory.java @@ -1,6 +1,8 @@ package cn.stylefeng.roses.kernel.sys.modular.role.factory; import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory; +import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions; import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleBindPermissionItem; @@ -40,4 +42,35 @@ public class PermissionAssignResultFactory { return result; } + /** + * 创建角色绑定应用时候的响应结果 + * + * @author fengshuonan + * @since 2023/6/14 14:53 + */ + public static List createRoleBindAppResult(List totalMenus, List totalMenuOptions, Boolean checkedFlag) { + + List result = new ArrayList<>(); + + if (ObjectUtil.isEmpty(totalMenus)) { + return result; + } + + for (SysMenu sysMenu : totalMenus) { + RoleBindPermissionItem roleBindPermissionItem = new RoleBindPermissionItem( + sysMenu.getMenuId(), null, sysMenu.getMenuName(), + PermissionNodeTypeEnum.MENU.getCode(), checkedFlag); + result.add(roleBindPermissionItem); + } + + for (SysMenuOptions sysMenuOptions : totalMenuOptions) { + RoleBindPermissionItem roleBindPermissionItem = new RoleBindPermissionItem( + sysMenuOptions.getMenuOptionId(), sysMenuOptions.getMenuId(), sysMenuOptions.getOptionName(), + PermissionNodeTypeEnum.OPTIONS.getCode(), checkedFlag); + result.add(roleBindPermissionItem); + } + + return new DefaultTreeBuildFactory().doTreeBuild(result); + } + } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java index a886aa3c3..dd25cae25 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/RoleBindAppImpl.java @@ -1,11 +1,26 @@ package cn.stylefeng.roses.kernel.sys.modular.role.service.impl; +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; +import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenuOptions; +import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuOptionsService; +import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuService; import cn.stylefeng.roses.kernel.sys.modular.role.action.RoleAssignOperateAction; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenu; +import cn.stylefeng.roses.kernel.sys.modular.role.entity.SysRoleMenuOptions; import cn.stylefeng.roses.kernel.sys.modular.role.enums.PermissionNodeTypeEnum; +import cn.stylefeng.roses.kernel.sys.modular.role.factory.PermissionAssignResultFactory; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleBindPermissionRequest; import cn.stylefeng.roses.kernel.sys.modular.role.pojo.response.RoleBindPermissionItem; +import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuOptionsService; +import cn.stylefeng.roses.kernel.sys.modular.role.service.SysRoleMenuService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 角色绑定权限,点击绑定应用时候的业务处理 @@ -15,6 +30,18 @@ import java.util.List; */ public class RoleBindAppImpl implements RoleAssignOperateAction { + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysMenuOptionsService sysMenuOptionsService; + + @Resource + private SysRoleMenuService sysRoleMenuService; + + @Resource + private SysRoleMenuOptionsService sysRoleMenuOptionsService; + @Override public PermissionNodeTypeEnum getNodeType() { return PermissionNodeTypeEnum.APP; @@ -22,7 +49,68 @@ public class RoleBindAppImpl implements RoleAssignOperateAction { @Override public List doOperateAction(RoleBindPermissionRequest roleBindPermissionRequest) { - return null; + + Long roleId = roleBindPermissionRequest.getRoleId(); + Long appId = roleBindPermissionRequest.getNodeId(); + + // 找到所选应用的对应的所有菜单 + LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuLambdaQueryWrapper.eq(SysMenu::getAppId, appId); + menuLambdaQueryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuName, SysMenu::getMenuParentId); + List totalMenus = sysMenuService.list(menuLambdaQueryWrapper); + Set totalMenuIds = totalMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet()); + + if (ObjectUtil.isEmpty(totalMenus)) { + return new ArrayList<>(); + } + + // 找到所选应用的对应的所有菜单功能 + LambdaQueryWrapper menuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuOptionsLambdaQueryWrapper.eq(SysMenuOptions::getAppId, appId); + menuOptionsLambdaQueryWrapper.select(SysMenuOptions::getMenuOptionId, SysMenuOptions::getOptionName, SysMenuOptions::getMenuId); + List totalMenuOptions = sysMenuOptionsService.list(menuOptionsLambdaQueryWrapper); + Set totalMenuOptionIds = totalMenuOptions.stream().map(SysMenuOptions::getMenuOptionId).collect(Collectors.toSet()); + + // 先删除角色绑定的这些菜单 + LambdaQueryWrapper sysRoleMenuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleMenuLambdaQueryWrapper.eq(SysRoleMenu::getRoleId, roleId); + sysRoleMenuLambdaQueryWrapper.in(SysRoleMenu::getMenuId, totalMenuIds); + sysRoleMenuService.remove(sysRoleMenuLambdaQueryWrapper); + + // 删除角色绑定的这些菜单功能 + if (ObjectUtil.isNotEmpty(totalMenuOptionIds)) { + LambdaQueryWrapper sysRoleMenuOptionsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleMenuOptionsLambdaQueryWrapper.eq(SysRoleMenuOptions::getRoleId, roleId); + sysRoleMenuOptionsLambdaQueryWrapper.in(SysRoleMenuOptions::getMenuOptionId, totalMenuOptionIds); + sysRoleMenuOptionsService.remove(sysRoleMenuOptionsLambdaQueryWrapper); + } + + // 如果是选中了应用,则从新绑定这些菜单和功能 + if (roleBindPermissionRequest.getChecked()) { + List sysRoleMenuList = new ArrayList<>(); + for (SysMenu menuItem : totalMenus) { + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setRoleId(roleId); + sysRoleMenu.setAppId(appId); + sysRoleMenu.setMenuId(menuItem.getMenuId()); + sysRoleMenuList.add(sysRoleMenu); + } + this.sysRoleMenuService.saveBatch(sysRoleMenuList); + + List sysRoleMenuOptionsList = new ArrayList<>(); + for (SysMenuOptions menuOptionItem : totalMenuOptions) { + SysRoleMenuOptions sysRoleMenuOptions = new SysRoleMenuOptions(); + sysRoleMenuOptions.setRoleId(roleId); + sysRoleMenuOptions.setAppId(appId); + sysRoleMenuOptions.setMenuId(menuOptionItem.getMenuId()); + sysRoleMenuOptions.setMenuOptionId(menuOptionItem.getMenuOptionId()); + sysRoleMenuOptionsList.add(sysRoleMenuOptions); + } + this.sysRoleMenuOptionsService.saveBatch(sysRoleMenuOptionsList); + } + + // 组装返回结果 + return PermissionAssignResultFactory.createRoleBindAppResult(totalMenus, totalMenuOptions, roleBindPermissionRequest.getChecked()); } }