@guandata/guancli 1.0.30 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +15 -1
- package/bin/run.js +36 -1
- package/binaries/guancli-darwin-arm64 +0 -0
- package/binaries/guancli-darwin-x64 +0 -0
- package/binaries/guancli-linux-arm64 +0 -0
- package/binaries/guancli-linux-x64 +0 -0
- package/binaries/guancli-win32-x64.exe +0 -0
- package/package.json +9 -3
- package/skills/guancli/SKILL.md +19 -5
- package/skills/guancli/references/metric-atomic-mutation.md +210 -0
- package/skills/guancli/references/metric-commands.md +94 -0
- package/skills/guancli/references/metric-common-fields.md +166 -0
- package/skills/guancli/references/metric-composite-mutation.md +146 -0
- package/skills/guancli/references/metric-delete-mutation.md +70 -0
- package/skills/guancli/references/metric-derived-mutation.md +384 -0
- package/skills/guancli/references/metric-expression-rules.md +143 -0
- package/skills/guancli/references/metric-mutation.md +67 -0
- package/skills/guancli/references/metric-public-dimension.md +151 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## @guandata/guancli 1.0.32 - 2026-06-04
|
|
4
|
+
|
|
5
|
+
- `metric` 增加指标创建、编辑和删除能力,并补充原子指标、派生指标、复合指标等配置参考。
|
|
6
|
+
- `metric` 支持公共维度查询与配置辅助,便于按主题准备指标口径。
|
|
7
|
+
- 数据集详情输出补充字段信息,页面详情会标记 backlog 卡片,资源诊断信息更完整。
|
|
8
|
+
- 补充指标命令、数据集字段解析和页面渲染相关测试覆盖。
|
|
9
|
+
|
|
10
|
+
## @guandata/guancli 1.0.31 - 2026-06-03
|
|
11
|
+
|
|
12
|
+
- `card preview` 会按卡片值格式设置输出展示值,支持小数位、百分比、千分位、前后缀等常见格式。
|
|
13
|
+
- `card preview` 保留 raw 原始值,避免展示格式影响排序、Excel/JSON 输出或后续处理。
|
|
14
|
+
- `ds execute-sql` 能力要求提示更清晰;认证请求默认不再额外发送 `X-AUTH-TOKEN`,提升部分环境兼容性。
|
|
15
|
+
- `install-skill` 增加 WorkBuddy skill 安装路径支持。
|
|
16
|
+
|
|
3
17
|
## @guandata/guancli 1.0.30 - 2026-05-29
|
|
4
18
|
|
|
5
19
|
- `card preview --dynamic-field` 支持当前卡片自身的多选动态维度覆盖,可用逗号分隔字段或重复传参合并。
|
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ guancli etl tree
|
|
|
23
23
|
guancli etl get <resource_id>
|
|
24
24
|
guancli ds search <keyword>
|
|
25
25
|
guancli ds preview <ds_id>
|
|
26
|
-
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' # 需目标 BI
|
|
26
|
+
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' # 需目标 BI 满足 8.2.0-hf12+,并在 BI 管理后台 - 域设置打开高级 SQL 查询开关
|
|
27
27
|
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' -f json
|
|
28
28
|
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' --raw
|
|
29
29
|
# SQL 中请使用数据集名称作为临时表名;名称包含中文、空格或特殊字符时,请使用反引号包裹。
|
|
@@ -38,6 +38,20 @@ guancli chatbi query --theme-name "经营主题" --message "最近30天营业收
|
|
|
38
38
|
|
|
39
39
|
## 版本更新
|
|
40
40
|
|
|
41
|
+
### @guandata/guancli 1.0.32
|
|
42
|
+
|
|
43
|
+
- `metric` 增加指标创建、编辑和删除能力,并补充原子指标、派生指标、复合指标等配置参考。
|
|
44
|
+
- `metric` 支持公共维度查询与配置辅助,便于按主题准备指标口径。
|
|
45
|
+
- 数据集详情输出补充字段信息,页面详情会标记 backlog 卡片,资源诊断信息更完整。
|
|
46
|
+
- 补充指标命令、数据集字段解析和页面渲染相关测试覆盖。
|
|
47
|
+
|
|
48
|
+
### @guandata/guancli 1.0.31
|
|
49
|
+
|
|
50
|
+
- `card preview` 会按卡片值格式设置输出展示值,支持小数位、百分比、千分位、前后缀等常见格式。
|
|
51
|
+
- `card preview` 保留 raw 原始值,避免展示格式影响排序、Excel/JSON 输出或后续处理。
|
|
52
|
+
- `ds execute-sql` 能力要求提示更清晰;认证请求默认不再额外发送 `X-AUTH-TOKEN`,提升部分环境兼容性。
|
|
53
|
+
- `install-skill` 增加 WorkBuddy skill 安装路径支持。
|
|
54
|
+
|
|
41
55
|
### 1.0.30
|
|
42
56
|
|
|
43
57
|
- `card preview --dynamic-field` 支持当前卡片自身的多选动态维度覆盖,可用逗号分隔字段或重复传参合并。
|
package/bin/run.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const { execFileSync, execSync, spawnSync } = require("child_process");
|
|
6
6
|
const path = require("path");
|
|
7
7
|
const fs = require("fs");
|
|
8
|
+
const os = require("os");
|
|
8
9
|
|
|
9
10
|
const PLATFORM_MAP = {
|
|
10
11
|
"darwin-arm64": "guancli-darwin-arm64",
|
|
@@ -35,6 +36,38 @@ function getBinaryPath() {
|
|
|
35
36
|
return binaryPath;
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
function copyDirectory(src, dest) {
|
|
40
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
41
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
42
|
+
const srcPath = path.join(src, entry.name);
|
|
43
|
+
const destPath = path.join(dest, entry.name);
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
copyDirectory(srcPath, destPath);
|
|
46
|
+
} else if (entry.isSymbolicLink()) {
|
|
47
|
+
fs.symlinkSync(fs.readlinkSync(srcPath), destPath);
|
|
48
|
+
} else {
|
|
49
|
+
fs.copyFileSync(srcPath, destPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function installCodeBuddySkill(pkgRoot, skill) {
|
|
55
|
+
try {
|
|
56
|
+
const srcDir = path.join(pkgRoot, "skills", skill);
|
|
57
|
+
if (!fs.existsSync(path.join(srcDir, "SKILL.md"))) {
|
|
58
|
+
console.warn(`Warning: skipping CodeBuddy/WorkBuddy install; skill not found: ${srcDir}`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const configDir = process.env.CODEBUDDY_CONFIG_DIR || path.join(os.homedir(), ".codebuddy");
|
|
63
|
+
const destDir = path.join(configDir, "skills", skill);
|
|
64
|
+
copyDirectory(srcDir, destDir);
|
|
65
|
+
console.log(`Installed ${skill} to CodeBuddy/WorkBuddy: ${destDir}`);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
console.warn(`Warning: CodeBuddy/WorkBuddy install failed for ${skill}: ${err.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
38
71
|
if (process.argv[2] === "version" && process.argv.length === 3) {
|
|
39
72
|
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
|
|
40
73
|
console.log(pkg.version);
|
|
@@ -57,7 +90,9 @@ if (process.argv[2] === "install-skill") {
|
|
|
57
90
|
console.log("Installing guancli to AI coding assistants...");
|
|
58
91
|
const result = spawnSync("npx", args, { stdio: "inherit", env: process.env, shell: true });
|
|
59
92
|
if (result.error) throw result.error;
|
|
60
|
-
|
|
93
|
+
const status = result.status || 0;
|
|
94
|
+
if (status === 0) installCodeBuddySkill(pkgRoot, "guancli");
|
|
95
|
+
process.exit(status);
|
|
61
96
|
}
|
|
62
97
|
|
|
63
98
|
const binary = getBinaryPath();
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@guandata/guancli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.32",
|
|
4
4
|
"description": "观远 BI 命令行工具 - 通过 API 操作 ETL、数据集、页面、表单等资源,并提供 ChatBI 问数/洞察能力",
|
|
5
5
|
"bin": {
|
|
6
6
|
"guancli": "bin/run.js"
|
|
7
7
|
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "node scripts/build.js && node scripts/sync-skill.js",
|
|
10
|
+
"changelog": "node ../../scripts/generate-release-changelog.js .",
|
|
11
|
+
"check-changelog": "node ../../scripts/check-release-changelog.js .",
|
|
12
|
+
"prepublishOnly": "npm run check-changelog && npm run build && node scripts/preflight.js"
|
|
13
|
+
},
|
|
8
14
|
"files": [
|
|
9
15
|
"bin/",
|
|
10
16
|
"binaries/",
|
|
@@ -29,7 +35,7 @@
|
|
|
29
35
|
"node": ">=14"
|
|
30
36
|
},
|
|
31
37
|
"publishConfig": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
38
|
+
"access": "public",
|
|
39
|
+
"registry": "https://registry.npmjs.org/"
|
|
34
40
|
}
|
|
35
41
|
}
|
package/skills/guancli/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: guancli
|
|
3
|
-
description: 当用户要分析观远 BI / Guandata 的 ETL、数据集、页面/仪表板、卡片、血缘、节点 SQL、资源树、目录、表单填报数据、指标 metric、指标树归因 metric_attribution、指标泛化查询参数,或给出 ETL ID、dsId、page ID、card ID、metric ID、metric tree ID 想看现有内容/查询数据时,主动使用这个 skill
|
|
3
|
+
description: 当用户要分析观远 BI / Guandata 的 ETL、数据集、页面/仪表板、卡片、血缘、节点 SQL、资源树、目录、表单填报数据、指标 metric、公共维度 public dimension、指标树归因 metric_attribution、指标泛化查询参数,或给出 ETL ID、dsId、page ID、card ID、metric ID、metric tree ID、公共维度 ID 想看现有内容/查询数据时,主动使用这个 skill。用户要创建、新建、编辑、删除指标或公共维度,尤其是“创建原子指标”“创建复合指标”“创建衍生指标”“新增 metric”“基于数据集建指标”“用两个指标算一个指标”“做同比/环比/最近N天/累计/期末值指标”“新建公共维度”“把几个数据集字段关联成公共维度”时,也要使用这个 skill 并读取对应写操作指引。即使用户只说"看一下这个 page""贴一下这个 ETL 的 SQL""搜个叫 X 的数据集""这个数据集长啥样""页面卡片用了哪些 ds""帮我查这个指标""生成指标泛化查询命令""帮我创建一个原子指标""帮我创建一个复合指标""帮我创建一个同比指标""帮我创建一个公共维度",也要触发。它直接调用 BI HTTP API 拉数据并整理成 AI 友好的中文结论,定位是 BI 查询分析 + 表单填报 CRUD + 指标/公共维度写操作引导。修改 ETL 走 guanetl;新建/改 Card/Page 走 guanvis;数据源/数据集 CRUD/增量/调度走 guands;页面 PNG 视觉验证走 guanvis screenshot;管理员级 SVC SQL / 动态码走 guanadmin。若用户希望直接分析 BI 项目而不是手工点页面,或希望直接通过 ChatBI 进行主题问数/洞察分析,也应优先使用这个 skill。
|
|
4
4
|
compatibility: Requires Node.js 14+. Install via npm install -g @guandata/guancli.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -15,6 +15,8 @@ compatibility: Requires Node.js 14+. Install via npm install -g @guandata/guancl
|
|
|
15
15
|
- 用户需要对表单填报(Form)数据进行 CRUD 操作(查询/插入/更新/删除)。
|
|
16
16
|
- 用户要直接用 ChatBI 主题做 L1 问数或 L2 洞察,而不是打开网页手工操作。
|
|
17
17
|
- 用户要搜索指标、获取指标详情、查询指标数据、查看指标目录、执行指标树归因,或让你生成/解释指标泛化查询命令。
|
|
18
|
+
- 用户要创建、新建、编辑或删除指标;当前指标写操作指引先覆盖原子指标、复合指标、衍生指标的创建和编辑前校验。
|
|
19
|
+
- 用户要查询、新建、编辑、转移责任人或删除指标公共维度。
|
|
18
20
|
|
|
19
21
|
如果用户只想生成页面 PNG 截图成品,不要用本 skill,改用 `guanvis screenshot`。页面截图不要再走 `guanexport`;移动端页面/卡片导出仍暂用 `guanexport` legacy 功能。
|
|
20
22
|
|
|
@@ -78,7 +80,7 @@ ChatBI 统一复用当前 profile 的 `base_url` 和 `uIdToken`。
|
|
|
78
80
|
|
|
79
81
|
## 能力边界
|
|
80
82
|
|
|
81
|
-
guancli 是 BI
|
|
83
|
+
guancli 是 BI 资源的**查询分析入口**,并支持少量明确边界的写操作(Form 表单填报 CRUD、指标写操作引导)。其他写入类任务由专用 skill 负责:
|
|
82
84
|
|
|
83
85
|
| 任务 | 应使用的工具 |
|
|
84
86
|
|------|-------------|
|
|
@@ -102,12 +104,23 @@ guancli 是 BI 资源的**只读分析入口**(Form 表单填报例外)。
|
|
|
102
104
|
|
|
103
105
|
- 指标与指标树全量命令:`references/metric-commands.md`
|
|
104
106
|
- 指标泛化查询参数与示例:`references/metric-generic-query.md`
|
|
107
|
+
- 指标新建 / 编辑 / 删除入口:`references/metric-mutation.md`
|
|
108
|
+
- 指标通用写入配置:`references/metric-common-fields.md`
|
|
109
|
+
- 指标表达式 / 计算公式支持范围:`references/metric-expression-rules.md`
|
|
110
|
+
- 原子指标写入细节:`references/metric-atomic-mutation.md`
|
|
111
|
+
- 复合指标写入细节:`references/metric-composite-mutation.md`
|
|
112
|
+
- 衍生指标写入细节:`references/metric-derived-mutation.md`
|
|
113
|
+
- 指标删除细节:`references/metric-delete-mutation.md`
|
|
114
|
+
- 公共维度查询与写入:`references/metric-public-dimension.md`
|
|
105
115
|
|
|
106
116
|
关键规则:
|
|
107
117
|
|
|
108
118
|
- 普通指标数据查询用 `guancli metric query <metric_id>`,可加 `--dim`、`--filter`、排序、列筛选、输出格式等。
|
|
109
119
|
- 只要传入 `--compare`、`--compare-value`、`--xtd`、`--last`、`--recent`、`--recent-base`、`--percentage`、`--percentage-dim`、`--rank-top`、`--rank-order`、`--rank-dim`、`--adv-calc-json` 任一参数,就进入指标泛化查询模式。
|
|
110
120
|
- 泛化查询要求 BI 版本 `>= 8.2.1`;如需确认环境版本,先执行 `guancli server-version --profile <profile>`。
|
|
121
|
+
- 当用户要创建或编辑原子指标、复合指标、衍生指标时,先读取 `references/metric-mutation.md` 判断类型,再读取 `references/metric-common-fields.md`,最后只读取对应类型文件:原子指标读 `references/metric-atomic-mutation.md`,复合指标读 `references/metric-composite-mutation.md`,衍生指标读 `references/metric-derived-mutation.md`。如果涉及原子指标表达式 `formulaField.fdFormula`、复合指标 `formula` 或组合衍生 `deriveSetting.formula`,必须同时读取 `references/metric-expression-rules.md`,按当前前后端支持的表达式形态生成。默认使用当前已登录环境,不询问 profile;按必填项、数据格式 `format` 和启用的指标业务属性配置逐步查询/确认,生成 JSON 文件并先做 dry-run/人工摘要。用户确认后仍需按 Web 同款保存前校验执行:原子指标上线前跑 save-precheck,编辑态跑 validate-update-impact;复合指标和衍生指标编辑态跑 validate-update-impact。校验通过或二次确认后才真实提交。
|
|
122
|
+
- 当用户要删除指标时,读取 `references/metric-delete-mutation.md`。删除必须先跑 `validate-delete-impact`;如果存在下游指标或卡片,按 Web 行为阻断删除并展示影响资源;只有无影响且用户明确确认后,才执行真实删除。
|
|
123
|
+
- 当用户要查询、新建、编辑或删除公共维度时,读取 `references/metric-public-dimension.md`。公共维度写入字段为 `name`、`businessOwner`、`relatedFields[{dsId,fdId}]`;关联字段必须同类型。删除前先跑 depend-check,若已有指标使用,需要提示会影响指标计算准确性,用户明确确认后才删除。
|
|
111
124
|
|
|
112
125
|
## 标准分析流程
|
|
113
126
|
|
|
@@ -153,7 +166,7 @@ guancli page get <resource_id> # 页面详情(含卡片列表、血缘
|
|
|
153
166
|
guancli ds preview <ds_id> # 预览数据集数据 (表格格式)
|
|
154
167
|
guancli ds preview <ds_id> --limit 20 # 限制预览行数
|
|
155
168
|
guancli ds preview <ds_id> --raw # 输出原始 JSON
|
|
156
|
-
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' # 用 SQL 查询数据集(需目标 BI
|
|
169
|
+
guancli ds execute-sql -inputs <ds_id> -sql 'SELECT * FROM `数据集名称` LIMIT 20' # 用 SQL 查询数据集(需目标 BI 满足 8.2.0-hf12+,并在 BI 管理后台 - 域设置打开高级 SQL 查询开关)
|
|
157
170
|
# SQL 中请使用数据集名称作为临时表名;名称包含中文、空格或特殊字符时,请使用反引号包裹。可先执行 `ds get <ds_id> --brief` 查看数据集名称和字段列表。
|
|
158
171
|
`execute-sql` 的旧版 public-api fallback 不支持 disable-cache;`--limit` 在非 raw 输出渲染前本地截断,`--raw` 保持后端原始响应。
|
|
159
172
|
```
|
|
@@ -234,12 +247,13 @@ guancli card preview <cd_id> --limit 20 # 限制预览行数
|
|
|
234
247
|
guancli card preview <cd_id> -f csv # 导出 CSV 到 stdout
|
|
235
248
|
guancli card preview <cd_id> -f csv -o card.csv # 导出 CSV 到文件
|
|
236
249
|
guancli card preview <cd_id> -f excel -o card.xls # 导出 Excel 可打开文件
|
|
250
|
+
guancli card preview <cd_id> --value-format raw -f csv # 保留原始数值,适合 AI 后续计算
|
|
237
251
|
```
|
|
238
252
|
|
|
239
253
|
卡片 ID (cdId) 可通过 `page get` 命令查看页面详情获取。
|
|
240
|
-
图表卡片内部会按 BI
|
|
254
|
+
图表卡片内部会按 BI 预览接口的分页能力自动取数;选择器/树状选择器仍使用服务端单次返回。图表卡片数值默认使用 `--value-format formatted`,按卡片返回的数值格式输出(小数位、千分位、货币、百分比、单位等);需要保留原始数值用于 AI 后续计算时,使用 `--value-format raw`。无卡片格式时 `--precision` 作为兜底最大精度,默认 6 位。任意卡片预览结果在未指定 `-o/--output` 且超过 1000 行时,默认写入 `card_<cdId>_<timestamp>.<ext>` 文件,避免把大结果直接塞入上下文。该能力不对接 BI 导出任务接口。
|
|
241
255
|
|
|
242
|
-
复杂报表 Pro 卡片会自动切换为 xlsx 下载模式,只支持写入文件,不支持 `--raw`、`-f/--format`、`--limit
|
|
256
|
+
复杂报表 Pro 卡片会自动切换为 xlsx 下载模式,只支持写入文件,不支持 `--raw`、`-f/--format`、`--limit`、排序、列筛选、精度、数值输出格式、动态参数和动态维度。未指定 `-o/--output` 时默认写入 `complex_report_pro_<cdId>_<timestamp>.xlsx`。
|
|
243
257
|
|
|
244
258
|
#### 带筛选条件预览卡片
|
|
245
259
|
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# 原子指标创建与编辑
|
|
2
|
+
|
|
3
|
+
原子指标用于在单个数据集字段或数据集字段表达式上定义指标口径,例如“订购金额 = SUM(订单金额)”。
|
|
4
|
+
|
|
5
|
+
## 触发场景
|
|
6
|
+
|
|
7
|
+
- 用户说“创建原子指标”“基于数据集建指标”“用某个字段求和/计数/平均”。
|
|
8
|
+
- 用户给出数据集、字段、聚合方式。
|
|
9
|
+
- 用户要编辑一个 `subType=ATOMIC` 的指标。
|
|
10
|
+
|
|
11
|
+
## 创建必填信息
|
|
12
|
+
|
|
13
|
+
| 字段 | 中文 | 说明 |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `projectId` | 主题 ID | 指标所属主题 |
|
|
16
|
+
| `subType` | 指标类型 | 固定 `ATOMIC` |
|
|
17
|
+
| `dsId` | 数据集 ID | 指标来源数据集 |
|
|
18
|
+
| `name` | 指标名称 | 最长 50 |
|
|
19
|
+
| `desc` | 业务口径 | 最长 1000 |
|
|
20
|
+
| `applicableDims` | 适用维度 | 数据集字段 ID 数组,不能为空 |
|
|
21
|
+
| `parentDirId` | 保存至/所属文件夹 | 指标目录 ID |
|
|
22
|
+
| `businessOwner` | 责任人 | 用户 ID |
|
|
23
|
+
| `publish` | 保存方式 | `true` 上线,`false` 草稿 |
|
|
24
|
+
|
|
25
|
+
计算方式二选一:
|
|
26
|
+
|
|
27
|
+
| 模式 | 必填字段 | 说明 |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| 来源字段 + 聚合方式 | `fdId` + `aggrType` | 最常见;来源字段是数据集字段 ID |
|
|
30
|
+
| 表达式 | `formulaField.fdFormula` | 例如 `SUM([fd_amount]) + SUM([fd_tax])`;不要同时传 `fdId/aggrType`;支持范围见 `metric-expression-rules.md` |
|
|
31
|
+
|
|
32
|
+
## 原子专属可选字段
|
|
33
|
+
|
|
34
|
+
| 字段 | 中文 | 说明 |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| `timeDim` | 时间维度 | 如果适用维度中包含时间字段,优先让用户指定一个时间维度字段 ID |
|
|
37
|
+
| `sourceMetricId` | 来源指标 ID | 复制/快捷等高级场景才传 |
|
|
38
|
+
|
|
39
|
+
通用可选字段见 `metric-common-fields.md`。
|
|
40
|
+
|
|
41
|
+
## 聚合方式
|
|
42
|
+
|
|
43
|
+
| `aggrType` | 中文 |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| `SUM` | 求和 |
|
|
46
|
+
| `MIN` | 最小值 |
|
|
47
|
+
| `MAX` | 最大值 |
|
|
48
|
+
| `AVG` | 平均值 |
|
|
49
|
+
| `CNT` | 计数 |
|
|
50
|
+
| `CNT_DISTINCT` | 去重计数 |
|
|
51
|
+
| `NUL` | 无处理 |
|
|
52
|
+
|
|
53
|
+
字段判断:
|
|
54
|
+
|
|
55
|
+
- 用户只给字段中文名时,先用 `guancli ds get <dsId> --brief` 查字段和 `fdId`。
|
|
56
|
+
- 来源字段是维度字段时,常用计数、去重计数、最大值、最小值、无处理。
|
|
57
|
+
- 来源字段是指标/数值字段时,常用求和、平均值、最大值、最小值、计数、去重计数。
|
|
58
|
+
|
|
59
|
+
## 表达式限制
|
|
60
|
+
|
|
61
|
+
当用户选择“使用表达式”时,先读取 `metric-expression-rules.md`。默认只生成当前前后端明确支持的聚合表达式形态:
|
|
62
|
+
|
|
63
|
+
- `SUM([fd_id])`、`COUNT([fd_id])`
|
|
64
|
+
- 多个聚合项加减:`SUM([fd_a]) - SUM([fd_b])`
|
|
65
|
+
- 条件聚合:`SUM(CASE WHEN ... THEN ... ELSE ... END)`
|
|
66
|
+
- 一个顶层比值:`SUM([fd_a]) / COUNT([fd_b])` 或 `(SUM([fd_a]) + SUM([fd_b])) / SUM([fd_c])`
|
|
67
|
+
|
|
68
|
+
不要把 `AVG/MAX/MIN/FIRST/LAST/ANY_VALUE` 主动写进 `formulaField.fdFormula`;如果用户要平均值、最大值、最小值,优先走“来源字段 + `aggrType`”。表达式中字段必须写 `[fdId]`,不要提交字段中文名。
|
|
69
|
+
|
|
70
|
+
## 信息收集
|
|
71
|
+
|
|
72
|
+
如果用户只说“帮我创建一个原子指标”,先收集:
|
|
73
|
+
|
|
74
|
+
1. 指标主题和保存目录。
|
|
75
|
+
2. 来源数据集和来源字段。
|
|
76
|
+
3. 计算方式:来源字段 + 聚合方式,还是表达式;如果是表达式,按 `metric-expression-rules.md` 校验支持形态。
|
|
77
|
+
4. 指标名称、业务口径、适用维度、时间维度、是否保存并上线。
|
|
78
|
+
5. 数据格式:默认、数值、货币、百分比;如需指定,确认小数位、千分位、货币符号/前后缀、数量级单位、百分比是否除以 100。
|
|
79
|
+
6. 责任人是否用当前登录用户。
|
|
80
|
+
7. 指标业务属性中启用且必填的 `bizAttrs`。
|
|
81
|
+
|
|
82
|
+
## JSON 模板:字段聚合
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"projectId": "<metric_project_id>",
|
|
87
|
+
"subType": "ATOMIC",
|
|
88
|
+
"dsId": "<ds_id>",
|
|
89
|
+
"name": "订购金额",
|
|
90
|
+
"engName": "order_amount",
|
|
91
|
+
"fdId": "<source_fd_id>",
|
|
92
|
+
"aggrType": "SUM",
|
|
93
|
+
"applicableDims": ["<dim_fd_id_1>", "<dim_fd_id_2>"],
|
|
94
|
+
"timeDim": "<time_dim_fd_id>",
|
|
95
|
+
"format": {
|
|
96
|
+
"formatType": "CURRENCY",
|
|
97
|
+
"decimalPlaces": 2,
|
|
98
|
+
"useThousandsSeparator": true,
|
|
99
|
+
"prefix": "¥",
|
|
100
|
+
"prefixUnit": null,
|
|
101
|
+
"showPrefixUnit": true,
|
|
102
|
+
"suffix": ""
|
|
103
|
+
},
|
|
104
|
+
"desc": "统计订单明细中的订购金额总和,用于分析销售规模。",
|
|
105
|
+
"parentDirId": "<metric_dir_id>",
|
|
106
|
+
"businessOwner": "<user_id>",
|
|
107
|
+
"publish": false
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
没有时间维度时删除 `timeDim`;没有英文名称时删除 `engName`;未指定数据格式时删除 `format` 或传 `{}`。
|
|
112
|
+
|
|
113
|
+
## JSON 模板:表达式
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"projectId": "<metric_project_id>",
|
|
118
|
+
"subType": "ATOMIC",
|
|
119
|
+
"dsId": "<ds_id>",
|
|
120
|
+
"name": "含税销售额",
|
|
121
|
+
"formulaField": {
|
|
122
|
+
"fdFormula": "SUM([fd_amount]) + SUM([fd_tax])"
|
|
123
|
+
},
|
|
124
|
+
"applicableDims": ["<dim_fd_id_1>", "<dim_fd_id_2>"],
|
|
125
|
+
"format": {
|
|
126
|
+
"formatType": "NUMBER",
|
|
127
|
+
"decimalPlaces": 2,
|
|
128
|
+
"useThousandsSeparator": true,
|
|
129
|
+
"prefixUnit": null,
|
|
130
|
+
"showPrefixUnit": true,
|
|
131
|
+
"prefix": "",
|
|
132
|
+
"suffix": ""
|
|
133
|
+
},
|
|
134
|
+
"desc": "销售金额与税额之和。",
|
|
135
|
+
"parentDirId": "<metric_dir_id>",
|
|
136
|
+
"businessOwner": "<user_id>",
|
|
137
|
+
"publish": false
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 创建步骤
|
|
142
|
+
|
|
143
|
+
1. 生成 `/tmp/atomic_metric.json`。
|
|
144
|
+
2. 先 dry-run:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
guancli metric create --file /tmp/atomic_metric.json --dry-run
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
3. 按 `metric-common-fields.md` 向用户摘要并确认。
|
|
151
|
+
4. 如果 `publish=true`,先跑 save-precheck:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
guancli fetch POST /api/metric-platform/metrics/atomic-metrics/save-precheck --stdin < /tmp/atomic_metric.json
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
5. 如果返回 `conflicts` 且非空,展示冲突指标、冲突口径、适用维度差异,等待用户二次确认。
|
|
158
|
+
6. 校验通过或二次确认后提交:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
guancli metric create --file /tmp/atomic_metric.json -f json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
7. 响应返回指标 ID 后回读:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
guancli metric get <metric_id> --brief
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 编辑步骤
|
|
171
|
+
|
|
172
|
+
编辑原子指标时复用 Web 顺序:必要时先口径冲突校验,再影响校验,最后提交。
|
|
173
|
+
|
|
174
|
+
1. 读取当前详情:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
guancli metric get <metric_id> -f json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
2. 生成 patch 或完整 payload,先 dry-run:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
guancli metric edit <metric_id> --file /tmp/atomic_metric_update.json --dry-run
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
3. 如果 `publish=true`,调用 save-precheck。编辑态请求体需要带 `metricId`:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
guancli fetch POST /api/metric-platform/metrics/atomic-metrics/save-precheck --stdin < /tmp/atomic_metric_update_precheck.json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
其中 precheck JSON 等于编辑 payload 加:
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{ "metricId": "<metric_id>" }
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
4. 如果存在 `conflicts`,展示后等待二次确认。
|
|
199
|
+
5. 调用编辑影响校验:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
guancli fetch POST /api/metric-platform/metrics/atomic-metrics/<metric_id>/validate-update-impact --stdin < /tmp/atomic_metric_update.json
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
6. 如果返回 `hasChanged=true` 且 `affectedMetrics` 或 `affectedCards` 非空,展示影响并等待二次确认。
|
|
206
|
+
7. 提交真实编辑:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
guancli metric edit <metric_id> --file /tmp/atomic_metric_update.json -f json
|
|
210
|
+
```
|
|
@@ -34,6 +34,10 @@ guancli metric [command]
|
|
|
34
34
|
| `get` | 获取指标详情 |
|
|
35
35
|
| `query` | 查询指标数据 |
|
|
36
36
|
| `tree` | 获取指标目录树 |
|
|
37
|
+
| `create` | 新建原子指标(JSON 文件驱动) |
|
|
38
|
+
| `edit` | 编辑原子指标(JSON patch / replace) |
|
|
39
|
+
| `delete` | 删除指标(先执行删除影响校验) |
|
|
40
|
+
| `public-dim` | 公共维度查询、新建、编辑、删除 |
|
|
37
41
|
|
|
38
42
|
### metric project
|
|
39
43
|
|
|
@@ -155,6 +159,96 @@ guancli metric tree --profile default -f json
|
|
|
155
159
|
guancli metric tree --profile default --raw
|
|
156
160
|
```
|
|
157
161
|
|
|
162
|
+
### metric create
|
|
163
|
+
|
|
164
|
+
新建原子指标。写入流程先读 `metric-mutation.md` 和 `metric-common-fields.md`,原子字段、问询流程和 JSON 模板见 `metric-atomic-mutation.md`。复合指标和衍生指标创建当前使用 `guancli fetch POST /api/metric-platform/metrics/<type>-metrics --stdin`,分别见 `metric-composite-mutation.md` 和 `metric-derived-mutation.md`。
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
guancli metric create --profile default --file atomic_metric.json --dry-run
|
|
168
|
+
guancli metric create --profile default --file atomic_metric.json -f json
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
专属参数:
|
|
172
|
+
|
|
173
|
+
| 参数 | 说明 |
|
|
174
|
+
| --- | --- |
|
|
175
|
+
| `--file string` | 指标请求体 JSON 文件 |
|
|
176
|
+
| `--stdin` | 从 stdin 读取指标请求体 JSON |
|
|
177
|
+
| `--set key=value` | 覆盖字段;支持点路径;可重复 |
|
|
178
|
+
| `--dry-run` | 只输出请求方法、路径和请求体,不提交 |
|
|
179
|
+
|
|
180
|
+
### metric edit
|
|
181
|
+
|
|
182
|
+
编辑原子指标。默认先读取现有详情,再将 JSON 文件/stdin 和 `--set` 作为 patch 合并;`--replace` 直接提交输入 JSON。复合指标和衍生指标编辑当前使用 `guancli fetch POST /api/metric-platform/metrics/<type>-metrics/<metric_id> --stdin`,写入流程先读 `metric-mutation.md` 和 `metric-common-fields.md`,再按类型读取对应细节文档。
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
guancli metric edit <metric_id> --profile default --file patch.json --dry-run
|
|
186
|
+
guancli metric edit <metric_id> --profile default --set name=新名称
|
|
187
|
+
guancli metric edit <metric_id> --profile default --file full.json --replace
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
专属参数:
|
|
191
|
+
|
|
192
|
+
| 参数 | 说明 |
|
|
193
|
+
| --- | --- |
|
|
194
|
+
| `--file string` | 指标 patch/full JSON 文件 |
|
|
195
|
+
| `--stdin` | 从 stdin 读取指标 patch/full JSON |
|
|
196
|
+
| `--set key=value` | 覆盖字段;支持点路径;可重复 |
|
|
197
|
+
| `--replace` | 直接提交输入 JSON,不先读取现有详情并合并 |
|
|
198
|
+
| `--dry-run` | 只输出请求方法、路径和请求体,不提交 |
|
|
199
|
+
|
|
200
|
+
### metric delete
|
|
201
|
+
|
|
202
|
+
删除指标。命令与 Web 删除弹窗一致:先调用删除影响校验;如果存在下游指标或卡片,则阻断删除并输出影响列表。未传 `--confirm` 时只输出校验结果,不真实删除。详细流程见 `metric-delete-mutation.md`。
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
guancli metric delete <metric_id> --profile default
|
|
206
|
+
guancli metric delete <metric_id> --profile default --confirm
|
|
207
|
+
guancli metric delete <metric_id> --profile default --confirm --dry-run
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
专属参数:
|
|
211
|
+
|
|
212
|
+
| 参数 | 说明 |
|
|
213
|
+
| --- | --- |
|
|
214
|
+
| `--confirm` | 确认删除;未设置时只执行删除影响校验 |
|
|
215
|
+
| `--dry-run` | 只输出将执行的删除校验和删除请求,不提交 |
|
|
216
|
+
|
|
217
|
+
### metric public-dim
|
|
218
|
+
|
|
219
|
+
公共维度相关操作。详细字段、问询流程和 JSON 模板见 `metric-public-dimension.md`。
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
guancli metric public-dim list [keyword]
|
|
223
|
+
guancli metric public-dim get <public_dim_id>
|
|
224
|
+
guancli metric public-dim fd-map <ds_id>
|
|
225
|
+
guancli metric public-dim create --file public_dim.json --dry-run
|
|
226
|
+
guancli metric public-dim edit <public_dim_id> --file patch.json
|
|
227
|
+
guancli metric public-dim owner <public_dim_id> --business-owner <user_id>
|
|
228
|
+
guancli metric public-dim delete <public_dim_id>
|
|
229
|
+
guancli metric public-dim delete <public_dim_id> --confirm
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
别名:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
guancli metric public-dimension ...
|
|
236
|
+
guancli metric pubdim ...
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
常用参数:
|
|
240
|
+
|
|
241
|
+
| 子命令 | 参数 | 说明 |
|
|
242
|
+
| --- | --- | --- |
|
|
243
|
+
| `list` | `--limit` | 返回条数,默认 50 |
|
|
244
|
+
| `list` | `--offset` | 分页偏移,默认 0 |
|
|
245
|
+
| `list` | `--order-by` | `utimeDesc` 或 `utimeAsc` |
|
|
246
|
+
| `create/edit` | `--file`、`--stdin`、`--set`、`--dry-run` | JSON 文件驱动写入 |
|
|
247
|
+
| `edit` | `--replace` | 直接提交输入 JSON,不读取详情合并 |
|
|
248
|
+
| `owner` | `--business-owner` | 新责任人用户 ID |
|
|
249
|
+
| `delete` | `--confirm` | 确认删除;未设置时只执行依赖检查 |
|
|
250
|
+
| `delete` | `--dry-run` | 输出依赖检查和删除请求,不提交 |
|
|
251
|
+
|
|
158
252
|
## metric_attribution
|
|
159
253
|
|
|
160
254
|
入口:
|