@guandata/guanmetric 0.1.3 → 0.1.5
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 +9 -0
- package/README.md +11 -0
- package/binaries/guanmetric-darwin-arm64 +0 -0
- package/binaries/guanmetric-darwin-x64 +0 -0
- package/binaries/guanmetric-linux-arm64 +0 -0
- package/binaries/guanmetric-linux-x64 +0 -0
- package/binaries/guanmetric-win32-x64.exe +0 -0
- package/package.json +1 -1
- package/skills/guanmetric/SKILL.md +6 -2
- package/skills/guanmetric/references/metric-tree-mutation.md +470 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## @guandata/guanmetric 0.1.5 - 2026-07-28
|
|
4
|
+
|
|
5
|
+
- 新增指标树创建、查看、改名、移动和配置更新能力,支持维度拆解、指标公式拆解及复合指标展开。
|
|
6
|
+
- 指标树写入支持预览计划和原地更新,减少配置错误及删除重建造成的引用失效。
|
|
7
|
+
|
|
8
|
+
## @guandata/guanmetric 0.1.4 - 2026-07-25
|
|
9
|
+
|
|
10
|
+
- 适配受控 Agent 运行环境,指标创建、编辑和模板处理可在嵌入式执行场景复用,现有 CLI 用法保持不变。
|
|
11
|
+
|
|
3
12
|
## @guandata/guanmetric 0.1.3 - 2026-07-23
|
|
4
13
|
|
|
5
14
|
- 完善已有指标资源的原地编辑指引,避免更新时误建新资源并影响既有引用。
|
package/README.md
CHANGED
|
@@ -21,10 +21,21 @@ guanmetric create --file atomic_metric.json --dry-run
|
|
|
21
21
|
guanmetric edit <metric_id> --file patch.json --dry-run
|
|
22
22
|
guanmetric delete <metric_id>
|
|
23
23
|
guanmetric public-dim create --file public_dim.json --dry-run
|
|
24
|
+
guanmetric metric-tree create 销售额指标树 --metric-id <metric_id> --parent-dir-id <metric_tree_dir_id> --dry-run
|
|
25
|
+
guanmetric metric-tree update-config <metric_tree_id> --file metric_tree_config.json --dry-run
|
|
24
26
|
```
|
|
25
27
|
|
|
26
28
|
## 版本更新
|
|
27
29
|
|
|
30
|
+
### @guandata/guanmetric 0.1.5
|
|
31
|
+
|
|
32
|
+
- 新增指标树创建、查看、改名、移动和配置更新能力,支持维度拆解、指标公式拆解及复合指标展开。
|
|
33
|
+
- 指标树写入支持预览计划和原地更新,减少配置错误及删除重建造成的引用失效。
|
|
34
|
+
|
|
35
|
+
### @guandata/guanmetric 0.1.4
|
|
36
|
+
|
|
37
|
+
- 适配受控 Agent 运行环境,指标创建、编辑和模板处理可在嵌入式执行场景复用,现有 CLI 用法保持不变。
|
|
38
|
+
|
|
28
39
|
### @guandata/guanmetric 0.1.3
|
|
29
40
|
|
|
30
41
|
- 完善已有指标资源的原地编辑指引,避免更新时误建新资源并影响既有引用。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: guanmetric
|
|
3
|
-
description: 当用户要创建、编辑、删除观远 BI
|
|
3
|
+
description: 当用户要创建、编辑、删除观远 BI 指标,创建指标主题/指标目录,创建或配置指标树(含维度拆解、指标拆解公式、复合指标公式展开),批量标准化 Excel 指标模板,或管理指标公共维度时使用本 skill。查询指标详情、搜索指标、指标数据查询仍使用 guancli。
|
|
4
4
|
compatibility: "Requires Node.js 14+. Install via npm link (local) or npm install -g @guandata/guanmetric (from internal Nexus registry). CLI command: guanmetric."
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -18,12 +18,14 @@ guanmetric create --file atomic_metric.json --dry-run
|
|
|
18
18
|
guanmetric edit <metric_id> --file patch.json --dry-run
|
|
19
19
|
guanmetric delete <metric_id>
|
|
20
20
|
guanmetric public-dim create --file public_dim.json --dry-run
|
|
21
|
+
guanmetric metric-tree create 销售额指标树 --metric-id <metric_id> --parent-dir-id <metric_tree_dir_id> --dry-run
|
|
22
|
+
guanmetric metric-tree update-config <metric_tree_id> --file metric_tree_config.json --dry-run
|
|
21
23
|
guanmetric fetch POST /api/metric-platform/metrics/composite-metrics --file composite_metric.json
|
|
22
24
|
```
|
|
23
25
|
|
|
24
26
|
## 编辑红线:编辑 ≠ 删除重建
|
|
25
27
|
|
|
26
|
-
用户要求**编辑/重命名/修改**已有指标时,必须用 `guanmetric edit <metric_id>` 原地更新(默认按线上详情合并 patch,改名用 `--set name=新名`);公共维度用 `public-dim edit
|
|
28
|
+
用户要求**编辑/重命名/修改**已有指标时,必须用 `guanmetric edit <metric_id>` 原地更新(默认按线上详情合并 patch,改名用 `--set name=新名`);公共维度用 `public-dim edit`;指标树用 `metric-tree rename`、`metric-tree move` 或 `metric-tree update-config` 原地更新。**严禁**用"delete 后重新 create 一个同名指标/指标树"来模拟编辑或改名:指标 ID 被复合指标、衍生指标、指标卡片和指标树引用,删除重建会让这些引用全部断链,指标上的权限和历史配置也会丢失且无法恢复。指标树删除重建还会改变指标树 ID,导致归因入口、目录引用和外部链接失效。`delete` 只用于用户明确要求删除该指标本身。指标主题/目录目前只支持创建,不支持改名或删除;用户要求时直接说明 CLI 暂不支持,不要新建一个新主题/目录来替代。无论通过哪个命令或接口,都不得把"编辑"拆成"删除 + 重建"的组合来绕过这条红线。只有用户明确指示"先新建替代、再删除旧的"时才允许该流程,且执行前必须列出会断链和丢失的内容并获得确认。
|
|
27
29
|
|
|
28
30
|
批量创建指标时,必须先生成固定结构的标准 Excel 返回给用户确认;确认前不生成最终 payload,不提交真实创建。
|
|
29
31
|
|
|
@@ -42,6 +44,7 @@ guanmetric fetch POST /api/metric-platform/metrics/composite-metrics --file comp
|
|
|
42
44
|
生成衍生指标模板时,如果 `衍生自` 指标不是已明确存在的线上指标,而是本批也要创建的指标,必须在标准模板中补充对应的原子指标或复合指标行;信息不足时先补行并在该基础指标行的 `问题说明` 中列出缺失的数据集、来源字段、聚合方式、计算公式、适用维度等。不要等到创建计划阶段才临时新增基础指标。
|
|
43
45
|
|
|
44
46
|
`fetch` 只用于指标平台写入接口尚未封装为专用命令的场景,例如复合指标/衍生指标创建、编辑和影响校验;常规原子指标、主题、目录、公共维度优先使用专用命令。
|
|
47
|
+
指标树创建和修改已封装为 `metric-tree` 专用命令,优先使用专用命令,不要再用裸 `fetch` 直接调用指标树写接口。指标树父目录来自 `METRIC_TREE` 目录树,可用 `guancli metric_attribution tree -f json` 查询;不要把 `guancli metric tree` 返回的 `METRIC_PLATFORM` 指标目录 ID 当作指标树目录 ID。用户给出指标拆解公式时,按 `metric-tree-mutation.md` 解析成 `metricRelationTree`;遇到复合指标时读取指标详情中的 `formula`,按规则递归展开或在计划中标注不能无损展开的原因。
|
|
45
48
|
|
|
46
49
|
参考文档见本 skill 的 `references/` 目录:
|
|
47
50
|
|
|
@@ -51,3 +54,4 @@ guanmetric fetch POST /api/metric-platform/metrics/composite-metrics --file comp
|
|
|
51
54
|
- `metric-composite-mutation.md`
|
|
52
55
|
- `metric-derived-mutation.md`
|
|
53
56
|
- `metric-public-dimension.md`
|
|
57
|
+
- `metric-tree-mutation.md`
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
# 指标树创建 / 修改指引
|
|
2
|
+
|
|
3
|
+
本文用于指导 Agent 创建、配置和原地修改指标树。查询、搜索、归因分析仍优先使用 `guancli metric_attribution`;写操作使用 `guanmetric metric-tree`。
|
|
4
|
+
|
|
5
|
+
## 读取顺序
|
|
6
|
+
|
|
7
|
+
处理指标树需求时按需读取:
|
|
8
|
+
|
|
9
|
+
1. 先读本文,判断用户是创建壳、创建并配置维度拆解、创建并配置指标拆解、修改配置、改名、移动,还是目录管理。
|
|
10
|
+
2. 如果需要根指标或下级指标,读取 `metric-common-fields.md` 的环境、资源查询和通用字段规则。
|
|
11
|
+
3. 如果用户需要先创建根指标或子指标,再建指标树,按 `metric-mutation.md` 完成指标创建闭环,拿到指标 ID 后再回到本文。
|
|
12
|
+
4. 如果指标拆解里出现复合指标公式,读取 `metric-composite-mutation.md` 和 `metric-expression-rules.md`,理解 `formula` 中 `[metricId]` 的含义。
|
|
13
|
+
5. 只在最终提交时使用 `guanmetric metric-tree`;不要用裸 `fetch` 调指标树写接口。
|
|
14
|
+
|
|
15
|
+
## 能力边界
|
|
16
|
+
|
|
17
|
+
`guanmetric metric-tree` 覆盖:
|
|
18
|
+
|
|
19
|
+
- `create`:创建指标树。
|
|
20
|
+
- `get`:回读指标树详情。
|
|
21
|
+
- `rename`:原地更新指标树名称。
|
|
22
|
+
- `move`:原地移动指标树目录。
|
|
23
|
+
- `update-config`:原地更新指标树配置。
|
|
24
|
+
|
|
25
|
+
不要用删除重建模拟指标树编辑。指标树 ID 可能被归因入口、页面链接、目录和外部系统引用,删除重建会造成断链。
|
|
26
|
+
|
|
27
|
+
## 前端同款流程
|
|
28
|
+
|
|
29
|
+
`guandata-web` 前端创建指标树分两步:
|
|
30
|
+
|
|
31
|
+
1. 创建壳:选择根指标,提交 `{ metricId, parentDirId, name }` 到 `POST /api/metric-platform/metric-tree/add`。
|
|
32
|
+
2. 编辑配置:进入 `/metrics-store/hierarchy/{metricTreeId}/edit/dimension`,保存时提交 `{ name, config }` 到 `POST /api/metric-platform/metric-tree/{metricTreeId}/update-config`。
|
|
33
|
+
|
|
34
|
+
因此 Agent 推荐也按两阶段执行:先创建指标树壳,再按用户确认的配置执行 `update-config`。只有用户明确要求“创建时带完整 config”时,才在 create payload 中携带 `config`。
|
|
35
|
+
|
|
36
|
+
默认名称可模拟前端格式:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
未命名的指标树_YYYY_MM_DD_HH_mm_ss
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
默认配置应模拟前端初始化。根指标必须有时间维度;没有时间维度时不得创建指标树,应提示用户先为指标配置时间维度。未显式指定对比方式时,CLI 会默认生成同环比 + 日环比配置,并开启对比和贡献计算:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"timeComparisonSetting": {
|
|
47
|
+
"advType": "COMPARATIVE",
|
|
48
|
+
"advValue": {
|
|
49
|
+
"advType": "COMPARATIVE",
|
|
50
|
+
"dateFdId": "<root_metric_time_dim_fd_id>",
|
|
51
|
+
"dateFdName": "<root_metric_time_dim_name>",
|
|
52
|
+
"valueType": "RAWDATA",
|
|
53
|
+
"offset": 1,
|
|
54
|
+
"offsetType": "DAY",
|
|
55
|
+
"granularity": "DAY",
|
|
56
|
+
"window": {
|
|
57
|
+
"period": ["<today:YYYY-MM-DD>"],
|
|
58
|
+
"withMacro": false
|
|
59
|
+
},
|
|
60
|
+
"mode": "NORMAL"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"comparisonEnabled": true,
|
|
64
|
+
"contributionCalcEnabled": true,
|
|
65
|
+
"dimensionDecompositionContent": {
|
|
66
|
+
"decomposableDimensionIds": [],
|
|
67
|
+
"multipleDimensionEnabled": false,
|
|
68
|
+
"multipleDimensionList": [],
|
|
69
|
+
"nodeNum": 5,
|
|
70
|
+
"orderBy": "valueDesc",
|
|
71
|
+
"drillDownLevels": []
|
|
72
|
+
},
|
|
73
|
+
"metricDecompositionContent": {
|
|
74
|
+
"metricRelationTree": [
|
|
75
|
+
{
|
|
76
|
+
"metricId": "<root_metric_id>",
|
|
77
|
+
"parentId": null,
|
|
78
|
+
"operation": "",
|
|
79
|
+
"decomposeMode": "calculation"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"reportDisplaySetting": {
|
|
84
|
+
"conclusionSetting": null
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
如果根指标有时间维度,前端会初始化同环比 `timeComparisonSetting`。当前 CLI 已内置同款默认生成器:当提交的 config 未包含 `timeComparisonSetting` 或为 `null` 时,会基于根指标时间维度补齐默认配置,并把 `comparisonEnabled`、`contributionCalcEnabled` 置为 `true`。
|
|
90
|
+
|
|
91
|
+
## 意图判断
|
|
92
|
+
|
|
93
|
+
| 用户意图 | 判断 | 推荐流程 |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| 给某指标建一个指标树 | 只创建壳 | 查根指标、查 `METRIC_TREE` 目录、计划确认、create |
|
|
96
|
+
| 按地区/渠道拆某指标 | 维度拆解 | 查根指标适用维度、生成 config、create 后 update-config |
|
|
97
|
+
| A = B + C / A 拆成 B、C | 指标拆解计算模式 | 解析公式、查指标 ID、生成 `metricRelationTree` |
|
|
98
|
+
| A 关系拆解为 B、C | 指标拆解关系模式 | 生成 relation 模式,子节点 operation 为空 |
|
|
99
|
+
| 根指标或子指标是复合指标 | 自动读取复合公式 | 根据 `formula` 可控展开 |
|
|
100
|
+
| 打开贡献分析/贡献排序 | 时间对比 + 贡献计算 | 必须根指标时间配置合法 |
|
|
101
|
+
| 改名 | 原地重命名 | `metric-tree rename` |
|
|
102
|
+
| 移动目录 | 原地移动 | 查 `METRIC_TREE` 目录,`metric-tree move` |
|
|
103
|
+
| 重建同名指标树替换旧的 | 高风险 | 阻断并说明断链,除非用户明确二次确认 |
|
|
104
|
+
|
|
105
|
+
## 资源解析规则
|
|
106
|
+
|
|
107
|
+
使用当前已登录环境,不主动询问 profile;写操作前可执行:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
guancli auth status
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
根指标和下级指标:
|
|
114
|
+
|
|
115
|
+
- 有 ID:用 `guancli metric get <metric_id> --brief` 或 `-f json` 回读确认。
|
|
116
|
+
- 只有名称:用 `guancli metric search <keyword> -f json` 搜索;多候选必须让用户指定 ID。
|
|
117
|
+
- 需要配置维度、时间对比或复合指标展开时,必须用 `guancli metric get <metric_id> -f json` 读取完整详情。
|
|
118
|
+
|
|
119
|
+
指标树父目录来自 `METRIC_TREE` 目录体系:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
guancli metric_attribution tree -f json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
不要使用 `guancli metric tree` 返回的 `METRIC_PLATFORM` 指标目录 ID 创建指标树。只有目录名时,按路径唯一匹配;重复时必须让用户指定目录 ID。
|
|
126
|
+
|
|
127
|
+
## 维度拆解配置规则
|
|
128
|
+
|
|
129
|
+
维度拆解需要先读取根指标详情,确认 `applicableDims`、`publicDimensionMap` 和 `timeDim`。
|
|
130
|
+
|
|
131
|
+
规则:
|
|
132
|
+
|
|
133
|
+
- 拆解维度必须在根指标 `applicableDims` 中。
|
|
134
|
+
- 不要把根指标时间维度作为拆解维度。
|
|
135
|
+
- 交叉维度每组至少 2 个维度,最多 5 个维度。
|
|
136
|
+
- 交叉维度中的每个维度必须已经在 `decomposableDimensionIds` 中。
|
|
137
|
+
- `multipleDimensionEnabled=true` 时,至少保留一组合法交叉维度;长度小于等于 1 的组合应提前过滤并提示。
|
|
138
|
+
- `drillDownLevels` 统一写 `dimensionIds`,不要写历史 `dimensionId`。
|
|
139
|
+
- `nodeNum` 默认 5,合法范围 5-20。
|
|
140
|
+
- `orderBy` 默认 `valueDesc`。
|
|
141
|
+
- `contributionCalcEnabled=false` 时只允许 `valueAsc` 和 `valueDesc`。
|
|
142
|
+
- 关闭对比时必须同时关闭贡献计算。
|
|
143
|
+
- 关闭贡献计算时,贡献排序要降级:`contributionAsc -> valueAsc`,`contributionDesc -> valueDesc`。
|
|
144
|
+
|
|
145
|
+
## 时间对比和贡献计算
|
|
146
|
+
|
|
147
|
+
根指标没有时间维度时,不允许创建指标树;必须提示用户先为指标配置时间维度。
|
|
148
|
+
|
|
149
|
+
根指标已经是同环比衍生指标时,不要再配置时间对比。
|
|
150
|
+
|
|
151
|
+
如果启用贡献计算:
|
|
152
|
+
|
|
153
|
+
- 必须 `comparisonEnabled=true`。
|
|
154
|
+
- `timeComparisonSetting` 必须合法。
|
|
155
|
+
- 排序可使用 `contributionAsc` 或 `contributionDesc`。
|
|
156
|
+
|
|
157
|
+
如果用户只说“按贡献排序”,Agent 应解释该能力依赖时间对比和贡献计算,先确认时间配置。
|
|
158
|
+
|
|
159
|
+
## 指标拆解公式理解
|
|
160
|
+
|
|
161
|
+
用户可能直接给出自然语言公式,Agent 需要转换为 `metricDecompositionContent.metricRelationTree`。
|
|
162
|
+
|
|
163
|
+
示例输入:
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
销售额 = 订单数 * 客单价
|
|
167
|
+
利润 = 销售额 - 成本
|
|
168
|
+
转化率 = 下单人数 / 访问人数
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
处理流程:
|
|
172
|
+
|
|
173
|
+
1. 识别公式左侧父指标和右侧子指标。
|
|
174
|
+
2. 如果用户只给右侧,例如“按 B + C 拆 A”,父指标来自当前根指标或上下文。
|
|
175
|
+
3. 对公式中的每个指标名解析唯一指标 ID;不能按名称猜。
|
|
176
|
+
4. 构造关系树节点:
|
|
177
|
+
- 父节点必须存在。
|
|
178
|
+
- 第一个子节点 `operation` 为空。
|
|
179
|
+
- 第二个及之后子节点的 `operation` 取它前面的运算符。
|
|
180
|
+
5. 输出计划时展示用户公式、ID 公式和关系表。
|
|
181
|
+
|
|
182
|
+
公式:
|
|
183
|
+
|
|
184
|
+
```text
|
|
185
|
+
销售额 = 订单数 * 客单价
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
生成:
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
[
|
|
192
|
+
{
|
|
193
|
+
"metricId": "metric_sales",
|
|
194
|
+
"parentId": null,
|
|
195
|
+
"operation": "",
|
|
196
|
+
"decomposeMode": "calculation"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"metricId": "metric_orders",
|
|
200
|
+
"parentId": "metric_sales",
|
|
201
|
+
"operation": "",
|
|
202
|
+
"decomposeMode": "calculation"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"metricId": "metric_aov",
|
|
206
|
+
"parentId": "metric_sales",
|
|
207
|
+
"operation": "*",
|
|
208
|
+
"decomposeMode": "calculation"
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
关系拆解:
|
|
214
|
+
|
|
215
|
+
```text
|
|
216
|
+
销售额 关系拆解为 线上销售额、线下销售额
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
生成:
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
[
|
|
223
|
+
{
|
|
224
|
+
"metricId": "metric_sales",
|
|
225
|
+
"parentId": null,
|
|
226
|
+
"operation": "",
|
|
227
|
+
"decomposeMode": "relation"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"metricId": "metric_online_sales",
|
|
231
|
+
"parentId": "metric_sales",
|
|
232
|
+
"operation": "",
|
|
233
|
+
"decomposeMode": "calculation"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"metricId": "metric_offline_sales",
|
|
237
|
+
"parentId": "metric_sales",
|
|
238
|
+
"operation": "",
|
|
239
|
+
"decomposeMode": "calculation"
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 公式能力边界
|
|
245
|
+
|
|
246
|
+
前端指标树关系模型是“父节点 = 直接子指标按顺序四则运算”。因此:
|
|
247
|
+
|
|
248
|
+
- 支持 `A = B + C - D`、`A = B * C`、`A = B / C`。
|
|
249
|
+
- 支持多层级:对子指标继续配置子节点。
|
|
250
|
+
- 不要无损承诺任意括号优先级,例如 `A = (B + C) / D`。
|
|
251
|
+
|
|
252
|
+
遇到括号、常量、函数、条件表达式或窗口表达式时:
|
|
253
|
+
|
|
254
|
+
1. 如果括号内已有线上复合指标,例如 `X = B + C`,用 `X` 作为中间节点。
|
|
255
|
+
2. 如果没有中间指标,提示用户指标树不能完整表达该公式优先级,建议先创建中间复合指标。
|
|
256
|
+
3. 不要把 `A = (B + C) / D` 强行转成 `A = B + C / D`。
|
|
257
|
+
|
|
258
|
+
## 复合指标自动拆解
|
|
259
|
+
|
|
260
|
+
触发场景:
|
|
261
|
+
|
|
262
|
+
- 根指标本身是 `subType=COMPOSITE`。
|
|
263
|
+
- 用户公式中的某个子指标是复合指标。
|
|
264
|
+
- 用户明确说“按复合指标公式展开”。
|
|
265
|
+
|
|
266
|
+
处理规则:
|
|
267
|
+
|
|
268
|
+
1. 对每个参与指标执行 `guancli metric get <metric_id> -f json`。
|
|
269
|
+
2. 如果 `subType=COMPOSITE`,读取其 `formula` 字段。
|
|
270
|
+
3. 从 `formula` 中提取 `[metricId]` 引用和 `+ - * /` 运算符。
|
|
271
|
+
4. 把复合指标作为节点保留,再把公式引用指标作为它的子节点。
|
|
272
|
+
5. 递归处理公式里的复合指标。
|
|
273
|
+
6. 设置 `decomposeMode=calculation`。
|
|
274
|
+
7. 检测循环引用和重复路径;同一条路径中重复出现的指标必须停止展开并提示。
|
|
275
|
+
8. 默认最大递归深度为 3;超过时停止并在计划中标记“未展开,需要确认”。
|
|
276
|
+
|
|
277
|
+
根指标是复合指标:
|
|
278
|
+
|
|
279
|
+
```text
|
|
280
|
+
客单价(metric_aov) = 销售额(metric_sales) / 订单数(metric_orders)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
生成:
|
|
284
|
+
|
|
285
|
+
```json
|
|
286
|
+
[
|
|
287
|
+
{
|
|
288
|
+
"metricId": "metric_aov",
|
|
289
|
+
"parentId": null,
|
|
290
|
+
"operation": "",
|
|
291
|
+
"decomposeMode": "calculation"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"metricId": "metric_sales",
|
|
295
|
+
"parentId": "metric_aov",
|
|
296
|
+
"operation": "",
|
|
297
|
+
"decomposeMode": "calculation"
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"metricId": "metric_orders",
|
|
301
|
+
"parentId": "metric_aov",
|
|
302
|
+
"operation": "/",
|
|
303
|
+
"decomposeMode": "calculation"
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
注意:前端关系图用 `metricId` 作为节点 ID,同一指标 ID 多父节点可能产生展示冲突。对子复合指标展开时,如果会让同一指标出现在多个父节点下,推荐默认不展开该子复合指标,并在计划中说明。用户可选择:
|
|
309
|
+
|
|
310
|
+
- 不展开子复合指标,只保留复合指标节点。
|
|
311
|
+
- 展开子复合指标,但调整顶层公式,避免重复节点。
|
|
312
|
+
- 先创建新的中间指标或调整拆解公式。
|
|
313
|
+
|
|
314
|
+
## 指标树创建计划
|
|
315
|
+
|
|
316
|
+
创建计划确认前,不生成最终 config,不执行 dry-run,不真实写入。
|
|
317
|
+
|
|
318
|
+
计划至少包含:
|
|
319
|
+
|
|
320
|
+
- 当前环境。
|
|
321
|
+
- 指标树名称。
|
|
322
|
+
- 根指标:ID、名称、主题、时间维度、指标类型。
|
|
323
|
+
- 目标指标树目录:路径、ID。
|
|
324
|
+
- 维度拆解配置:拆解维度、交叉维度、下钻层级、展示个数、排序。
|
|
325
|
+
- 指标拆解配置:每条父子关系、模式、运算符、来源。
|
|
326
|
+
- 指标拆解来源:用户公式、复合指标公式、手工关系。
|
|
327
|
+
- 自动展开结果:展开了哪些复合指标,跳过了哪些复合指标,以及原因。
|
|
328
|
+
- 时间对比和贡献计算开关。
|
|
329
|
+
- 后续步骤:create dry-run、真实 create、update-config dry-run、真实 update-config、回读和可选归因查询。
|
|
330
|
+
|
|
331
|
+
关系表示例:
|
|
332
|
+
|
|
333
|
+
| 父指标 | 子指标 | 模式 | 运算符 | 来源 |
|
|
334
|
+
| --- | --- | --- | --- | --- |
|
|
335
|
+
| 销售额 | 订单数 | calculation | 空 | 用户公式 |
|
|
336
|
+
| 销售额 | 客单价 | calculation | * | 用户公式 |
|
|
337
|
+
| 客单价 | 商品单价 | calculation | 空 | 复合指标公式 |
|
|
338
|
+
| 客单价 | 购买件数 | calculation | * | 复合指标公式 |
|
|
339
|
+
|
|
340
|
+
## JSON 生成
|
|
341
|
+
|
|
342
|
+
建议生成两个 JSON。
|
|
343
|
+
|
|
344
|
+
`metric_tree_create.json`:
|
|
345
|
+
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"metricId": "<root_metric_id>",
|
|
349
|
+
"name": "<tree_name>",
|
|
350
|
+
"parentDirId": "<metric_tree_dir_id>"
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
`metric_tree_config.json`:
|
|
355
|
+
|
|
356
|
+
```json
|
|
357
|
+
{
|
|
358
|
+
"config": {
|
|
359
|
+
"timeComparisonSetting": null,
|
|
360
|
+
"comparisonEnabled": true,
|
|
361
|
+
"contributionCalcEnabled": true,
|
|
362
|
+
"dimensionDecompositionContent": {
|
|
363
|
+
"decomposableDimensionIds": ["fd-region", "fd-channel"],
|
|
364
|
+
"multipleDimensionEnabled": true,
|
|
365
|
+
"multipleDimensionList": [["fd-region", "fd-channel"]],
|
|
366
|
+
"nodeNum": 5,
|
|
367
|
+
"orderBy": "valueDesc",
|
|
368
|
+
"drillDownLevels": [
|
|
369
|
+
{
|
|
370
|
+
"dimensionIds": ["fd-region"]
|
|
371
|
+
}
|
|
372
|
+
]
|
|
373
|
+
},
|
|
374
|
+
"metricDecompositionContent": {
|
|
375
|
+
"metricRelationTree": [
|
|
376
|
+
{
|
|
377
|
+
"metricId": "metric-root",
|
|
378
|
+
"parentId": null,
|
|
379
|
+
"operation": "",
|
|
380
|
+
"decomposeMode": "calculation"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"metricId": "metric-child-1",
|
|
384
|
+
"parentId": "metric-root",
|
|
385
|
+
"operation": "",
|
|
386
|
+
"decomposeMode": "calculation"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"metricId": "metric-child-2",
|
|
390
|
+
"parentId": "metric-root",
|
|
391
|
+
"operation": "+",
|
|
392
|
+
"decomposeMode": "calculation"
|
|
393
|
+
}
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
"reportDisplaySetting": {
|
|
397
|
+
"conclusionSetting": null
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
如果只创建壳,不生成 config;若用户要求“Web 同款可编辑初始配置”,可生成默认 config 并执行 `update-config`。
|
|
404
|
+
|
|
405
|
+
## 执行顺序
|
|
406
|
+
|
|
407
|
+
创建:
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
guanmetric metric-tree create --file metric_tree_create.json --dry-run
|
|
411
|
+
guanmetric metric-tree create --file metric_tree_create.json
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
创建成功后拿到 `metricTreeId`。如果有配置:
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
guanmetric metric-tree update-config <metric_tree_id> --file metric_tree_config.json --dry-run
|
|
418
|
+
guanmetric metric-tree update-config <metric_tree_id> --file metric_tree_config.json
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
原地修改:
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
guanmetric metric-tree rename <metric_tree_id> 新名称 --dry-run
|
|
425
|
+
guanmetric metric-tree move <metric_tree_id> --parent-dir-id <metric_tree_dir_id> --dry-run
|
|
426
|
+
guanmetric metric-tree update-config <metric_tree_id> --file metric_tree_config.json --dry-run
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## 验证和回读
|
|
430
|
+
|
|
431
|
+
回读详情:
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
guanmetric metric-tree get <metric_tree_id>
|
|
435
|
+
guancli metric_attribution get <metric_tree_id> -f json
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
验证维度拆解:
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
guancli metric_attribution query <metric_tree_id> --target dim --dim <维度名>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
验证指标拆解:
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
guancli metric_attribution query <metric_tree_id> --target index
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
不要把 dry-run 成功描述成指标树已经创建或修改成功。只有真实写入并回读确认后,才能报告线上更新成功。
|
|
451
|
+
|
|
452
|
+
## 命令和接口速查
|
|
453
|
+
|
|
454
|
+
| 操作 | 命令 | 后端接口 |
|
|
455
|
+
| --- | --- | --- |
|
|
456
|
+
| 创建指标树 | `guanmetric metric-tree create` | `POST /api/metric-platform/metric-tree/add` |
|
|
457
|
+
| 回读指标树 | `guanmetric metric-tree get` | `GET /api/metric-platform/metric-tree/{id}` |
|
|
458
|
+
| 重命名 | `guanmetric metric-tree rename` | `POST /api/metric-platform/metric-tree/{id}/rename` |
|
|
459
|
+
| 移动 | `guanmetric metric-tree move` | `POST /api/metric-platform/metric-tree/{id}/move` |
|
|
460
|
+
| 更新配置 | `guanmetric metric-tree update-config` | `POST /api/metric-platform/metric-tree/{id}/update-config` |
|
|
461
|
+
| 查询目录树 | `guancli metric_attribution tree` | `GET /api/directory/METRIC_TREE/authorized-tree` |
|
|
462
|
+
|
|
463
|
+
## 后续 CLI 增强建议
|
|
464
|
+
|
|
465
|
+
当前 skill 可通过 `guancli` 查询、手写 JSON 和 `guanmetric metric-tree` 完成闭环。后续可考虑新增:
|
|
466
|
+
|
|
467
|
+
- `metric-tree dir-create`:封装 `METRIC_TREE` 目录创建。
|
|
468
|
+
- `metric-tree init-config <root_metric_id>`:按前端初始化逻辑生成默认 config。
|
|
469
|
+
- `metric-tree validate-config`:离线校验维度、交叉维度、指标关系树和时间对比开关。
|
|
470
|
+
- `metric-tree plan`:从简化 DSL 或用户公式生成 create/config JSON。
|