@wubaoqi/guancopilot 0.0.0-stage → 0.2.0
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/NOTICE.md +17 -0
- package/README.md +146 -2
- package/assets/coreutils.wasm +0 -0
- package/assets/find.wasm +0 -0
- package/assets/guanbi.wasm +4 -0
- package/assets/guancli.wasm +0 -0
- package/assets/guanhelm.wasm +0 -0
- package/assets/jq.wasm +0 -0
- package/assets/openskills.wasm +0 -0
- package/assets/rg.wasm +0 -0
- package/assets/sed.wasm +0 -0
- package/bin/guancopilot +0 -0
- package/bin/guanvm +0 -0
- package/bin/platforms.cjs +6 -0
- package/bin/run.cjs +39 -0
- package/bin/runtime.cjs +44 -0
- package/licenses/Go-LICENSE +27 -0
- package/licenses/browser-_speed-highlight_core-LICENSE +121 -0
- package/licenses/browser-_speed-highlight_core-package.json +14 -0
- package/licenses/browser-dompurify-LICENSE +202 -0
- package/licenses/browser-dompurify-LICENSE-MPL +373 -0
- package/licenses/browser-dompurify-package.json +10 -0
- package/licenses/browser-marked-LICENSE +44 -0
- package/licenses/browser-marked-package.json +10 -0
- package/licenses/coreutils-LICENSE +18 -0
- package/licenses/findutils-LICENSE +18 -0
- package/licenses/github.com_BurntSushi_toml_v1.6.0-COPYING +21 -0
- package/licenses/github.com_dustin_go-humanize_v1.0.1-LICENSE +21 -0
- package/licenses/github.com_google_jsonschema-go_v0.4.3-LICENSE +21 -0
- package/licenses/github.com_google_uuid_v1.6.0-LICENSE +27 -0
- package/licenses/github.com_jackc_pgpassfile_v1.0.0-LICENSE +22 -0
- package/licenses/github.com_jackc_pgservicefile_v0.0.0-20240606120523-5a60cdf6a761-LICENSE +22 -0
- package/licenses/github.com_jackc_pgx_v5_v5.11.0-LICENSE +22 -0
- package/licenses/github.com_jackc_puddle_v2_v2.2.2-LICENSE +22 -0
- package/licenses/github.com_mattn_go-isatty_v0.0.20-LICENSE +9 -0
- package/licenses/github.com_modelcontextprotocol_go-sdk_v1.8.0-LICENSE +216 -0
- package/licenses/github.com_ncruces_go-strftime_v1.0.0-LICENSE +21 -0
- package/licenses/github.com_remyoudompheng_bigfft_v0.0.0-20230129092748-24d4a6f8daec-LICENSE +27 -0
- package/licenses/github.com_santhosh-tekuri_jsonschema_v6_v6.0.3-LICENSE +175 -0
- package/licenses/github.com_segmentio_asm_v1.1.3-LICENSE +21 -0
- package/licenses/github.com_segmentio_encoding_v0.5.4-LICENSE +21 -0
- package/licenses/github.com_tetratelabs_wazero_v1.12.0-LICENSE +201 -0
- package/licenses/github.com_tetratelabs_wazero_v1.12.0-NOTICE +2 -0
- package/licenses/github.com_yosida95_uritemplate_v3_v3.0.2-LICENSE +25 -0
- package/licenses/golang.org_x_image_v0.44.0-LICENSE +27 -0
- package/licenses/golang.org_x_net_v0.58.0-LICENSE +27 -0
- package/licenses/golang.org_x_oauth2_v0.36.0-LICENSE +27 -0
- package/licenses/golang.org_x_sync_v0.22.0-LICENSE +27 -0
- package/licenses/golang.org_x_sys_v0.47.0-LICENSE +27 -0
- package/licenses/golang.org_x_text_v0.41.0-LICENSE +27 -0
- package/licenses/golang.org_x_time_v0.15.0-LICENSE +27 -0
- package/licenses/guanbi-skills-LICENSE +133 -0
- package/licenses/guanbi-skills-LICENSE.README.md +28 -0
- package/licenses/guanbi-skills-LICENSE.zh-CN +82 -0
- package/licenses/jq-COPYING +176 -0
- package/licenses/modernc.org_libc_v1.73.4-LICENSE +27 -0
- package/licenses/modernc.org_libc_v1.73.4-LICENSE-3RD-PARTY.md +305 -0
- package/licenses/modernc.org_mathutil_v1.7.1-LICENSE +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-GO +27 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-LOGO +1 -0
- package/licenses/modernc.org_memory_v1.11.0-LICENSE-MMAP-GO +25 -0
- package/licenses/modernc.org_sqlite_v1.53.0-LICENSE +26 -0
- package/licenses/mvdan.cc_sh_v3_v3.13.1-LICENSE +27 -0
- package/licenses/ripgrep-COPYING +3 -0
- package/licenses/ripgrep-LICENSE-MIT +21 -0
- package/licenses/sed-LICENSE +21 -0
- package/manifest.json +972 -0
- package/package.json +30 -4
- package/plugin/guancopilot.js +193 -0
- package/skills-bundle/.guanvm-skills-bundle +0 -0
- package/skills-bundle/_recipes/dashboard/gates/page_check.js +16 -0
- package/skills-bundle/_recipes/dashboard/gates/report_check.js +4 -0
- package/skills-bundle/_recipes/dashboard/knowledge/01.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/02.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/03.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/04.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/05.md +1 -0
- package/skills-bundle/_recipes/dashboard/knowledge/06.md +1 -0
- package/skills-bundle/_recipes/dashboard/template.json +41 -0
- package/skills-bundle/_recipes/etl/gates/etl_live_check.js +10 -0
- package/skills-bundle/_recipes/etl/gates/etl_report_check.js +3 -0
- package/skills-bundle/_recipes/etl/knowledge/01.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/02.md +9 -0
- package/skills-bundle/_recipes/etl/knowledge/03.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/04.md +1 -0
- package/skills-bundle/_recipes/etl/knowledge/05.md +1 -0
- package/skills-bundle/_recipes/etl/template.json +39 -0
- package/skills-bundle/_recipes/hints.json +46 -0
- package/skills-bundle/guancli/.commandface.json +155 -0
- package/skills-bundle/guancli/SKILL.md +342 -0
- package/skills-bundle/guancli/evals/evals.json +156 -0
- package/skills-bundle/guancli/evals/fixtures/metric-candidate-empty-search.json +13 -0
- package/skills-bundle/guancli/evals/fixtures/metric-candidate-prior-request.json +13 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-columns.json +46 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-metadata.json +36 -0
- package/skills-bundle/guancli/evals/fixtures/metric-consumption-query.json +18 -0
- package/skills-bundle/guancli/references/analysis-primitives.md +95 -0
- package/skills-bundle/guancli/references/auth-and-config.md +131 -0
- package/skills-bundle/guancli/references/examples/metric-date-in.json +7 -0
- package/skills-bundle/guancli/references/examples/metric-query-rows.py +83 -0
- package/skills-bundle/guancli/references/examples/metric-query.sh +6 -0
- package/skills-bundle/guancli/references/form-chatbi.md +199 -0
- package/skills-bundle/guancli/references/gateway.md +148 -0
- package/skills-bundle/guancli/references/metric-batch-query.md +82 -0
- package/skills-bundle/guancli/references/metric-commands.md +562 -0
- package/skills-bundle/guancli/references/metric-generic-query.md +215 -0
- package/skills-bundle/guancli/references/metric-json-migration.md +18 -0
- package/skills-bundle/guancli/references/metric-query-recipes.md +358 -0
- package/skills-bundle/guancli/references/preview-and-output.md +192 -0
- package/skills-bundle/guancli/references/resource-query.md +101 -0
- package/skills-bundle/guands/SKILL.md +281 -0
- package/skills-bundle/guands/references/calc-fields-boundaries-and-pitfalls.md +160 -0
- package/skills-bundle/guands/references/command-reference.md +267 -0
- package/skills-bundle/guands/references/incremental-and-schedule.md +157 -0
- package/skills-bundle/guands/references/workflows.md +256 -0
- package/skills-bundle/guanetl/SKILL.md +391 -0
- package/skills-bundle/guanetl/evals/evals.json +41 -0
- package/skills-bundle/guanetl/references/ETL_AI_DEVELOP.md +456 -0
- package/skills-bundle/guanmetric/SKILL.md +144 -0
- package/skills-bundle/guanmetric/evals/evals.json +117 -0
- package/skills-bundle/guanmetric/evals/fixtures/atomic-detail-read-model.json +18 -0
- package/skills-bundle/guanmetric/evals/fixtures/confirmed-template-summary.json +12 -0
- package/skills-bundle/guanmetric/evals/fixtures/create-result-unknown-state.json +13 -0
- package/skills-bundle/guanmetric/evals/forward-eval-2026-09-21.json +62 -0
- package/skills-bundle/guanmetric/references/metric-api-contract-examples.json +690 -0
- package/skills-bundle/guanmetric/references/metric-api-contract.schema.json +349 -0
- package/skills-bundle/guanmetric/references/metric-api-contracts.md +436 -0
- package/skills-bundle/guanmetric/references/metric-atomic-mutation.md +238 -0
- package/skills-bundle/guanmetric/references/metric-batch-status.md +71 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract-examples.json +53 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract.schema.json +26 -0
- package/skills-bundle/guanmetric/references/metric-business-dictionary.md +76 -0
- package/skills-bundle/guanmetric/references/metric-common-fields.md +246 -0
- package/skills-bundle/guanmetric/references/metric-composite-mutation.md +165 -0
- package/skills-bundle/guanmetric/references/metric-delete-mutation.md +70 -0
- package/skills-bundle/guanmetric/references/metric-derived-mutation.md +453 -0
- package/skills-bundle/guanmetric/references/metric-excel-template.md +365 -0
- package/skills-bundle/guanmetric/references/metric-expression-rules.md +146 -0
- package/skills-bundle/guanmetric/references/metric-flow-generate-example.json +79 -0
- package/skills-bundle/guanmetric/references/metric-flow-generate.schema.json +93 -0
- package/skills-bundle/guanmetric/references/metric-flow.md +218 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract-examples.json +171 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract.schema.json +167 -0
- package/skills-bundle/guanmetric/references/metric-hierarchy-api-contracts.md +193 -0
- package/skills-bundle/guanmetric/references/metric-mutation.md +155 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract-examples.json +62 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract.schema.json +47 -0
- package/skills-bundle/guanmetric/references/metric-public-dimension.md +155 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contract-examples.json +277 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contract.schema.json +263 -0
- package/skills-bundle/guanmetric/references/metric-tree-api-contracts.md +53 -0
- package/skills-bundle/guanmetric/references/metric-tree-mutation.md +500 -0
- package/skills-bundle/guanmetric/references/metric-validation-ownership.md +74 -0
- package/skills-bundle/guanvis/SKILL.md +333 -0
- package/skills-bundle/guanvis/evals/china_map/card_01_basic_map.js +13 -0
- package/skills-bundle/guanvis/evals/china_map/card_02_world_map.js +10 -0
- package/skills-bundle/guanvis/evals/china_map/card_03_point_map.js +12 -0
- package/skills-bundle/guanvis/evals/china_map/page.js +10 -0
- package/skills-bundle/guanvis/evals/china_map/schema.js +10 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/README.md +30 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/card_01_comparative_mvp.js +72 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/verify_default_roundtrip.sh +92 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/card_01_monthly.js +63 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/page.js +6 -0
- package/skills-bundle/guanvis/evals/complex_report_pro/schema.js +6 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/card_01_bar.js +13 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/card_02_pie.js +13 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/bar.js +11 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/pie.js +15 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/page.js +5 -0
- package/skills-bundle/guanvis/evals/custom_chart_echarts/schema.js +9 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/card_01_level_nodes.js +19 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.css +51 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.html +1 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.js +28 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/page.js +5 -0
- package/skills-bundle/guanvis/evals/custom_chart_sdk/schema.js +7 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/card_01_dynamic_dataset.js +20 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/card_02_dynamic_metric_chart.js +16 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/metrics.js +19 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/page.js +9 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/schema.js +7 -0
- package/skills-bundle/guanvis/evals/dynamic_fields/verify_default_roundtrip.sh +137 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/README.md +26 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_01_percentage_advcalc.js +44 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_02_scroll_percentage.js +12 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/README.md +28 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/card_01_rank_advcalc.js +59 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/verify_default_roundtrip.sh +135 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/README.md +15 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/card_01_running_total_advcalc.js +74 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/page.js +6 -0
- package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/schema.js +22 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_01_revenue_column.js +10 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_02_trend_line.js +9 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_03_kpi.js +6 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_04_pie.js +9 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/card_05_calc_field_test.js +12 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/page.js +11 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/schema.js +14 -0
- package/skills-bundle/guanvis/evals/sales_dashboard/selector_01_region.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_01_column_split.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_02_line_split.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/card_03_combo_split.js +11 -0
- package/skills-bundle/guanvis/evals/split_charts/page.js +10 -0
- package/skills-bundle/guanvis/evals/split_charts/schema.js +14 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_00_total_revenue.js +6 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_01_revenue.js +10 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_02_trend.js +9 -0
- package/skills-bundle/guanvis/evals/tab_layout/card_03_story.js +11 -0
- package/skills-bundle/guanvis/evals/tab_layout/page.js +23 -0
- package/skills-bundle/guanvis/evals/tab_layout/schema.js +11 -0
- package/skills-bundle/guanvis/evals/tab_layout/selector_01_region.js +8 -0
- package/skills-bundle/guanvis/references/api-reference.md +476 -0
- package/skills-bundle/guanvis/references/builder-reference.md +1676 -0
- package/skills-bundle/guanvis/references/chart-properties.md +2101 -0
- package/skills-bundle/guanvis/references/checkout-editing.md +53 -0
- package/skills-bundle/guanvis/references/complex-report-pro-patterns.md +398 -0
- package/skills-bundle/guanvis/references/dir-and-page-management.md +48 -0
- package/skills-bundle/guanvis/references/metric-chart-reference.md +258 -0
- package/skills-bundle/guanvis/references/publish-and-constraints.md +60 -0
- package/skills-bundle/guanvis/references/selector-reference.md +431 -0
- package/skills-bundle/guanvis/references/tableau-migration.md +73 -0
- package/skills-bundle/guanvis/references/theme.md +123 -0
- package/skills-bundle/guanvis/references/troubleshooting.md +25 -0
- package/skills-bundle/guanvis/references/validation-and-chart-patterns.md +205 -0
- package/skills-bundle/guanwf/SKILL.md +543 -0
- package/skills-bundle/guanwf/references/ETL_AI_DEVELOP.md +456 -0
- package/skills-bundle/guanwf/references/TASK_NODE_CONTRACTS.md +64 -0
- package/skills-bundle/guanwf/references/WORKFLOW_DSL.md +536 -0
- package/skills-bundle/guanwf/references/WORKFLOW_NODES.md +166 -0
- package/skills-bundle/js/SKILL.md +145 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# 指标批量上线 / 下线
|
|
2
|
+
|
|
3
|
+
## 命令
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# 重复 --id
|
|
7
|
+
guanmetric batch online --id metric_1 --id metric_2 --dry-run
|
|
8
|
+
guanmetric batch offline --id metric_1 --id metric_2 --dry-run
|
|
9
|
+
|
|
10
|
+
# JSON 文件;与 --id 互斥
|
|
11
|
+
guanmetric batch online --file metric_ids.json --dry-run
|
|
12
|
+
guanmetric batch offline --file metric_ids.json --dry-run
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`metric_ids.json`:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{"ids":["metric_1","metric_2"]}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
输入顺序会保留,重复 ID 按首次出现去重。至少需要一个非空 ID。
|
|
22
|
+
|
|
23
|
+
## 执行语义
|
|
24
|
+
|
|
25
|
+
### 批量上线
|
|
26
|
+
|
|
27
|
+
服务端没有批量上线端点。CLI 按输入顺序对每个指标执行:
|
|
28
|
+
|
|
29
|
+
1. `GET /api/metric-platform/metrics/{id}?fromDraft=true` 读取草稿。
|
|
30
|
+
2. 根据 `subType` 识别 `ATOMIC`、`COMPOSITE` 或 `DERIVED`,将详情映射为对应完整更新请求并设置 `publish=true`。
|
|
31
|
+
3. 原子指标调用 `POST /api/metric-platform/metrics/atomic-metrics/{id}/save-precheck`。
|
|
32
|
+
4. 调用对应类型的 `POST /api/metric-platform/metrics/{type}/{id}/validate-update-impact`。
|
|
33
|
+
5. 调用对应类型的 `POST /api/metric-platform/metrics/{type}/{id}` 原地更新。
|
|
34
|
+
|
|
35
|
+
快捷引用指标没有可编辑草稿,不支持上线。save-precheck 发现口径冲突、或影响校验发现下游资源时,该项默认返回 `blocked`,不提交更新;用户看过汇总并明确确认后,才可追加 `--confirm`。`--confirm` 只越过这两类客户端确认门禁,不绕过服务端权限、资源状态、审批或业务校验。
|
|
36
|
+
|
|
37
|
+
### 批量下线
|
|
38
|
+
|
|
39
|
+
CLI 按输入顺序逐项调用 `POST /api/metric-platform/metrics/{id}/offline`,以便为每个 ID 返回准确结果。BI 后端另有 `POST /api/metric-platform/metrics/batchOffline`,但其失败响应只聚合错误,无法提供稳定的 ID 级失败映射;两者的业务语义均为 best-effort,部分成功不回滚。
|
|
40
|
+
|
|
41
|
+
### 完整性、顺序与一致性
|
|
42
|
+
|
|
43
|
+
- completeness:每个去重后的输入 ID 恰好产生一个 `items` 结果。
|
|
44
|
+
- ordering:串行执行并保持输入顺序;依赖指标需由调用者按基础指标到下游指标排序。
|
|
45
|
+
- consistency:不是事务;某项失败不会回滚先前成功项,命令继续处理后续项。
|
|
46
|
+
- failure:存在 `failed`,或上线存在 `blocked` 时,JSON 仍完整输出,但进程以非零状态退出。
|
|
47
|
+
- approval:更新请求被服务端接受不代表最终已经上线;启用审批时应等待审批并回读状态。
|
|
48
|
+
|
|
49
|
+
## JSON 机器契约
|
|
50
|
+
|
|
51
|
+
新增契约版本为 `schemaVersion: "1.0"`,顶层固定字段:
|
|
52
|
+
|
|
53
|
+
- `operation`: `online` 或 `offline`
|
|
54
|
+
- `dryRun`: 是否仅规划
|
|
55
|
+
- `requested`: 去重后的输入数
|
|
56
|
+
- `succeeded` / `failed` / `blocked` / `planned`: 各状态计数
|
|
57
|
+
- `items`: 与输入同序的逐项结果
|
|
58
|
+
|
|
59
|
+
逐项 `status` 为 `planned`、`succeeded`、`failed` 或 `blocked`;`stage` 标识失败或阻断阶段。`message` 是人类诊断文案,不作为稳定错误码解析;`detail` 保留服务端预检或影响数据。新增后端字段不会改变顶层固定契约。
|
|
60
|
+
|
|
61
|
+
## Domain and Contract / PAT
|
|
62
|
+
|
|
63
|
+
权威路由来自 `guandata-core` 的 `MetricManagementNgController`:
|
|
64
|
+
|
|
65
|
+
- `GET /metric-platform/metrics/{id}`:`METRIC_PLATFORM.READ`
|
|
66
|
+
- `POST /metric-platform/metrics/{id}/offline`:`METRIC_PLATFORM.UPDATE`
|
|
67
|
+
- `POST /metric-platform/metrics/{type}/{id}`:`METRIC_PLATFORM.UPDATE`
|
|
68
|
+
- `POST /metric-platform/metrics/atomic-metrics/{id}/save-precheck`:`METRIC_PLATFORM.UPDATE`
|
|
69
|
+
- `POST /metric-platform/metrics/{type}/{id}/validate-update-impact`:`METRIC_PLATFORM.UPDATE`
|
|
70
|
+
|
|
71
|
+
客户端路径统一增加 `/api`,由代理剥离。PAT scope 目录 `modules/server/resources/cli_pat_scope.json` 中 `metric_platform` 默认包含 `read`、`update`,覆盖上述操作;真实环境仍需用同一用户的登录态与 PAT 分别验证有权、无权和资源不存在,以及写入后的回读结果。
|
package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract-examples.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0",
|
|
3
|
+
"source": {
|
|
4
|
+
"environment": "test153",
|
|
5
|
+
"capturedAt": "2026-09-21",
|
|
6
|
+
"authentication": "account-password",
|
|
7
|
+
"note": "由隔离临时业务字典真实 CRUD 请求采集后脱敏;PAT 未验证,示例 ID 不可用于调用。"
|
|
8
|
+
},
|
|
9
|
+
"createRequest": {"name": "销售额", "desc": "订单实付金额汇总", "dirId": "business_dir_root", "bizAttrs": []},
|
|
10
|
+
"createResponse": {"result": "ok", "response": "business_dictionary_example"},
|
|
11
|
+
"updateRequest": {"name": "含税销售额", "desc": "订单含税实付金额汇总", "dirId": "business_dir_root", "bizAttrs": []},
|
|
12
|
+
"updateResponse": {"result": "ok", "response": "business_dictionary_example"},
|
|
13
|
+
"detailResponse": {
|
|
14
|
+
"result": "ok",
|
|
15
|
+
"response": {
|
|
16
|
+
"id": "business_dictionary_example",
|
|
17
|
+
"domId": "example_domain",
|
|
18
|
+
"dirId": "business_dir_root",
|
|
19
|
+
"name": "含税销售额",
|
|
20
|
+
"desc": "订单含税实付金额汇总",
|
|
21
|
+
"bizAttrs": [],
|
|
22
|
+
"creator": "user_example",
|
|
23
|
+
"creatorName": "示例用户",
|
|
24
|
+
"ctime": "2026-09-21 14:04:11",
|
|
25
|
+
"utime": "2026-09-21 14:04:30",
|
|
26
|
+
"associatedMetrics": []
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"listResponse": {
|
|
30
|
+
"result": "ok",
|
|
31
|
+
"response": {
|
|
32
|
+
"list": [{
|
|
33
|
+
"id": "business_dictionary_example",
|
|
34
|
+
"domId": "example_domain",
|
|
35
|
+
"dirId": "business_dir_root",
|
|
36
|
+
"name": "含税销售额",
|
|
37
|
+
"desc": "订单含税实付金额汇总",
|
|
38
|
+
"bizAttrs": [],
|
|
39
|
+
"creator": "user_example",
|
|
40
|
+
"creatorName": "示例用户",
|
|
41
|
+
"ctime": "2026-09-21 14:04:11",
|
|
42
|
+
"utime": "2026-09-21 14:04:30",
|
|
43
|
+
"associatedMetrics": []
|
|
44
|
+
}],
|
|
45
|
+
"total": 1
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"treeResponse": {
|
|
49
|
+
"result": "ok",
|
|
50
|
+
"response": {"children": [{"dirId": "business_dir_root", "dirName": "根目录", "parentDirId": "", "children": []}]}
|
|
51
|
+
},
|
|
52
|
+
"deleteResponse": {"result": "ok", "response": true}
|
|
53
|
+
}
|
package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract.schema.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://guandata.example/schemas/metric-business-dictionary-api-contract.schema.json",
|
|
4
|
+
"title": "GuanData metric business dictionary API contracts",
|
|
5
|
+
"$defs": {
|
|
6
|
+
"nonEmptyString": {"type": "string", "minLength": 1},
|
|
7
|
+
"bizAttr": {"type": "object", "required": ["id", "values"], "properties": {"id": {"type": "string"}, "values": {"type": "array", "items": {"type": "string"}}}, "additionalProperties": true},
|
|
8
|
+
"writeRequest": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"required": ["name", "desc"],
|
|
11
|
+
"properties": {"name": {"$ref": "#/$defs/nonEmptyString"}, "desc": {"type": "string"}, "dirId": {"type": "string"}, "bizAttrs": {"type": "array", "items": {"$ref": "#/$defs/bizAttr"}}},
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
},
|
|
14
|
+
"mutationResponse": {"type": "object", "required": ["result", "response"], "properties": {"result": {"const": "ok"}, "response": {"$ref": "#/$defs/nonEmptyString"}}, "additionalProperties": true},
|
|
15
|
+
"dictionary": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["id", "domId", "name", "desc", "bizAttrs", "creator", "creatorName", "ctime", "utime", "associatedMetrics"],
|
|
18
|
+
"properties": {"id": {"type": "string"}, "domId": {"type": "string"}, "dirId": {"type": "string"}, "name": {"type": "string"}, "desc": {"type": "string"}, "bizAttrs": {"type": "array"}, "creator": {"type": "string"}, "creatorName": {"type": "string"}, "ctime": {"type": "string"}, "utime": {"type": "string"}, "associatedMetrics": {"type": "array"}},
|
|
19
|
+
"additionalProperties": true
|
|
20
|
+
},
|
|
21
|
+
"detailResponse": {"type": "object", "required": ["result", "response"], "properties": {"result": {"const": "ok"}, "response": {"$ref": "#/$defs/dictionary"}}, "additionalProperties": true},
|
|
22
|
+
"listResponse": {"type": "object", "required": ["result", "response"], "properties": {"result": {"const": "ok"}, "response": {"type": "object", "required": ["list", "total"], "properties": {"list": {"type": "array", "items": {"$ref": "#/$defs/dictionary"}}, "total": {"type": "number"}}, "additionalProperties": true}}, "additionalProperties": true},
|
|
23
|
+
"treeResponse": {"type": "object", "required": ["result", "response"], "properties": {"result": {"const": "ok"}, "response": {"type": "object", "required": ["children"], "properties": {"children": {"type": "array"}}, "additionalProperties": true}}, "additionalProperties": true},
|
|
24
|
+
"deleteResponse": {"type": "object", "required": ["result", "response"], "properties": {"result": {"const": "ok"}, "response": {"type": "boolean"}}, "additionalProperties": true}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 业务字典管理
|
|
2
|
+
|
|
3
|
+
业务字典在后端接口和代码中也称 `BusinessMetric`,CLI 使用面向产品语义的命令名 `business-dict`,并兼容 `business-metric`、`biz-dict` 别名。
|
|
4
|
+
|
|
5
|
+
构造或解析请求和响应前先读取 `metric-business-dictionary-api-contract-examples.json` 与 `metric-business-dictionary-api-contract.schema.json`。样例于 2026-09-21 在 test153 使用隔离临时业务字典和账号密码认证完成 create、detail/list、edit、delete 后脱敏;PAT 尚未验证。仓库测试会按 Schema 校验真实快照的必需字段和类型,同时允许后端新增可选字段。
|
|
6
|
+
|
|
7
|
+
真实响应外层统一为 `{ "result": "ok", "response": ... }`:创建和编辑成功时 `response` 是业务字典 ID 字符串;详情包含 `id/domId/dirId/name/desc/bizAttrs/creator/creatorName/ctime/utime/associatedMetrics`;搜索返回 `response.list/total`;删除成功返回布尔值。详情是读模型,编辑只白名单提交 `name/desc/dirId/bizAttrs`。
|
|
8
|
+
|
|
9
|
+
## 查询
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
guanmetric business-dict list
|
|
13
|
+
guanmetric business-dict list 销售 --order-by utimeDesc
|
|
14
|
+
guanmetric business-dict list --desc 收入 --dir-id <dir_id>
|
|
15
|
+
guanmetric business-dict list --associated
|
|
16
|
+
guanmetric business-dict list --associated=false
|
|
17
|
+
guanmetric business-dict list --biz-attr region=华东,华南 --biz-attr channel=直营
|
|
18
|
+
guanmetric business-dict list -f table
|
|
19
|
+
guanmetric business-dict get <business_dict_id>
|
|
20
|
+
guanmetric business-dict tree
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
搜索接口无分页,`list` 返回全部匹配项。支持的排序为 `nameAsc`、`nameDesc`、`ctimeAsc`、`ctimeDesc`、`utimeAsc`、`utimeDesc`。`--associated` 仅查已关联指标的字典,显式传 `--associated=false` 仅查未关联字典;不传时不按关联状态过滤。
|
|
24
|
+
|
|
25
|
+
业务属性搜索中,文本类属性由服务端执行不区分大小写的包含匹配,枚举类属性执行精确匹配。禁用或不存在的属性由服务端返回业务错误;不可搜索的属性不会匹配结果,通常表现为空列表。
|
|
26
|
+
|
|
27
|
+
## 新建
|
|
28
|
+
|
|
29
|
+
请求体字段:
|
|
30
|
+
|
|
31
|
+
| 字段 | 必填 | 说明 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `name` | 是 | 名称;trim 后不能为空、同域唯一、最长 250 字符 |
|
|
34
|
+
| `desc` | 是 | 业务口径 |
|
|
35
|
+
| `dirId` | 否 | `BUSINESS_METRIC` 目录 ID;用 `business-dict tree` 查询 |
|
|
36
|
+
| `bizAttrs` | 否 | `[{"id":"<attr_id>","values":["<value>"]}]` |
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
guanmetric business-dict create --file business_dict.json --dry-run
|
|
40
|
+
guanmetric business-dict create --file business_dict.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
示例请求体:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"name": "销售额",
|
|
48
|
+
"desc": "订单实付金额汇总,不含退款",
|
|
49
|
+
"dirId": "dir_xxx",
|
|
50
|
+
"bizAttrs": [
|
|
51
|
+
{"id": "attr_region", "values": ["华东"]}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 编辑
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
guanmetric business-dict edit <business_dict_id> --set name=含税销售额 --dry-run
|
|
60
|
+
guanmetric business-dict edit <business_dict_id> --file patch.json
|
|
61
|
+
guanmetric business-dict edit <business_dict_id> --file full.json --replace
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
默认会先读取线上详情,只保留 `name`、`desc`、`dirId`、`bizAttrs` 四个可提交字段,再合并 patch 并原地更新。`--replace` 仅用于调用方已经提供完整请求体的场景。严禁通过删除后新建同名字典模拟编辑。
|
|
65
|
+
|
|
66
|
+
## 删除
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
guanmetric business-dict delete <business_dict_id>
|
|
70
|
+
guanmetric business-dict delete <business_dict_id> --confirm
|
|
71
|
+
guanmetric business-dict delete <business_dict_id> --confirm --dry-run
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
第一次执行只读取详情,展示是否存在 `associatedMetric`,不提交删除。追加 `--confirm` 后才调用删除接口。
|
|
75
|
+
|
|
76
|
+
删除采用逻辑删除。如果字典已关联指标,服务端会先清空正式指标与草稿中的 `bizMetricId`,并把字典的 `desc` 和 `bizAttrs` 留存在指标上,再删除字典。该行为不同于“有依赖即阻断删除”,所以确认提示必须明确说明解除关联和保留字段的影响。
|
|
@@ -0,0 +1,246 @@
|
|
|
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
|
+
`guanmetric create/edit` 和指标定义类 `fetch POST` 会在提交前统一校验 `name`、`engName`、`desc`;标准 Excel 的原子、复合、衍生指标行使用相同规则。长度按 Web 表单的 JavaScript UTF-16 计数语义计算,因此 emoji 等非 BMP 字符计为 2,避免 CLI 校验通过但 Web 编辑页报超长。
|
|
36
|
+
|
|
37
|
+
## 筛选条件 `filter`(WebFilterData)
|
|
38
|
+
|
|
39
|
+
原子指标筛选、复合指标筛选、衍生指标业务限定和查询加速筛选共用同一套 `WebFilterData` 协议。合法节点只有:
|
|
40
|
+
|
|
41
|
+
| `type` | `value` | 说明 |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `condition` | 字段筛选对象 | 规范化后必须包含 `dsId`、`fdId`、`name`、`fdType`、`metaType`、`filterType`;按筛选类型提供 `filterValue` |
|
|
44
|
+
| `operator` | `and` 或 `or` | 只能出现在 `composition.value` 的两个条件节点之间 |
|
|
45
|
+
| `composition` | WebFilterData 数组 | 按“条件、运算符、条件”交替排列;同一 composition 内运算符必须一致,可递归嵌套 |
|
|
46
|
+
|
|
47
|
+
CLI 接受可无损转换的 `not: true` 作为兼容输入,但提交前会将其改写成明确的反向筛选类型,例如 `IN` 改为 `NI`、`CONTAINS` 改为 `NOT_CONTAINS`;组合节点按德摩根定律展开。Web 编辑器不会可靠读取节点上的 `not` 字段,因此规范化后的请求始终使用 `not: false`。遇到没有明确反向类型的条件(例如区间 `BT`)时,CLI 会拒绝提交,避免保存后语义与回显不一致。
|
|
48
|
+
|
|
49
|
+
单条件示例:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
"filter": {
|
|
53
|
+
"type": "condition",
|
|
54
|
+
"not": false,
|
|
55
|
+
"value": {
|
|
56
|
+
"dsId": "ds_sales",
|
|
57
|
+
"fdId": "fd_region",
|
|
58
|
+
"name": "区域",
|
|
59
|
+
"fdType": "STRING",
|
|
60
|
+
"metaType": "DIM",
|
|
61
|
+
"filterType": "IN",
|
|
62
|
+
"filterValue": ["华东"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
嵌套条件示例,表示“区域属于华东,并且(城市为空或城市包含杭州)”:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
"filter": {
|
|
71
|
+
"type": "composition",
|
|
72
|
+
"not": false,
|
|
73
|
+
"value": [
|
|
74
|
+
{
|
|
75
|
+
"type": "condition",
|
|
76
|
+
"not": false,
|
|
77
|
+
"value": { "dsId": "ds_sales", "fdId": "fd_region", "name": "区域", "fdType": "STRING", "metaType": "DIM", "filterType": "IN", "filterValue": ["华东"] }
|
|
78
|
+
},
|
|
79
|
+
{ "type": "operator", "value": "and" },
|
|
80
|
+
{
|
|
81
|
+
"type": "composition",
|
|
82
|
+
"not": false,
|
|
83
|
+
"value": [
|
|
84
|
+
{
|
|
85
|
+
"type": "condition",
|
|
86
|
+
"not": false,
|
|
87
|
+
"value": { "dsId": "ds_sales", "fdId": "fd_city", "name": "城市", "fdType": "STRING", "metaType": "DIM", "filterType": "IS_NULL", "filterValue": [] }
|
|
88
|
+
},
|
|
89
|
+
{ "type": "operator", "value": "or" },
|
|
90
|
+
{
|
|
91
|
+
"type": "condition",
|
|
92
|
+
"not": false,
|
|
93
|
+
"value": { "dsId": "ds_sales", "fdId": "fd_city", "name": "城市", "fdType": "STRING", "metaType": "DIM", "filterType": "CONTAINS", "filterValue": ["杭州"] }
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
禁止使用下面这类其它系统的分组结构:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{ "type": "group", "value": { "combineType": "AND", "conditions": [] } }
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
后端可能宽松接收这类 JSON,但 Web 指标编辑器只识别 `condition/operator/composition`,保存后会出现业务限定不回显。条件的 `fdId` 还必须存在于当前可筛选字段中:原子指标使用数据集字段;业务限定衍生指标使用基础指标 `applicableDims`。指标编辑和业务限定写入会优先从指标详情补齐缺少的字段元数据;查询加速条件必须自行提供完整元数据。
|
|
108
|
+
|
|
109
|
+
兼容输入会在提交前规范化:`EMPTY -> IS_NULL`、`NOT_EMPTY -> NOT_NULL`、`LIKE -> CONTAINS`、`NOT_LIKE -> NOT_CONTAINS`。`IS_NULL/NOT_NULL` 必须携带空数组 `filterValue: []`;其它普通筛选类型必须携带非空数组。不要把这些兼容别名直接写进最终请求。
|
|
110
|
+
|
|
111
|
+
## 数据格式 `format`
|
|
112
|
+
|
|
113
|
+
`format` 是指标数值的展示格式,创建和编辑原子指标、复合指标、衍生指标时都可设置。保存指标时写入 Web 表单使用的 UI 配置,不要写转换后的 d3 `specifier`、Excel format 或预览接口返回值。
|
|
114
|
+
|
|
115
|
+
省略 `format` 或传 `{}` 表示使用默认格式。用户没有明确要求时,不要为了补全字段强行设置格式;用户提到“保留两位小数”“显示百分比”“人民币”“万元”“不要千分位”“加后缀”等,再按下面字段生成。
|
|
116
|
+
|
|
117
|
+
| 字段 | 中文 | 说明 |
|
|
118
|
+
| --- | --- | --- |
|
|
119
|
+
| `formatType` | 格式类型 | `NUMBER` 数值、`CURRENCY` 货币、`PERCENTAGE` 百分比、`ADVANCED` 高级自定义 |
|
|
120
|
+
| `decimalPlaces` | 小数位数 | `null` 表示 0 位;也可传 `1` 到 `15` |
|
|
121
|
+
| `useThousandsSeparator` | 是否使用千分位 | `true/false` |
|
|
122
|
+
| `prefix` | 前缀/货币符号 | 货币常用 `¥`、`$`、`€`、`£`;后端兼容旧字段 `currencySymbol`,新建优先写 `prefix` |
|
|
123
|
+
| `suffix` | 后缀 | 如 `元`、`人`、`单`、`次`;没有则省略或传空字符串 |
|
|
124
|
+
| `prefixUnit` | 数量级单位 | `null` 无,`K`、`M`、`万`、`亿` 或 `auto` 自动 |
|
|
125
|
+
| `showPrefixUnit` | 是否展示数量级单位 | 数值/货币格式可用;`prefixUnit=auto` 时应为 `true` |
|
|
126
|
+
| `divideDataBy` | 百分比是否除以 100 | 百分比格式可用;`1` 适合底层值是比例小数如 `0.85`,`100` 适合底层值已是百分数如 `85` |
|
|
127
|
+
| `customFormat` | 高级自定义格式 | `formatType=ADVANCED` 时使用;除非用户给出现成格式串,否则不要主动生成 |
|
|
128
|
+
| `suffixSizePercent` | 后缀字号比例 | 部分卡片展示场景使用,指标创建/编辑通常不需要 |
|
|
129
|
+
|
|
130
|
+
常用模板:
|
|
131
|
+
|
|
132
|
+
```jsonc
|
|
133
|
+
// 默认格式:省略 format 或传 {}
|
|
134
|
+
"format": {}
|
|
135
|
+
|
|
136
|
+
// 数值:千分位,保留 2 位小数
|
|
137
|
+
"format": {
|
|
138
|
+
"formatType": "NUMBER",
|
|
139
|
+
"decimalPlaces": 2,
|
|
140
|
+
"useThousandsSeparator": true,
|
|
141
|
+
"prefixUnit": null,
|
|
142
|
+
"showPrefixUnit": true,
|
|
143
|
+
"prefix": "",
|
|
144
|
+
"suffix": ""
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// 货币:人民币,千分位,保留 2 位小数
|
|
148
|
+
"format": {
|
|
149
|
+
"formatType": "CURRENCY",
|
|
150
|
+
"decimalPlaces": 2,
|
|
151
|
+
"useThousandsSeparator": true,
|
|
152
|
+
"prefix": "¥",
|
|
153
|
+
"prefixUnit": null,
|
|
154
|
+
"showPrefixUnit": true,
|
|
155
|
+
"suffix": ""
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// 百分比:底层值为 0.85 时展示为 85.00%
|
|
159
|
+
"format": {
|
|
160
|
+
"formatType": "PERCENTAGE",
|
|
161
|
+
"decimalPlaces": 2,
|
|
162
|
+
"divideDataBy": 1,
|
|
163
|
+
"useThousandsSeparator": false,
|
|
164
|
+
"prefix": "",
|
|
165
|
+
"suffix": ""
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 百分比:底层值为 85 时展示为 85.00%
|
|
169
|
+
"format": {
|
|
170
|
+
"formatType": "PERCENTAGE",
|
|
171
|
+
"decimalPlaces": 2,
|
|
172
|
+
"divideDataBy": 100,
|
|
173
|
+
"useThousandsSeparator": false,
|
|
174
|
+
"prefix": "",
|
|
175
|
+
"suffix": ""
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// 数值:按万元展示
|
|
179
|
+
"format": {
|
|
180
|
+
"formatType": "NUMBER",
|
|
181
|
+
"decimalPlaces": 2,
|
|
182
|
+
"useThousandsSeparator": true,
|
|
183
|
+
"prefixUnit": "万",
|
|
184
|
+
"showPrefixUnit": true,
|
|
185
|
+
"prefix": "",
|
|
186
|
+
"suffix": "元"
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## 业务属性 `bizAttrs`
|
|
191
|
+
|
|
192
|
+
`bizAttrs` 是管理员配置的指标自定义业务属性,不是固定字段。创建或编辑指标前读取当前环境配置:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
guanmetric fetch GET /api/metric-attr-config
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
响应关键字段:
|
|
199
|
+
|
|
200
|
+
| 字段 | 中文 | 说明 |
|
|
201
|
+
| --- | --- | --- |
|
|
202
|
+
| `id` | 属性 ID | 写入 `bizAttrs[].id` |
|
|
203
|
+
| `name` | 属性名称 | 用于向用户提问 |
|
|
204
|
+
| `description` | 属性描述 | 可作为输入提示 |
|
|
205
|
+
| `valueType` | 属性值类型 | `ENUM_SINGLE`、`ENUM_MULTIPLE`、`TEXT`、`TEXT_AREA` |
|
|
206
|
+
| `defaultValue` | 默认值 | 用户未指定且允许默认时可采用 |
|
|
207
|
+
| `optionValue` | 枚举选项 | 枚举单选/多选必须从这里选择 |
|
|
208
|
+
| `required` | 是否必填 | `true` 且 `enabled=true` 时必须收集 |
|
|
209
|
+
| `enabled` | 是否启用 | 只处理启用的属性 |
|
|
210
|
+
|
|
211
|
+
处理规则:
|
|
212
|
+
|
|
213
|
+
- 只展示和写入 `enabled=true` 的属性;其中 `required=true` 是必填项。
|
|
214
|
+
- `ENUM_SINGLE`:`values` 只能有一个值,且必须来自 `optionValue`。
|
|
215
|
+
- `ENUM_MULTIPLE`:`values` 可以有多个值,且都必须来自 `optionValue`。
|
|
216
|
+
- `TEXT`:写入 `values[0]`,Web 单项最大 50 个字符。
|
|
217
|
+
- `TEXT_AREA`:写入 `values[0]`,Web 单项最大 200 个字符。
|
|
218
|
+
- 如果关联了业务字典 `bizMetricId`,业务口径和业务属性通常由业务字典同步;仍需确认最终 payload 中 `desc` 和 `bizAttrs` 已有值。
|
|
219
|
+
|
|
220
|
+
当 JSON 创建/编辑 payload 包含非空 `bizAttrs` 时,CLI 会先读取当前环境的 `GET /api/metric-attr-config`,再按属性 ID 对 `TEXT` / `TEXT_AREA` 执行上述 50/200 长度校验。因此,这类请求(包括 `--dry-run`)需要有效登录态;不包含业务属性时,原子指标 `create --dry-run` 仍可只做本地字段校验。
|
|
221
|
+
|
|
222
|
+
示例:
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
"bizAttrs": [
|
|
226
|
+
{ "id": "attr_region", "values": ["华东"] },
|
|
227
|
+
{ "id": "attr_tags", "values": ["销售", "核心"] },
|
|
228
|
+
{ "id": "attr_owner_note", "values": ["用于经营分析月报"] }
|
|
229
|
+
]
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 保存与确认
|
|
233
|
+
|
|
234
|
+
- 先输出“指标创建计划”让用户 review;计划确认前不生成最终提交 JSON,不执行真实创建。
|
|
235
|
+
- 用户确认计划后,再生成 JSON 文件并做 dry-run 或人工摘要,不直接提交。
|
|
236
|
+
- 计划/摘要至少包含:当前环境、主题、目录、指标类型、名称、核心计算方式、依赖顺序、复用/新建指标、适用维度/时间维度、数据格式、业务属性、保存方式。
|
|
237
|
+
- 如果适用维度中存在时间字段但时间维度为空,计划必须标记为待确认,不能继续提交。
|
|
238
|
+
- 用户确认后按类型执行 save-precheck 或 validate-update-impact。
|
|
239
|
+
- 如果校验返回冲突或影响下游资源,展示冲突指标、受影响指标、受影响卡片,并等待二次确认。
|
|
240
|
+
- 写入成功后回读 `guancli metric get <metric_id> --brief`。
|
|
241
|
+
|
|
242
|
+
## 发布状态判断
|
|
243
|
+
|
|
244
|
+
- 用户说“先别上线”“保存草稿”:`publish=false`。
|
|
245
|
+
- 用户说“直接上线”“发布”:`publish=true`,提交前提醒会创建或更新在线指标。
|
|
246
|
+
- 不要把 `publish=true` 自动当成用户已经确认所有冲突;冲突/影响校验仍需要单独二次确认。
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# 复合指标创建与编辑
|
|
2
|
+
|
|
3
|
+
复合指标用于通过公式组合已有指标,例如“客单价 = 销售额 / 订单数”。
|
|
4
|
+
|
|
5
|
+
创建/编辑请求、真实详情响应和读写映射见 `metric-api-contracts.md`;机器样例见
|
|
6
|
+
`metric-api-contract-examples.json`。
|
|
7
|
+
|
|
8
|
+
## 触发场景
|
|
9
|
+
|
|
10
|
+
- 用户说“创建复合指标”“基于多个指标算一个指标”。
|
|
11
|
+
- 用户描述的口径是已有指标之间的四则运算。
|
|
12
|
+
- 用户给出数据集字段计算表达式后,确认希望先创建/复用基础原子指标,再创建复合指标。
|
|
13
|
+
- 用户要编辑一个 `subType=COMPOSITE` 的指标。
|
|
14
|
+
|
|
15
|
+
## 创建必填信息
|
|
16
|
+
|
|
17
|
+
| 字段 | 中文 | 说明 |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `projectId` | 主题 ID | 指标所属主题 |
|
|
20
|
+
| `subType` | 指标类型 | 固定 `COMPOSITE` |
|
|
21
|
+
| `name` | 指标名称 | 最长 50 |
|
|
22
|
+
| `formula` | 计算公式 | 使用已有指标 ID,形如 `[metric_sales] / [metric_orders]` |
|
|
23
|
+
| `useExpressionMetricCommonDims` | 是否沿用公式指标共有维度 | Web 默认 `true` |
|
|
24
|
+
| `applicableDims` | 适用维度 | 引用指标的共有维度字段 ID 数组;手动选择时不能为空 |
|
|
25
|
+
| `desc` | 业务口径 | 最长 1000 |
|
|
26
|
+
| `parentDirId` | 保存至/所属文件夹 | 创建时需要 |
|
|
27
|
+
| `businessOwner` | 责任人 | 创建时需要 |
|
|
28
|
+
| `publish` | 保存方式 | `true` 上线,`false` 草稿 |
|
|
29
|
+
|
|
30
|
+
专属可选字段:
|
|
31
|
+
|
|
32
|
+
| 字段 | 中文 | 说明 |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `timeDim` | 时间维度 | 最终适用维度中存在时间字段时选择一个 |
|
|
35
|
+
|
|
36
|
+
通用可选字段见 `metric-common-fields.md`。
|
|
37
|
+
|
|
38
|
+
## 公式与引用指标
|
|
39
|
+
|
|
40
|
+
复合指标公式在最终 payload 中使用指标 ID,而不是指标中文名:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
[metric_sales_amount] / [metric_order_count]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
处理规则:
|
|
47
|
+
|
|
48
|
+
- 涉及复合指标 `formula` 时,先读取 `metric-expression-rules.md`。
|
|
49
|
+
- 先用 `guancli metric search <关键词> -d <projectId> -f json` 查询公式中的指标,再用 `guancli metric get <metric_id> --brief` 核对名称、类型、状态和适用维度。
|
|
50
|
+
- 如果用户只提供数据集字段级公式,先询问是否要创建复合指标。用户确认后,再识别公式里的基础度量,创建或复用基础原子指标,并把公式改写为 `[metricId]`。
|
|
51
|
+
- 如果输入来自标准 Excel,字段级公式需要读取 `公式来源数据集ID` / `公式来源数据集名称` 和 `公式字段映射`。没有这些映射时,不要根据 `repr / total_buyer` 这类裸 token 猜测字段或指标;应要求用户补齐或确认。
|
|
52
|
+
- 公式只能引用数值型原子指标或复合指标;不要引用衍生指标、快捷引用指标或当前正在编辑的指标本身。创建计划和提交前都要读取引用指标详情并核对 `subType`。
|
|
53
|
+
- 公式支持 `+`、`-`、`*`、`/`、括号、数字和 `[指标ID]`;不要主动生成函数、窗口函数或 SQL 片段。
|
|
54
|
+
- 公式中的 `[xxx]` 会被后端解析为上游指标 ID,并参与循环引用校验。
|
|
55
|
+
- 如果用户用中文名描述公式,先转换成 ID 公式,再把“中文公式”和“ID 公式”都展示给用户确认。
|
|
56
|
+
|
|
57
|
+
用户确认创建复合指标后的字段公式改写示例:
|
|
58
|
+
|
|
59
|
+
| 用户口径 | 建模方式 |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `SUM([销售额字段]) / COUNT([订单ID字段])` | 先建“销售额”“订单数”原子指标,再建复合指标 `[metric_sales] / [metric_order_count]` |
|
|
62
|
+
| `SUM([归因销售额字段]) / SUM([广告花费字段])` | 先建“归因销售额”“广告花费”原子指标,再建复合指标 ROAS |
|
|
63
|
+
| `SUM([点击量字段]) / SUM([曝光量字段])` | 先建“点击量”“曝光量”原子指标,再建复合指标 CTR |
|
|
64
|
+
| `COUNT(CASE WHEN ... THEN 1 ELSE NULL END) / COUNT([ID字段])` | 优先把分子建为条件计数原子指标,再创建复合比率指标;业务限定衍生指标不能作为复合指标上游 |
|
|
65
|
+
|
|
66
|
+
如果用户给出的公式依赖衍生指标,不要把它直接提交为复合指标:
|
|
67
|
+
|
|
68
|
+
- 组合“最近 N、累计、期末值”等受支持衍生结果时,评估改建为组合衍生指标。
|
|
69
|
+
- 表达“某个复合口径的同比/环比”时,通常先创建原子/复合基础口径,再基于该复合指标创建普通衍生指标。
|
|
70
|
+
- 两种改写可能改变业务语义,例如“比率的同比”不等于“两个同比增长率相除”;创建计划必须展示改模方案并让用户确认。
|
|
71
|
+
|
|
72
|
+
## 适用维度
|
|
73
|
+
|
|
74
|
+
复合指标的适用维度来自公式中引用指标的共有维度:
|
|
75
|
+
|
|
76
|
+
- `useExpressionMetricCommonDims=true`:沿用表达式中指标的共用维度。需要根据引用指标详情整理共有维度;如果没有共有维度,Web 会报“计算公式来源指标无共有适用维度,请检查”。
|
|
77
|
+
- `useExpressionMetricCommonDims=false`:从共有维度中手动选择 `applicableDims`,至少选择一个。
|
|
78
|
+
- 如果最终适用维度中有时间类型字段,需要选择一个 `timeDim`。
|
|
79
|
+
- 不要把某个上游指标独有的维度写进 `applicableDims`。
|
|
80
|
+
|
|
81
|
+
## 信息收集
|
|
82
|
+
|
|
83
|
+
如果用户只说“帮我创建一个复合指标”,先收集:
|
|
84
|
+
|
|
85
|
+
1. 指标主题和保存目录。
|
|
86
|
+
2. 公式中要引用哪些已有指标;中文名先搜索确认唯一指标。
|
|
87
|
+
3. 计算公式,转换成 `[metric_id]` 形式。
|
|
88
|
+
4. 是否沿用共有维度;如果手动选择,确认具体维度和时间维度。
|
|
89
|
+
5. 数据格式:默认、数值、货币、百分比;如需指定,确认小数位、千分位、货币符号/前后缀、数量级单位、百分比是否除以 100。
|
|
90
|
+
6. 指标名称、业务口径、是否保存并上线。
|
|
91
|
+
7. 责任人和必填 `bizAttrs`。
|
|
92
|
+
|
|
93
|
+
## JSON 模板
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"projectId": "<metric_project_id>",
|
|
98
|
+
"subType": "COMPOSITE",
|
|
99
|
+
"name": "客单价",
|
|
100
|
+
"engName": "avg_order_value",
|
|
101
|
+
"formula": "[<sales_amount_metric_id>] / [<order_count_metric_id>]",
|
|
102
|
+
"useExpressionMetricCommonDims": true,
|
|
103
|
+
"applicableDims": ["<common_dim_fd_id_1>", "<common_dim_fd_id_2>"],
|
|
104
|
+
"timeDim": "<time_dim_fd_id>",
|
|
105
|
+
"format": {
|
|
106
|
+
"formatType": "NUMBER",
|
|
107
|
+
"decimalPlaces": 2,
|
|
108
|
+
"useThousandsSeparator": true,
|
|
109
|
+
"prefixUnit": null,
|
|
110
|
+
"showPrefixUnit": true,
|
|
111
|
+
"prefix": "",
|
|
112
|
+
"suffix": ""
|
|
113
|
+
},
|
|
114
|
+
"desc": "销售金额除以订单数,用于衡量平均每笔订单贡献的销售额。",
|
|
115
|
+
"parentDirId": "<metric_dir_id>",
|
|
116
|
+
"businessOwner": "<user_id>",
|
|
117
|
+
"publish": false
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
没有时间维度时删除 `timeDim`;没有英文名称时删除 `engName`;未指定数据格式时删除 `format` 或传 `{}`。如需业务属性,按 `metric-common-fields.md` 补充 `bizAttrs`。
|
|
122
|
+
|
|
123
|
+
## 创建步骤
|
|
124
|
+
|
|
125
|
+
单个复合指标使用 `guanmetric composite create`;对话式批量创建或公式引用本批指标时,优先按 `metric-flow.md` 使用 `guanmetric flow`。
|
|
126
|
+
|
|
127
|
+
1. 先输出指标创建计划,按 `metric-mutation.md` 的“指标创建计划”要求展示环境、主题、目录、将复用或新建的基础指标、复合公式、共有适用维度/时间维度、格式、业务属性和保存方式。
|
|
128
|
+
2. 用户确认计划后,生成 `/tmp/composite_metric.json`。
|
|
129
|
+
3. 本地/人工检查 JSON、公式引用指标、共有适用维度、必填业务属性;逐个读取引用指标详情,确认 `subType` 仅为 `ATOMIC` 或 `COMPOSITE`。`guanmetric composite create` 也会在提交前执行同一类型检查。
|
|
130
|
+
4. 按 `metric-common-fields.md` 向用户摘要并确认。
|
|
131
|
+
5. 用户确认后,不调用原子指标 `save-precheck`;复合指标 Web 创建没有 save-precheck。
|
|
132
|
+
6. 提交真实创建:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
guanmetric composite create --file /tmp/composite_metric.json --dry-run
|
|
136
|
+
guanmetric composite create --file /tmp/composite_metric.json
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
7. 响应返回指标 ID 后回读:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
guancli metric get <metric_id> --brief
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 编辑步骤
|
|
146
|
+
|
|
147
|
+
复合指标没有原子指标的 save-precheck;主要校验公式或筛选变化是否影响下游指标/卡片。
|
|
148
|
+
|
|
149
|
+
1. 准备只包含本次变更字段的 patch,例如 `/tmp/composite_metric_patch.json`;不要复制或回写详情读模型。
|
|
150
|
+
2. 先 dry-run。命令会读取当前详情,按复合指标 Update DTO 白名单构造完整写模型并输出影响校验和更新步骤:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
guanmetric composite edit <metric_id> --file /tmp/composite_metric_patch.json --dry-run
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
3. 提交真实编辑。命令自动调用 `validate-update-impact`;存在下游影响时会阻断并返回影响清单,用户确认后才追加 `--confirm`:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
guanmetric composite edit <metric_id> --file /tmp/composite_metric_patch.json
|
|
160
|
+
guanmetric composite edit <metric_id> --file /tmp/composite_metric_patch.json --confirm
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
4. 命令保存后自动回读,校验名称、口径、公式及维度等已提交字段;`useExpressionMetricCommonDims=true` 时适用维度由后端按引用指标共有维度重算,不做输入数组逐项相等判断。
|
|
164
|
+
|
|
165
|
+
编辑命令内部读取后端详情,但只通过白名单生成写模型;`referencedMetrics`、`creator`、`statisticsData`、对象数组 `applicableDims`、对象 `timeDim` 等读模型字段绝不能原样提交。
|