读取数据字典缓存列表(业务租户+default 合并)

验证状态:已源码核验、未联调;适用基线:Web 7fe6dd10、services 89bd222c;核验日期:2026-09-12

用途与 App 场景

读取数据字典的"业务租户 + default 兜底"合并列表,供前端选择器整段加载。该入口按租户显式条件寻址缓存并在租户豁免作用域执行,是任意已登录用户可跨业务租户读取的既定合同,不是普通 list 的别名。

Web 使用位置

页面/功能 角色或空间分支 调用证据
登录后字典预取 任意已登录用户;tenantId 为业务字典空间选择参数 app/.client/components/data-dictionary-select-1.tsx:8
登录后字典预取(2) 任意已登录用户;tenantId 为业务字典空间选择参数 app/routes/($lng).$spaceId/route.tsx:89

协议身份

operationId http-post-main-service-system-api-configuration-data-dictionary-listcache-f90f6af2
method + path POST /main-service/system-api/configuration/data-dictionary/listCache
base URL 当前 Web 使用同源相对 URL;App 的部署 base URL 未由源码固定
headers Accept: application/json;charset=UTF-8;有登录态时 Authorization: Bearer <token>;body 操作为 Content-Type: application/json
序列化 object body 由公共 wrapper 执行 JSON.stringify;当前 Web 全局预取发送 { tenantId: <当前租户> },选择器挂载时发送 {}

前置条件与权限

需要有效登录态;该入口(Plus Controller)没有 @PreAuthorize 资源权限,任何已登录用户可读。认证失败与适用出口见错误差异页。 查询在租户豁免作用域执行并以请求 DTO 的 tenantId 显式寻址(gt-common-configuration-common/src/main/java/tech/gt/configuration/service/DataDictionaryService.java:83-85);请求中的租户字段在这里就是合同的一部分,不代替空间切换。

输入

JSON 路径/参数 JSON 类型 位置 必填 可空 默认值 枚举/范围/单位 说明 字段证据
body object body {} 查询字段 DataDictionaryListRequestDTO;通用查询控制字段见查询控制字段 gt-common-configuration-dto/src/main/java/tech/gt/configuration/dto/DataDictionaryListRequestDTO.java
tenantId string body 空 → 仅读 default 公共空间 default 或业务租户 ID 业务字典空间选择参数;非空且非 default 时服务端先读业务租户再读 default 并合并 es-center-server-main-service/src/main/java/com/es/center/server/configuration/controller/DataDictionaryPlusController.java:59-77 listCache

输出、应答或事件

JSON 路径 JSON 类型 出现条件 可空 枚举/范围/单位 说明 字段证据
timestamp number JSON 响应 epoch 毫秒 响应生成时间 gt-common-core/src/main/java/tech/gt/api/ApiResult.java
status number JSON 响应 成功为 200 不能只看 HTTP status gt-common-core/src/main/java/tech/gt/api/ApiResult.java
error/localizedError/path string | null JSON 响应 成功通常为 null;失败见差异页 gt-common-core/src/main/java/tech/gt/api/ApiResult.java
extraData object 成功 本操作无专属键,恒为 {} gt-common-core/src/main/java/tech/gt/api/ApiResult.java
data array 业务成功 业务租户在前、default 兜底在后的合并数组;合并上限 20000;字段见本资源族字段模型 DataDictionaryPlusController.java:69-75 businessList/defaultList + mergeBusinessFirst(…, 20_000)DictionaryDefaultFallbackSupport.java:22-31

完成判据

status=200data 数组可消费表示读取结束。但结果来自带 TTL 的缓存(见下),不承诺与最新写入实时一致。

示例

以下均为按已核验契约构造的示例,不是真实联调记录;ID、时间与租户为占位值。

请求:

1{
2  "tenantId": "scm"
3}

成功响应:

1{
2  "timestamp": 1789142400000,
3  "status": 200,
4  "error": null,
5  "localizedError": null,
6  "path": null,
7  "extraData": {},
8  "data": [
9    {
10      "dataDictionaryId": "dict-01",
11      "dataDictionaryTypeCode": "device-vendor",
12      "dataDictionaryCode": "hikvision",
13      "value": "海康威视",
14      "name": "海康威视",
15      "sort": 1,
16      "revision": 1,
17      "createdUsername": "administrator",
18      "createdTime": 1789142400,
19      "lastModifiedUsername": "administrator",
20      "lastModifiedTime": 1789142400,
21      "deleteTime": null,
22      "tenantId": "default"
23    }
24  ]
25}

信封字段证据:gt-common-core/src/main/java/tech/gt/api/ApiResult.java(成功/失败信封)与 es-center-server-main-service/src/main/java/com/es/center/server/config/JsonFormatConfig.java:20-113(时间序列化)。

错误与边界

认证失败/权限失败:认证与资源权限拒绝的 wire 形态见错误差异页对应锚点。 本入口没有资源权限检查;读取走缓存(10 分钟 TTL,本地+远程两级,syncLocal)。配置写入不会主动失效该缓存(configuration 模块内无 @CacheInvalidate),写后最长 10 分钟 内可能读到合并结果未刷新的数据。 公共 Web helper 默认 15 分钟超时(app/.common/lib/fetch-timeouts.ts:4-76 fetchTimeout/fetchTimeoutResponseJson)。读取无副作用,可按网络策略重试。

调用关系与资源清理

登录后根路由在 tenantId 就绪时以当前租户预取并写入全局 store(500ms 节流;重试 10 次);各选择器组件挂载时以空 body 再取(等价 default 空间读取),store 侧再按"当前租户优先、default 兜底"本地过滤。切换空间/租户会触发重新拉取。

已知缺口

缓存 TTL(10 分钟)内的写后读不一致是已核实的现行行为,不是缺陷推断;配置模块无主动缓存失效。 合并上限 20000 与单租户默认 10000 是服务端常量;超限时的截断行为以代码为准(合并结果静默截断),未联调复核。 无已知会阻止按当前源码调用的其他关键证据缺口。未执行真实 HTTP、数据库或缓存联调。

验证状态与依据

结论 状态 仓库/基线 路径、符号及定位 内容指纹(脏文件)
Web 方法、路径、序列化与消费 已源码核验 web 7fe6dd10 app/.client/api/system/configuration/dataDictionaryApi.ts:31 configurationdataDictionaryListCacheApiapp/.client/components/data-dictionary-select-1.tsx:8app/routes/($lng).$spaceId/route.tsx:89;公共 wrapper:app/.common/lib/fetch-timeouts.ts:4-76 fetchTimeout/fetchTimeoutResponseJson 证据文件与 HEAD 一致
权限、输入、输出和完成语义 已源码核验 services 89bd222c es-center-server-main-service/src/main/java/com/es/center/server/configuration/controller/DataDictionaryController.java:55 listCachegt-common-configuration-common/src/main/java/tech/gt/configuration/service/DataDictionaryService.java:80-86 listCachees-center-server-main-service/src/main/java/com/es/center/server/configuration/function/DictionaryDefaultFallbackSupport.java:22-31 mergeBusinessFirst 证据文件与 HEAD 一致
JSON 字段与时间类型 已源码核验 services 89bd222c 本资源族字段模型DataDictionaryListResponseDTO.javaDataDictionaryGetByIdResponseDTO.java(gt-common-configuration-dto/src/main/java/tech/gt/configuration/dto/) 证据文件与 HEAD 一致
清单归属 已重新比对 inventory .scratch/institutional-app-api-docs/inventory/operations.json SHA-256 b5cce137b4fc602840fdbe74c99d90667b3e581815bddc709e263ffcc64e00f9(工作树仅既有格式化漂移,本票未修改)
真实部署联调 未执行 未发送请求、未连接数据库/缓存/JMS