diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java index 3b0916f46..bbff1b0d4 100644 --- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java @@ -1,7 +1,11 @@ package cn.stylefeng.roses.kernel.db.mp.tenant.defaultimpl; +import cn.stylefeng.roses.kernel.db.mp.tenant.SaasServiceApi; import cn.stylefeng.roses.kernel.db.mp.tenant.TenantSwitchApi; +import cn.stylefeng.roses.kernel.db.mp.tenant.holder.TenantIdHolder; +import cn.stylefeng.roses.kernel.db.mp.tenant.holder.TenantSwitchHolder; import cn.stylefeng.roses.kernel.db.mp.tenant.pojo.TenantSwitchInfo; +import jakarta.annotation.Resource; import java.util.function.Supplier; @@ -13,24 +17,74 @@ import java.util.function.Supplier; */ public class DefaultTenantSwitchImpl implements TenantSwitchApi { + @Resource + private SaasServiceApi saasServiceApi; + @Override public T changeTenant(String tenantCode, Supplier action) { - return action.get(); + + // 获取租户的切换信息 + TenantSwitchInfo tenantSwitchInfo = saasServiceApi.getTenantSwitchInfo(tenantCode); + if (tenantSwitchInfo == null) { + return action.get(); + } + + return this.commonChangeTenant(action, tenantSwitchInfo); } @Override public T changeTenant(Long tenantId, Supplier action) { - return action.get(); + + // 获取租户的切换信息 + TenantSwitchInfo tenantSwitchInfo = saasServiceApi.getTenantSwitchInfo(tenantId); + if (tenantSwitchInfo == null) { + return action.get(); + } + + return this.commonChangeTenant(action, tenantSwitchInfo); } @Override public T changeTenant(TenantSwitchInfo tenantSwitchInfo, Supplier action) { - return action.get(); + return this.commonChangeTenant(action, tenantSwitchInfo); } @Override public T doNoTenantChange(Supplier action) { - return action.get(); + try { + // 去掉租户切换的逻辑,这个用在按租户id切割的情况下 + TenantSwitchHolder.set(false); + + // 执行传入的逻辑 + return action.get(); + + } finally { + // 恢复租户切换逻辑 + TenantSwitchHolder.remove(); + } + } + + /** + * 通用切换租户的信息 + * + * @author fengshuonan + * @since 2025/5/5 11:45 + */ + private T commonChangeTenant(Supplier action, TenantSwitchInfo tenantSwitchInfo) { + // 保存当前租户的id + Long currentTenantId = TenantIdHolder.get(); + + try { + // 切换租户 + TenantIdHolder.set(tenantSwitchInfo.getTenantId()); + + // 执行传入的逻辑 + return action.get(); + + } finally { + // 恢复当前租户 + TenantIdHolder.set(currentTenantId); + } } }