mirror of
http://git.pig4cloud.com/pig/pigx.git
synced 2026-11-14 22:29:00 +08:00
feat(pigx-upms-biz): 优化 SysTenantServiceImpl 租户处理逻辑
从 19b3e3ba3 提取非 AI 部分。
This commit is contained in:
1 parent
7070b9f3d2
commit
7e005eabd0
1 file changed
+39
-24
+39
-24
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2026, lengleng All rights reserved.
|
* Copyright (c) 2018-2025, lengleng All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@@ -44,6 +44,7 @@ import com.pig4cloud.pigx.common.security.util.SecurityUtils;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.cache.CacheManager;
|
import org.springframework.cache.CacheManager;
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
@@ -63,6 +64,7 @@ import java.util.*;
|
|||||||
* @author lengleng
|
* @author lengleng
|
||||||
* @date 2025/06/30
|
* @date 2025/06/30
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements SysTenantService {
|
public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements SysTenantService {
|
||||||
@@ -554,47 +556,60 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
|
|||||||
@Override
|
@Override
|
||||||
public SysTenant getOrUpdateTenant() {
|
public SysTenant getOrUpdateTenant() {
|
||||||
PigxUser loginUser = SecurityUtils.getUser();
|
PigxUser loginUser = SecurityUtils.getUser();
|
||||||
// 通过代理对象调用以确保 @Cacheable 生效,避免自调用导致缓存失效
|
LocalDateTime now = LocalDateTime.now();
|
||||||
List<SysTenant> normalTenantList = SpringContextHolder.getBean(SysTenantService.class)
|
|
||||||
|
// 通过代理对象调用以确保 @Cacheable 生效
|
||||||
|
List<SysTenant> validTenantList = SpringContextHolder.getBean(SysTenantService.class)
|
||||||
.getNormalTenant()
|
.getNormalTenant()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
|
.filter(tenant -> tenant.getStartTime().isBefore(now))
|
||||||
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
|
.filter(tenant -> tenant.getEndTime().isAfter(now))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
boolean match = normalTenantList.stream()
|
// 当前租户有效则直接返回
|
||||||
.anyMatch(tenant -> tenant.getId().equals(loginUser.getTenantId()));
|
Optional<SysTenant> currentTenant = validTenantList.stream()
|
||||||
|
.filter(tenant -> tenant.getId().equals(loginUser.getTenantId()))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
if (match) {
|
if (currentTenant.isPresent()) {
|
||||||
// 当前租户有效,返回当前租户对象
|
return currentTenant.get();
|
||||||
return normalTenantList.stream()
|
|
||||||
.filter(tenant -> tenant.getId().equals(loginUser.getTenantId()))
|
|
||||||
.findFirst()
|
|
||||||
.orElse(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SysTenantUser tenantUser = sysTenantUserMapper.selectOne(Wrappers.<SysTenantUser>lambdaQuery()
|
// 当前租户无效,输出有效租户列表便于排查
|
||||||
.eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId())
|
log.warn("用户[{}]当前租户[{}]无效或已过期,有效租户列表: {}",
|
||||||
.ne(SysTenantUser::getTenantId, loginUser.getTenantId()), false);
|
loginUser.getUsername(),
|
||||||
// 如果当前用户没有租户信息,则不进行任何操作
|
loginUser.getTenantId(),
|
||||||
|
validTenantList.stream()
|
||||||
|
.map(t -> String.format("ID:%d,名称:%s", t.getId(), t.getName()))
|
||||||
|
.toList());
|
||||||
|
|
||||||
|
// 查找用户的其他租户关联
|
||||||
|
SysTenantUser tenantUser = sysTenantUserMapper.selectOne(
|
||||||
|
Wrappers.<SysTenantUser>lambdaQuery()
|
||||||
|
.eq(SysTenantUser::getUserId, loginUser.getId())
|
||||||
|
.ne(SysTenantUser::getTenantId, loginUser.getTenantId()),
|
||||||
|
false);
|
||||||
|
|
||||||
if (Objects.isNull(tenantUser)) {
|
if (Objects.isNull(tenantUser)) {
|
||||||
|
log.warn("用户[{}]没有其他可用的租户关联,无法自动切换", loginUser.getUsername());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 切换至状态正常的租户
|
// 执行租户切换
|
||||||
|
Long targetTenantId = tenantUser.getTenantId();
|
||||||
UserDTO userDTO = new UserDTO();
|
UserDTO userDTO = new UserDTO();
|
||||||
userDTO.setUserId(loginUser.getId());
|
userDTO.setUserId(loginUser.getId());
|
||||||
userDTO.setTenantId(tenantUser.getTenantId());
|
userDTO.setTenantId(targetTenantId);
|
||||||
userDTO.setUsername(loginUser.getUsername());
|
userDTO.setUsername(loginUser.getUsername());
|
||||||
updateUserTenant(userDTO);
|
updateUserTenant(userDTO);
|
||||||
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(loginUser.getUsername());
|
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(loginUser.getUsername());
|
||||||
|
|
||||||
// 返回切换后的租户对象
|
log.info("用户[{}]租户切换完成:{} -> {}", loginUser.getUsername(), loginUser.getTenantId(), targetTenantId);
|
||||||
return normalTenantList.stream()
|
|
||||||
.filter(tenant -> tenant.getId().equals(tenantUser.getTenantId()))
|
|
||||||
.findFirst()
|
|
||||||
.orElseGet(() -> baseMapper.selectById(tenantUser.getTenantId()));
|
|
||||||
|
|
||||||
|
return validTenantList.stream()
|
||||||
|
.filter(tenant -> tenant.getId().equals(targetTenantId))
|
||||||
|
.findFirst()
|
||||||
|
.orElseGet(() -> baseMapper.selectById(targetTenantId));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user