## ADDED Requirements ### Requirement: 注册源 租户配置 SHALL 存放于宜搭"应用表"。mjava-pro MUST 通过 `tenant.registry.formUuid` 配置项加载租户列表。 #### Scenario: 访问宜搭自身凭据 - **WHEN** mjava-pro 启动加载租户表 - **THEN** 使用 `application-{profile}.yml` 配置的 `aliwork.appType` / `aliwork.systemToken`(mjava-pro 自身入口凭据,不是租户凭据) - **AND** 租户凭据从宜搭表记录动态加载 ### Requirement: 加载与缓存 租户注册表 SHALL 支持启动全量加载 + TTL 刷新 + stale-while-revalidate。 #### Scenario: 启动全量加载 - **WHEN** 应用启动 `@PostConstruct` - **THEN** 分页拉取全部 `enabled=on` 租户记录 - **AND** 写入内存 `Map` #### Scenario: TTL 过期刷新 - **WHEN** 距上次加载超过 `tenant.registry.ttlSeconds`(默认 600 秒) - **THEN** 异步重新拉取 - **AND** 旧值继续可用直到新值就绪 #### Scenario: 热刷入口 - **WHEN** 调用 `POST /api/pro/_admin/reloadTenant?tenantId=xxx` - **AND** 当前 profile 为 dev - **THEN** 立即刷新单条记录 ### Requirement: 敏感字段处理 租户凭据(appSecret / systemToken)MUST 在日志输出时脱敏。内存中允许保留明文。 #### Scenario: 日志脱敏 - **WHEN** 审计日志打印 TenantProfile - **THEN** appSecret / systemToken / accessKey 等字段输出为 `***` - **AND** tenantId / vendor / corpId 等非敏感字段正常输出 ### Requirement: 失效与禁用 宜搭表 `enabled=off` 的租户 MUST 在下次刷新后移除。停用期间请求 MUST 返回 403。 #### Scenario: 禁用生效 - **WHEN** 宜搭表单 `radioField_enabled=off` - **AND** 注册表刷新完成 - **THEN** 该 tenantId 从内存 Map 移除 - **AND** 携带此 tenantId 的请求返回 `403 { code: "TENANT_DISABLED" }`