讲师中心 微信公众号
AI工具推荐 视频效率加速

观远 BI · 马甲实战版

Polar Sponsor
爱发电 赞助
.NET 9.0

观远BI(Guandata)实战增强层Agent Skill——在官方全家桶(guancli查数 / guanvis建卡发布截图 / guanetl ETL / guanwf数据流 / guands数据源)之上,专注于官方DSL/命令覆盖不到的难题:Part B ETL 整库治理判断 + 10...

观远 BI · 马甲实战版(V3.1.3)

功能概述

观远 BI · 马甲实战版(V3.1.3)是一项面向实际任务的技能,主要用于结构说明(V1.5.0 引入 progressive disclosure) :本文档是 路由层 + 关键规则 ,详细操作手册下沉到 references/;每个 Part 的入口章节会指出"何时回到 references/ 查全表";

核心要点

  • 完整章节索引见末尾的 📚 References 目录;
  • 🧭 Part 选择;
  • 查数据、建卡、出报表、。

使用与执行

它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。

结果检查与注意事项

执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

观远 BI · 马甲实战版(V3.1.3)

结构说明(V1.5.0 引入 progressive disclosure):本文档是路由层 + 关键规则,详细操作手册下沉到 references/。每个 Part 的入口章节会指出"何时回到 references/ 查全表"。完整章节索引见末尾的 📚 References 目录。

🧭 Part 选择

你想做 走
查数据、建卡、出报表、标准 ETL / 数据集 CRUD 🧭 路由层 → 交给官方全家桶(guancli / guanvis / guanetl / guands),见路由总表
扫整库 ETL 治理 / 新建/修改/删除 ETL / 字段使用度审计 / 修复 ETL 报错 Part B:ETL 治理与写入
把整条 SmartETL 链改写成 SQL 版 + 页面副本验收 + 差异定位 + 空快照阻塞 Part B-17:全链路重写方法论(拆到 references/part-b17-fullchain-rewrite.md)
30+ 张表批量迁移 / 跨多日工程 / 复杂重构需要项目化追踪 B-17.11 ExecPlan 工作法(同上文件 §11)
自定义图表 HTML/CSS/JS 注入、固定卡片/overlay、payload_json 取数、路由清理 Part C:自定义图表开发与排障
从零生成 HTML 化经营分析应用(用户说"更高级 / 应用化 / 自定义模块 / 最完美 / 不限标准看板") Part C-12:HTML 应用化看板生成(拆到 references/part-c-html-dashboard.md)
v7 BI 实例上端到端搭多个 HTML 应用看板 / 手撸 POST /api/page+/api/card 被 60004 此操作只能在草稿页面执行 卡住 / CSV 散客 会员ID IS NOT NULL 算出 100% 假指标 / Spark WITH 中文别名 报 PARSE_SYNTAX_ERROR / ETL update 报 1012 输出数据集目录中存在同名文件 Part D:V7 Page/Card 发布流水线 + 三态硬规则(V2.1.6 新增,拆到 references/v7-page-card-publish-pipeline.md)
SuperApp / 超级应用 / 开放应用开发流水线 / guancli app create/publish / --app-id 不传变成每次新建 / 数据集异步预览 3 步 / form_xxx 建表反向工程(脚手架没暴露建表 API,实测 POST /survey-engine/api/form/add)/ BI 中转 LLM 报 NOT_JSON_RES / ILLEGAL_JSON_RES(响应被塞在 error_message)/ /api/llm-config/list 返回裸数组被脚手架 unwrap 吞 / 同源 fetch credentials 不带 cookie / 客户端模拟流式打字效果 / 任务池工作台「看 + 想 + 选 + 做 + 留痕」闭环 Part E:SuperApp 开放应用开发流水线(V2.1.12 新增,拆到 references/part-e-superapp-pipeline.md)
客户说"想给现有 BI 接 AI / 上 LLM" / "我们 ETL 治理做了一年还没出活" / 判断 是该治理还是该重搭 / 客户预算分配讨论 / 评估底表 schema 是否 AI-friendly / 提案"AI-native 数据底座" AI-native ADS 设计方法论(V2.1.13 新增,majia-guanyuan 的哲学层文档——不是操作手册而是范式判断,拆到 references/ai-native-ads-design.md)
写餐饮业务公式(AC / ADS / 复购率 / 新老客 / 用餐时段 / 留存流失 / RFM / Comp 老店)/ 查字段口径 / 排数据质量坑 / ETL 工程范式(DWD 宽表 / 双源对账 / 评价 pipeline) 餐饮 BI 公式实战库(references/restaurant-bi-formulas/README.md,V2.1.5 蒸馏自两段餐饮连锁 BI 履职 + 39 个生产 ETL,全脱敏)
不知道用哪个 看 Part B "推荐工作流" 章节,或直接读各 Part 章节末尾的"实战 ID 速查"

作者:马甲(Part B/C/D/E 实证)+ 观远 CTO 张进(B-17 SmartETL 改写方法论 + Part C 自定义图表经验)+ OpenAI Codex(ExecPlan 规范) 版本:V3.1.3(2026-06-22)· 环境:Node ≥20 · 前置:官方全家桶 npm i -g @guandata/guanskill && guanskill install-skill(装齐 guancli / guanvis / guanetl / guanwf / guands + 各自 AI skill)· 认证:guancli auth login(全家桶共用一套 profile,本 skill 不再单独要 config.json)· 作用域:本地私有 BI 实例 安装:git clone https://github.com/maojiebc/majia-guanyuan.git,或 npx github:maojiebc/majia-guanyuan install 兼容工具:Claude Code · OpenClaw · Codex · Hermes (gbrain) · 任何支持 SKILL.md frontmatter 的 agent。详见 README · 兼容性 与 AGENTS.md。

