|
@@ -9,17 +9,23 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
+import cn.iocoder.yudao.framework.security.core.LoginUser;
|
|
|
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelateSaveReqVO;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
|
|
@@ -29,6 +35,7 @@ import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
|
|
import cn.iocoder.yudao.module.system.service.tenant.handler.TenantInfoHandler;
|
|
|
import cn.iocoder.yudao.module.system.service.tenant.handler.TenantMenuHandler;
|
|
|
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
|
|
+import cn.iocoder.yudao.module.system.service.user.UserTenantRelateService;
|
|
|
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -40,8 +47,10 @@ import javax.annotation.Resource;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
|
|
import static java.util.Collections.singleton;
|
|
|
|
|
@@ -73,6 +82,9 @@ public class TenantServiceImpl implements TenantService {
|
|
|
private MenuService menuService;
|
|
|
@Resource
|
|
|
private PermissionService permissionService;
|
|
|
+ @Resource
|
|
|
+ private UserTenantRelateService userTenantRelateService;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public List<Long> getTenantIdList() {
|
|
@@ -102,19 +114,35 @@ public class TenantServiceImpl implements TenantService {
|
|
|
// 校验租户域名是否重复
|
|
|
validTenantWebsiteDuplicate(createReqVO.getWebsite(), null);
|
|
|
// 校验套餐被禁用
|
|
|
- TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId());
|
|
|
+// TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId());
|
|
|
|
|
|
// 创建租户
|
|
|
TenantDO tenant = BeanUtils.toBean(createReqVO, TenantDO.class);
|
|
|
tenantMapper.insert(tenant);
|
|
|
+ // 获得用户信息
|
|
|
+ LoginUser user = SecurityFrameworkUtils.getLoginUser();
|
|
|
+ // 更新用户信息当前租户
|
|
|
+ userService.updateUserTenantId(user.getId(), tenant.getId());
|
|
|
+ // 3创建角色
|
|
|
+
|
|
|
+ // 4给角色授权所有菜单权限
|
|
|
+
|
|
|
+ // 5给角色授权所有数据权限
|
|
|
// 创建租户的管理员
|
|
|
TenantUtils.execute(tenant.getId(), () -> {
|
|
|
// 创建角色
|
|
|
- Long roleId = createRole(tenantPackage);
|
|
|
- // 创建用户,并分配角色
|
|
|
- Long userId = createUser(roleId, createReqVO);
|
|
|
+ Long roleId = createRole(0L);
|
|
|
+
|
|
|
+ // 1.1将这个用户所有租户关系设为不生效
|
|
|
+ userTenantRelateService.deactivateAllForUser(user.getId());
|
|
|
+ // 1.2插入用户租户关系
|
|
|
+ userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(true));
|
|
|
+
|
|
|
+
|
|
|
+ // 分配角色
|
|
|
+ permissionService.assignUserRole(user.getId(), singleton(roleId));
|
|
|
// 修改租户的管理员
|
|
|
- tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId));
|
|
|
+ tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(user.getId()));
|
|
|
});
|
|
|
return tenant.getId();
|
|
|
}
|
|
@@ -138,6 +166,24 @@ public class TenantServiceImpl implements TenantService {
|
|
|
return roleId;
|
|
|
}
|
|
|
|
|
|
+ private Long createRole(Long tenantId) {
|
|
|
+ // 创建角色
|
|
|
+ RoleSaveReqVO reqVO = new RoleSaveReqVO();
|
|
|
+ reqVO.setName(RoleCodeEnum.TENANT_SUPER_ADMIN.getName()).setCode(RoleCodeEnum.TENANT_SUPER_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()));
|
|
|
+ Set<Long> menuIds = menus.stream()
|
|
|
+ .map(MenuDO::getId) // 映射每个MenuDO对象到它的id
|
|
|
+ .collect(Collectors.toSet()); // 收集到一个新的Set中
|
|
|
+ // 分配菜单权限
|
|
|
+ permissionService.assignRoleMenu(roleId, menuIds);
|
|
|
+ // 分配数据权限
|
|
|
+ permissionService.assignRoleDataScope(roleId, 1, null);
|
|
|
+ return roleId;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换
|
|
|
public void updateTenant(TenantSaveReqVO updateReqVO) {
|
|
@@ -148,15 +194,15 @@ public class TenantServiceImpl implements TenantService {
|
|
|
// 校验租户域名是否重复
|
|
|
validTenantWebsiteDuplicate(updateReqVO.getWebsite(), updateReqVO.getId());
|
|
|
// 校验套餐被禁用
|
|
|
- TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId());
|
|
|
+// TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId());
|
|
|
|
|
|
// 更新租户
|
|
|
TenantDO updateObj = BeanUtils.toBean(updateReqVO, TenantDO.class);
|
|
|
tenantMapper.updateById(updateObj);
|
|
|
// 如果套餐发生变化,则修改其角色的权限
|
|
|
- if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) {
|
|
|
- updateTenantRoleMenu(tenant.getId(), tenantPackage.getMenuIds());
|
|
|
- }
|
|
|
+// if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) {
|
|
|
+// updateTenantRoleMenu(tenant.getId(), tenantPackage.getMenuIds());
|
|
|
+// }
|
|
|
}
|
|
|
|
|
|
private void validTenantNameDuplicate(String name, Long id) {
|
|
@@ -289,7 +335,12 @@ public class TenantServiceImpl implements TenantService {
|
|
|
if (isSystemTenant(tenant)) { // 系统租户,菜单是全量的
|
|
|
menuIds = CollectionUtils.convertSet(menuService.getMenuList(), MenuDO::getId);
|
|
|
} else {
|
|
|
- menuIds = tenantPackageService.getTenantPackage(tenant.getPackageId()).getMenuIds();
|
|
|
+// menuIds = tenantPackageService.getTenantPackage(tenant.getPackageId()).getMenuIds();
|
|
|
+ // 获取菜单Ids
|
|
|
+ List<MenuDO> menus = menuService.getMenuList(new MenuListReqVO().setTenantId(0L).setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
|
|
+ menuIds = menus.stream()
|
|
|
+ .map(MenuDO::getId) // 映射每个MenuDO对象到它的id
|
|
|
+ .collect(Collectors.toSet()); // 收集到一个新的Set中
|
|
|
}
|
|
|
// 执行处理器
|
|
|
handler.handle(menuIds);
|