@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,12 @@
|
|
|
1
|
+
var scrollRegion = f("地区");
|
|
2
|
+
|
|
3
|
+
var scrollPercentageCard = createCard(ChartType.SCROLL_TABLE, "L3 占比高级计算 Scroll")
|
|
4
|
+
.setId("pct02a02b03c04d05e06f07g")
|
|
5
|
+
.bindDataset(DS)
|
|
6
|
+
.addRow(scrollRegion)
|
|
7
|
+
.addMetric(f("销售额", {
|
|
8
|
+
alias: "滚动表默认聚合占比",
|
|
9
|
+
advCalc: percentage.byColumn()
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
registerCard(scrollPercentageCard.build());
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Dataset: 订单表 (default)
|
|
2
|
+
defineDataset("a184fe1b1c27941a9ac977bc", [
|
|
3
|
+
{ fdId: "o0f29e706bf1041d9ab0da11", name: "订单 ID", fdType: "STRING", metaType: "DIM" },
|
|
4
|
+
{ fdId: "r739b62cd3dab49ff9bb7134", name: "订单日期", fdType: "DATE", metaType: "DIM" },
|
|
5
|
+
{ fdId: "o82eaae89ecd046a4b531ce4", name: "发货日期", fdType: "DATE", metaType: "DIM" },
|
|
6
|
+
{ fdId: "k673939fff12744b786d8d44", name: "邮寄方式", fdType: "STRING", metaType: "DIM" },
|
|
7
|
+
{ fdId: "me4783b3bf8984906a32e5ce", name: "客户 ID", fdType: "STRING", metaType: "DIM" },
|
|
8
|
+
{ fdId: "v2a8590c1236e4e58882ee9c", name: "客户名称", fdType: "STRING", metaType: "DIM" },
|
|
9
|
+
{ fdId: "j81f7f09ab6c84168924f9aa", name: "细分", fdType: "STRING", metaType: "DIM" },
|
|
10
|
+
{ fdId: "s99bcae4ac5a045ebae87762", name: "城市", fdType: "STRING", metaType: "DIM" },
|
|
11
|
+
{ fdId: "ufe7632b5afa44dd7a79194e", name: "省/自治区", fdType: "STRING", metaType: "DIM" },
|
|
12
|
+
{ fdId: "e2a051c6ebda04917a10cc14", name: "国家", fdType: "STRING", metaType: "DIM" },
|
|
13
|
+
{ fdId: "xe01f39825ccc428eaf67911", name: "地区", fdType: "STRING", metaType: "DIM" },
|
|
14
|
+
{ fdId: "cd9b3a6c556ef4c53a08df16", name: "产品 ID", fdType: "STRING", metaType: "DIM" },
|
|
15
|
+
{ fdId: "cece9879e99f545449909a82", name: "类别", fdType: "STRING", metaType: "DIM" },
|
|
16
|
+
{ fdId: "k15359167149d4d02bbede2b", name: "子类别", fdType: "STRING", metaType: "DIM" },
|
|
17
|
+
{ fdId: "f247afa584af241dba64821d", name: "产品名称", fdType: "STRING", metaType: "DIM" },
|
|
18
|
+
{ fdId: "g4a34bd7bcb78425aa5485d1", name: "销售额", fdType: "DOUBLE", metaType: "METRIC" },
|
|
19
|
+
{ fdId: "xd21ba1d7fd19433ebc728b6", name: "数量", fdType: "LONG", metaType: "METRIC" },
|
|
20
|
+
{ fdId: "l0dbffcc612e047c9a6dae7b", name: "折扣", fdType: "DOUBLE", metaType: "METRIC" },
|
|
21
|
+
{ fdId: "s1c05aa5e4bdd4a54a60e811", name: "利润", fdType: "DOUBLE", metaType: "METRIC" }
|
|
22
|
+
], { displayType: "DATAFLOW" });
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Rank Advanced Calc Round-Trip
|
|
2
|
+
|
|
3
|
+
This eval verifies the L3 native BI `RANK` advanced calculation builder against a real `default` BI environment.
|
|
4
|
+
|
|
5
|
+
It covers:
|
|
6
|
+
|
|
7
|
+
- 按列:`RANK` + 从高到低
|
|
8
|
+
- 按行:`DENSE_RANK` + 从低到高
|
|
9
|
+
- 维度组内:`ROW_NUMBER` + 指定行维度
|
|
10
|
+
- 维度项:`RANK` + 指定列维度
|
|
11
|
+
- Top N:`CUSTOM_NUMBER` with `applyToSubtotal=true/false`
|
|
12
|
+
|
|
13
|
+
Run from `guanvis/`:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
./evals/rank_advcalc_roundtrip/verify_default_roundtrip.sh
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The script publishes fixed resource IDs to `default`, then verifies:
|
|
20
|
+
|
|
21
|
+
- `advCalc` is preserved in `zoneData.metric[*].advCalc`.
|
|
22
|
+
- No metric silently degrades to a formula.
|
|
23
|
+
- Each expected `calDimension` / `rankType` / `sorting` / `tfdId` / `topN` field round-trips.
|
|
24
|
+
- `card preview` succeeds and ranking aliases have non-empty values.
|
|
25
|
+
|
|
26
|
+
Runtime outputs are written to `.roundtrip/` and ignored by git.
|
|
27
|
+
|
|
28
|
+
The eval uses fixed resource IDs and `GUANCLI_PROFILE=default`; reruns overwrite the same test page/cards in the shared default environment.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
var region = f("地区");
|
|
2
|
+
var province = f("省/自治区");
|
|
3
|
+
var category = f("类别");
|
|
4
|
+
|
|
5
|
+
var rangeCard = createCard(ChartType.PIVOT_TABLE, "L3 排名高级计算 范围")
|
|
6
|
+
.setId("r3f01a02b03c04d05e06f07a")
|
|
7
|
+
.bindDataset(DS)
|
|
8
|
+
.addRow(region)
|
|
9
|
+
.addRow(province)
|
|
10
|
+
.addColumn(category)
|
|
11
|
+
.addMetric(f("销售额", {
|
|
12
|
+
alias: "按列RANK降序",
|
|
13
|
+
aggrType: AggrType.SUM,
|
|
14
|
+
advCalc: rank.byColumn({ rankType: RankType.RANK, order: SortOrder.DESC })
|
|
15
|
+
}))
|
|
16
|
+
.addMetric(f("销售额", {
|
|
17
|
+
alias: "按行DENSE升序",
|
|
18
|
+
aggrType: AggrType.SUM,
|
|
19
|
+
advCalc: rank.byRow({ rankType: RankType.DENSE_RANK, order: SortOrder.ASC })
|
|
20
|
+
}))
|
|
21
|
+
.addMetric(f("销售额", {
|
|
22
|
+
alias: "地区组内ROW_NUMBER降序",
|
|
23
|
+
aggrType: AggrType.SUM,
|
|
24
|
+
advCalc: rank.byField(region, { rankType: RankType.ROW_NUMBER, order: SortOrder.DESC })
|
|
25
|
+
}))
|
|
26
|
+
.addMetric(f("销售额", {
|
|
27
|
+
alias: "类别维度项RANK升序",
|
|
28
|
+
aggrType: AggrType.SUM,
|
|
29
|
+
advCalc: rank.byDimensionItem(category, { rankType: RankType.RANK, order: SortOrder.ASC })
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
registerCard(rangeCard.build());
|
|
33
|
+
|
|
34
|
+
var topNCard = createCard(ChartType.PIVOT_TABLE, "L3 排名高级计算 TopN")
|
|
35
|
+
.setId("r4f01a02b03c04d05e06f08a")
|
|
36
|
+
.bindDataset(DS)
|
|
37
|
+
.addRow(region)
|
|
38
|
+
.addRow(province)
|
|
39
|
+
.addColumn(category)
|
|
40
|
+
.addMetric(f("利润", {
|
|
41
|
+
alias: "Top3适用小计",
|
|
42
|
+
aggrType: AggrType.SUM,
|
|
43
|
+
advCalc: rank.byColumn({
|
|
44
|
+
rankType: RankType.RANK,
|
|
45
|
+
order: SortOrder.DESC,
|
|
46
|
+
topN: rank.topN(3, { applyToSubtotal: true })
|
|
47
|
+
})
|
|
48
|
+
}))
|
|
49
|
+
.addMetric(f("利润", {
|
|
50
|
+
alias: "Top5不适用小计",
|
|
51
|
+
aggrType: AggrType.SUM,
|
|
52
|
+
advCalc: rank.byDimensionItem(region, {
|
|
53
|
+
rankType: RankType.DENSE_RANK,
|
|
54
|
+
order: SortOrder.DESC,
|
|
55
|
+
topN: rank.topN(5, { applyToSubtotal: false })
|
|
56
|
+
})
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
registerCard(topNCard.build());
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Dataset: 订单表 (default)
|
|
2
|
+
defineDataset("a184fe1b1c27941a9ac977bc", [
|
|
3
|
+
{ fdId: "o0f29e706bf1041d9ab0da11", name: "订单 ID", fdType: "STRING", metaType: "DIM" },
|
|
4
|
+
{ fdId: "r739b62cd3dab49ff9bb7134", name: "订单日期", fdType: "DATE", metaType: "DIM" },
|
|
5
|
+
{ fdId: "o82eaae89ecd046a4b531ce4", name: "发货日期", fdType: "DATE", metaType: "DIM" },
|
|
6
|
+
{ fdId: "k673939fff12744b786d8d44", name: "邮寄方式", fdType: "STRING", metaType: "DIM" },
|
|
7
|
+
{ fdId: "me4783b3bf8984906a32e5ce", name: "客户 ID", fdType: "STRING", metaType: "DIM" },
|
|
8
|
+
{ fdId: "v2a8590c1236e4e58882ee9c", name: "客户名称", fdType: "STRING", metaType: "DIM" },
|
|
9
|
+
{ fdId: "j81f7f09ab6c84168924f9aa", name: "细分", fdType: "STRING", metaType: "DIM" },
|
|
10
|
+
{ fdId: "s99bcae4ac5a045ebae87762", name: "城市", fdType: "STRING", metaType: "DIM" },
|
|
11
|
+
{ fdId: "ufe7632b5afa44dd7a79194e", name: "省/自治区", fdType: "STRING", metaType: "DIM" },
|
|
12
|
+
{ fdId: "e2a051c6ebda04917a10cc14", name: "国家", fdType: "STRING", metaType: "DIM" },
|
|
13
|
+
{ fdId: "xe01f39825ccc428eaf67911", name: "地区", fdType: "STRING", metaType: "DIM" },
|
|
14
|
+
{ fdId: "cd9b3a6c556ef4c53a08df16", name: "产品 ID", fdType: "STRING", metaType: "DIM" },
|
|
15
|
+
{ fdId: "cece9879e99f545449909a82", name: "类别", fdType: "STRING", metaType: "DIM" },
|
|
16
|
+
{ fdId: "k15359167149d4d02bbede2b", name: "子类别", fdType: "STRING", metaType: "DIM" },
|
|
17
|
+
{ fdId: "f247afa584af241dba64821d", name: "产品名称", fdType: "STRING", metaType: "DIM" },
|
|
18
|
+
{ fdId: "g4a34bd7bcb78425aa5485d1", name: "销售额", fdType: "DOUBLE", metaType: "METRIC" },
|
|
19
|
+
{ fdId: "xd21ba1d7fd19433ebc728b6", name: "数量", fdType: "LONG", metaType: "METRIC" },
|
|
20
|
+
{ fdId: "l0dbffcc612e047c9a6dae7b", name: "折扣", fdType: "DOUBLE", metaType: "METRIC" },
|
|
21
|
+
{ fdId: "s1c05aa5e4bdd4a54a60e811", name: "利润", fdType: "DOUBLE", metaType: "METRIC" }
|
|
22
|
+
], { displayType: "DATAFLOW" });
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
5
|
+
EVAL_DIR="$ROOT_DIR/evals/rank_advcalc_roundtrip"
|
|
6
|
+
OUT_DIR="$EVAL_DIR/.roundtrip"
|
|
7
|
+
|
|
8
|
+
mkdir -p "$OUT_DIR"
|
|
9
|
+
|
|
10
|
+
cd "$ROOT_DIR"
|
|
11
|
+
|
|
12
|
+
export GUANCLI_PROFILE=default
|
|
13
|
+
|
|
14
|
+
go run ./cmd/guanvis preview "$EVAL_DIR" > "$OUT_DIR/preview_payload.json"
|
|
15
|
+
go run ./cmd/guanvis publish "$EVAL_DIR" > "$OUT_DIR/publish.log"
|
|
16
|
+
|
|
17
|
+
guancli card get r3f01a02b03c04d05e06f07a --profile default --raw > "$OUT_DIR/raw_range.json"
|
|
18
|
+
guancli card get r4f01a02b03c04d05e06f08a --profile default --raw > "$OUT_DIR/raw_topn.json"
|
|
19
|
+
guancli card preview r3f01a02b03c04d05e06f07a --profile default --limit 50 -f json > "$OUT_DIR/preview_range.json"
|
|
20
|
+
guancli card preview r4f01a02b03c04d05e06f08a --profile default --limit 50 -f json > "$OUT_DIR/preview_topn.json"
|
|
21
|
+
|
|
22
|
+
python3 - "$OUT_DIR" <<'PY'
|
|
23
|
+
import json
|
|
24
|
+
import sys
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
out = Path(sys.argv[1])
|
|
28
|
+
|
|
29
|
+
cases = [
|
|
30
|
+
{
|
|
31
|
+
"kind": "range",
|
|
32
|
+
"raw": out / "raw_range.json",
|
|
33
|
+
"preview": out / "preview_range.json",
|
|
34
|
+
"expected": {
|
|
35
|
+
"按列RANK降序": {
|
|
36
|
+
"calDimension": "COLUMN",
|
|
37
|
+
"rankType": "RANK",
|
|
38
|
+
"sorting": "desc",
|
|
39
|
+
"tfdId": "",
|
|
40
|
+
"topN": {"topType": "ALL", "count": 10, "calculationType": "COUNT"},
|
|
41
|
+
},
|
|
42
|
+
"按行DENSE升序": {
|
|
43
|
+
"calDimension": "ROW",
|
|
44
|
+
"rankType": "DENSE_RANK",
|
|
45
|
+
"sorting": "asc",
|
|
46
|
+
"tfdId": "",
|
|
47
|
+
"topN": {"topType": "ALL", "count": 10, "calculationType": "COUNT"},
|
|
48
|
+
},
|
|
49
|
+
"地区组内ROW_NUMBER降序": {
|
|
50
|
+
"calDimension": "FIELD",
|
|
51
|
+
"rankType": "ROW_NUMBER",
|
|
52
|
+
"sorting": "desc",
|
|
53
|
+
"tfdId": "xe01f39825ccc428eaf67911",
|
|
54
|
+
"topN": {"topType": "ALL", "count": 10, "calculationType": "COUNT"},
|
|
55
|
+
},
|
|
56
|
+
"类别维度项RANK升序": {
|
|
57
|
+
"calDimension": "DIMENSION_ITEM",
|
|
58
|
+
"rankType": "RANK",
|
|
59
|
+
"sorting": "asc",
|
|
60
|
+
"tfdId": "cece9879e99f545449909a82",
|
|
61
|
+
"topN": {"topType": "ALL", "count": 10, "calculationType": "COUNT"},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"kind": "topn",
|
|
67
|
+
"raw": out / "raw_topn.json",
|
|
68
|
+
"preview": out / "preview_topn.json",
|
|
69
|
+
"expected": {
|
|
70
|
+
"Top3适用小计": {
|
|
71
|
+
"calDimension": "COLUMN",
|
|
72
|
+
"rankType": "RANK",
|
|
73
|
+
"sorting": "desc",
|
|
74
|
+
"tfdId": "",
|
|
75
|
+
"topN": {"topType": "CUSTOM_NUMBER", "count": 3, "calculationType": "COUNT", "applyToSubtotal": True},
|
|
76
|
+
},
|
|
77
|
+
"Top5不适用小计": {
|
|
78
|
+
"calDimension": "DIMENSION_ITEM",
|
|
79
|
+
"rankType": "DENSE_RANK",
|
|
80
|
+
"sorting": "desc",
|
|
81
|
+
"tfdId": "xe01f39825ccc428eaf67911",
|
|
82
|
+
"topN": {"topType": "CUSTOM_NUMBER", "count": 5, "calculationType": "COUNT", "applyToSubtotal": False},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
summary = {"cards": []}
|
|
89
|
+
|
|
90
|
+
for case in cases:
|
|
91
|
+
raw_obj = json.loads(case["raw"].read_text())
|
|
92
|
+
response = raw_obj.get("response") or raw_obj.get("data") or raw_obj
|
|
93
|
+
zone_data = response["content"]["meta"]["chartMain"]["zoneData"]
|
|
94
|
+
metrics = zone_data.get("metric", [])
|
|
95
|
+
by_alias = {m.get("alias"): m for m in metrics if m.get("alias")}
|
|
96
|
+
rows = json.loads(case["preview"].read_text())
|
|
97
|
+
|
|
98
|
+
card_summary = {
|
|
99
|
+
"kind": case["kind"],
|
|
100
|
+
"cardId": response.get("cdId") or response.get("id"),
|
|
101
|
+
"name": response.get("name"),
|
|
102
|
+
"previewRows": len(rows),
|
|
103
|
+
"aliases": {},
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
for alias, expected in case["expected"].items():
|
|
107
|
+
metric = by_alias.get(alias)
|
|
108
|
+
if metric is None:
|
|
109
|
+
raise SystemExit(f"{case['kind']}: missing metric alias {alias}")
|
|
110
|
+
if "formula" in metric:
|
|
111
|
+
raise SystemExit(f"{case['kind']}: {alias} degraded to formula")
|
|
112
|
+
adv_calc = metric.get("advCalc")
|
|
113
|
+
if not adv_calc:
|
|
114
|
+
raise SystemExit(f"{case['kind']}: {alias} missing advCalc")
|
|
115
|
+
if adv_calc.get("advType") != "RANK":
|
|
116
|
+
raise SystemExit(f"{case['kind']}: {alias} advType is not RANK")
|
|
117
|
+
adv_value = adv_calc.get("advValue") or {}
|
|
118
|
+
if adv_value.get("advType") != "RANK":
|
|
119
|
+
raise SystemExit(f"{case['kind']}: {alias} advValue.advType is not RANK")
|
|
120
|
+
for key in ("calDimension", "rankType", "sorting", "tfdId"):
|
|
121
|
+
if adv_value.get(key, "") != expected[key]:
|
|
122
|
+
raise SystemExit(f"{case['kind']}: {alias} {key}={adv_value.get(key)!r}, want {expected[key]!r}")
|
|
123
|
+
top_n = adv_value.get("topN") or {}
|
|
124
|
+
for key, want in expected["topN"].items():
|
|
125
|
+
if top_n.get(key) != want:
|
|
126
|
+
raise SystemExit(f"{case['kind']}: {alias} topN.{key}={top_n.get(key)!r}, want {want!r}")
|
|
127
|
+
if not any(isinstance(row, dict) and row.get(alias) not in ("", None) for row in rows):
|
|
128
|
+
raise SystemExit(f"{case['kind']}: {alias} has no non-empty preview value")
|
|
129
|
+
card_summary["aliases"][alias] = adv_value
|
|
130
|
+
|
|
131
|
+
summary["cards"].append(card_summary)
|
|
132
|
+
|
|
133
|
+
(out / "summary.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
134
|
+
print(json.dumps(summary, ensure_ascii=False, indent=2))
|
|
135
|
+
PY
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
This eval verifies the L3 native BI `RUNNING_TOTAL` advanced calculation builder against a real `default` BI environment.
|
|
2
|
+
|
|
3
|
+
It publishes fixed card/page IDs, reads the created cards back, and verifies:
|
|
4
|
+
|
|
5
|
+
- `COLUMN` accumulation.
|
|
6
|
+
- `ROW` accumulation.
|
|
7
|
+
- `FIELD` accumulation by a non-date dimension.
|
|
8
|
+
- date field accumulation with `DAY`, `WEEK`, `MONTH`, `YEAR`, and `NONE`.
|
|
9
|
+
- sub-date field accumulation with `QUARTER` and `NONE`.
|
|
10
|
+
- `advCalc` is preserved in `zoneData.metric[*].advCalc`.
|
|
11
|
+
- preview returns non-empty accumulated metric values.
|
|
12
|
+
|
|
13
|
+
The default-environment roundtrip runner is intentionally not committed with this eval.
|
|
14
|
+
Its command sequence and assertions are recorded in the knowledge base:
|
|
15
|
+
`01-Projects/L3-running-total-advcalc-golden-answer.md`.
|
package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/card_01_running_total_advcalc.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
var orderDate = f("订单日期");
|
|
2
|
+
var orderMonth = f("订单日期", { granularity: Granularity.MONTH });
|
|
3
|
+
var region = f("地区");
|
|
4
|
+
var province = f("省/自治区");
|
|
5
|
+
var category = f("类别");
|
|
6
|
+
|
|
7
|
+
var rangeCard = createCard(ChartType.PIVOT_TABLE, "L3 累计高级计算 范围")
|
|
8
|
+
.setId("t3f01a02b03c04d05e06f07a")
|
|
9
|
+
.bindDataset(DS)
|
|
10
|
+
.addRow(orderDate)
|
|
11
|
+
.addRow(region)
|
|
12
|
+
.addRow(province)
|
|
13
|
+
.addColumn(category)
|
|
14
|
+
.addMetric(f("销售额", {
|
|
15
|
+
alias: "按列累计",
|
|
16
|
+
aggrType: AggrType.SUM,
|
|
17
|
+
advCalc: runningTotal.byColumn()
|
|
18
|
+
}))
|
|
19
|
+
.addMetric(f("销售额", {
|
|
20
|
+
alias: "按行累计",
|
|
21
|
+
aggrType: AggrType.SUM,
|
|
22
|
+
advCalc: runningTotal.byRow()
|
|
23
|
+
}))
|
|
24
|
+
.addMetric(f("销售额", {
|
|
25
|
+
alias: "地区组内累计",
|
|
26
|
+
aggrType: AggrType.SUM,
|
|
27
|
+
advCalc: runningTotal.byField(region)
|
|
28
|
+
}))
|
|
29
|
+
.addMetric(f("销售额", {
|
|
30
|
+
alias: "订单日期日累计",
|
|
31
|
+
aggrType: AggrType.SUM,
|
|
32
|
+
advCalc: runningTotal.byDateField(orderDate, RunningTotalGranularity.DAY)
|
|
33
|
+
}))
|
|
34
|
+
.addMetric(f("销售额", {
|
|
35
|
+
alias: "订单日期周累计",
|
|
36
|
+
aggrType: AggrType.SUM,
|
|
37
|
+
advCalc: runningTotal.byDateField(orderDate, RunningTotalGranularity.WEEK)
|
|
38
|
+
}))
|
|
39
|
+
.addMetric(f("销售额", {
|
|
40
|
+
alias: "订单日期月累计",
|
|
41
|
+
aggrType: AggrType.SUM,
|
|
42
|
+
advCalc: runningTotal.byDateField(orderDate, RunningTotalGranularity.MONTH)
|
|
43
|
+
}))
|
|
44
|
+
.addMetric(f("销售额", {
|
|
45
|
+
alias: "订单日期当年累计",
|
|
46
|
+
aggrType: AggrType.SUM,
|
|
47
|
+
advCalc: runningTotal.byDateField(orderDate, RunningTotalGranularity.YEAR)
|
|
48
|
+
}))
|
|
49
|
+
.addMetric(f("销售额", {
|
|
50
|
+
alias: "订单日期历年累计",
|
|
51
|
+
aggrType: AggrType.SUM,
|
|
52
|
+
advCalc: runningTotal.byDateField(orderDate, RunningTotalGranularity.ALL_YEARS)
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
registerCard(rangeCard.build());
|
|
56
|
+
|
|
57
|
+
var subDateCard = createCard(ChartType.PIVOT_TABLE, "L3 累计高级计算 子日期")
|
|
58
|
+
.setId("t4f01a02b03c04d05e06f08a")
|
|
59
|
+
.bindDataset(DS)
|
|
60
|
+
.addRow(orderMonth)
|
|
61
|
+
.addRow(region)
|
|
62
|
+
.addColumn(category)
|
|
63
|
+
.addMetric(f("利润", {
|
|
64
|
+
alias: "订单月季度累计",
|
|
65
|
+
aggrType: AggrType.SUM,
|
|
66
|
+
advCalc: runningTotal.byDateField(orderMonth, RunningTotalGranularity.QUARTER)
|
|
67
|
+
}))
|
|
68
|
+
.addMetric(f("利润", {
|
|
69
|
+
alias: "订单月历年累计",
|
|
70
|
+
aggrType: AggrType.SUM,
|
|
71
|
+
advCalc: runningTotal.byDateField(orderMonth, RunningTotalGranularity.ALL_YEARS)
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
registerCard(subDateCard.build());
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Dataset: 订单表 (default)
|
|
2
|
+
defineDataset("a184fe1b1c27941a9ac977bc", [
|
|
3
|
+
{ fdId: "o0f29e706bf1041d9ab0da11", name: "订单 ID", fdType: "STRING", metaType: "DIM" },
|
|
4
|
+
{ fdId: "r739b62cd3dab49ff9bb7134", name: "订单日期", fdType: "DATE", metaType: "DIM" },
|
|
5
|
+
{ fdId: "o82eaae89ecd046a4b531ce4", name: "发货日期", fdType: "DATE", metaType: "DIM" },
|
|
6
|
+
{ fdId: "k673939fff12744b786d8d44", name: "邮寄方式", fdType: "STRING", metaType: "DIM" },
|
|
7
|
+
{ fdId: "me4783b3bf8984906a32e5ce", name: "客户 ID", fdType: "STRING", metaType: "DIM" },
|
|
8
|
+
{ fdId: "v2a8590c1236e4e58882ee9c", name: "客户名称", fdType: "STRING", metaType: "DIM" },
|
|
9
|
+
{ fdId: "j81f7f09ab6c84168924f9aa", name: "细分", fdType: "STRING", metaType: "DIM" },
|
|
10
|
+
{ fdId: "s99bcae4ac5a045ebae87762", name: "城市", fdType: "STRING", metaType: "DIM" },
|
|
11
|
+
{ fdId: "ufe7632b5afa44dd7a79194e", name: "省/自治区", fdType: "STRING", metaType: "DIM" },
|
|
12
|
+
{ fdId: "e2a051c6ebda04917a10cc14", name: "国家", fdType: "STRING", metaType: "DIM" },
|
|
13
|
+
{ fdId: "xe01f39825ccc428eaf67911", name: "地区", fdType: "STRING", metaType: "DIM" },
|
|
14
|
+
{ fdId: "cd9b3a6c556ef4c53a08df16", name: "产品 ID", fdType: "STRING", metaType: "DIM" },
|
|
15
|
+
{ fdId: "cece9879e99f545449909a82", name: "类别", fdType: "STRING", metaType: "DIM" },
|
|
16
|
+
{ fdId: "k15359167149d4d02bbede2b", name: "子类别", fdType: "STRING", metaType: "DIM" },
|
|
17
|
+
{ fdId: "f247afa584af241dba64821d", name: "产品名称", fdType: "STRING", metaType: "DIM" },
|
|
18
|
+
{ fdId: "g4a34bd7bcb78425aa5485d1", name: "销售额", fdType: "DOUBLE", metaType: "METRIC" },
|
|
19
|
+
{ fdId: "xd21ba1d7fd19433ebc728b6", name: "数量", fdType: "LONG", metaType: "METRIC" },
|
|
20
|
+
{ fdId: "l0dbffcc612e047c9a6dae7b", name: "折扣", fdType: "DOUBLE", metaType: "METRIC" },
|
|
21
|
+
{ fdId: "s1c05aa5e4bdd4a54a60e811", name: "利润", fdType: "DOUBLE", metaType: "METRIC" }
|
|
22
|
+
], { displayType: "DATAFLOW" });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var card = createCard(ChartType.GROUPED_COLUMN, "区域营收分析")
|
|
2
|
+
.setId("qe122aaf82e38c1fa369325e")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("区域"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
6
|
+
.addColumn(f("产品"))
|
|
7
|
+
.setShowLegend(true, "right")
|
|
8
|
+
.setDataLabel({ show: true, showNumber: true });
|
|
9
|
+
|
|
10
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var card = createCard(ChartType.MULTI_LINE, "月度趋势")
|
|
2
|
+
.setId("p3e20cf5d750ee644259f7b8")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("月份"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.auto("万") }))
|
|
6
|
+
.addMetric(f("成本", { aggrType: AggrType.SUM, numberFormat: NumberFormat.auto("万") }))
|
|
7
|
+
.setShowLegend(true, "bottom");
|
|
8
|
+
|
|
9
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var card = createCard(ChartType.PIE, "产品分布")
|
|
2
|
+
.setId("s1fa6bd1b68a4974f7ad0202")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("产品"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM }))
|
|
6
|
+
.setDataLabel({ show: true, showPercentage: true, showCategory: true })
|
|
7
|
+
.setPieSetting({ innerSize: 0 });
|
|
8
|
+
|
|
9
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var card = createCard(ChartType.GROUPED_COLUMN, "利润率-计算字段测试")
|
|
2
|
+
.setId("te122aaf82e38c1fa3693250")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("区域"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM }))
|
|
6
|
+
.addMetric(calcField("利润", "(SUM([营收])-SUM([成本]))", { calculationType: "aggregation" }))
|
|
7
|
+
.addMetric(calcField("毛利率", "(SUM([营收])-SUM([成本]))/SUM([营收])", {
|
|
8
|
+
calculationType: "aggregation",
|
|
9
|
+
numberFormat: NumberFormat.percentage(1)
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
var page = createPage("销售分析仪表板")
|
|
2
|
+
.setId("a67a1cddb97678851fe1317f")
|
|
3
|
+
.setDescription("综合销售数据分析看板")
|
|
4
|
+
.setBackgroundColor("#f5f5f5")
|
|
5
|
+
.setCardMargin(8)
|
|
6
|
+
.placeCard(2, 0, 0, 4, 4)
|
|
7
|
+
.placeCard(3, 4, 0, 8, 4)
|
|
8
|
+
.addFullWidthCard(0, 6)
|
|
9
|
+
.addFullWidthCard(1, 6);
|
|
10
|
+
|
|
11
|
+
registerPage(page.build());
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Auto-generated by guanvis schema command
|
|
2
|
+
// DO NOT EDIT — regenerate with: guanvis schema s9ded2338f43807b095fbb4f
|
|
3
|
+
// This file defines dataset schemas for field() references in card scripts.
|
|
4
|
+
|
|
5
|
+
// Dataset: 销售数据 (example, 7 fields)
|
|
6
|
+
defineDataset("s9ded2338f43807b095fbb4f", [
|
|
7
|
+
{ fdId: "jb16f22f6c1c21c3f6e8e293", name: "区域", fdType: "STRING", metaType: "DIM" },
|
|
8
|
+
{ fdId: "o7093aaf2b2f32c9e964c41a", name: "产品", fdType: "STRING", metaType: "DIM" },
|
|
9
|
+
{ fdId: "p2670dd6b74fc78c3e9c57ad", name: "月份", fdType: "DATE", metaType: "DIM" },
|
|
10
|
+
{ fdId: "lb1c31b4dc86511a27049a98", name: "营收", fdType: "DOUBLE", metaType: "METRIC" },
|
|
11
|
+
{ fdId: "aece10cd6806966be56f52ff", name: "成本", fdType: "DOUBLE", metaType: "METRIC" },
|
|
12
|
+
{ fdId: "g1b16b52a16eb10c5e26d4bb", name: "数量", fdType: "INT", metaType: "METRIC" },
|
|
13
|
+
{ fdId: "eae7cae6fbdcde68acdf5d1f", name: "利润率", fdType: "DOUBLE", metaType: "METRIC" }
|
|
14
|
+
], { displayType: "CSV" });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Selector: Region filter with auto-link to all cards
|
|
2
|
+
var sel = createSelector("区域筛选")
|
|
3
|
+
.setId("j423ad9cedf3b4bb1336fd6b")
|
|
4
|
+
.bindField(f("区域"))
|
|
5
|
+
.setMultiSelect(true)
|
|
6
|
+
.setDefaultType(SelectorDefaultType.FIRST_PICK)
|
|
7
|
+
.linkToAll()
|
|
8
|
+
.build();
|
|
9
|
+
|
|
10
|
+
registerSelector(sel);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var card = createCard(ChartType.BASIC_COLUMN, "按产品拆分区域营收")
|
|
2
|
+
.setId("spcolsplitdemoaabbccddee")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("区域"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
6
|
+
.addSplit(f("产品"))
|
|
7
|
+
.setSplitSetting({ rows: 2, columns: 3 })
|
|
8
|
+
.setDataLabel({ show: true, showNumber: true });
|
|
9
|
+
|
|
10
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var card = createCard(ChartType.BASIC_LINE, "按产品拆分月营收趋势")
|
|
2
|
+
.setId("splinesplitdemoaabbccdde")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("月份", { granularity: "MONTH" }))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
6
|
+
.addSplit(f("产品"))
|
|
7
|
+
.setSplitSetting({ rows: 2, columns: 3 })
|
|
8
|
+
.setShowLegend(false);
|
|
9
|
+
|
|
10
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
var card = createCard(ChartType.GROUPED_COLUMN_WITH_LINE, "按产品拆分营收成本趋势")
|
|
2
|
+
.setId("spcombosplitdemoaabbccdd")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("月份", { granularity: "MONTH" }))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
6
|
+
.addMetricAdditional(f("成本", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
7
|
+
.addSplit(f("产品"))
|
|
8
|
+
.setSplitSetting({ rows: 2, columns: 2 })
|
|
9
|
+
.setShowLegend(true, "bottom");
|
|
10
|
+
|
|
11
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var page = createPage("拆分图示例")
|
|
2
|
+
.setId("sppagesplitdemoaabbccdde")
|
|
3
|
+
.setDescription("展示柱形、折线和柱线组合图的 addSplit 用法。")
|
|
4
|
+
.setBackgroundColor("#f5f5f5")
|
|
5
|
+
.setCardMargin(8)
|
|
6
|
+
.addFullWidthCard(0, 6)
|
|
7
|
+
.addFullWidthCard(1, 6)
|
|
8
|
+
.addFullWidthCard(2, 6);
|
|
9
|
+
|
|
10
|
+
registerPage(page.build());
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Auto-generated by guanvis schema command
|
|
2
|
+
// DO NOT EDIT — regenerate with: guanvis schema s9ded2338f43807b095fbb4f
|
|
3
|
+
// This file defines dataset schemas for field() references in card scripts.
|
|
4
|
+
|
|
5
|
+
// Dataset: 销售数据 (example, 7 fields)
|
|
6
|
+
defineDataset("s9ded2338f43807b095fbb4f", [
|
|
7
|
+
{ fdId: "jb16f22f6c1c21c3f6e8e293", name: "区域", fdType: "STRING", metaType: "DIM" },
|
|
8
|
+
{ fdId: "o7093aaf2b2f32c9e964c41a", name: "产品", fdType: "STRING", metaType: "DIM" },
|
|
9
|
+
{ fdId: "p2670dd6b74fc78c3e9c57ad", name: "月份", fdType: "DATE", metaType: "DIM" },
|
|
10
|
+
{ fdId: "lb1c31b4dc86511a27049a98", name: "营收", fdType: "DOUBLE", metaType: "METRIC" },
|
|
11
|
+
{ fdId: "aece10cd6806966be56f52ff", name: "成本", fdType: "DOUBLE", metaType: "METRIC" },
|
|
12
|
+
{ fdId: "g1b16b52a16eb10c5e26d4bb", name: "数量", fdType: "INT", metaType: "METRIC" },
|
|
13
|
+
{ fdId: "eae7cae6fbdcde68acdf5d1f", name: "利润率", fdType: "DOUBLE", metaType: "METRIC" }
|
|
14
|
+
], { displayType: "EXCEL" });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var card = createCard(ChartType.GROUPED_COLUMN, "区域产品营收")
|
|
2
|
+
.setId("aaaaaaaaaaaaaaaaaaaaaaaa")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("区域"))
|
|
5
|
+
.addColumn(f("产品"))
|
|
6
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }))
|
|
7
|
+
.setShowLegend(true, "right")
|
|
8
|
+
.setDataLabel({ show: true, showNumber: true });
|
|
9
|
+
|
|
10
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var card = createCard(ChartType.MULTI_LINE, "月度营收成本趋势")
|
|
2
|
+
.setId("bbbbbbbbbbbbbbbbbbbbbbbb")
|
|
3
|
+
.bindDataset(DS)
|
|
4
|
+
.addRow(f("月份"))
|
|
5
|
+
.addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.auto("万") }))
|
|
6
|
+
.addMetric(f("成本", { aggrType: AggrType.SUM, numberFormat: NumberFormat.auto("万") }))
|
|
7
|
+
.setShowLegend(true, "bottom");
|
|
8
|
+
|
|
9
|
+
registerCard(card.build());
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
var text = createTextCard("Tab 使用说明")
|
|
2
|
+
.setId("cccccccccccccccccccccccc")
|
|
3
|
+
.addMarkdown(
|
|
4
|
+
"### Tab 布局示例\n\n" +
|
|
5
|
+
"- `createTab()` 创建容器\n" +
|
|
6
|
+
"- `addPanel(name, callback)` 创建页面上可切换的标签\n" +
|
|
7
|
+
"- panel 内通过 cardIndex 放置图表/文本等卡片,也可以用 selector 字符串 ID 放置筛选器\n\n" +
|
|
8
|
+
"> 未放入画布布局的筛选器会进入筛选器栏;用 `placeCard(\"selectorId\")` 放入 panel/root/cardGroup 后,同页筛选器栏不再重复展示。"
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
registerTextCard(text.build());
|