🆕 V3.1.3 更新(2026-06-22):官方全家桶 06-17 版本对齐——guanskill 0.1.6→0.1.7,子包对齐最新:guancli 1.0.34→1.0.35(login status 服务端 profile 校验登录态 + 数据集字段输出加 raw name/alias 误用提示,ETL/指标配置前排查字段引用)、guanvis 0.1.26→0.1.27(publish/upload 发布前不再对 Card 做额外导入探测,减少无权限/跨环境误拦截)、guanetl 0.1.15→0.1.16(save --dry-run 保存影响预览 + run 执行前提示上游数据集失败态 + preview 提示 LEFT JOIN 桥接列全空样本)、guands 0.1.15→0.1.16(dataset list 统一目录搜索接口);guanwf 0.1.5 无变化。路由总表版本号 + 能力描述刷新;Part B 实测边界补 0.1.16 note;manifest/README/package 基线 pin 同步。同时滚入 rank9 保守去冗余(B-0.5/B-11 同行压指针,护城河零删减)。

🆕 V3.1.2 更新(2026-06-17):专业 skill 评审团驱动的质量迭代(8 视角审 + 对抗校验 + 红队)——① 删除顺序矛盾实测定案:workshop513 真实独立 ETL 净零回归确认 ds-first 正确(先删输出数据集再删 ETL,两步皆成功不报 6001)、etl-first 撞 2002 输出数据集已存在;据此修正 B-0.5 line 219 + Part D 删除段两处把方向写反/错记 6001 的旧文,统一到 B-7.1。② page?force=true 级联删页纳入 B-7.0 安全闸(条件句:本地有 guanvis 源可重建才免对账)+ 红线括号补全。③ 事实性卫生:README 双语移除已下架 guanetl delete、AGENTS.md/marketplace.json 元数据 drift 修正、References 行数回填、description 瘦身、餐饮锚点死链修、config 死字段注释。纯 correctness+safety+hygiene,护城河零删减。

🆕 V3.1.1 更新(2026-06-17):官方全家桶 06-15 版本对齐——guanskill 0.1.5→0.1.6,子包全部对齐最新:guancli 1.0.33→1.0.34(metric by-dataset 按数据集 ID 反查原子指标 + 沿血缘展开下游复合/衍生)、guanvis 0.1.24→0.1.26(资源包打包一致性校验 + 自定义排序 payload 修复)、guanetl 0.1.14→0.1.15(save 输出数据集保护增强 + 追加写入行结构校验)、guanwf 0.1.4→0.1.5(workflow.go DSL 统一 + 新增 Python 节点 DSL/本地校验 + 保存三方合并)、guands 0.1.14→0.1.15(新增 dataset update-fields 批量改字段展示名/注释 + import 增编码/分隔符参数 + refresh --overwrite)。路由总表版本号 + 能力描述刷新(guanwf 升级为「数据流 + Python 节点多节点 DAG」、guands 补 dataset update-fields);Part B 实测边界补 0.1.15 note;manifest/README/package 基线 pin 同步。

🧭 路由层:标准活交给官方全家桶

V3.0.0 心法:观远官方已把"查数 / 建卡 / ETL / 数据流 / 数据源 / 截图 / 管理"做成公网全家桶(npm i -g @guandata/guanskill)。本 skill 不再自造这些轮子——标准活一律路由给官方,本 skill 专攻官方 DSL/命令覆盖不到的"业务实战 + 引擎级踩坑"(Part B–E + 方法论 + 公式库)。

⚠️ 跨 Part 通用工作原则

  1. 所有数值计算必须跑代码 —— 禁止在思考里口算百分比、环比、除法、占比。
  2. 必须确认数据范围 —— 用户没明确日期范围时必须追问("看哪段时间?今天 / 本周 / 上月?"),不要自己假设。
  3. 遇到意外错误立即落档 —— 把新坑写进对应章节(Part B 报错 → references/part-b-errors.md,Part C → references/part-c-payload-json.md)或 ExecPlan 的 Surprises & Discoveries(B-17.11)。格式:### [YYYY-MM-DD] 标题 + 场景 / 问题(含 task error 原文、payload 片段)/ 判断。
  4. 写操作前先治理、删除前先对账 —— 见 Part B-〇 工作流 + B-7.0 删除安全闸。

官方全家桶 ↔ 本 skill 分工总表

前置:npm i -g @guandata/guanskill && guanskill install-skill(装齐 7 个命令 + AI skill);认证 guancli auth login,全家桶共用一套 profile。

