mjava-pro/(非直接 cp mcli,精简依赖)pom.xml artifactId=mjava-pro,依赖仅 mjava 基座Boot.java package=com.malk.pro,@EnableScheduling + @EnableJpaAuditing + scanBasePackages=com.malkapplication.yml port=9010 / context-path=/api/pro / spel.scheduling=true / multiSource=falsepom.xml <modules> 追加 mjava-promvn -pl mjava-pro -am compile 通过(2026-04-19 验证)TenantProfile + VendorCredential 数据类TenantContext(ThreadLocal + set/current/clear/propagate + currentTenantId)TenantInterceptor(preHandle 读 X-Tenant-Id → registry.get → TenantContext.set + MDC;afterCompletion clear;401 TENANT_REQUIRED / 403 TENANT_NOT_FOUND)ProWebConfig 注册拦截器,排除 /_admin/** / /actuator/** / /static/** 等TenantRegistryService(依赖 YDClient_Form,使用新原子接口 searchForm)loadAll() 按 formUuid 分页查宜搭应用表 → mergeRow 合并同 tenantId 多 vendor → Map<String, TenantProfile>get(tenantId) / contains / size 内存 Map 直查(缓存 miss 不触发单条拉取,等下次 TTL 刷新)@PostConstruct init() + @Scheduled(fixedDelayString=ttl*1000) 定时刷新;failFast 开关控制启动失败行为AdminController @Profile("dev") @NoAuth POST /_admin/reloadTenantcom.malk.pro.service.dingtalk.DynamicDDService:从 TenantContext 取凭据 → 调基座 DDClient.getAccessToken(appKey, appSecret) → 走 {tenantId}:dingtalk:{appKey} namespace 缓存(2026-06-10)com.malk.pro.service.aliwork.DynamicYDService:构造 YDAuth(accessToken 复用 DynamicDDService,appType/systemToken/userId 取自 extra)(2026-06-10){tenantId}:{vendor}:{appKey} 已在 4.1/4.2 实现;基座不动tenantId 通过 MDC 自动进审计(TenantInterceptor 已写 MDC + logback pattern 含 [%X{tenantId:-}],不动基座 UtilHttp)./log/{日期}/pro-%X{tenantId}.log — 延后(pattern 已含 tenantId,分文件按实际部署需求评估)application-dev.yml.example(含 tenant.registry.* 占位)— 2026-04-26application-prod.yml.example(含 tenant.registry.* 占位)— 2026-04-26 复核已存在mjava-pro/README.md:调用范式 + 入驻 SOP + 隔离边界 + 配置(2026-06-10)后端/CLAUDE.md);状态更新待 add-mjava-pro 整体 archive 时再回写TenantContextTest(set/clear/异步传播)X-Tenant-Id 调同一接口 → 验证 token 隔离 + 审计日志分片/opsx:validate add-mjava-pro --strict 通过