From c66f3ca48216decddb32a7ad3fdde6bdfe1c055c Mon Sep 17 00:00:00 2001 From: Jay <csj123456> Date: 星期三, 16 十月 2024 15:31:09 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/PermissionServiceImpl.java | 70 ++++++++++++++++++++++++++++++++++- 1 files changed, 68 insertions(+), 2 deletions(-) diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/PermissionServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/PermissionServiceImpl.java index ad8e0a9..06ea1cb 100644 --- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/PermissionServiceImpl.java +++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/PermissionServiceImpl.java @@ -8,15 +8,22 @@ import com.iailab.framework.common.util.collection.CollectionUtils; import com.iailab.framework.datapermission.core.annotation.DataPermission; import com.iailab.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.iailab.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.iailab.module.system.dal.dataobject.app.AppDO; import com.iailab.module.system.dal.dataobject.permission.MenuDO; import com.iailab.module.system.dal.dataobject.permission.RoleDO; import com.iailab.module.system.dal.dataobject.permission.RoleMenuDO; import com.iailab.module.system.dal.dataobject.permission.UserRoleDO; +import com.iailab.module.system.dal.dataobject.tenant.TenantDO; +import com.iailab.module.system.dal.dataobject.tenant.TenantPackageDO; import com.iailab.module.system.dal.mysql.permission.RoleMenuMapper; import com.iailab.module.system.dal.mysql.permission.UserRoleMapper; import com.iailab.module.system.dal.redis.RedisKeyConstants; import com.iailab.module.system.enums.permission.DataScopeEnum; +import com.iailab.module.system.service.app.AppService; import com.iailab.module.system.service.dept.DeptService; +import com.iailab.module.system.service.tenant.TenantPackageService; +import com.iailab.module.system.service.tenant.TenantService; import com.iailab.module.system.service.user.AdminUserService; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.google.common.annotations.VisibleForTesting; @@ -35,6 +42,7 @@ import static com.iailab.framework.common.util.collection.CollectionUtils.convertSet; import static com.iailab.framework.common.util.json.JsonUtils.toJsonString; +import static com.iailab.framework.tenant.core.context.TenantContextHolder.getTenantId; /** * 权限 Service 实现类 @@ -58,6 +66,13 @@ private DeptService deptService; @Resource private AdminUserService userService; + @Resource + private TenantService tenantService; + @Resource + private TenantPackageService tenantPackageService; + @Resource + private AppService appService; + @Override public boolean hasAnyPermissions(Long userId, String... permissions) { @@ -155,6 +170,37 @@ } } + // ========== 角色-菜单的相关方法 ========== + +// @Override +// @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 +// @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, +// allEntries = true) // allEntries 清空所有缓存,主要一次更新涉及到的 menuIds 较多,反倒批量会更快 +// public void assignRoleAppMenu(Long roleId, Set<Long> menuIds) { +// // 获得角色拥有应用菜单编号 +// MenuListReqVO reqVO = new MenuListReqVO(); +// List<MenuDO> appMenuList = menuService.getAppMenuList(reqVO); +// Set<Long> appMenuIds = convertSet(appMenuList, MenuDO::getId); +// Set<Long> dbMenuIds = convertSet(roleMenuMapper.selectListByRoleId(roleId), RoleMenuDO::getMenuId); +// dbMenuIds.retainAll(appMenuIds); +// // 计算新增和删除的菜单编号 +// Set<Long> menuIdList = CollUtil.emptyIfNull(menuIds); +// Collection<Long> createMenuIds = CollUtil.subtract(menuIdList, dbMenuIds); +// Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIdList); +// // 执行新增和删除。对于已经授权的菜单,不用做任何处理 +// if (CollUtil.isNotEmpty(createMenuIds)) { +// roleMenuMapper.insertBatch(CollectionUtils.convertList(createMenuIds, menuId -> { +// RoleMenuDO entity = new RoleMenuDO(); +// entity.setRoleId(roleId); +// entity.setMenuId(menuId); +// return entity; +// })); +// } +// if (CollUtil.isNotEmpty(deleteMenuIds)) { +// roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); +// } +// } + @Override @Transactional(rollbackFor = Exception.class) @Caching(evict = { @@ -181,16 +227,36 @@ if (CollUtil.isEmpty(roleIds)) { return Collections.emptySet(); } - // 如果是管理员的情况下,获取全部菜单编号 if (roleService.hasAnySuperAdmin(roleIds)) { return convertSet(menuService.getMenuList(), MenuDO::getId); } - // 如果是非管理员的情况下,获得拥有的菜单编号 return convertSet(roleMenuMapper.selectListByRoleId(roleIds), RoleMenuDO::getMenuId); } @Override + public Set<Long> getRoleAppMenuListByRoleId(Collection<Long> roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return Collections.emptySet(); + } + + // 如果是管理员的情况下,获取全部应用菜单编号 + if (roleService.hasAnySuperAdmin(roleIds)) { + MenuListReqVO reqVO = new MenuListReqVO(); + return convertSet(menuService.getAppMenuList(reqVO), MenuDO::getId); + } + // 如果是非管理员的情况下,获得拥有的应用菜单编号 + // 获取 tenantId + Long tenantId = getTenantId(); + TenantDO tenant = tenantService.getTenant(tenantId); + TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(tenant.getPackageId()); + Set<Long> menuIds = tenantPackage.getMenuIds(); + Set<Long> longs = convertSet(roleMenuMapper.selectListByRoleId(roleIds), RoleMenuDO::getMenuId); + longs.retainAll(menuIds); + return longs; + } + + @Override @Cacheable(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId") public Set<Long> getMenuRoleIdListByMenuIdFromCache(Long menuId) { return convertSet(roleMenuMapper.selectListByMenuId(menuId), RoleMenuDO::getRoleId); -- Gitblit v1.9.3