skill 版本 角色 什么需求路由给它
guancli 1.0.35 只读分析中枢 + 表单 CRUD + 指标 CRUD 查 ETL / dsId / page / card / 血缘 / 节点 SQL、ds execute-sql 跨集 SQL、ds search --id 精确解析、metric query 同比/累计/Top N、metric_attribution 归因、task 排查、ChatBI 问数、card preview 取数导出、form 数据 CRUD、指标建/改/删(metric create/edit/delete,1.0.32 起从只读转可写) + metric by-dataset 按数据集 ID 反查原子指标并沿血缘展开下游复合/衍生(1.0.34 新);login status 服务端 profile 校验登录态 + 数据集字段输出加 raw name/alias 误用提示(1.0.35 新,ETL/指标配置前排查字段引用)
guanvis 0.1.27 标准建卡 + Page 装配 + 服务端截图 74 种图表 JS DSL、双 Y 轴、同环比/累计/排名/占比、selector 联动、tab/栅格、AreaTitle 分区标题 + CardGroup 卡片组(0.1.24 新)、custom chart(ECHARTS_LITE/SDK)、guanvis pack/publish/upload、guanvis screenshot 出 PNG、指标卡片构建(metric init)、publish --allow-overwrite 覆盖前自动建迁移备份、资源包打包一致性校验提前发现重复/冲突资源(0.1.26)、publish/upload 发布前不再对 Card 做额外导入探测、减少无权限/跨环境误拦截(0.1.27)
guanetl 0.1.16 ETL 写操作闭环 单个 ETL 新建/改/lint/preview/save/run/schedule/mkdir-pair(源文件 etl/etl.go+SQL 驱动,黑盒 direct-save);0.1.14 移除 delete 命令(高风险操作不再暴露,删 ETL 走 BI UI 或 API);修复 save 导出空 dataSource 覆盖服务端绑定的 bug;0.1.15 save 输出数据集保护增强(保留级联配置)+ 追加写入场景行结构提前校验;0.1.16 save --dry-run 保存影响预览 + run 执行前提示上游数据集失败态 + preview LEFT JOIN 桥接列全空告警
guanwf 🆕 0.1.5 工作流(数据流 + Python 节点多节点 DAG) 工作流引擎里建/编/存/跑工作流,workflow.go DSL 统一数据流创建/编辑/导出/预览/保存/运行;0.1.5 新增 Python 节点 DSL + 本地校验 + 保存采用三方合并降低覆盖线上数据流配置风险;guanwf edit <父工作流ID> → 改 etl/ → export → save;只读查 guancli workflow(隐藏命令)
guands 0.1.16 数据源 + 数据集 CRUD 建数据连接(MySQL/PG/Oracle)、dataset create-db/create-query/import/replace-data、批量移删、增量更新、定时调度、计算字段、dataset alias 改字段展示名、dataset update-fields 批量改字段展示名/注释(0.1.15 新,命令行或 JSON + --dry-run)+ import 增 --header-row/--encoding/--delimiter + refresh --overwrite 全量覆盖;dataset list 统一目录搜索接口(0.1.16)
guanvis screenshot — 导出 页面 PNG/PDF 服务端截图(彻底取代 legacy guanexport)
guanexport / guanadmin 已退出 — 2026-06-04 起从 guanskill 聚合包移除、npm 也下架:导出全归 guanvis screenshot;管理员级操作(dynamicCode / adminToken / svc SQL)已不在公开全家桶,需另装 standalone 或走 BI UI
majia-guanyuan(本 skill) 3.1.3 业务实战 + 引擎级踩坑 + 方法论 Part B ETL 整库治理判断 + 10 类引擎报错 + 双源字段审计 + B-17 全链路重写/ExecPlan · Part C 既有页自定义图表 HTML/JS 注入排障 + 固定卡/overlay · Part C-12 HTML 应用化看板 + descriptor patch 联 dataView + 视觉设计底线(反 AI 味红线 + 五层验收) · Part D v7 草稿-发布状态机绕过 + 节点化静默坑 + phoneLayout · Part E SuperApp 反向工程 · AI-native ADS 方法论 · 餐饮 BI 公式库

一句话路由:标准查数 → guancli;标准建卡/发布/截图 → guanvis;标准 ETL → guanetl;数据流 → guanwf;数据源/数据集 → guands。任何一个遇到官方 DSL/命令够不着的字段、报错、状态机、反向工程、业务口径——回到本 skill 对应 Part。

为什么还要本 skill:官方命令封装在"高层 DSL + 黑盒"那层,遇到 ① 整库治理的判断逻辑(砍哪张表/哪个字段)② BI 引擎运行期/语义报错(<> NULL 吞行、CTE 中文别名、UNION 列数)③ v7 草稿-发布状态机绕过 ④ custom chart 内部 dataView 联 selector ⑤ SuperApp 脚手架没暴露的 form 建表 / LLM 中转 bug ⑥ AI-native 的 schema 重搭判断 ⑦ 餐饮业务口径——官方都够不着,这就是本 skill 的地盘。

降歧义:5 个官方 skill + 本 skill 同时启用时,只读场景(查 dsId/ETL)可能在 guancli 与本 skill 间双触发。本 skill 不与官方抢只读——遇到纯查询/取数,直接路由 guancli,别自己拼 API。

🔄 官方全家桶更新 SOP(高频操作)

观远官方迭代节奏快(平均每周 1–2 次),本 skill 需要跟着对齐。以下是完整更新链路——从检查到落地,一条龙。

Step 0. 检查是否有新版本

# 看本机当前全家桶版本
guanskill version

# 看 npm 上最新聚合包版本
npm view @guandata/guanskill version

# 逐个看子包最新版本(聚合包可能滞后)
npm view @guandata/guancli version
npm view @guandata/guanvis version
npm view @guandata/guanetl version
npm view @guandata/guands version
npm view @guandata/guanwf version

如果 npm 版本 > 本机版本 → 继续 Step 1。否则无需更新。

Step 1. 升级 CLI(npm 聚合包)

# 升级到最新聚合包(装到你的 npm 全局 prefix —— 先 `npm prefix -g` 确认当前目标)
npm i -g @guandata/guanskill@latest

# 验证新版本
guanskill version

安装路径坑(双装滞后):guanskill 的 forwarder 跟着 which guancli 解析到的 prefix 走。若曾用不同 node(如 Homebrew node 的 /opt/homebrew vs nvm/asdf/独立 ~/.local)装过两份,PATH 靠前那份会"赢",而 npm i -g 只更新当前 prefix 的那份、另一份滞后 →「升了却没生效 / 本地副本常滞后」。排查:which -a guancli 看是否多份;统一到单一 prefix(多余的用 npm uninstall -g @guandata/guanskill --prefix <多余prefix> 删掉)。

Step 2. 升级 AI Skill(SKILL.md + references)

# install-skill 把每个子包的 SKILL.md + references/ 装到 ~/.agents/skills//
guanskill install-skill

落点:~/.agents/skills/{guancli,guanvis,guanetl,guands,guanwf}/。这些是 agent 路由用的 skill 定义,和 CLI 二进制分开更新。

Step 3. 读 Changelog,摘要变更

# 各子包 CHANGELOG.md 在 npm 包目录下
GUANSKILL_DIR=$(npm root -g)/@guandata/guanskill/node_modules/@guandata
for pkg in guancli guanvis guanetl guands guanwf; do
  echo "=== $pkg ===" && head -30 "$GUANSKILL_DIR/$pkg/CHANGELOG.md" 2>/dev/null && echo
done

重点关注:新增/移除命令、DSL 新组件、bug 修复(尤其影响 B-0.5 / Part C / Part D 的)、breaking change。

Step 4. 迭代 majia-guanyuan

按 changelog 摘要,更新以下位置(有改动的才改):

位置 改什么
路由总表(本文件 官方全家桶 ↔ 本 skill 分工总表) 版本号 + 能力描述
V3.x.x 更新 callout(本文件顶部 > 🆕) 新版本摘要
Part B 实测边界 callout 如果 guanetl 有 bug 修复
Part D guanvis 版本引用 如果 guanvis 版本变了
manifest.json / package.json version + description 里的版本号
README.md / README.en.md 版本徽章 + 版本记录段(≤3 条)
CHANGELOG.md 新增 [x.y.z] — YYYY-MM-DD 条目

版本号规则:官方对齐 = patch;影响 skill 自身逻辑(如 B-0.5 降级)= minor。

Step 5. 同步 + 发布

# 同步到已安装 skill 目录
cp SKILL.md CHANGELOG.md ~/.agents/skills/majia-guanyuan/

# commit + push(或走 /majia-ota-skill 完整发布链)

快速一键检查(日常用)

# 一行看完「本机 vs npm 最新」差异
echo "LOCAL:" && guanskill version && echo "---" && echo "NPM latest:" && npm view @guandata/guanskill version

通用错误码处理

状态码 处理
500 终止,服务器问题
401 终止,登录失效(guancli auth login 重登)
403 终止,无权限
404 终止,资源不存在

🅱️ Part B:ETL 治理与写入(V1.0)

基于 @guandata/guancli@1.0.35 的实证记录。所有 API 路径、payload 字段、报错信息、治理判断维度均来自真实跑通的请求。覆盖整库治理扫描 + 60+ 张 ETL 创建/重构/修复/删除的实战。

⚠️ 官方全家桶已把 BI 写操作拆成兄弟 skill 并全部公网化(2026-06-03,npm i -g @guandata/guanskill):标准 ETL 写入有 guanetl、工作流数据流有 guanwf、数据源/数据集有 guands。但 Part B 这套基于 guancli fetch + payload 的实战手册仍是底层事实源——直接命中 API 路径 / payload 字段 / 报错码 / 治理判断的部分官方命令封装不到。遇到标准化 ETL 写入可路由到 guanetl,但整库治理扫描、direct-save、payload_json、SmartETL 全链路重写、10 类报错速查继续走本 skill。

🧪 实测边界(2026-06-04 · workshop513 · BI 8.2.1-hf6):guanetl edit 的 base→etl.go 逆向在 0.1.12 / 0.1.13 完全失效(空 return []Node{},5/5 ETL 全复现、-v 无报错);save 的输出绑定 guard 也误触发。0.1.14 两个 bug 均已修复(2026-06-09 workshop513 实测:ads_会员经营任务池 6 节点 edit→export→lint→save 全链路通过)。改现有 ETL 现在可以走 guanetl edit 正常路径了。B-0.5 绕过方案仍保留作 fallback 参考(万一其他 BI 版本 / 节点类型仍触发)。

⚡ 0.1.14 修复确认(2026-06-09 复测):① edit 空 etl.go(Wall 1)→ ✅ 已修,6 节点完整逆向为 BasicInputDataset×4 + BasicSqlScript + BasicOutputDatasetInDir;② save 输出绑定 guard 误触发(Wall 2)→ ✅ 已修,save 直接成功不再拦截。另:0.1.14 移除了 delete 命令,删 ETL 改走 BI UI 或直接 DELETE /api/etl/ API。0.1.15(2026-06-15)进一步增强 save 输出数据集保护(保留级联相关配置)+ 对追加写入场景的行数据结构提前校验——改 ETL 走 guanetl edit 正常路径更稳。0.1.16(2026-06-17)再加 save --dry-run 保存影响预览 + run 执行前提示上游数据集失败态 + preview 提示 LEFT JOIN 桥接列全空样本,改 ETL 前可先 --dry-run 看影响面。

B-0.5 guanetl edit 失效时的绕过方案(0.1.12–0.1.13 历史;0.1.14 已修复,保留作 fallback)

0.1.14 已修复 edit 空 etl.go + save 输出绑定 guard 两 bug(确认详见上方 Part B 实测边界段),正常直接用 guanetl edit;以下绕过方案保留为 fallback——特定 BI 版本 / 节点类型仍触发时用。

原三道墙(guanetl 0.1.12–0.1.13,0.1.14 已全部修复):

  1. edit 的 base→etl.go 逆向出空 → 0.1.14 已修
  2. save 撞输出绑定 guard 误触发 → 0.1.14 已修
  3. save 的合并对「身份字段」base 优先(改 ETL 名 / 节点名被覆盖)+ 输出 dsId churn → 未验证是否修复,改名仍建议走 guands dataset rename / alias

→ Fallback 路径(仅在 guanetl edit 仍有问题时使用):

  • 纯改名 / 字段展示名 → 别碰 ETL 图,直接 guands dataset rename / guands dataset alias。
  • 改逻辑 / 改结构(加节点、改 SQL) → 不可变重建(最稳):读 _base_etl.json 拿旧定义 → guanetl create 写一份新 outputDsName 的新 ETL → export/lint/save/verify → 旧 ETL 退役。
  • 高级逃生(仅在没法重建时):手工构造 _exported.json = fresh _base 的 actions + 保留 output dataSource.dsId + 你的逻辑改动,再 guanetl save。
  • 认证别绕:BI API 是 cookie/session 认证——写操作一律走 guanetl save / guands(它们持有正确会话)。

清理坑:guanetl delete --cascade(0.1.14 起无 delete 命令)。删 ETL + 孤儿输出集走 DELETE API,顺序必须先删输出数据集、再删 ETL(与 B-7.1 一致);反过来先删 ETL → 2002 输出数据集已存在 失败。2026-06-17 · workshop513 实测定案(独立 DATAFLOW ETL,净零回归):DELETE /api/data-source/<输出dsId>(ETL 还在)→ DataSource deleted 成功、不报 6001;再 DELETE /api/etl/ → 成功。churn 出的中间绑定是另一回事——删 ETL 后多为 NOT_FOUND 幽灵(ds get=1002 但 ds delete=6001,不可见、无害)。

B-〇. 推荐工作流(先治理再重建)

1. 治理扫描     ← 批量抓全部 ETL 原始 JSON,分析依赖、循环、复杂度
2. 决策保留     ← 用 8 维 ETL + 4 维字段判断:保留 / 合并 / 降级 / 删除
3. 设计分层     ← 按 ODS/DIM/DWD/DWS/APP 重新分配
4. 字段审计     ← 双源(page + etl)扫字段使用度,确定砍字段范围
5. 新建目录     ← v2 目录与旧目录并行,不动旧链路
6. 写入 ETL     ← 三节点骨架 INPUT→SQL→OUTPUT,本地编译 payload
7. 预览节点     ← etl preview 先看 OUTPUT 节点能不能出数据
8. 执行落表     ← execute + task get 轮询 + 拿 result.error
9. 对账切流     ← 新旧并行验证,下游看板/ETL 逐张迁移
10. 清理旧链路  ← 先 DELETE data-source,再 DELETE etl(顺序不能反)

跳过治理直接动手 = 把同样混乱重做一遍。第 1–4 步是写 ETL 之前最值钱的活。

B-1. API 全图(11 个已实测 endpoint)

🔧 写入类(POST)
POST /api/directory                  ← 建目录(dirType=ETL 或 DATA_SET)
POST /api/etl/direct-save --stdin    ← 创建/更新 ETL(payload 有 dataFlowId 即更新)
POST /api/etl/execute                ← 触发执行 {"dataFlowId":"..."} → taskId

📖 读取类(GET)
GET  /api/etl/                   ← ETL 完整定义(含 actions/sql/relativeFieldAlias)
GET  /api/directory/ETL/authorized-tree       ← ETL 目录树
GET  /api/directory/DATA_SET/authorized-tree  ← 数据集目录树
GET  /api/task/              ← 任务状态 + 错误详情(关键修 bug 入口)

🗑️ 删除类(DELETE)
DELETE /api/data-source/       ← 删数据集(必须先于 etl 删)
DELETE /api/etl/                 ← 删 ETL(输出数据集还在 → 失败)

🔍 探测类(OPTIONS)
OPTIONS /api/              ← 返回 Allow 头,反推支持的 method

B-1.1 反推未知 endpoint 的方法

# 步骤 1:探 method 集合(最高效)
guancli fetch OPTIONS /api/
# Allow: POST,GET,HEAD,DELETE,OPTIONS

# 步骤 2:盲发 POST,根据错误类型判断
# - "No static resource X"               → endpoint 不存在
# - "Request method 'X' is not supported" → endpoint 存在但方法不对
# - "InvalidJSON" / "missing field"       → endpoint 对,body 不对(开始迭代)
# - "ResourceId(...) ResourceNotExist"    → endpoint 模式错误

# 步骤 3:根据错误反推 schema

血泪经验:BI 内部 endpoint 命名不一致——data-source(带连字符)、dataflow(无连字符)、etl(无连字符)、directory/ETL(驼峰大写)混用。靠 OPTIONS 探测比盲发 POST 高效 10 倍。

B-2. 治理扫描:判断 ETL/字段去留

B-2.1 为什么扫描

观远 BI 用久了的常见症状:核心表互相循环引用、同份业务规则散落多张计算列、维表混入下游经营字段、大量已创建未运行的废弃 ETL、名实不符。不扫一遍直接动手,重建出来还是一团乱麻。

B-2.2 扫描 3 步走

