package com.ruoyi.common.handler; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.ruoyi.common.config.IgnoreTableConfig; import com.ruoyi.common.utils.SecurityUtils; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import java.util.Set; @Component public class CustomTenantLineHandler implements TenantLineHandler { @Override public Expression getTenantId() { try { Long tenantId = SecurityUtils.getLoginUser().getTenantId(); return new LongValue(tenantId); } catch (Exception e) { return null; } } /** * 线程级临时忽略开关:某些 insert 场景下 jsqlparser 解析会抛 * ClassCastException: SetOperationList cannot be cast to PlainSelect, * 可在该线程内临时跳过租户插件(tenant_id 由 MybatisHandler 自动填充保证)。 */ public static final ThreadLocal TEMP_IGNORE = new ThreadLocal<>(); @Override public boolean ignoreTable(String tableName) { if (Boolean.TRUE.equals(TEMP_IGNORE.get())) { return true; } // 指定不需要添加过滤条件的表 Set ignoreTables = IgnoreTableConfig.IGNORE_TABLES; return ignoreTables.contains(tableName); } @Override public String getTenantIdColumn() { // 指定租户 ID 字段名称,比如 "station_id" return "tenant_id"; } }