diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java index d3bc9199b..9ffc6626c 100755 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java @@ -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 * 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.Data; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; @@ -63,6 +64,7 @@ import java.util.*; * @author lengleng * @date 2025/06/30 */ +@Slf4j @Service @AllArgsConstructor public class SysTenantServiceImpl extends ServiceImpl implements SysTenantService { @@ -554,47 +556,60 @@ public class SysTenantServiceImpl extends ServiceImpl normalTenantList = SpringContextHolder.getBean(SysTenantService.class) + LocalDateTime now = LocalDateTime.now(); + + // 通过代理对象调用以确保 @Cacheable 生效 + List validTenantList = SpringContextHolder.getBean(SysTenantService.class) .getNormalTenant() .stream() - .filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now())) - .filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now())) + .filter(tenant -> tenant.getStartTime().isBefore(now)) + .filter(tenant -> tenant.getEndTime().isAfter(now)) .toList(); - boolean match = normalTenantList.stream() - .anyMatch(tenant -> tenant.getId().equals(loginUser.getTenantId())); + // 当前租户有效则直接返回 + Optional currentTenant = validTenantList.stream() + .filter(tenant -> tenant.getId().equals(loginUser.getTenantId())) + .findFirst(); - if (match) { - // 当前租户有效,返回当前租户对象 - return normalTenantList.stream() - .filter(tenant -> tenant.getId().equals(loginUser.getTenantId())) - .findFirst() - .orElse(null); + if (currentTenant.isPresent()) { + return currentTenant.get(); } - SysTenantUser tenantUser = sysTenantUserMapper.selectOne(Wrappers.lambdaQuery() - .eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId()) - .ne(SysTenantUser::getTenantId, loginUser.getTenantId()), false); - // 如果当前用户没有租户信息,则不进行任何操作 + // 当前租户无效,输出有效租户列表便于排查 + log.warn("用户[{}]当前租户[{}]无效或已过期,有效租户列表: {}", + loginUser.getUsername(), + loginUser.getTenantId(), + validTenantList.stream() + .map(t -> String.format("ID:%d,名称:%s", t.getId(), t.getName())) + .toList()); + + // 查找用户的其他租户关联 + SysTenantUser tenantUser = sysTenantUserMapper.selectOne( + Wrappers.lambdaQuery() + .eq(SysTenantUser::getUserId, loginUser.getId()) + .ne(SysTenantUser::getTenantId, loginUser.getTenantId()), + false); + if (Objects.isNull(tenantUser)) { + log.warn("用户[{}]没有其他可用的租户关联,无法自动切换", loginUser.getUsername()); return null; } - // 切换至状态正常的租户 + // 执行租户切换 + Long targetTenantId = tenantUser.getTenantId(); UserDTO userDTO = new UserDTO(); userDTO.setUserId(loginUser.getId()); - userDTO.setTenantId(tenantUser.getTenantId()); + userDTO.setTenantId(targetTenantId); userDTO.setUsername(loginUser.getUsername()); updateUserTenant(userDTO); cacheManager.getCache(CacheConstants.USER_DETAILS).evict(loginUser.getUsername()); - // 返回切换后的租户对象 - return normalTenantList.stream() - .filter(tenant -> tenant.getId().equals(tenantUser.getTenantId())) - .findFirst() - .orElseGet(() -> baseMapper.selectById(tenantUser.getTenantId())); + log.info("用户[{}]租户切换完成:{} -> {}", loginUser.getUsername(), loginUser.getTenantId(), targetTenantId); + return validTenantList.stream() + .filter(tenant -> tenant.getId().equals(targetTenantId)) + .findFirst() + .orElseGet(() -> baseMapper.selectById(targetTenantId)); } }