# Step 1:列出范围
guancli etl tree                                       # 全库
guancli etl search '' -d  --raw     # 按目录缩范围

# Step 2:批量抓原始定义(--raw 关键,不带就只输出阉割版)
mkdir -p raw
jq -r '.response.contents[].dataFlowId' etl-list.json | while read id; do
  guancli --raw etl get $id > raw/$id.json
done

# Step 3:本地脚本聚合分析
node analyze.mjs raw/ > analysis.json

B-2.3 分析脚本要算的 10 个指标

指标 怎么算
输出数据集 actions[].type=="OUTPUT_DATASET" 的 outputDsName
上游 ETL 依赖 inputs[] 里 displayType=="DATAFLOW" 的,反查归属哪个 ETL
节点数 actions.length
Join 数 actions[].type=="JOIN_DATA" 的个数
计算列数 actions[].type=="CALCULATOR" 的个数
透传聚合数 actions[].type=="GROUP_BY" 的个数
长公式数 CALCULATOR 里 formulas[].expr.length > N 的个数
输出行数/大小 输出 ds 的 rowCount / storageSize
调度方式 cron(AFTER_REFRESH / 具体 cron / 无)
状态 status(FINISHED / CREATED / FAILED)

构建依赖图(节点 = ETL,边 = "本 ETL 输入了另一个 ETL 的输出表"),DFS 三色标记找循环组,计算 fanIn/fanOut。

B-2.4 ETL 去留判断(8 维)

维度 信号 处置
循环依赖 出现在循环组里 必拆:找共同字段抽到 DIM/DWD,让两下游都读它
状态异常 status=CREATED 且无输出 / 0 次执行 删或重建为明确用途
本地无下游 没有任何其他本地 ETL 引用其输出 区分两类:① 给看板用 → 标 APP 层;② 没人用 → 删或归档
节点复杂度 节点 > 25、Join > 5、CALCULATOR > 3、长公式 > 0 拆成多段:基础明细 / 规则映射 / 业务汇总
输出大小 单表 > 1GB 或 > 1000 万行 检查是否不必要物化;规则计算应集中
名实不符 ETL 名跟输出表名差距大 改名或废弃
历史补数 名字含"补齐 / 历史 / 月末"等,调度异常 移到补数/归档目录,不挂主链
未调度 cron 为空且不是被其他 ETL 触发 确认是否临时/手工 → 标记或删除

B-2.5 字段去留判断(4 维)

维度 怎么判断 处置
下游 ETL 引用 在所有下游 ETL 的 SQL/CALCULATOR/SELECT_COLUMNS 里 grep 字段名 0 引用 → 候选删
看板(page)引用 看板/卡片是否用了这个字段 有 → 不能删
业务口径 字段名是否含业务规则("是否会员"、"是否新客") 这类是规则字段,集中维护到专门的规则映射 ETL
冗余/派生 能否从其他字段推导(开业天数 vs 开业日期) 派生字段尽量在下游算,不在维表物化

详细双源审计方法见 B-10。

B-2.6 ODS/DIM/DWD/DWS/APP 分层

层 放什么 关键约束
ODS 原始外部表、DB_EXTRACT、手工源表 只做轻清洗,不承载业务口径
DIM 门店、会员、日期、支付通道、顾客标识映射 稳定、少依赖、可复用,禁止依赖 DWS/APP
DWD 订单明细、券明细、好友明细、评价明细 固定主键和时间粒度
DWS 复购、RFM、拉新、蓄水、门店日报 从 DWD/DIM 读,禁止反向被 DIM 引用
APP 看板专用宽表 只服务页面,不再作为基础上游

调度按层推进 ODS → DIM → DWD → DWS → APP。

核心反模式:维表(DIM)混入了下游经营结果字段——比如门店维表里塞了"近 90 天订单数"。这是循环依赖最常见的根源。

B-2.7 输出物建议

  • analysis.json:机器可读分析结果(summaries / cycleGroups / highComplexity / nodeTypes)
  • governance-report.md:人类可读治理报告(核心结论 + 循环组 + 合并主题域 + 清理对象 + 目标架构 + 实施路线)
  • migration-plan.json:每个旧 ETL → v2 的对应表(score / targetName / status)

B-3. 第一步:新建目录

B-3.1 不要试这些路径(全部 5001 失败)

POST /api/directory/create
POST /api/directory/ETL/create
POST /api/directory/ETL/add
POST /api/directory/add
GET  /api/directory                  ← Method 'GET' is not supported
GET  /api/etl/tree                   ← ResourceId(tree)/ResourceKind(DataFlow) ResourceNotExist
POST /api/etl/dir                    ← Method 'POST' is not supported
POST /api/resource-atlas/dir         ← 'resourceTypeName missing'

合法 dirType 只有 ETL 和 DATA_SET(不要写 DATA_PROCESS_ETL SMART_ETL DATAFLOW DATA_FLOW)。

B-3.2 正确做法

ETL 树和数据集树是两棵独立的树:

guancli fetch GET /api/directory/ETL/authorized-tree
guancli fetch GET /api/directory/DATA_SET/authorized-tree

分别建(同名也得建两次):

# ETL 目录
guancli fetch POST /api/directory 
  '{"name":"warehouse_v2","parentDirId":"","dirType":"ETL"}'

# 数据集目录
guancli fetch POST /api/directory 
  '{"name":"warehouse_v2","parentDirId":"","dirType":"DATA_SET"}'

