@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.
Files changed (239) hide show
  1. package/NOTICE.md +17 -0
  2. package/README.md +146 -2
  3. package/assets/coreutils.wasm +0 -0
  4. package/assets/find.wasm +0 -0
  5. package/assets/guanbi.wasm +4 -0
  6. package/assets/guancli.wasm +0 -0
  7. package/assets/guanhelm.wasm +0 -0
  8. package/assets/jq.wasm +0 -0
  9. package/assets/openskills.wasm +0 -0
  10. package/assets/rg.wasm +0 -0
  11. package/assets/sed.wasm +0 -0
  12. package/bin/guancopilot +0 -0
  13. package/bin/guanvm +0 -0
  14. package/bin/platforms.cjs +6 -0
  15. package/bin/run.cjs +39 -0
  16. package/bin/runtime.cjs +44 -0
  17. package/licenses/Go-LICENSE +27 -0
  18. package/licenses/browser-_speed-highlight_core-LICENSE +121 -0
  19. package/licenses/browser-_speed-highlight_core-package.json +14 -0
  20. package/licenses/browser-dompurify-LICENSE +202 -0
  21. package/licenses/browser-dompurify-LICENSE-MPL +373 -0
  22. package/licenses/browser-dompurify-package.json +10 -0
  23. package/licenses/browser-marked-LICENSE +44 -0
  24. package/licenses/browser-marked-package.json +10 -0
  25. package/licenses/coreutils-LICENSE +18 -0
  26. package/licenses/findutils-LICENSE +18 -0
  27. package/licenses/github.com_BurntSushi_toml_v1.6.0-COPYING +21 -0
  28. package/licenses/github.com_dustin_go-humanize_v1.0.1-LICENSE +21 -0
  29. package/licenses/github.com_google_jsonschema-go_v0.4.3-LICENSE +21 -0
  30. package/licenses/github.com_google_uuid_v1.6.0-LICENSE +27 -0
  31. package/licenses/github.com_jackc_pgpassfile_v1.0.0-LICENSE +22 -0
  32. package/licenses/github.com_jackc_pgservicefile_v0.0.0-20240606120523-5a60cdf6a761-LICENSE +22 -0
  33. package/licenses/github.com_jackc_pgx_v5_v5.11.0-LICENSE +22 -0
  34. package/licenses/github.com_jackc_puddle_v2_v2.2.2-LICENSE +22 -0
  35. package/licenses/github.com_mattn_go-isatty_v0.0.20-LICENSE +9 -0
  36. package/licenses/github.com_modelcontextprotocol_go-sdk_v1.8.0-LICENSE +216 -0
  37. package/licenses/github.com_ncruces_go-strftime_v1.0.0-LICENSE +21 -0
  38. package/licenses/github.com_remyoudompheng_bigfft_v0.0.0-20230129092748-24d4a6f8daec-LICENSE +27 -0
  39. package/licenses/github.com_santhosh-tekuri_jsonschema_v6_v6.0.3-LICENSE +175 -0
  40. package/licenses/github.com_segmentio_asm_v1.1.3-LICENSE +21 -0
  41. package/licenses/github.com_segmentio_encoding_v0.5.4-LICENSE +21 -0
  42. package/licenses/github.com_tetratelabs_wazero_v1.12.0-LICENSE +201 -0
  43. package/licenses/github.com_tetratelabs_wazero_v1.12.0-NOTICE +2 -0
  44. package/licenses/github.com_yosida95_uritemplate_v3_v3.0.2-LICENSE +25 -0
  45. package/licenses/golang.org_x_image_v0.44.0-LICENSE +27 -0
  46. package/licenses/golang.org_x_net_v0.58.0-LICENSE +27 -0
  47. package/licenses/golang.org_x_oauth2_v0.36.0-LICENSE +27 -0
  48. package/licenses/golang.org_x_sync_v0.22.0-LICENSE +27 -0
  49. package/licenses/golang.org_x_sys_v0.47.0-LICENSE +27 -0
  50. package/licenses/golang.org_x_text_v0.41.0-LICENSE +27 -0
  51. package/licenses/golang.org_x_time_v0.15.0-LICENSE +27 -0
  52. package/licenses/guanbi-skills-LICENSE +133 -0
  53. package/licenses/guanbi-skills-LICENSE.README.md +28 -0
  54. package/licenses/guanbi-skills-LICENSE.zh-CN +82 -0
  55. package/licenses/jq-COPYING +176 -0
  56. package/licenses/modernc.org_libc_v1.73.4-LICENSE +27 -0
  57. package/licenses/modernc.org_libc_v1.73.4-LICENSE-3RD-PARTY.md +305 -0
  58. package/licenses/modernc.org_mathutil_v1.7.1-LICENSE +27 -0
  59. package/licenses/modernc.org_memory_v1.11.0-LICENSE +27 -0
  60. package/licenses/modernc.org_memory_v1.11.0-LICENSE-GO +27 -0
  61. package/licenses/modernc.org_memory_v1.11.0-LICENSE-LOGO +1 -0
  62. package/licenses/modernc.org_memory_v1.11.0-LICENSE-MMAP-GO +25 -0
  63. package/licenses/modernc.org_sqlite_v1.53.0-LICENSE +26 -0
  64. package/licenses/mvdan.cc_sh_v3_v3.13.1-LICENSE +27 -0
  65. package/licenses/ripgrep-COPYING +3 -0
  66. package/licenses/ripgrep-LICENSE-MIT +21 -0
  67. package/licenses/sed-LICENSE +21 -0
  68. package/manifest.json +972 -0
  69. package/package.json +30 -4
  70. package/plugin/guancopilot.js +193 -0
  71. package/skills-bundle/.guanvm-skills-bundle +0 -0
  72. package/skills-bundle/_recipes/dashboard/gates/page_check.js +16 -0
  73. package/skills-bundle/_recipes/dashboard/gates/report_check.js +4 -0
  74. package/skills-bundle/_recipes/dashboard/knowledge/01.md +1 -0
  75. package/skills-bundle/_recipes/dashboard/knowledge/02.md +1 -0
  76. package/skills-bundle/_recipes/dashboard/knowledge/03.md +1 -0
  77. package/skills-bundle/_recipes/dashboard/knowledge/04.md +1 -0
  78. package/skills-bundle/_recipes/dashboard/knowledge/05.md +1 -0
  79. package/skills-bundle/_recipes/dashboard/knowledge/06.md +1 -0
  80. package/skills-bundle/_recipes/dashboard/template.json +41 -0
  81. package/skills-bundle/_recipes/etl/gates/etl_live_check.js +10 -0
  82. package/skills-bundle/_recipes/etl/gates/etl_report_check.js +3 -0
  83. package/skills-bundle/_recipes/etl/knowledge/01.md +1 -0
  84. package/skills-bundle/_recipes/etl/knowledge/02.md +9 -0
  85. package/skills-bundle/_recipes/etl/knowledge/03.md +1 -0
  86. package/skills-bundle/_recipes/etl/knowledge/04.md +1 -0
  87. package/skills-bundle/_recipes/etl/knowledge/05.md +1 -0
  88. package/skills-bundle/_recipes/etl/template.json +39 -0
  89. package/skills-bundle/_recipes/hints.json +46 -0
  90. package/skills-bundle/guancli/.commandface.json +155 -0
  91. package/skills-bundle/guancli/SKILL.md +342 -0
  92. package/skills-bundle/guancli/evals/evals.json +156 -0
  93. package/skills-bundle/guancli/evals/fixtures/metric-candidate-empty-search.json +13 -0
  94. package/skills-bundle/guancli/evals/fixtures/metric-candidate-prior-request.json +13 -0
  95. package/skills-bundle/guancli/evals/fixtures/metric-consumption-columns.json +46 -0
  96. package/skills-bundle/guancli/evals/fixtures/metric-consumption-metadata.json +36 -0
  97. package/skills-bundle/guancli/evals/fixtures/metric-consumption-query.json +18 -0
  98. package/skills-bundle/guancli/references/analysis-primitives.md +95 -0
  99. package/skills-bundle/guancli/references/auth-and-config.md +131 -0
  100. package/skills-bundle/guancli/references/examples/metric-date-in.json +7 -0
  101. package/skills-bundle/guancli/references/examples/metric-query-rows.py +83 -0
  102. package/skills-bundle/guancli/references/examples/metric-query.sh +6 -0
  103. package/skills-bundle/guancli/references/form-chatbi.md +199 -0
  104. package/skills-bundle/guancli/references/gateway.md +148 -0
  105. package/skills-bundle/guancli/references/metric-batch-query.md +82 -0
  106. package/skills-bundle/guancli/references/metric-commands.md +562 -0
  107. package/skills-bundle/guancli/references/metric-generic-query.md +215 -0
  108. package/skills-bundle/guancli/references/metric-json-migration.md +18 -0
  109. package/skills-bundle/guancli/references/metric-query-recipes.md +358 -0
  110. package/skills-bundle/guancli/references/preview-and-output.md +192 -0
  111. package/skills-bundle/guancli/references/resource-query.md +101 -0
  112. package/skills-bundle/guands/SKILL.md +281 -0
  113. package/skills-bundle/guands/references/calc-fields-boundaries-and-pitfalls.md +160 -0
  114. package/skills-bundle/guands/references/command-reference.md +267 -0
  115. package/skills-bundle/guands/references/incremental-and-schedule.md +157 -0
  116. package/skills-bundle/guands/references/workflows.md +256 -0
  117. package/skills-bundle/guanetl/SKILL.md +391 -0
  118. package/skills-bundle/guanetl/evals/evals.json +41 -0
  119. package/skills-bundle/guanetl/references/ETL_AI_DEVELOP.md +456 -0
  120. package/skills-bundle/guanmetric/SKILL.md +144 -0
  121. package/skills-bundle/guanmetric/evals/evals.json +117 -0
  122. package/skills-bundle/guanmetric/evals/fixtures/atomic-detail-read-model.json +18 -0
  123. package/skills-bundle/guanmetric/evals/fixtures/confirmed-template-summary.json +12 -0
  124. package/skills-bundle/guanmetric/evals/fixtures/create-result-unknown-state.json +13 -0
  125. package/skills-bundle/guanmetric/evals/forward-eval-2026-09-21.json +62 -0
  126. package/skills-bundle/guanmetric/references/metric-api-contract-examples.json +690 -0
  127. package/skills-bundle/guanmetric/references/metric-api-contract.schema.json +349 -0
  128. package/skills-bundle/guanmetric/references/metric-api-contracts.md +436 -0
  129. package/skills-bundle/guanmetric/references/metric-atomic-mutation.md +238 -0
  130. package/skills-bundle/guanmetric/references/metric-batch-status.md +71 -0
  131. package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract-examples.json +53 -0
  132. package/skills-bundle/guanmetric/references/metric-business-dictionary-api-contract.schema.json +26 -0
  133. package/skills-bundle/guanmetric/references/metric-business-dictionary.md +76 -0
  134. package/skills-bundle/guanmetric/references/metric-common-fields.md +246 -0
  135. package/skills-bundle/guanmetric/references/metric-composite-mutation.md +165 -0
  136. package/skills-bundle/guanmetric/references/metric-delete-mutation.md +70 -0
  137. package/skills-bundle/guanmetric/references/metric-derived-mutation.md +453 -0
  138. package/skills-bundle/guanmetric/references/metric-excel-template.md +365 -0
  139. package/skills-bundle/guanmetric/references/metric-expression-rules.md +146 -0
  140. package/skills-bundle/guanmetric/references/metric-flow-generate-example.json +79 -0
  141. package/skills-bundle/guanmetric/references/metric-flow-generate.schema.json +93 -0
  142. package/skills-bundle/guanmetric/references/metric-flow.md +218 -0
  143. package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract-examples.json +171 -0
  144. package/skills-bundle/guanmetric/references/metric-hierarchy-api-contract.schema.json +167 -0
  145. package/skills-bundle/guanmetric/references/metric-hierarchy-api-contracts.md +193 -0
  146. package/skills-bundle/guanmetric/references/metric-mutation.md +155 -0
  147. package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract-examples.json +62 -0
  148. package/skills-bundle/guanmetric/references/metric-public-dimension-api-contract.schema.json +47 -0
  149. package/skills-bundle/guanmetric/references/metric-public-dimension.md +155 -0
  150. package/skills-bundle/guanmetric/references/metric-tree-api-contract-examples.json +277 -0
  151. package/skills-bundle/guanmetric/references/metric-tree-api-contract.schema.json +263 -0
  152. package/skills-bundle/guanmetric/references/metric-tree-api-contracts.md +53 -0
  153. package/skills-bundle/guanmetric/references/metric-tree-mutation.md +500 -0
  154. package/skills-bundle/guanmetric/references/metric-validation-ownership.md +74 -0
  155. package/skills-bundle/guanvis/SKILL.md +333 -0
  156. package/skills-bundle/guanvis/evals/china_map/card_01_basic_map.js +13 -0
  157. package/skills-bundle/guanvis/evals/china_map/card_02_world_map.js +10 -0
  158. package/skills-bundle/guanvis/evals/china_map/card_03_point_map.js +12 -0
  159. package/skills-bundle/guanvis/evals/china_map/page.js +10 -0
  160. package/skills-bundle/guanvis/evals/china_map/schema.js +10 -0
  161. package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/README.md +30 -0
  162. package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/card_01_comparative_mvp.js +72 -0
  163. package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/page.js +6 -0
  164. package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/schema.js +22 -0
  165. package/skills-bundle/guanvis/evals/comparative_mvp_roundtrip/verify_default_roundtrip.sh +92 -0
  166. package/skills-bundle/guanvis/evals/complex_report_pro/card_01_monthly.js +63 -0
  167. package/skills-bundle/guanvis/evals/complex_report_pro/page.js +6 -0
  168. package/skills-bundle/guanvis/evals/complex_report_pro/schema.js +6 -0
  169. package/skills-bundle/guanvis/evals/custom_chart_echarts/card_01_bar.js +13 -0
  170. package/skills-bundle/guanvis/evals/custom_chart_echarts/card_02_pie.js +13 -0
  171. package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/bar.js +11 -0
  172. package/skills-bundle/guanvis/evals/custom_chart_echarts/charts/pie.js +15 -0
  173. package/skills-bundle/guanvis/evals/custom_chart_echarts/page.js +5 -0
  174. package/skills-bundle/guanvis/evals/custom_chart_echarts/schema.js +9 -0
  175. package/skills-bundle/guanvis/evals/custom_chart_sdk/card_01_level_nodes.js +19 -0
  176. package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.css +51 -0
  177. package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.html +1 -0
  178. package/skills-bundle/guanvis/evals/custom_chart_sdk/charts/level_nodes.js +28 -0
  179. package/skills-bundle/guanvis/evals/custom_chart_sdk/page.js +5 -0
  180. package/skills-bundle/guanvis/evals/custom_chart_sdk/schema.js +7 -0
  181. package/skills-bundle/guanvis/evals/dynamic_fields/card_01_dynamic_dataset.js +20 -0
  182. package/skills-bundle/guanvis/evals/dynamic_fields/card_02_dynamic_metric_chart.js +16 -0
  183. package/skills-bundle/guanvis/evals/dynamic_fields/metrics.js +19 -0
  184. package/skills-bundle/guanvis/evals/dynamic_fields/page.js +9 -0
  185. package/skills-bundle/guanvis/evals/dynamic_fields/schema.js +7 -0
  186. package/skills-bundle/guanvis/evals/dynamic_fields/verify_default_roundtrip.sh +137 -0
  187. package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/README.md +26 -0
  188. package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_01_percentage_advcalc.js +44 -0
  189. package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/card_02_scroll_percentage.js +12 -0
  190. package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/page.js +6 -0
  191. package/skills-bundle/guanvis/evals/percentage_advcalc_roundtrip/schema.js +22 -0
  192. package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/README.md +28 -0
  193. package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/card_01_rank_advcalc.js +59 -0
  194. package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/page.js +6 -0
  195. package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/schema.js +22 -0
  196. package/skills-bundle/guanvis/evals/rank_advcalc_roundtrip/verify_default_roundtrip.sh +135 -0
  197. package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/README.md +15 -0
  198. package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/card_01_running_total_advcalc.js +74 -0
  199. package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/page.js +6 -0
  200. package/skills-bundle/guanvis/evals/running_total_advcalc_roundtrip/schema.js +22 -0
  201. package/skills-bundle/guanvis/evals/sales_dashboard/card_01_revenue_column.js +10 -0
  202. package/skills-bundle/guanvis/evals/sales_dashboard/card_02_trend_line.js +9 -0
  203. package/skills-bundle/guanvis/evals/sales_dashboard/card_03_kpi.js +6 -0
  204. package/skills-bundle/guanvis/evals/sales_dashboard/card_04_pie.js +9 -0
  205. package/skills-bundle/guanvis/evals/sales_dashboard/card_05_calc_field_test.js +12 -0
  206. package/skills-bundle/guanvis/evals/sales_dashboard/page.js +11 -0
  207. package/skills-bundle/guanvis/evals/sales_dashboard/schema.js +14 -0
  208. package/skills-bundle/guanvis/evals/sales_dashboard/selector_01_region.js +10 -0
  209. package/skills-bundle/guanvis/evals/split_charts/card_01_column_split.js +10 -0
  210. package/skills-bundle/guanvis/evals/split_charts/card_02_line_split.js +10 -0
  211. package/skills-bundle/guanvis/evals/split_charts/card_03_combo_split.js +11 -0
  212. package/skills-bundle/guanvis/evals/split_charts/page.js +10 -0
  213. package/skills-bundle/guanvis/evals/split_charts/schema.js +14 -0
  214. package/skills-bundle/guanvis/evals/tab_layout/card_00_total_revenue.js +6 -0
  215. package/skills-bundle/guanvis/evals/tab_layout/card_01_revenue.js +10 -0
  216. package/skills-bundle/guanvis/evals/tab_layout/card_02_trend.js +9 -0
  217. package/skills-bundle/guanvis/evals/tab_layout/card_03_story.js +11 -0
  218. package/skills-bundle/guanvis/evals/tab_layout/page.js +23 -0
  219. package/skills-bundle/guanvis/evals/tab_layout/schema.js +11 -0
  220. package/skills-bundle/guanvis/evals/tab_layout/selector_01_region.js +8 -0
  221. package/skills-bundle/guanvis/references/api-reference.md +476 -0
  222. package/skills-bundle/guanvis/references/builder-reference.md +1676 -0
  223. package/skills-bundle/guanvis/references/chart-properties.md +2101 -0
  224. package/skills-bundle/guanvis/references/checkout-editing.md +53 -0
  225. package/skills-bundle/guanvis/references/complex-report-pro-patterns.md +398 -0
  226. package/skills-bundle/guanvis/references/dir-and-page-management.md +48 -0
  227. package/skills-bundle/guanvis/references/metric-chart-reference.md +258 -0
  228. package/skills-bundle/guanvis/references/publish-and-constraints.md +60 -0
  229. package/skills-bundle/guanvis/references/selector-reference.md +431 -0
  230. package/skills-bundle/guanvis/references/tableau-migration.md +73 -0
  231. package/skills-bundle/guanvis/references/theme.md +123 -0
  232. package/skills-bundle/guanvis/references/troubleshooting.md +25 -0
  233. package/skills-bundle/guanvis/references/validation-and-chart-patterns.md +205 -0
  234. package/skills-bundle/guanwf/SKILL.md +543 -0
  235. package/skills-bundle/guanwf/references/ETL_AI_DEVELOP.md +456 -0
  236. package/skills-bundle/guanwf/references/TASK_NODE_CONTRACTS.md +64 -0
  237. package/skills-bundle/guanwf/references/WORKFLOW_DSL.md +536 -0
  238. package/skills-bundle/guanwf/references/WORKFLOW_NODES.md +166 -0
  239. 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,6 @@
