@guandata/guancli 1.0.38 → 1.0.40

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.
@@ -1,225 +0,0 @@
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
-
67
- 不要把 `AVG/MAX/MIN/FIRST/LAST/ANY_VALUE` 主动写进 `formulaField.fdFormula`;如果用户要平均值、最大值、最小值,优先走“来源字段 + `aggrType`”。表达式中字段必须写 `[fdId]`,不要提交字段中文名。
68
-
69
- ### 计算表达式确认
70
-
71
- 遇到计算表达式时,不要直接替用户决定创建原子表达式还是复合指标。先说明两种方案并询问:
72
-
73
- - 原子表达式:直接在当前数据集字段上生成 `formulaField.fdFormula`。
74
- - 复合指标:先创建或复用表达式中的基础原子指标,再用 `[metricId]` 公式创建复合指标。
75
-
76
- 用户选择复合指标后,再拆解基础度量。例如 `SUM([attributed_sales_fd]) / SUM([spend_amount_fd])` 可先创建或复用“归因销售额”“广告花费”两个原子指标,再创建复合指标:
77
-
78
- ```text
79
- [metric_attributed_sales] / [metric_ad_spend]
80
- ```
81
-
82
- 用户选择原子表达式,或明确要求“数据集字段表达式原子指标”时,才使用 `formulaField.fdFormula`。
83
-
84
- ## 信息收集
85
-
86
- 如果用户只说“帮我创建一个原子指标”,先收集:
87
-
88
- 1. 指标主题和保存目录。
89
- 2. 来源数据集和来源字段。
90
- 3. 计算方式:来源字段 + 聚合方式,还是表达式;如果是表达式,先询问用户是否改用复合指标。用户选择原子表达式时,再按 `metric-expression-rules.md` 校验支持形态。
91
- 4. 指标名称、业务口径、适用维度、时间维度、是否保存并上线。
92
- 5. 数据格式:默认、数值、货币、百分比;如需指定,确认小数位、千分位、货币符号/前后缀、数量级单位、百分比是否除以 100。
93
- 6. 责任人是否用当前登录用户。
94
- 7. 指标业务属性中启用且必填的 `bizAttrs`。
95
-
96
- ## JSON 模板:字段聚合
97
-
98
- ```json
99
- {
100
- "projectId": "<metric_project_id>",
101
- "subType": "ATOMIC",
102
- "dsId": "<ds_id>",
103
- "name": "订购金额",
104
- "engName": "order_amount",
105
- "fdId": "<source_fd_id>",
106
- "aggrType": "SUM",
107
- "applicableDims": ["<dim_fd_id_1>", "<dim_fd_id_2>"],
108
- "timeDim": "<time_dim_fd_id>",
109
- "format": {
110
- "formatType": "CURRENCY",
111
- "decimalPlaces": 2,
112
- "useThousandsSeparator": true,
113
- "prefix": "¥",
114
- "prefixUnit": null,
115
- "showPrefixUnit": true,
116
- "suffix": ""
117
- },
118
- "desc": "统计订单明细中的订购金额总和,用于分析销售规模。",
119
- "parentDirId": "<metric_dir_id>",
120
- "businessOwner": "<user_id>",
121
- "publish": false
122
- }
123
- ```
124
-
125
- 没有时间维度时删除 `timeDim`;没有英文名称时删除 `engName`;未指定数据格式时删除 `format` 或传 `{}`。
126
-
127
- ## JSON 模板:表达式
128
-
129
- ```json
130
- {
131
- "projectId": "<metric_project_id>",
132
- "subType": "ATOMIC",
133
- "dsId": "<ds_id>",
134
- "name": "含税销售额",
135
- "formulaField": {
136
- "fdFormula": "SUM([fd_amount]) + SUM([fd_tax])"
137
- },
138
- "applicableDims": ["<dim_fd_id_1>", "<dim_fd_id_2>"],
139
- "format": {
140
- "formatType": "NUMBER",
141
- "decimalPlaces": 2,
142
- "useThousandsSeparator": true,
143
- "prefixUnit": null,
144
- "showPrefixUnit": true,
145
- "prefix": "",
146
- "suffix": ""
147
- },
148
- "desc": "销售金额与税额之和。",
149
- "parentDirId": "<metric_dir_id>",
150
- "businessOwner": "<user_id>",
151
- "publish": false
152
- }
153
- ```
154
-
155
- ## 创建步骤
156
-
157
- 1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、来源数据集/字段、聚合方式或表达式、适用维度/时间维度、格式、业务属性和保存方式。
158
- 2. 用户确认计划后,生成 `/tmp/atomic_metric.json`。
159
- 3. 先 dry-run:
160
-
161
- ```bash
162
- guancli metric create --file /tmp/atomic_metric.json --dry-run
163
- ```
164
-
165
- 4. 按 `metric-common-fields.md` 向用户摘要并确认。
166
- 5. 如果 `publish=true`,先跑 save-precheck:
167
-
168
- ```bash
169
- guancli fetch POST /api/metric-platform/metrics/atomic-metrics/save-precheck --stdin < /tmp/atomic_metric.json
170
- ```
171
-
172
- 6. 如果返回 `conflicts` 且非空,展示冲突指标、冲突口径、适用维度差异,等待用户二次确认。
173
- 7. 校验通过或二次确认后提交:
174
-
175
- ```bash
176
- guancli metric create --file /tmp/atomic_metric.json -f json
177
- ```
178
-
179
- 8. 响应返回指标 ID 后回读:
180
-
181
- ```bash
182
- guancli metric get <metric_id> --brief
183
- ```
184
-
185
- ## 编辑步骤
186
-
187
- 编辑原子指标时复用 Web 顺序:必要时先口径冲突校验,再影响校验,最后提交。
188
-
189
- 1. 读取当前详情:
190
-
191
- ```bash
192
- guancli metric get <metric_id> -f json
193
- ```
194
-
195
- 2. 生成 patch 或完整 payload,先 dry-run:
196
-
197
- ```bash
198
- guancli metric edit <metric_id> --file /tmp/atomic_metric_update.json --dry-run
199
- ```
200
-
201
- 3. 如果 `publish=true`,调用 save-precheck。编辑态请求体需要带 `metricId`:
202
-
203
- ```bash
204
- guancli fetch POST /api/metric-platform/metrics/atomic-metrics/save-precheck --stdin < /tmp/atomic_metric_update_precheck.json
205
- ```
206
-
207
- 其中 precheck JSON 等于编辑 payload 加:
208
-
209
- ```json
210
- { "metricId": "<metric_id>" }
211
- ```
212
-
213
- 4. 如果存在 `conflicts`,展示后等待二次确认。
214
- 5. 调用编辑影响校验:
215
-
216
- ```bash
217
- guancli fetch POST /api/metric-platform/metrics/atomic-metrics/<metric_id>/validate-update-impact --stdin < /tmp/atomic_metric_update.json
218
- ```
219
-
220
- 6. 如果返回 `hasChanged=true` 且 `affectedMetrics` 或 `affectedCards` 非空,展示影响并等待二次确认。
221
- 7. 提交真实编辑:
222
-
223
- ```bash
224
- guancli metric edit <metric_id> --file /tmp/atomic_metric_update.json -f json
225
- ```
@@ -1,168 +0,0 @@
1
- # 指标通用配置
2
-
3
- 本文记录原子指标、复合指标、衍生指标共享的写操作规则、通用字段和业务属性处理方式。处理任一指标创建/编辑任务时,都应先读取本文,再读取对应类型文档。
4
-
5
- ## 环境与查询
6
-
7
- - 默认使用用户当前已登录环境,不询问“创建到哪个 profile”。可先执行 `guancli auth status` 确认登录态。
8
- - 只有用户明确指定其它环境时,才统一追加 `--profile <profile>`。
9
- - 用户只给中文名称时,先查询并展示候选;查不到或有多个候选再向用户确认。
10
- - 常用查询:
11
- - 指标主题:`guancli metric project [keyword] -f json`
12
- - 指标目录:`guancli metric tree -f json`
13
- - 指标:`guancli metric search <keyword> -f json`
14
- - 指标详情:`guancli metric get <metric_id> --brief`
15
- - 数据集:`guancli ds search <keyword>`、`guancli ds get <dsId> --brief`
16
-
17
- ## 通用字段
18
-
19
- | 字段 | 中文 | 适用范围 | 说明 |
20
- | --- | --- | --- | --- |
21
- | `projectId` | 主题 ID | 创建/编辑 | 指标所属主题 |
22
- | `subType` | 指标类型 | 创建/编辑 | `ATOMIC`、`COMPOSITE`、`DERIVED` |
23
- | `name` | 指标名称 | 创建/编辑 | 最长 50;仅中文、字母、数字、下划线 |
24
- | `engName` | 英文名称 | 可选 | 最长 50;仅字母、数字、下划线 |
25
- | `desc` | 业务口径 | 创建/编辑 | 最长 1000;必须能解释业务含义 |
26
- | `format` | 数据格式 | 可选 | 指标数值展示格式;省略或传 `{}` 表示默认格式 |
27
- | `parentDirId` | 保存至/所属文件夹 | 创建必填 | 指标目录 ID |
28
- | `businessOwner` | 责任人 | 创建必填 | 用户 ID,默认可用当前登录用户 |
29
- | `publish` | 保存方式 | 创建/编辑 | `true` 保存并上线;`false` 保存为草稿 |
30
- | `bizMetricId` | 关联业务字典 ID | 可选 | 关联后业务口径/业务属性通常会同步 |
31
- | `bizAttrs` | 业务属性 | 条件必填 | 由环境中的指标属性配置决定 |
32
- | `filter` | 业务限定/筛选 | 可选或条件必填 | 业务限定衍生指标必填 |
33
- | `dynamicParameters` | 动态参数默认值 | 可选 | 表达式或最近 N 配置引用动态参数时使用 |
34
-
35
- ## 数据格式 `format`
36
-
37
- `format` 是指标数值的展示格式,创建和编辑原子指标、复合指标、衍生指标时都可设置。保存指标时写入 Web 表单使用的 UI 配置,不要写转换后的 d3 `specifier`、Excel format 或预览接口返回值。
38
-
39
- 省略 `format` 或传 `{}` 表示使用默认格式。用户没有明确要求时,不要为了补全字段强行设置格式;用户提到“保留两位小数”“显示百分比”“人民币”“万元”“不要千分位”“加后缀”等,再按下面字段生成。
40
-
41
- | 字段 | 中文 | 说明 |
42
- | --- | --- | --- |
43
- | `formatType` | 格式类型 | `NUMBER` 数值、`CURRENCY` 货币、`PERCENTAGE` 百分比、`ADVANCED` 高级自定义 |
44
- | `decimalPlaces` | 小数位数 | `null` 表示 0 位;也可传 `1` 到 `15` |
45
- | `useThousandsSeparator` | 是否使用千分位 | `true/false` |
46
- | `prefix` | 前缀/货币符号 | 货币常用 `¥`、`$`、`€`、`£`;后端兼容旧字段 `currencySymbol`,新建优先写 `prefix` |
47
- | `suffix` | 后缀 | 如 `元`、`人`、`单`、`次`;没有则省略或传空字符串 |
48
- | `prefixUnit` | 数量级单位 | `null` 无,`K`、`M`、`万`、`亿` 或 `auto` 自动 |
49
- | `showPrefixUnit` | 是否展示数量级单位 | 数值/货币格式可用;`prefixUnit=auto` 时应为 `true` |
50
- | `divideDataBy` | 百分比是否除以 100 | 百分比格式可用;`1` 适合底层值是比例小数如 `0.85`,`100` 适合底层值已是百分数如 `85` |
51
- | `customFormat` | 高级自定义格式 | `formatType=ADVANCED` 时使用;除非用户给出现成格式串,否则不要主动生成 |
52
- | `suffixSizePercent` | 后缀字号比例 | 部分卡片展示场景使用,指标创建/编辑通常不需要 |
53
-
54
- 常用模板:
55
-
56
- ```jsonc
57
- // 默认格式:省略 format 或传 {}
58
- "format": {}
59
-
60
- // 数值:千分位,保留 2 位小数
61
- "format": {
62
- "formatType": "NUMBER",
63
- "decimalPlaces": 2,
64
- "useThousandsSeparator": true,
65
- "prefixUnit": null,
66
- "showPrefixUnit": true,
67
- "prefix": "",
68
- "suffix": ""
69
- }
70
-
71
- // 货币:人民币,千分位,保留 2 位小数
72
- "format": {
73
- "formatType": "CURRENCY",
74
- "decimalPlaces": 2,
75
- "useThousandsSeparator": true,
76
- "prefix": "¥",
77
- "prefixUnit": null,
78
- "showPrefixUnit": true,
79
- "suffix": ""
80
- }
81
-
82
- // 百分比:底层值为 0.85 时展示为 85.00%
83
- "format": {
84
- "formatType": "PERCENTAGE",
85
- "decimalPlaces": 2,
86
- "divideDataBy": 1,
87
- "useThousandsSeparator": false,
88
- "prefix": "",
89
- "suffix": ""
90
- }
91
-
92
- // 百分比:底层值为 85 时展示为 85.00%
93
- "format": {
94
- "formatType": "PERCENTAGE",
95
- "decimalPlaces": 2,
96
- "divideDataBy": 100,
97
- "useThousandsSeparator": false,
98
- "prefix": "",
99
- "suffix": ""
100
- }
101
-
102
- // 数值:按万元展示
103
- "format": {
104
- "formatType": "NUMBER",
105
- "decimalPlaces": 2,
106
- "useThousandsSeparator": true,
107
- "prefixUnit": "万",
108
- "showPrefixUnit": true,
109
- "prefix": "",
110
- "suffix": "元"
111
- }
112
- ```
113
-
114
- ## 业务属性 `bizAttrs`
115
-
116
- `bizAttrs` 是管理员配置的指标自定义业务属性,不是固定字段。创建或编辑指标前读取当前环境配置:
117
-
118
- ```bash
119
- guancli fetch GET /api/metric-attr-config
120
- ```
121
-
122
- 响应关键字段:
123
-
124
- | 字段 | 中文 | 说明 |
125
- | --- | --- | --- |
126
- | `id` | 属性 ID | 写入 `bizAttrs[].id` |
127
- | `name` | 属性名称 | 用于向用户提问 |
128
- | `description` | 属性描述 | 可作为输入提示 |
129
- | `valueType` | 属性值类型 | `ENUM_SINGLE`、`ENUM_MULTIPLE`、`TEXT`、`TEXT_AREA` |
130
- | `defaultValue` | 默认值 | 用户未指定且允许默认时可采用 |
131
- | `optionValue` | 枚举选项 | 枚举单选/多选必须从这里选择 |
132
- | `required` | 是否必填 | `true` 且 `enabled=true` 时必须收集 |
133
- | `enabled` | 是否启用 | 只处理启用的属性 |
134
-
135
- 处理规则:
136
-
137
- - 只展示和写入 `enabled=true` 的属性;其中 `required=true` 是必填项。
138
- - `ENUM_SINGLE`:`values` 只能有一个值,且必须来自 `optionValue`。
139
- - `ENUM_MULTIPLE`:`values` 可以有多个值,且都必须来自 `optionValue`。
140
- - `TEXT`:写入 `values[0]`,Web 单项最大 50 个字符。
141
- - `TEXT_AREA`:写入 `values[0]`,Web 单项最大 200 个字符。
142
- - 如果关联了业务字典 `bizMetricId`,业务口径和业务属性通常由业务字典同步;仍需确认最终 payload 中 `desc` 和 `bizAttrs` 已有值。
143
-
144
- 示例:
145
-
146
- ```json
147
- "bizAttrs": [
148
- { "id": "attr_region", "values": ["华东"] },
149
- { "id": "attr_tags", "values": ["销售", "核心"] },
150
- { "id": "attr_owner_note", "values": ["用于经营分析月报"] }
151
- ]
152
- ```
153
-
154
- ## 保存与确认
155
-
156
- - 先输出“指标创建计划”让用户 review;计划确认前不生成最终提交 JSON,不执行真实创建。
157
- - 用户确认计划后,再生成 JSON 文件并做 dry-run 或人工摘要,不直接提交。
158
- - 计划/摘要至少包含:当前环境、主题、目录、指标类型、名称、核心计算方式、依赖顺序、复用/新建指标、适用维度/时间维度、数据格式、业务属性、保存方式。
159
- - 如果适用维度中存在时间字段但时间维度为空,计划必须标记为待确认,不能继续提交。
160
- - 用户确认后按类型执行 save-precheck 或 validate-update-impact。
161
- - 如果校验返回冲突或影响下游资源,展示冲突指标、受影响指标、受影响卡片,并等待二次确认。
162
- - 写入成功后回读 `guancli metric get <metric_id> --brief`。
163
-
164
- ## 发布状态判断
165
-
166
- - 用户说“先别上线”“保存草稿”:`publish=false`。
167
- - 用户说“直接上线”“发布”:`publish=true`,提交前提醒会创建或更新在线指标。
168
- - 不要把 `publish=true` 自动当成用户已经确认所有冲突;冲突/影响校验仍需要单独二次确认。
@@ -1,158 +0,0 @@
1
- # 复合指标创建与编辑
2
-
3
- 复合指标用于通过公式组合已有指标,例如“客单价 = 销售额 / 订单数”。
4
-
5
- ## 触发场景
6
-
7
- - 用户说“创建复合指标”“基于多个指标算一个指标”。
8
- - 用户描述的口径是已有指标之间的四则运算。
9
- - 用户给出数据集字段计算表达式后,确认希望先创建/复用基础原子指标,再创建复合指标。
10
- - 用户要编辑一个 `subType=COMPOSITE` 的指标。
11
-
12
- ## 创建必填信息
13
-
14
- | 字段 | 中文 | 说明 |
15
- | --- | --- | --- |
16
- | `projectId` | 主题 ID | 指标所属主题 |
17
- | `subType` | 指标类型 | 固定 `COMPOSITE` |
18
- | `name` | 指标名称 | 最长 50 |
19
- | `formula` | 计算公式 | 使用已有指标 ID,形如 `[metric_sales] / [metric_orders]` |
20
- | `useExpressionMetricCommonDims` | 是否沿用公式指标共有维度 | Web 默认 `true` |
21
- | `applicableDims` | 适用维度 | 引用指标的共有维度字段 ID 数组;手动选择时不能为空 |
22
- | `desc` | 业务口径 | 最长 1000 |
23
- | `parentDirId` | 保存至/所属文件夹 | 创建时需要 |
24
- | `businessOwner` | 责任人 | 创建时需要 |
25
- | `publish` | 保存方式 | `true` 上线,`false` 草稿 |
26
-
27
- 专属可选字段:
28
-
29
- | 字段 | 中文 | 说明 |
30
- | --- | --- | --- |
31
- | `timeDim` | 时间维度 | 最终适用维度中存在时间字段时选择一个 |
32
-
33
- 通用可选字段见 `metric-common-fields.md`。
34
-
35
- ## 公式与引用指标
36
-
37
- 复合指标公式在最终 payload 中使用指标 ID,而不是指标中文名:
38
-
39
- ```text
40
- [metric_sales_amount] / [metric_order_count]
41
- ```
42
-
43
- 处理规则:
44
-
45
- - 涉及复合指标 `formula` 时,先读取 `metric-expression-rules.md`。
46
- - 先用 `guancli metric search <关键词> -d <projectId> -f json` 查询公式中的指标,再用 `guancli metric get <metric_id> --brief` 核对名称、类型、状态和适用维度。
47
- - 如果用户只提供数据集字段级公式,先询问是否要创建复合指标。用户确认后,再识别公式里的基础度量,创建或复用基础原子指标,并把公式改写为 `[metricId]`。
48
- - 公式只能引用数值型指标;不要引用当前正在编辑的指标本身。
49
- - 公式支持 `+`、`-`、`*`、`/`、括号、数字和 `[指标ID]`;不要主动生成函数、窗口函数或 SQL 片段。
50
- - 公式中的 `[xxx]` 会被后端解析为上游指标 ID,并参与循环引用校验。
51
- - 如果用户用中文名描述公式,先转换成 ID 公式,再把“中文公式”和“ID 公式”都展示给用户确认。
52
-
53
- 用户确认创建复合指标后的字段公式改写示例:
54
-
55
- | 用户口径 | 建模方式 |
56
- | --- | --- |
57
- | `SUM([销售额字段]) / COUNT([订单ID字段])` | 先建“销售额”“订单数”原子指标,再建复合指标 `[metric_sales] / [metric_order_count]` |
58
- | `SUM([归因销售额字段]) / SUM([广告花费字段])` | 先建“归因销售额”“广告花费”原子指标,再建复合指标 ROAS |
59
- | `SUM([点击量字段]) / SUM([曝光量字段])` | 先建“点击量”“曝光量”原子指标,再建复合指标 CTR |
60
- | `COUNT(CASE WHEN ... THEN 1 ELSE NULL END) / COUNT([ID字段])` | 先判断分子是否应建为条件计数原子指标或业务限定衍生指标,再创建复合比率指标 |
61
-
62
- ## 适用维度
63
-
64
- 复合指标的适用维度来自公式中引用指标的共有维度:
65
-
66
- - `useExpressionMetricCommonDims=true`:沿用表达式中指标的共用维度。需要根据引用指标详情整理共有维度;如果没有共有维度,Web 会报“计算公式来源指标无共有适用维度,请检查”。
67
- - `useExpressionMetricCommonDims=false`:从共有维度中手动选择 `applicableDims`,至少选择一个。
68
- - 如果最终适用维度中有时间类型字段,需要选择一个 `timeDim`。
69
- - 不要把某个上游指标独有的维度写进 `applicableDims`。
70
-
71
- ## 信息收集
72
-
73
- 如果用户只说“帮我创建一个复合指标”,先收集:
74
-
75
- 1. 指标主题和保存目录。
76
- 2. 公式中要引用哪些已有指标;中文名先搜索确认唯一指标。
77
- 3. 计算公式,转换成 `[metric_id]` 形式。
78
- 4. 是否沿用共有维度;如果手动选择,确认具体维度和时间维度。
79
- 5. 数据格式:默认、数值、货币、百分比;如需指定,确认小数位、千分位、货币符号/前后缀、数量级单位、百分比是否除以 100。
80
- 6. 指标名称、业务口径、是否保存并上线。
81
- 7. 责任人和必填 `bizAttrs`。
82
-
83
- ## JSON 模板
84
-
85
- ```json
86
- {
87
- "projectId": "<metric_project_id>",
88
- "subType": "COMPOSITE",
89
- "name": "客单价",
90
- "engName": "avg_order_value",
91
- "formula": "[<sales_amount_metric_id>] / [<order_count_metric_id>]",
92
- "useExpressionMetricCommonDims": true,
93
- "applicableDims": ["<common_dim_fd_id_1>", "<common_dim_fd_id_2>"],
94
- "timeDim": "<time_dim_fd_id>",
95
- "format": {
96
- "formatType": "NUMBER",
97
- "decimalPlaces": 2,
98
- "useThousandsSeparator": true,
99
- "prefixUnit": null,
100
- "showPrefixUnit": true,
101
- "prefix": "",
102
- "suffix": ""
103
- },
104
- "desc": "销售金额除以订单数,用于衡量平均每笔订单贡献的销售额。",
105
- "parentDirId": "<metric_dir_id>",
106
- "businessOwner": "<user_id>",
107
- "publish": false
108
- }
109
- ```
110
-
111
- 没有时间维度时删除 `timeDim`;没有英文名称时删除 `engName`;未指定数据格式时删除 `format` 或传 `{}`。如需业务属性,按 `metric-common-fields.md` 补充 `bizAttrs`。
112
-
113
- ## 创建步骤
114
-
115
- `guancli metric create` 当前是原子指标专用 endpoint;复合指标创建使用 `guancli fetch`。
116
-
117
- 1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、将复用或新建的基础指标、复合公式、共有适用维度/时间维度、格式、业务属性和保存方式。
118
- 2. 用户确认计划后,生成 `/tmp/composite_metric.json`。
119
- 3. 本地/人工检查 JSON、公式引用指标、共有适用维度、必填业务属性。
120
- 4. 按 `metric-common-fields.md` 向用户摘要并确认。
121
- 5. 用户确认后,不调用原子指标 `save-precheck`;复合指标 Web 创建没有 save-precheck。
122
- 6. 提交真实创建:
123
-
124
- ```bash
125
- guancli fetch POST /api/metric-platform/metrics/composite-metrics --stdin < /tmp/composite_metric.json
126
- ```
127
-
128
- 7. 响应返回指标 ID 后回读:
129
-
130
- ```bash
131
- guancli metric get <metric_id> --brief
132
- ```
133
-
134
- ## 编辑步骤
135
-
136
- 复合指标没有原子指标的 save-precheck;主要校验公式或筛选变化是否影响下游指标/卡片。
137
-
138
- 1. 读取当前详情:
139
-
140
- ```bash
141
- guancli metric get <metric_id> -f json
142
- ```
143
-
144
- 2. 基于当前详情生成完整编辑 payload,例如 `/tmp/composite_metric_update.json`。至少包含 `projectId`、`subType`、`name`、`formula`、`useExpressionMetricCommonDims`、`applicableDims`、`desc`、`publish`。
145
- 3. 如果修改了 `formula` 或 `filter`,先调用影响校验:
146
-
147
- ```bash
148
- guancli fetch POST /api/metric-platform/metrics/composite-metrics/<metric_id>/validate-update-impact --stdin < /tmp/composite_metric_update.json
149
- ```
150
-
151
- 4. 如果返回 `hasChanged=true` 且 `affectedMetrics` 或 `affectedCards` 非空,展示受影响指标和卡片,等待用户二次确认。
152
- 5. 提交真实编辑:
153
-
154
- ```bash
155
- guancli fetch POST /api/metric-platform/metrics/composite-metrics/<metric_id> --stdin < /tmp/composite_metric_update.json
156
- ```
157
-
158
- 6. 保存后回读确认。
@@ -1,70 +0,0 @@
1
- # 指标删除
2
-
3
- 指标删除适用于原子指标、复合指标、衍生指标和快捷引用指标。删除流程是通用的,不需要按指标类型走不同 endpoint。
4
-
5
- ## Web 同款行为
6
-
7
- Web 的单指标删除弹窗会先做删除影响校验:
8
-
9
- ```bash
10
- guancli fetch GET /api/metric-platform/metrics/<metric_id>/validate-delete-impact
11
- ```
12
-
13
- 响应结构与编辑影响校验一致:
14
-
15
- | 字段 | 中文 | 说明 |
16
- | --- | --- | --- |
17
- | `hasChanged` | 是否存在变更影响 | 删除校验通常为 `true` |
18
- | `affectedMetrics` | 下游指标 | 仍引用该指标的指标列表 |
19
- | `affectedCards` | 下游指标卡片 | 仍引用该指标的卡片列表 |
20
-
21
- 如果 `affectedMetrics` 或 `affectedCards` 非空,Web 会提示“指标已被以下资源使用,暂无法删除”,只允许用户查看影响并关闭弹窗,不会提交删除。
22
-
23
- 只有影响列表为空时,Web 才展示“删除后无法恢复”的确认弹窗;用户确认后调用:
24
-
25
- ```bash
26
- guancli fetch POST /api/metric-platform/metrics/<metric_id>/delete
27
- ```
28
-
29
- ## CLI 推荐流程
30
-
31
- 优先使用封装命令:
32
-
33
- ```bash
34
- guancli metric delete <metric_id>
35
- ```
36
-
37
- 该命令默认只执行删除影响校验并输出结果,不会真实删除。输出 `deletable=true` 时,再向用户确认“删除后无法恢复”。
38
-
39
- 用户明确确认后执行:
40
-
41
- ```bash
42
- guancli metric delete <metric_id> --confirm
43
- ```
44
-
45
- `--confirm` 也会先重新执行删除影响校验;如果此时发现下游指标或卡片,仍然阻断删除,不会调用 delete 接口。
46
-
47
- ## 信息收集
48
-
49
- 如果用户只说“帮我删除一个指标”,先收集或查询:
50
-
51
- 1. 指标 ID;如果只给名称,先用 `guancli metric search <关键词> -f json` 查候选。
52
- 2. 用 `guancli metric get <metric_id> --brief` 核对指标名称、类型、主题、目录和状态。
53
- 3. 运行 `guancli metric delete <metric_id>` 查看删除影响。
54
- 4. 如果可删除,向用户确认删除对象和“删除后无法恢复”。
55
- 5. 用户明确确认后执行 `guancli metric delete <metric_id> --confirm`。
56
-
57
- ## 影响展示
58
-
59
- 影响校验返回下游资源时,需要向用户展示:
60
-
61
- - 下游指标:`id`、`name`、`subType`;若有 `linkMetricId`,说明是快捷引用关联的原始指标。
62
- - 下游卡片:`id`、`name`。
63
-
64
- 存在下游资源时不要提供 `--confirm` 继续删除的建议;应提示用户先调整或删除引用关系。
65
-
66
- ## 常见判断
67
-
68
- - 删除是不可恢复操作,即使 `publish=false` 的草稿也要明确确认。
69
- - 不要把“删除影响校验通过”说成已经删除成功。
70
- - 删除成功后可尝试 `guancli metric get <metric_id> --brief` 或重新搜索确认资源已不可见;如果后端返回已删除/不存在,视为删除完成。