记住返回的两个 dirId,写 ETL payload 时两个都要用:

  • ETL 目录 id → ETL 自身的顶层 parentDirId
  • 数据集目录 id → OUTPUT_DATASET 节点的 parentDirId + dataSource.parentDirId

B-4. 第二步:构造 ETL payload(速查)

最小骨架 = 3 节点:

INPUT_DATASET → SQL_SCRIPT → OUTPUT_DATASET

最关键的字段坑(详细见 references):

  • ⚠️ SQL 节点字段名是 sql,不是 sqlScript。写错时 direct-save 不报错,但 SQL 不生效(最隐蔽 bug)。
  • ⚠️ SQL 里 input1/input2/... 是位置式索引对应 sources[],删除 INPUT 节点会让索引前移,改 input 节点必须同时改 SQL。
  • ⚠️ INPUT_DATASET 的 relativeFieldAlias 决定 SQL 里能引用什么字段名,必须读了再写 SQL。
  • ⚠️ OUTPUT_DATASET 的 parentDirId 是数据集目录 id,不是 ETL 目录 id(错填→"保存路径无效")。

📖 references/part-b-payload.md — 完整 payload 模板(含 dataSource.dirPath)+ 三种节点的字段速查表 + 9 种已知节点类型 + dataFlowId 控制 create vs update + B-8 复用模板:从扫描到落表的完整 4 阶段脚本(治理扫描 → 建目录 → 写入执行 → 删除旧链)。

B-5. 第三步:执行 + 拿真实错误

B-5.1 触发执行(status 字段误导)

guancli fetch POST /api/etl/execute '{"dataFlowId":""}'
# => {"taskId":"","status":"FINISHED"}

⚠️ status 字段误导最坑:返回的 status:"FINISHED" 是任务触发结果,不是 ETL 执行结果。

B-5.2 查任务详情(修 bug 必经路径)

guancli fetch GET /api/task/
# => {"response":{"taskId":"...","status":"FAILED","result":{"error":"..."},"messages":""}}

response.result.error 才是 BI 引擎给的真实错误(SQL 报错、字段找不到等)。

B-5.3 错误定位三步走

# Step 1:触发 execute 拿 taskId
taskId=$(guancli fetch POST /api/etl/execute "{"dataFlowId":"$DFID"}" 
  | jq -r '.response.taskId')

# Step 2:等几秒再查 task error
sleep 4
guancli fetch GET "/api/task/$taskId" | jq '.response.result.error'

# Step 3:根据 error 类型对照 references/part-b-errors.md 修复手册

B-5.4 异步轮询写法

TASK_ID=""
for i in $(seq 1 30); do
  st=$(guancli task get $TASK_ID --raw | jq -r '.response.status')
  echo "[$i] $st"
  [ "$st" = "FINISHED" ] || [ "$st" = "FAILED" ] && break
  sleep 10
done

复杂表给 5 分钟(30×10s)一般够。

B-6. 第四步:校验工具集

# 1. ETL 视角
guancli etl search  -d  --raw 
  | jq '.response.contents[0] | {dataFlowId,name,status,lastExecution,outputs}'

# 2. 节点级预览(不用 execute 也能看任意节点输出 — 修 bug 利器)
guancli etl preview   --limit 5 --timeout 120

# 3. 数据集视角
guancli ds search  --raw

# 4. 实际数据预览
guancli ds preview  --limit 10

# 5. 行列数对账
guancli ds get  --brief

⚠️ 保存后 OUTPUT 节点 ID 会变成 id___out,preview 时用新 id:

guancli etl get  --raw 
  | jq -r '.data.actions[] | select(.type=="OUTPUT_DATASET") | .id'

B-7. 第五步:删除拓扑

⛔ B-7.0 删除前的硬性安全闸(V1.3.1 新增)

Agent 在执行任何 DELETE /api/data-source/ 或 DELETE /api/etl/ 前必须满足以下全部条件,否则拒绝执行:

  1. 用户已逐项明确确认:列出本次将删除的所有 dsId / etlId(含 ETL 名 + 输出表名 + 路径),用户回复"确认删除"或等价明确指令。模糊回复(如"嗯"、"可以"、"清理一下")不算确认。
  2. 下游引用已切流:通过 guancli ds get --assoc 或 B-10 双源审计验证目标 ds 的下游 ETL 与看板(page)已切到 v2,无任何活跃引用。
  3. 新链路对账通过:v2 对应 ETL status:FINISHED,行数与 v1 差异 <1%,关键字段一致(参考 B-7.3 checklist)。
  4. 批量删除分批确认:单次删除 ≤ 5 张表;超过 5 张必须分批,每批单独走步骤 1。

Agent 默认行为:在 ETL 治理 / 重写 / 字段裁剪等任务里,永远不要主动建议删除。把待删清单作为 governance-report.md / migration-status.md 的一节产出给用户审阅,由用户主动指令"删 X / 删这一批"才执行。新旧并行是默认终态,不是过渡态——除非用户明确要求收敛。

这条闸跟 B-13 红线、B-17.10 完成标准里的"对账确认后再处理旧表"一脉相承。误删一张被看板用着的 ds,恢复成本高过保留旧链一年。

B-7.1 关键约束:先 ds 后 etl

✅ 2026-06-17 · workshop513 实测复核(净零回归):独立 DATAFLOW ETL 两个方向各测一次——etl-first 撞 2002 输出数据集已存在 失败;ds-first(先 DELETE /api/data-source/<输出dsId>,后 DELETE /api/etl/)两步皆 ok、不报 6001。本约束适用所有「ETL + 其输出数据集」清理。6001 依赖于该数据集 不出现在这里,它只属于删输入数据集(ETL 仍读它)或 churn NOT_FOUND 幽灵场景(见 B-0.5 清理坑)。

guancli fetch DELETE /api/etl/
# => {"error":{"status":2002,"message":"输出数据集已存在"}}  ← 失败!

正确顺序:

# Step 1:先删数据集
guancli fetch DELETE /api/data-source/

# Step 2:再删 ETL
guancli fetch DELETE /api/etl/

B-7.2 数据集 endpoint 反推血泪史

DELETE /api/dataset/     ← No static resource dataset/...
DELETE /api/datasource/  ← No static resource datasource/...
DELETE /api/ds/          ← No static resource ds/...
DELETE /api/dataflow/    ← No static resource dataflow/...
✅ 正确:
DELETE /api/data-source/

B-7.3 删除前 checklist

  • v3 对应 ETL Status = FINISHED
  • v3 输出数据集行数 vs v2 行数(差异 < 1%)
  • v3 输出字段集 = v2 字段集 - 设计砍掉的
  • 看板(page)依赖 v2 数据集的,已先切到 v3
  • 下游 ETL 依赖 v2 输出的,已先切到 v3

B-9. 报错修复手册(10 类真坑 · 速查)

每条只列触发现象 + 一句根因 + 一句修复方向;完整修复方案 + SQL 示例 + 升级版坑见 references/part-b-errors.md。

坑号 触发现象 根因 / 修复方向
1 请输入ETL名称 / 保存路径无效 顶层 parentDirId 缺失或填错 → 必须是 dirType=ETL 那棵树的 id
2 保存成功但 execute 数据为空 上游 inputDsId 只有读权限没运行权限 → 换有权限的输入或写自包含 ETL
3 列名带隐藏 n 找不到字段 SQL 里要 `带换行的原字段名` AS `干净别名`;升级版坑:fieldAlias 与 SQL 中换行+空格不一致
4 WHERE field <> NULL 输出 0 行 SQL 标准里 <> NULL 永远是 unknown → 必须 IS NOT NULL / IS NULL
5 cannot resolve column 字段引用与 INPUT_DATASET 的 relativeFieldAlias 错位 → 编译时按节点级别名替换
6 Syntax error at or near ';' CTE 内 trailing ; + 中文注释 → 用 regex 去除 FROM n_id_xxx; 后的 ; 与注释
7 AMBIGUOUS_REFERENCE FROM/JOIN 同表别名同名 → 改 FROM 别名为 s2,对齐 ON 子句
8 s2.xxx 找不到 FROM 表错位(自连而非 JOIN 不同表) → 修正 JOIN 目标表
9 NUM_COLUMNS_MISMATCH UNION 列数不一致(老引擎自动补 NULL,新引擎严格化) → 手工对齐 SELECT,缺的用 NULL AS xxx
10 日期比较恒为 false WHERE order_date < 'today_field' 字符串字面量 → 改 date_sub(current_date(), 1)

B-10. 字段使用度审计(双源扫描)

B-10.1 方法论

字段裁剪不能只看看板(page)—— 下游 ETL 也消费字段。双源 0 引用才能安全裁。

# 1. 拉数据集所有下游
guancli ds get  --assoc
# 输出 N 个下游:M 个 ETL + K 个 PAGE

# 2. 批量 page get + etl get 落本地
for id in ; do
  guancli page get $id > pages/$id.txt
  guancli etl get $id > etls/$id.txt
done

# 3. 对每个字段做 grep 双源统计
for fld in ; do
  page_cnt=$(grep -c "$fld" pages/*.txt)
  etl_cnt=$(grep -c "$fld" etls/*.txt)
  if [ "$page_cnt" = "0" ] && [ "$etl_cnt" = "0" ]; then
    echo "🟥 $fld → 真 0 引用,可裁"
  fi
done

B-10.2 实测对照(必看)

某千万级订单明细表:43 字段、5GB
全量扫描:29 page + 14 etl
仅看板抽样:17 个 0 引用候选
双源全扫描:仅 2 个真 0 引用
误删任何一个 → 下游 ETL 跑挂

只看看板会高估 8 倍可裁字段,必须 page+etl 双源。

B-11. v2 → v3 批量改造 SDK(速查)

v3_sdk.mjs 三个核心 API:

transformV2ToV3({ v2PayloadFile, v3Name, removeInputs, newSql, inputMap, description })
pushAndExecute(v3Name, payloadPath)   // direct-save → execute
checkStatus(v3Name)                    // guancli etl search → parse Status

transformV2ToV3 有 4 个关键陷阱,头号坑是 SQL 字段名是 sql 不是 sqlScript(写错不报错、SQL 静默不生效);完整 4 条清单见下方 reference。

📖 references/part-b-sdk.md — 完整 7 步实现 + 时间窗口缩减实战(v2 近 3 月 → v3 昨日窗口的 regex 替换样板)。

B-12. 批量迁移工程经验(30+ 表实战)

  1. 先治理后写入:跳过治理直接写 = 把混乱重做一遍。
  2. payload 全部本地生成:写编译器把每个旧 ETL 的 meta 编译成三段式 payload,存 payloads/.json。
  3. 分批保存:一次 5–10 张 direct-save,避免单次失败影响整批。
  4. 预览先于执行:保存完先 etl preview 看 OUTPUT 节点能不能出数据;能出来再 execute。
  5. 节点 ID 重映射:保存后 OUTPUT 节点 ID 变成 id___ou
目录

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

0

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

0

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn