From 7b346938a4ab9837499a4f7767b41da0f413d298 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Wed, 17 Jan 2024 00:53:49 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.1.0=E3=80=91=E3=80=90role=E3=80=91?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A7=92=E8=89=B2=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kernel/sys/api/SysRoleServiceApi.java | 8 +++ .../kernel/sys/api/pojo/role/SysRoleDTO.java | 6 ++ .../service/impl/SysUserRoleServiceImpl.java | 62 +++++++++++++++---- .../role/service/impl/SysRoleServiceImpl.java | 18 +++++- 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java index 460ba0578..c7cb96731 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java @@ -72,4 +72,12 @@ public interface SysRoleServiceApi { */ List getRolesByIds(List roleIds); + /** + * 获取所有系统角色和当前登录公司的角色集合 + * + * @author fengshuonan + * @since 2024/1/17 0:40 + */ + List getSystemRoleAndCurrentCompanyRole(Long companyId); + } diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleDTO.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleDTO.java index 479686ed6..87b504e62 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleDTO.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/role/SysRoleDTO.java @@ -54,4 +54,10 @@ public class SysRoleDTO { @ChineseDescription("编码") private String roleCode; + /** + * 角色类型:10-系统角色,20-公司角色 + */ + @ChineseDescription("角色类型:10-系统角色,20-公司角色") + private Integer roleType; + } diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java index 90a7d333e..ff5327f4c 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/user/service/impl/SysUserRoleServiceImpl.java @@ -11,6 +11,8 @@ import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi; import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi; import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; +import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum; +import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO; import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole; import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper; @@ -24,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -63,8 +66,7 @@ public class SysUserRoleServiceImpl extends ServiceImpl wrapper = this.createWrapper(sysUserRoleRequest); - this.remove(wrapper); + this.removeRoleAlreadyBind(sysUserRoleRequest); // 重新绑定用户角色信息 Set roleIdList = sysUserRoleRequest.getRoleIdList(); @@ -157,9 +159,8 @@ public class SysUserRoleServiceImpl extends ServiceImpl findUserIdsByRoleId(Long roleId) { - SysUserRoleRequest userRoleRequest = new SysUserRoleRequest(); - userRoleRequest.setRoleId(roleId); - LambdaQueryWrapper queryWrapper = this.createWrapper(userRoleRequest); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUserRole::getRoleId, roleId); queryWrapper.select(SysUserRole::getUserId); List list = this.list(queryWrapper); return list.stream().map(SysUserRole::getUserId).collect(Collectors.toList()); @@ -184,21 +185,56 @@ public class SysUserRoleServiceImpl extends ServiceImpl createWrapper(SysUserRoleRequest sysUserRoleRequest) { + private void removeRoleAlreadyBind(SysUserRoleRequest sysUserRoleRequest) { + + // 1. 获取系统中的所有角色,包括系统角色和当前公司角色 + List roleResults = sysRoleServiceApi.getSystemRoleAndCurrentCompanyRole( + LoginContext.me().getCurrentUserCompanyId()); + if (ObjectUtil.isEmpty(roleResults)) { + return; + } + + // 2. 所有系统角色id集合 + Set systemRoleIdList = roleResults.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.SYSTEM_ROLE.getCode())) + .map(SysRoleDTO::getRoleId) + .collect(Collectors.toSet()); + + // 3. 所有当前公司角色id集合 + Set currentCompanyRoleIdList = roleResults.stream() + .filter(i -> i.getRoleType().equals(RoleTypeEnum.COMPANY_ROLE.getCode())) + .map(SysRoleDTO::getRoleId) + .collect(Collectors.toSet()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - Long userId = sysUserRoleRequest.getUserId(); - queryWrapper.eq(ObjectUtil.isNotNull(userId), SysUserRole::getUserId, userId); + // 2. 当前如果是超级管理员在操作,清空用户的系统角色和当前公司角色(因为超级管理员的绑定角色列表,可以看到系统角色和当前公司角色) + boolean superAdminFlag = LoginContext.me().getSuperAdminFlag(); + if (superAdminFlag) { - Long roleId = sysUserRoleRequest.getRoleId(); - queryWrapper.eq(ObjectUtil.isNotNull(roleId), SysUserRole::getRoleId, roleId); + Set paramsRoleIdList = new HashSet<>(systemRoleIdList); + if (ObjectUtil.isNotEmpty(currentCompanyRoleIdList)) { + paramsRoleIdList.addAll(currentCompanyRoleIdList); + } - return queryWrapper; + queryWrapper.eq(SysUserRole::getUserId, sysUserRoleRequest.getUserId()); + queryWrapper.in(SysUserRole::getRoleId, paramsRoleIdList); + this.remove(queryWrapper); + } + + // 3. 如果当前不是超级管理员,则只能清空当前公司的角色id集合 + else { + if (ObjectUtil.isEmpty(currentCompanyRoleIdList)) { + return; + } + queryWrapper.eq(SysUserRole::getUserId, sysUserRoleRequest.getUserId()); + queryWrapper.in(SysUserRole::getRoleId, currentCompanyRoleIdList); + this.remove(queryWrapper); + } } } \ No newline at end of file diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java index 1d0ff38c6..d39f527ab 100644 --- a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -163,7 +163,8 @@ public class SysRoleServiceImpl extends ServiceImpl impl LambdaQueryWrapper wrapper = createWrapper(sysRoleRequest); // 只查询需要的字段 - wrapper.select(SysRole::getRoleName, SysRole::getRoleCode, SysRole::getRoleSort, SysRole::getRoleId, BaseEntity::getCreateTime, SysRole::getRoleType, SysRole::getRoleCompanyId); + wrapper.select(SysRole::getRoleName, SysRole::getRoleCode, SysRole::getRoleSort, SysRole::getRoleId, BaseEntity::getCreateTime, + SysRole::getRoleType, SysRole::getRoleCompanyId); // 非管理员用户只能查看自己创建的角色 this.filterRolePermission(wrapper, sysRoleRequest); @@ -335,6 +336,21 @@ public class SysRoleServiceImpl extends ServiceImpl impl return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError()); } + @Override + public List getSystemRoleAndCurrentCompanyRole(Long companyId) { + LambdaQueryWrapper sysRoleLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysRoleLambdaQueryWrapper.eq(SysRole::getRoleType, RoleTypeEnum.SYSTEM_ROLE.getCode()); + sysRoleLambdaQueryWrapper.or(i -> i.eq(SysRole::getRoleCompanyId, companyId)); + sysRoleLambdaQueryWrapper.select(SysRole::getRoleName, SysRole::getRoleId, SysRole::getRoleCode, SysRole::getRoleType); + List sysRoleList = this.list(sysRoleLambdaQueryWrapper); + + if (ObjectUtil.isEmpty(sysRoleList)) { + return new ArrayList<>(); + } + + return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError()); + } + /** * 获取信息 *