Skip to content

[Base] dashboard-block-update 无法更新 UI 复制且返回 type=unknown 的组件,raw PATCH 返回 code 1 #2137

Description

@gwowg

问题描述

在飞书 Base 网页端复制一个已有仪表盘后,lark-cli 可以读取其中的图表组件及完整 data_config,但这些组件的 type 被返回为 "unknown"

尝试修改组件的日期筛选条件时:

  1. base +dashboard-block-update 即使使用 --no-validate,仍会因为 type=unknown 在本地终止;
  2. 改用 lark-cli api PATCH 调用同一个 Base v3 endpoint,则服务端返回通用错误 code: 1
  3. 即使只提交保持原值的 name,不修改 data_config,也会返回相同错误。

因此,目前无法通过 CLI 更新网页端复制的仪表盘组件。

这可能是以下情况之一:

相关 Issue:

环境

  • lark-cli version 1.0.80
  • macOS / arm64
  • 品牌:Feishu
  • 用户身份和应用身份均已测试
  • 用户 token 已验证有效
  • 已开通:
    • base:dashboard:read
    • base:dashboard:update
    • base:block:read
    • base:block:update
  • 应用已添加为目标 Base 的可编辑协作者

所有 Base token、dashboard ID、block ID、账号和应用标识均已在以下示例中脱敏。

前置条件

  1. 在飞书 Base 网页端创建一个包含图表和日期筛选的仪表盘。
  2. 在网页端复制该仪表盘。
  3. 日期筛选使用 Base 返回的 ExactDate 格式,例如:
{
  "filter": {
    "conditions": [
      {
        "field_name": "Date",
        "operator": "isGreater",
        "value": ["ExactDate", 1704038400000]
      },
      {
        "field_name": "Date",
        "operator": "isLess",
        "value": ["ExactDate", 1706716800000]
      }
    ],
    "conjunction": "and"
  }
}

复现步骤

1. 读取组件

用户身份调用:

lark-cli api GET \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --as user

读取成功,返回结果类似:

{
  "ok": true,
  "identity": "user",
  "data": {
    "block_id": "<block_id>",
    "name": "本月示例数据",
    "type": "unknown",
    "data_config": {
      "table_name": "示例数据表",
      "series": [
        {
          "field_name": "Metric",
          "rollup": "SUM"
        }
      ],
      "group_by": [
        {
          "field_name": "Date",
          "mode": "integrated",
          "sort": {
            "type": "group"
          }
        }
      ],
      "filter": {
        "conditions": [
          {
            "field_name": "Date",
            "operator": "isGreater",
            "value": ["ExactDate", 1701360000000]
          },
          {
            "field_name": "Date",
            "operator": "isLess",
            "value": ["ExactDate", 1704038400000]
          }
        ],
        "conjunction": "and"
      }
    }
  }
}

2. 使用 dashboard-block-update 修改日期筛选

lark-cli base +dashboard-block-update \
  --base-token <base_token> \
  --dashboard-id <dashboard_id> \
  --block-id <block_id> \
  --data-config '{
    "filter": {
      "conditions": [
        {
          "field_name": "Date",
          "operator": "isGreater",
          "value": ["ExactDate", 1704038400000]
        },
        {
          "field_name": "Date",
          "operator": "isLess",
          "value": ["ExactDate", 1706716800000]
        }
      ],
      "conjunction": "and"
    }
  }' \
  --no-validate \
  --as user

实际结果:

unsupported block type "unknown", supported types: column, bar, line, pie, ring, scatter, funnel, wordCloud, area, combo, radar, statistics, text

--no-validate 没有绕过这个 block type 检查,请求没有发送到服务端。

3. 使用 raw API PATCH 绕过本地类型检查

lark-cli api PATCH \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --data '{
    "data_config": {
      "filter": {
        "conditions": [
          {
            "field_name": "Date",
            "operator": "isGreater",
            "value": ["ExactDate", 1704038400000]
          },
          {
            "field_name": "Date",
            "operator": "isLess",
            "value": ["ExactDate", 1706716800000]
          }
        ],
        "conjunction": "and"
      }
    }
  }' \
  --as user

实际结果:

{
  "ok": false,
  "identity": "user",
  "error": {
    "type": "api",
    "subtype": "unknown",
    "code": 1,
    "message": "API error: [1]"
  }
}

4. 排除日期 filter 格式问题

只提交保持原值的组件名称:

lark-cli api PATCH \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --data '{"name":"本月示例数据"}' \
  --as user

仍然返回:

{
  "ok": false,
  "identity": "user",
  "error": {
    "type": "api",
    "subtype": "unknown",
    "code": 1,
    "message": "API error: [1]"
  }
}

因此错误并非由 ExactDate value 或筛选 JSON 引起。

身份与权限排查

为了排除授权问题,还进行了以下验证:

身份 操作 结果
user GET block 成功,可读取完整 data_config
user PATCH block filter code: 1
user PATCH block,名称保持原值 code: 1
bot,未添加协作者前 PATCH block 91403
bot,添加为可编辑协作者并开通 read/update 后 GET/PATCH block scope 和 91403 消失,但返回 code: 1

所以当前问题不是缺少 OAuth scope 或 Base 协作者权限。

预期行为

至少满足以下一种行为:

  1. UI 创建或复制的图表组件应返回 CLI 支持的 canonical block type,而不是 unknown
  2. 即使 block type 暂时无法识别,+dashboard-block-update --no-validate 也应允许更新 name 或已有的 data_config.filter
  3. +dashboard-block-get 得到的 data_config 应能够在仅修改日期值后提交给 +dashboard-block-update,与 lark-cli base +dashboard-block-update 对具体日期筛选不可用 #757 的修复结论一致;
  4. 如果上游 API 确实不支持更新该类组件,应返回明确、可操作的错误,而不是通用 code: 1

实际影响

  • 网页端复制的仪表盘无法通过 CLI 滚动日期范围;
  • 无法将仪表盘配置纳入可重复执行的自动化流程;
  • 只能依赖网页端手动修改或 UI 自动化;
  • --no-validate 无法作为未知组件类型的 raw passthrough;
  • 通用 code: 1 无法判断是组件类型、服务端兼容性还是其他请求限制。

建议

  1. 检查 UI 创建或复制的 Dashboard block 到 CLI type 枚举的映射;
  2. --no-validate 真正跳过本地 block type 限制;
  3. code: 1 保留并显示上游返回的详细错误信息;
  4. 增加以下回归测试:
    • UI copied block;
    • type=unknown
    • ExactDate filter round-trip;
    • name-only PATCH;
  5. 如果属于 OpenAPI 能力限制,请在 Dashboard 支持矩阵和 CLI help 中明确说明。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain/authAuthentication subsystemdomain/basePR touches the base domaindomain/coreCLI framework and core libraries

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions