|
|
@@ -24,6 +24,7 @@ import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
|
|
|
import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuTenantRelateSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.*;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelateSaveReqVO;
|
|
|
@@ -39,12 +40,14 @@ import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
|
|
|
import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
|
|
|
+import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
|
|
|
import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;
|
|
|
import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
|
|
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.MenuService;
|
|
|
+import cn.iocoder.yudao.module.system.service.permission.MenuTenantRelateService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
|
|
import cn.iocoder.yudao.module.system.service.tenant.handler.TenantInfoHandler;
|
|
|
@@ -60,9 +63,7 @@ import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
@@ -108,6 +109,8 @@ public class TenantServiceImpl implements TenantService {
|
|
|
private OAuth2TokenService oauth2TokenService;
|
|
|
@Resource
|
|
|
private AdminAuthService authService;
|
|
|
+ @Resource
|
|
|
+ private MenuTenantRelateService menuTenantRelateService;
|
|
|
|
|
|
@Override
|
|
|
public List<Long> getTenantIdList() {
|
|
|
@@ -166,10 +169,12 @@ public class TenantServiceImpl implements TenantService {
|
|
|
} else {
|
|
|
throw exception(USER_TENANT_EMPLOYEE_DUPLICATE, tenant.getName());
|
|
|
}
|
|
|
- // 创建租户的管理员
|
|
|
TenantUtils.execute(tenant.getId(), () -> {
|
|
|
- // 创建角色
|
|
|
- Long roleId = createRole(0L);
|
|
|
+ // 创建租户内置角色
|
|
|
+ Long roleId = createSystemSuperAdminRole(tenant.getId());
|
|
|
+ createSystemAdminRole(tenant.getId());
|
|
|
+ createCommonEmployeeRole(tenant.getId());
|
|
|
+ createDepartmentLeaderRole(tenant.getId());
|
|
|
// 分配角色
|
|
|
permissionService.assignUserRole(user.getId(), singleton(roleId));
|
|
|
// 修改租户的管理员
|
|
|
@@ -215,6 +220,14 @@ public class TenantServiceImpl implements TenantService {
|
|
|
} else {
|
|
|
throw exception(USER_TENANT_EMPLOYEE_DUPLICATE, tenant.getName());
|
|
|
}
|
|
|
+ TenantUtils.execute(tenant.getId(), () -> {
|
|
|
+ RoleDO roleDO = roleService.selectByName(RoleCodeEnum.COMMON_EMPLOYEE.getName());
|
|
|
+ if (roleDO == null || roleDO.getId() == null) {
|
|
|
+ throw exception(ROLE_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ // 分配角色
|
|
|
+ permissionService.assignUserRole(user.getId(), singleton(roleDO.getId()));
|
|
|
+ });
|
|
|
TenantSimpleRespVO tenantSimpleRespVO = new TenantSimpleRespVO();
|
|
|
tenantSimpleRespVO.setId(tenant.getId());
|
|
|
tenantSimpleRespVO.setName(tenant.getName());
|
|
|
@@ -241,21 +254,95 @@ public class TenantServiceImpl implements TenantService {
|
|
|
return roleId;
|
|
|
}
|
|
|
|
|
|
- private Long createRole(Long tenantId) {
|
|
|
+ // 创建系统管理员:拥有所有OA磁贴权限和企业管理磁贴权限,只有本人数据权限,是给创建人默认授予的角色。
|
|
|
+ private Long createSystemSuperAdminRole(Long tenantId) {
|
|
|
// 创建角色
|
|
|
RoleSaveReqVO reqVO = new RoleSaveReqVO();
|
|
|
- reqVO.setName(RoleCodeEnum.TENANT_SUPER_ADMIN.getName()).setCode(RoleCodeEnum.TENANT_SUPER_ADMIN.getCode())
|
|
|
- .setSort(0).setRemark("系统自动生成");
|
|
|
+ reqVO.setName(RoleCodeEnum.SYSTEM_SUPER_ADMIN.getName()).setCode(RoleCodeEnum.SYSTEM_SUPER_ADMIN.getCode())
|
|
|
+ .setSort(0).setRemark("创建租户内置角色");
|
|
|
+ Long roleId = roleService.createRole(reqVO, RoleTypeEnum.CUSTOM.getType());
|
|
|
+ Set<Long> menuIds = new HashSet<>();
|
|
|
+ // 获取OA菜单
|
|
|
+ MenuDO oaMenu = menuService.selectByParentIdAndName(0L, "OA");
|
|
|
+ // 获取其他菜单
|
|
|
+ MenuDO otherMenu = menuService.selectByParentIdAndName(0L, "其他");
|
|
|
+ // 获取企业管理菜单
|
|
|
+ MenuDO manageMenu = menuService.selectByParentIdAndName(otherMenu.getId(), "企业管理");
|
|
|
+ // 获取OA菜单下所有子级菜单ID
|
|
|
+ Set<Long> oaChildrenMenuIds = this.collectAllMenuIds(oaMenu.getId());
|
|
|
+ // 获取企业管理菜单下所有子级菜单ID
|
|
|
+ Set<Long> manageChildrenMenuIds = this.collectAllMenuIds(manageMenu.getId());
|
|
|
+ menuIds.add(oaMenu.getId());
|
|
|
+ menuIds.addAll(oaChildrenMenuIds);
|
|
|
+ menuIds.add(otherMenu.getId());
|
|
|
+ menuIds.add(manageMenu.getId());
|
|
|
+ menuIds.addAll(manageChildrenMenuIds);
|
|
|
+ menuIds.stream()
|
|
|
+ .forEach(menuId ->
|
|
|
+ menuTenantRelateService.createTenantRelate(new MenuTenantRelateSaveReqVO().setMenuId(menuId).setTenantId(tenantId))
|
|
|
+ );
|
|
|
+ // 分配菜单权限
|
|
|
+ permissionService.assignRoleMenu(roleId, menuIds);
|
|
|
+ // 分配数据权限
|
|
|
+ permissionService.assignRoleDataScope(roleId, DataScopeEnum.SELF.getScope(), null);
|
|
|
+ return roleId;
|
|
|
+ }
|
|
|
+ // 创建管理员:拥有所有磁贴权限,拥有全部数据权限,默认没有人拥有此角色,需要手动授予。
|
|
|
+ private Long createSystemAdminRole(Long tenantId) {
|
|
|
+ // 创建角色
|
|
|
+ RoleSaveReqVO reqVO = new RoleSaveReqVO();
|
|
|
+ reqVO.setName(RoleCodeEnum.SYSTEM_ADMIN.getName()).setCode(RoleCodeEnum.SYSTEM_ADMIN.getCode())
|
|
|
+ .setSort(0).setRemark("创建租户内置角色");
|
|
|
Long roleId = roleService.createRole(reqVO, RoleTypeEnum.CUSTOM.getType());
|
|
|
// 获取菜单Ids
|
|
|
- List<MenuDO> menus = menuService.getMenuList(new MenuListReqVO().setTenantId(tenantId).setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
|
|
+ List<MenuDO> menus = menuService.getMenuList(new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
|
|
Set<Long> menuIds = menus.stream()
|
|
|
- .map(MenuDO::getId) // 映射每个MenuDO对象到它的id
|
|
|
- .collect(Collectors.toSet()); // 收集到一个新的Set中
|
|
|
+ .map(MenuDO::getId) // 映射每个MenuDO对象到它的id
|
|
|
+ .collect(Collectors.toSet()); // 收集到一个新的Set中
|
|
|
+ // 分配菜单权限
|
|
|
+ permissionService.assignRoleMenu(roleId, menuIds);
|
|
|
+ // 分配数据权限
|
|
|
+ permissionService.assignRoleDataScope(roleId, DataScopeEnum.ALL.getScope(), null);
|
|
|
+ return roleId;
|
|
|
+ }
|
|
|
+ // 普通员工:拥有所有OA磁贴权限,只有本人数据权限,是加入企业时,默认授予的角色。
|
|
|
+ private Long createCommonEmployeeRole(Long tenantId) {
|
|
|
+ // 创建角色
|
|
|
+ RoleSaveReqVO reqVO = new RoleSaveReqVO();
|
|
|
+ reqVO.setName(RoleCodeEnum.COMMON_EMPLOYEE.getName()).setCode(RoleCodeEnum.COMMON_EMPLOYEE.getCode())
|
|
|
+ .setSort(0).setRemark("创建租户内置角色");
|
|
|
+ Long roleId = roleService.createRole(reqVO, RoleTypeEnum.CUSTOM.getType());
|
|
|
+ Set<Long> menuIds = new HashSet<>();
|
|
|
+ // 获取OA菜单
|
|
|
+ MenuDO oaMenu = menuService.selectByParentIdAndName(0L, "OA");
|
|
|
+ // 获取OA菜单下所有子级菜单ID
|
|
|
+ Set<Long> oaChildrenMenuIds = this.collectAllMenuIds(oaMenu.getId());
|
|
|
+ menuIds.add(oaMenu.getId());
|
|
|
+ menuIds.addAll(oaChildrenMenuIds);
|
|
|
+ // 分配菜单权限
|
|
|
+ permissionService.assignRoleMenu(roleId, menuIds);
|
|
|
+ // 分配数据权限
|
|
|
+ permissionService.assignRoleDataScope(roleId, DataScopeEnum.SELF.getScope(), null);
|
|
|
+ return roleId;
|
|
|
+ }
|
|
|
+ // 部门负责人:拥有所有OA磁贴权限,有本部门及以下数据权限,默认没有人拥有此角色,需要手动授予。
|
|
|
+ private Long createDepartmentLeaderRole(Long tenantId) {
|
|
|
+ // 创建角色
|
|
|
+ RoleSaveReqVO reqVO = new RoleSaveReqVO();
|
|
|
+ reqVO.setName(RoleCodeEnum.DEPARTMENT_LEADER.getName()).setCode(RoleCodeEnum.DEPARTMENT_LEADER.getCode())
|
|
|
+ .setSort(0).setRemark("创建租户内置角色");
|
|
|
+ Long roleId = roleService.createRole(reqVO, RoleTypeEnum.CUSTOM.getType());
|
|
|
+ Set<Long> menuIds = new HashSet<>();
|
|
|
+ // 获取OA菜单
|
|
|
+ MenuDO oaMenu = menuService.selectByParentIdAndName(0L, "OA");
|
|
|
+ // 获取OA菜单下所有子级菜单ID
|
|
|
+ Set<Long> oaChildrenMenuIds = this.collectAllMenuIds(oaMenu.getId());
|
|
|
+ menuIds.add(oaMenu.getId());
|
|
|
+ menuIds.addAll(oaChildrenMenuIds);
|
|
|
// 分配菜单权限
|
|
|
permissionService.assignRoleMenu(roleId, menuIds);
|
|
|
// 分配数据权限
|
|
|
- permissionService.assignRoleDataScope(roleId, 1, null);
|
|
|
+ permissionService.assignRoleDataScope(roleId, DataScopeEnum.DEPT_AND_CHILD.getScope(), null);
|
|
|
return roleId;
|
|
|
}
|
|
|
|
|
|
@@ -264,11 +351,15 @@ public class TenantServiceImpl implements TenantService {
|
|
|
public void updateTenant(TenantSaveReqVO updateReqVO) {
|
|
|
// 1.1 获得用户信息
|
|
|
AdminUserDO user = userService.getUser(getLoginUserId());
|
|
|
- if (user == null || user.getTenantId() == null) {
|
|
|
+ if (user == null) {
|
|
|
+ throw exception(USER_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ AdminUserDO adminUserDO = userService.getUser(user.getId());
|
|
|
+ if (adminUserDO == null || adminUserDO.getTenantId() == null) {
|
|
|
throw exception(USER_NOT_EXISTS);
|
|
|
}
|
|
|
if (updateReqVO.getId() == null) {
|
|
|
- updateReqVO.setId(user.getTenantId());
|
|
|
+ updateReqVO.setId(adminUserDO.getTenantId());
|
|
|
}
|
|
|
// 校验存在
|
|
|
TenantDO tenant = validateUpdateTenant(updateReqVO.getId());
|
|
|
@@ -518,4 +609,23 @@ public class TenantServiceImpl implements TenantService {
|
|
|
return UserTypeEnum.ADMIN;
|
|
|
}
|
|
|
|
|
|
+ // 递归方法,收集所有menuId并放入Set中
|
|
|
+ private Set<Long> collectAllMenuIds(Long parentId) {
|
|
|
+ Set<Long> menuIds = new HashSet<>();
|
|
|
+
|
|
|
+ // 获取当前parentId的直接子菜单
|
|
|
+ List<MenuDO> childrenMenus = menuService.getMenuList(new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()).setParentId(parentId));
|
|
|
+
|
|
|
+ // 将当前层级的menuId添加到Set中
|
|
|
+ for (MenuDO menu : childrenMenus) {
|
|
|
+ menuIds.add(menu.getId()); // 假设Menu类有一个getId()方法返回menuId
|
|
|
+
|
|
|
+ // 递归收集子菜单的menuId
|
|
|
+ Set<Long> subMenuIds = collectAllMenuIds(menu.getId());
|
|
|
+ menuIds.addAll(subMenuIds); // 将子菜单的menuId也添加到Set中
|
|
|
+ }
|
|
|
+
|
|
|
+ return menuIds;
|
|
|
+ }
|
|
|
+
|
|
|
}
|