1
+ var page = createPage("L3 占比高级计算 RoundTrip")
2
+ .setId("pct01a02b03c04d05e06f09g")
3
+ .addFullWidthCard("pct01a02b03c04d05e06f07g", 8)
4
+ .addFullWidthCard("pct02a02b03c04d05e06f07g", 8);
5
+
6
+ registerPage(page.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,6 @@
1
+ var page = createPage("L3 排名高级计算 RoundTrip")
2
+ .setId("r5f01a02b03c04d05e06f09a")
3
+ .addFullWidthCard("r3f01a02b03c04d05e06f07a", 8)
4
+ .addFullWidthCard("r4f01a02b03c04d05e06f08a", 8);
5
+
6
+ registerPage(page.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`.
@@ -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,6 @@
1
+ var page = createPage("L3 累计高级计算 RoundTrip")
2
+ .setId("t5f01a02b03c04d05e06f09a")
3
+ .addFullWidthCard("t3f01a02b03c04d05e06f07a", 8)
4
+ .addFullWidthCard("t4f01a02b03c04d05e06f08a", 8);
5
+
6
+ registerPage(page.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,6 @@
1
+ var card = createCard(ChartType.KPI_CARD, "总营收")
2
+ .setId("o1c1e4431cc0c6dcc30663a1")
3
+ .bindDataset(DS)
4
+ .addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }));
5
+
6
+ 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,6 @@
1
+ var card = createCard(ChartType.SINGLE_VALUE, "总营收")
2
+ .setId("eeeeeeeeeeeeeeeeeeeeeeee")
3
+ .bindDataset(DS)
4
+ .addMetric(f("营收", { aggrType: AggrType.SUM, numberFormat: NumberFormat.currency("¥", 0) }));
5
+
6
+ registerCard(card.build());
@@ -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());