feat(common): 添加 MybatisPlusConfig/StateValidator,修复 jsqlparser 依赖 (T010/T011)

- MybatisPlusConfig: TenantLineInnerInterceptor + PaginationInnerInterceptor
- StateValidator: 通用状态机校验,失败抛出 INVALID_STATE_TRANSITION
- pom.xml: 新增 mybatis-plus-jsqlparser 3.5.9(3.5.7+ 必须显式引入)
This commit is contained in:
wh
2026-04-09 13:31:14 +08:00
parent 8fb730d281
commit 556f7b9672
3 changed files with 100 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
package com.label.common.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.label.common.context.CompanyContext;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.NullValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.List;
@Configuration
public class MybatisPlusConfig {
// Tables that do NOT need tenant isolation (either global or tenant root tables)
private static final List<String> IGNORED_TABLES = Arrays.asList(
"sys_company", // the tenant root table itself
"sys_config" // has company_id=NULL for global defaults; service handles this manually
);
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 1. Tenant isolation - auto-injects WHERE company_id = ?
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
Long companyId = CompanyContext.get();
if (companyId == null) {
return new NullValue();
}
return new LongValue(companyId);
}
@Override
public String getTenantIdColumn() {
return "company_id";
}
@Override
public boolean ignoreTable(String tableName) {
return IGNORED_TABLES.contains(tableName);
}
}));
// 2. Pagination interceptor (required for MyBatis Plus Page queries)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}