openyida 2026.7.18 → 2026.7.21

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 (200) hide show
  1. package/README.md +37 -2
  2. package/bin/yida.js +113 -18
  3. package/docs/capabilities.md +202 -0
  4. package/lib/agent-center/agent-center.js +2 -3
  5. package/lib/app/app-list.js +3 -4
  6. package/lib/app/build-page.js +13 -6
  7. package/lib/app/check-page.js +16 -6
  8. package/lib/app/compile.js +17 -7
  9. package/lib/app/create-app.js +14 -2
  10. package/lib/app/create-form/api-path.js +25 -0
  11. package/lib/app/create-form/args.js +13 -0
  12. package/lib/app/create-form/commands.js +4 -0
  13. package/lib/app/create-form/definition-reader.js +23 -23
  14. package/lib/app/create-form/field-normalizers.js +26 -7
  15. package/lib/app/create-form/schema-patch.js +4 -1
  16. package/lib/app/create-form.js +155 -68
  17. package/lib/app/create-page.js +47 -10
  18. package/lib/app/generate-page.js +20 -1
  19. package/lib/app/get-form-config.js +2 -1
  20. package/lib/app/get-schema.js +67 -15
  21. package/lib/app/import-app.js +94 -42
  22. package/lib/app/list-forms.js +4 -8
  23. package/lib/app/page-ir.js +140 -0
  24. package/lib/app/publish.js +289 -556
  25. package/lib/app/schema-field-resolution.js +370 -0
  26. package/lib/app/services/app-reader.js +85 -0
  27. package/lib/app/services/app-service.js +235 -0
  28. package/lib/app/services/canvas-page-compiler.js +91 -0
  29. package/lib/app/services/canvas-page-schema-builder.js +149 -0
  30. package/lib/app/services/field-bindings.js +68 -0
  31. package/lib/app/services/form-compiler.js +1922 -0
  32. package/lib/app/services/form-mode-service.js +182 -0
  33. package/lib/app/services/form-schema-patcher.js +333 -0
  34. package/lib/app/services/form-schema-reader.js +59 -0
  35. package/lib/app/services/form-service.js +379 -0
  36. package/lib/app/services/form-validation.js +562 -0
  37. package/lib/app/services/native-page-compiler.js +92 -0
  38. package/lib/app/services/native-page-schema-builder.js +428 -0
  39. package/lib/app/services/page-resource-service.js +185 -0
  40. package/lib/app/update-app.js +22 -9
  41. package/lib/app/update-form-config.js +4 -2
  42. package/lib/asset/asset-cmd.js +19 -6
  43. package/lib/auth/oauth-loopback.js +376 -15
  44. package/lib/auth/token-auth.js +34 -3
  45. package/lib/auth/token-store.js +22 -4
  46. package/lib/basic-info/basic-info.js +2 -1
  47. package/lib/bridge/bridge.js +43 -18
  48. package/lib/core/agent-capabilities.js +5 -3
  49. package/lib/core/command-errors.js +38 -0
  50. package/lib/core/command-manifest.js +59 -1
  51. package/lib/core/copy.js +12 -0
  52. package/lib/core/doctor.js +15 -4
  53. package/lib/core/env-cmd.js +1 -1
  54. package/lib/core/env.js +7 -6
  55. package/lib/core/i18n.js +66 -8
  56. package/lib/core/legacy-schema-guard.js +408 -0
  57. package/lib/core/locales/en.js +38 -46
  58. package/lib/core/locales/zh.js +30 -46
  59. package/lib/core/sample.js +12 -2
  60. package/lib/core/utils.js +334 -66
  61. package/lib/core/yida-client.js +108 -5
  62. package/lib/corp-efficiency/corp-efficiency.js +2 -2
  63. package/lib/corp-manager/corp-manager.js +3 -3
  64. package/lib/formula/evaluate.js +11 -68
  65. package/lib/formula/field-refs.js +83 -0
  66. package/lib/i18n-management/i18n-management.js +2 -3
  67. package/lib/process/configure-process.js +44 -1992
  68. package/lib/process/create-process.js +54 -87
  69. package/lib/process/preview-process.js +20 -8
  70. package/lib/process/services/process-compiler.js +2056 -0
  71. package/lib/process/services/process-reader.js +232 -0
  72. package/lib/process/services/process-resource-service.js +571 -0
  73. package/lib/process/services/process-service.js +122 -0
  74. package/lib/process/services/process-stage-checkpoint.js +246 -0
  75. package/lib/report/append.js +7 -26
  76. package/lib/report/http.js +31 -5
  77. package/lib/report/index.js +10 -2
  78. package/lib/samples/yida-canvas-custom-page/business-list.canvas.jsx +63 -14
  79. package/lib/samples/yida-canvas-custom-page/dashboard-overview.canvas.jsx +176 -32
  80. package/lib/samples/yida-canvas-custom-page/dashboard-starter.canvas.jsx +5 -2
  81. package/lib/samples/yida-canvas-custom-page/data-management.canvas.jsx +228 -14
  82. package/lib/samples/yida-canvas-custom-page/portal-shell-home.canvas.jsx +2 -2
  83. package/lib/samples/yida-canvas-custom-page/split-pane-detail.canvas.jsx +206 -10
  84. package/lib/samples/yida-custom-page/data-management.oyd.jsx +14 -3
  85. package/lib/samples/yida-custom-page/design-tokens.js +2 -2
  86. package/lib/samples/yida-custom-page/detail-profile.oyd.jsx +1 -1
  87. package/lib/samples/yida-custom-page/portal-shell-home.oyd.jsx +7 -2
  88. package/lib/samples/yida-custom-page/split-pane-detail.oyd.jsx +2 -1
  89. package/lib/schema/adapters/app-adapter.js +210 -0
  90. package/lib/schema/adapters/form-adapter.js +1362 -0
  91. package/lib/schema/adapters/keys.js +19 -0
  92. package/lib/schema/adapters/page-adapter.js +566 -0
  93. package/lib/schema/adapters/process-adapter.js +519 -0
  94. package/lib/schema/applier.js +1878 -0
  95. package/lib/schema/apply-store.js +1083 -0
  96. package/lib/schema/command.js +645 -0
  97. package/lib/schema/dependency-graph.js +83 -0
  98. package/lib/schema/errors.js +481 -0
  99. package/lib/schema/hash.js +9 -0
  100. package/lib/schema/manifest-limits.js +177 -0
  101. package/lib/schema/manifest-loader.js +309 -0
  102. package/lib/schema/manifest-schema-v1.json +193 -0
  103. package/lib/schema/normalize-manifest.js +281 -0
  104. package/lib/schema/page-canvas-foundation.js +447 -0
  105. package/lib/schema/page-data-source-builder.js +561 -0
  106. package/lib/schema/page-foundation.js +556 -0
  107. package/lib/schema/page-source-loader.js +314 -0
  108. package/lib/schema/planner.js +691 -0
  109. package/lib/schema/remote-dispatch-boundary.js +39 -0
  110. package/lib/schema/remote-missing.js +21 -0
  111. package/lib/schema/remote-reader.js +189 -0
  112. package/lib/schema/resource-registry.js +157 -0
  113. package/lib/schema/server-revision.js +71 -0
  114. package/lib/schema/sort.js +28 -0
  115. package/lib/schema/state-store.js +589 -0
  116. package/package.json +10 -8
  117. package/scripts/check-release-risks.js +254 -0
  118. package/scripts/generate-command-docs.js +6 -1
  119. package/scripts/i18n-baseline.json +11 -11
  120. package/scripts/postinstall.js +8 -12
  121. package/scripts/validate-ci.sh +15 -11
  122. package/scripts/validate-i18n.js +30 -9
  123. package/scripts/validate-package-size.js +5 -2
  124. package/scripts/validate-skills.js +4 -0
  125. package/scripts/validate-structure.js +15 -0
  126. package/yida-skills/SKILL.md +117 -30
  127. package/yida-skills/references/schema-as-code-phase1.md +99 -0
  128. package/yida-skills/references/setup-and-env.md +59 -59
  129. package/yida-skills/references/task-retrospective.md +6 -6
  130. package/yida-skills/skills/yida-app/SKILL.md +78 -17
  131. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +18 -7
  132. package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +3 -3
  133. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +15 -0
  134. package/yida-skills/skills/yida-create-app/SKILL.md +21 -3
  135. package/yida-skills/skills/yida-create-form-page/SKILL.md +19 -1
  136. package/yida-skills/skills/yida-create-page/SKILL.md +16 -3
  137. package/yida-skills/skills/yida-create-process/SKILL.md +100 -4
  138. package/yida-skills/skills/yida-custom-page/SKILL.md +19 -4
  139. package/yida-skills/skills/yida-dashboard/SKILL.md +1 -1
  140. package/yida-skills/skills/yida-dashboard/references/pitfalls.md +1 -1
  141. package/yida-skills/skills/yida-get-schema/SKILL.md +49 -5
  142. package/yida-skills/skills/yida-i18n/SKILL.md +1 -1
  143. package/yida-skills/skills/yida-integration/SKILL.md +7 -1
  144. package/yida-skills/skills/yida-login/SKILL.md +50 -99
  145. package/yida-skills/skills/yida-page-config/SKILL.md +7 -1
  146. package/yida-skills/skills/yida-page-uiux/references/app/blueprint.md +0 -1
  147. package/yida-skills/skills/yida-page-uiux/references/app/navigation-patterns.md +0 -1
  148. package/yida-skills/skills/yida-page-uiux/references/app/role-journey.md +0 -1
  149. package/yida-skills/skills/yida-page-uiux/references/dashboard/app-blueprint.md +0 -1
  150. package/yida-skills/skills/yida-page-uiux/references/dashboard/chart-contracts.md +0 -1
  151. package/yida-skills/skills/yida-page-uiux/references/dashboard/component-contracts.md +0 -1
  152. package/yida-skills/skills/yida-page-uiux/references/dashboard/layout-patterns.md +0 -1
  153. package/yida-skills/skills/yida-page-uiux/references/dashboard/theme-recipes.md +0 -1
  154. package/yida-skills/skills/yida-page-uiux/references/detail/object-narrative.md +0 -1
  155. package/yida-skills/skills/yida-page-uiux/references/detail/section-patterns.md +0 -1
  156. package/yida-skills/skills/yida-page-uiux/references/detail/timeline-and-related.md +0 -1
  157. package/yida-skills/skills/yida-page-uiux/references/landing/assets-workflow.md +0 -1
  158. package/yida-skills/skills/yida-page-uiux/references/landing/industry-playbooks.md +0 -1
  159. package/yida-skills/skills/yida-page-uiux/references/landing/research-levels.md +0 -1
  160. package/yida-skills/skills/yida-page-uiux/references/landing/section-patterns.md +0 -1
  161. package/yida-skills/skills/yida-page-uiux/references/list/drawer-detail.md +0 -1
  162. package/yida-skills/skills/yida-page-uiux/references/list/empty-loading-error.md +0 -1
  163. package/yida-skills/skills/yida-page-uiux/references/list/filter-patterns.md +0 -1
  164. package/yida-skills/skills/yida-page-uiux/references/list/table-patterns.md +0 -1
  165. package/yida-skills/skills/yida-page-uiux/references/scenes/screen.md +0 -1
  166. package/yida-skills/skills/yida-page-uiux/references/workbench/entry-patterns.md +0 -1
  167. package/yida-skills/skills/yida-page-uiux/references/workbench/portal-layouts.md +0 -1
  168. package/yida-skills/skills/yida-page-uiux/references/workbench/task-feed.md +0 -1
  169. package/yida-skills/skills/yida-page-uiux/workflow/output-decision-block.md +1 -1
  170. package/yida-skills/skills/yida-process-rule/SKILL.md +35 -1
  171. package/yida-skills/skills/yida-publish-page/SKILL.md +46 -4
  172. package/yida-skills/skills/yida-report/SKILL.md +9 -235
  173. package/yida-skills/skills/yida-report/references/schema-builder-details.md +239 -0
  174. package/yida-skills/skills/yida-skill-evaluator/SKILL.md +170 -0
  175. package/yida-skills/skills-index.json +238 -54
  176. package/lib/core/locales/ar.js +0 -834
  177. package/lib/core/locales/de.js +0 -834
  178. package/lib/core/locales/es.js +0 -834
  179. package/lib/core/locales/fr.js +0 -834
  180. package/lib/core/locales/hi.js +0 -834
  181. package/lib/core/locales/ja.js +0 -1227
  182. package/lib/core/locales/ko.js +0 -836
  183. package/lib/core/locales/pt.js +0 -834
  184. package/lib/core/locales/vi.js +0 -834
  185. package/lib/core/locales/zh-HK.js +0 -1263
  186. package/project/pages/src/demo-birthday-game.oyd.jsx +0 -832
  187. package/project/pages/src/demo-chip-insight.oyd.jsx +0 -983
  188. package/project/pages/src/demo-compat-smoke.oyd.jsx +0 -58
  189. package/project/pages/src/demo-crm-batch-entry.oyd.jsx +0 -805
  190. package/project/pages/src/demo-crm-dashboard.oyd.jsx +0 -677
  191. package/project/pages/src/demo-future-vision-2026.oyd.jsx +0 -1102
  192. package/project/pages/src/demo-ppt.oyd.jsx +0 -1192
  193. package/project/pages/src/demo-salary-calculator.oyd.jsx +0 -904
  194. package/project/pages/src/openyida-knowledge-doc.oyd.jsx +0 -1714
  195. package/yida-skills/skills/large-file-write/SKILL.md +0 -93
  196. package/yida-skills/skills/large-file-write/references/write-patterns.md +0 -147
  197. package/yida-skills/skills/large-file-write/scripts/write.js +0 -157
  198. package/yida-skills/skills/sls-log-workbench/SKILL.md +0 -134
  199. package/yida-skills/skills/sls-log-workbench/references/workbench-reference.md +0 -130
  200. package/yida-skills/skills/sls-log-workbench/sls-query.js +0 -295
@@ -1,16 +1,29 @@
1
1
  ---
2
2
  name: yida-process-rule
3
- description: 为已有流程表单配置审批规则(审批/办理/抄送、条件/并行分支、字段权限、跳转规则、官方组件节点透传)。适用于流程表单已创建、需要调整审批流程时。
3
+ description: 配置已有流程表单审批规则;schema-managed 流程由根技能或明确 context 路由到 schema workflow。
4
4
  ---
5
5
 
6
6
  # 宜搭流程规则配置技能
7
7
 
8
+ > 资源边界:本技能只处理普通 OpenYida 资源;若根技能、上下文或 CLI guard 显示目标是 schema-managed,停止本技能并走 schema workflow;目标不明时回到根技能确认。
9
+ > direct/standalone 路径才可执行本技能;schema-managed 路径必须回到 schema validate → plan → apply,不在本技能内降级写入。
10
+
11
+ ## Resource-First 使用门槛
12
+
13
+ 本技能是已有流程/表单上下文的默认流程修改入口:
14
+
15
+ - 已有流程表单、`processCode`、流程 URL、bound process 或可确认的 workflow form 时,审批节点、条件分支、字段权限、抄送、跳转规则等诉求默认使用本技能。
16
+ - 已有普通表单 `formUuid` 且用户要“配置审批 / 转为审批流程”,先确认是否对该表单启用流程;如果只是转流程且尚无流程,可由 `yida-create-process --formUuid` 复用该表单,不要新建同名表单。
17
+ - 没有目标表单/流程,且用户明确从零创建审批系统时,才改用 `yida-create-process`。
18
+ - 多个流程候选按根技能来源优先级选择;同级冲突或无法判断目标流程时才问用户。
19
+
8
20
  ## 严格禁止 (NEVER DO)
9
21
 
10
22
  - 不要在流程定义中使用猜测的 fieldId,必须先用 `yida-get-schema` 获取
11
23
  - 不要在未加载本技能内容的情况下编写流程定义 JSON,格式复杂且易出错
12
24
  - 不要用此技能创建流程表单,应使用 `yida-create-process`
13
25
  - 不要用 shell heredoc、`cat`/`echo`/`printf`/`tee` 或重定向生成流程定义 JSON
26
+ - 已有 process/form context 时不要新建同类流程表单;在原流程上配置/更新。
14
27
 
15
28
  ## 严格要求 (MUST DO)
16
29
 
@@ -25,6 +38,7 @@ description: 为已有流程表单配置审批规则(审批/办理/抄送、
25
38
  | 用户意图 | 触发条件 |
26
39
  |---------|---------|
27
40
  | 配置/修改审批流程 | "配置审批"、"审批节点"、"条件分支"、"字段权限" |
41
+ | 从零创建流程表单 | 仅无既有 form/process context 时 → 改用 `yida-create-process` |
28
42
 
29
43
  ## 触发条件
30
44
 
@@ -51,6 +65,14 @@ description: 为已有流程表单配置审批规则(审批/办理/抄送、
51
65
 
52
66
  ## 前提
53
67
 
68
+ | 场景 | 使用技能 |
69
+ |------|---------|
70
+ | **已有流程表单**:只需修改/配置已有表单的审批流程规则 | **本技能(yida-process-rule)** |
71
+ | **已有普通表单**:要启用/转换审批流程 | 先确认目标表单,再用 `yida-create-process --formUuid` 复用表单或回到本技能配置 |
72
+ | **从零创建**:没有目标表单/流程,需要新建表单 + 配置审批流程 | **yida-create-process** |
73
+
74
+ > 简单判断:有没有现成的流程表单?有 → 本技能;没有 → `yida-create-process`。
75
+
54
76
  执行本技能前需要已经有目标流程表单、`appType`、`formUuid`、字段 ID 和必要的审批人 / 条件信息。
55
77
 
56
78
  ## 使用方式
@@ -420,3 +442,15 @@ OpenYida 会自动兼容常见别名:
420
442
  yida-process-rule/
421
443
  └── SKILL.md # 本文档
422
444
  ```
445
+
446
+ ## 与其他技能配合
447
+
448
+ | 步骤 | 技能 | 说明 |
449
+ | --- | --- | --- |
450
+ | 1 | 已有 app 或 `yida-create-app` | 复用已解析 `appType`;仅无 app 且允许创建时新建 |
451
+ | 2 | 已有表单或 `yida-create-form-page` | 复用已解析 `formUuid`;仅缺表单且允许创建时新建,并获取字段 ID |
452
+ | 3 | **本技能** | 配置表单的流程规则 |
453
+ | 4 | `yida-custom-page` | 编写自定义页面代码 |
454
+ | 5 | `yida-publish-page` | 发布自定义页面 |
455
+
456
+ > **快捷方式**:使用 `yida-create-process` 技能可一键完成步骤 2-3(创建表单 + 配置流程)。
@@ -1,16 +1,30 @@
1
1
  ---
2
2
  name: yida-publish-page
3
- description: JSX 源码编译发布到宜搭自定义页面。Babel ES5 + UglifyJS 压缩 + Schema 构建 + saveFormSchema 接口部署。适用于自定义页面代码编写完成后的编译和发布。
3
+ description: 自定义页面 JSX 编译发布技能;schema-managed 页面由根技能或明确 context 路由到 schema workflow。
4
4
  ---
5
5
 
6
6
  # 发布自定义页面
7
7
 
8
+ > 资源边界:本技能只处理普通 OpenYida 资源;若根技能、上下文或 CLI guard 显示目标是 schema-managed,停止本技能并走 schema workflow;目标不明时回到根技能确认。
9
+ > direct/standalone 路径才可执行本技能;schema-managed 路径必须回到 schema validate → plan → apply,不在本技能内降级写入。
10
+
11
+ ## Resource-First 发布目标
12
+
13
+ 发布前必须先解析目标页面 context;本技能优先服务已有页面:
14
+
15
+ - 用户说“优化这个页面 URL / 修改这个页面 / 重新发布 / 覆盖现有页面”并提供页面 URL、`formUuid`、bound page 或 workspace 中可确认的 display page 时,直接把该页面作为发布目标,不创建 app/page。
16
+ - bound page 是默认发布候选,不是强制目标;如果当前会话绑定页面 A,而用户本轮明确指定页面 B,必须先解析 B。B 有唯一 URL / display `formUuid` 时发布到 B;B 只有名称或描述且无法唯一匹配时先问用户;不要静默发布到 A。
17
+ - 只有无法解析目标页面,且用户明确要新增一个页面容器时,才回到 `yida-create-page` 创建缺失 display page;已有 appType 不代表需要新建 app。
18
+ - 发布目标必须是 `formType=display` 的自定义页面;普通表单、流程表单、数据底表的 `formUuid` 不能作为 `openyida publish` 第三个参数。
19
+ - 多个页面候选按根技能来源优先级选择;同级冲突或无法判断页面类型时才问用户或执行只读 `list-forms` 确认。
20
+
8
21
  ## 严格禁止 (NEVER DO)
9
22
 
10
23
  - 不要在未加载对应页面子技能的情况下编写页面源码:普通自定义页面 JSX/Jsx 组件链路加载 `yida-custom-page`,Code Canvas 链路加载 `yida-canvas-custom-page`
11
24
  - 不要把 AI 生成的普通 React 项目代码直接发布;源码应使用 OpenYida 页面源码格式:普通自定义页面 JSX/Jsx 组件链路用 `.oyd.jsx` / `.jsx` 并通过 `check-page` / `compile` 预检,Code Canvas 用 `.canvas.jsx` 并通过 `publish` 的 Canvas 编译阶段校验
12
25
  - 不要在宜搭原生 `export function renderJsx()` 页面里手写 Hooks;如确需 `useState/useEffect`,必须使用 `.oyd.jsx` 的 `export default function Page()` authoring 模式,让 OpenYida 兼容编译器降级
13
26
  - 不要编造 appType 和 formUuid,必须从已有记录或命令返回中获取
27
+ - 用户已给页面 URL / `formUuid` / bound page 时,不要先创建新 app 或新 page;直接确认目标并发布到已有页面。
14
28
 
15
29
  ## 严格要求 (MUST DO)
16
30
 
@@ -22,17 +36,19 @@ description: 将 JSX 源码编译发布到宜搭自定义页面。Babel 转 ES5
22
36
  - corpId 不匹配时,必须询问用户是否切换组织,不得强行发布
23
37
  - 重新发布已有自定义页面时,`openyida publish` 会自动读取目标页面现有 Schema 并合并页面级 `dataSource`;不要靠 Agent 口头承诺“保留数据源”,必须使用新版 CLI 的默认保护能力
24
38
  - 如果源码包含 `this.dataSourceMap.`,而发布输出包含 `No custom page data sources to preserve`,本次发布不能视为完成;说明源码依赖设计器数据源但目标页没有可保留数据源。必须改为 `this.utils.yida.*` / 入口型页面后重新 check、compile、publish,或先通过 `yida-data-source-connectors` 创建并绑定数据源后重新发布
39
+ - **发布证据闭环**:本轮只要 Write/Edit/Create 了 `project/pages/src/*.{canvas.jsx,canvas.tsx,oyd.jsx,jsx,tsx}`,final 证据只认真实执行成功的 `openyida publish <source> <appType> <displayPageFormUuid>` 命令结果;本地文件编辑、diff、`check-page`、`compile`、`compileCanvasLocal` 或口头声明都不能证明远端页面已更新
25
40
  - **本技能不读写 memory**:发布操作通过 CLI 命令写入宜搭平台,不依赖跨会话的 memory 状态
26
41
 
27
42
  ## 适用场景
28
43
 
29
- 编写完自定义页面 JSX 代码后,执行此技能将代码编译发布到宜搭平台。
44
+ 编写完自定义页面 JSX 代码后,执行此技能将代码编译发布到宜搭平台。已有页面 URL / `formUuid` / bound page 时,默认发布到该已有页面。
30
45
  通常在 `yida-custom-page`(普通自定义页面 JSX/Jsx 组件链路)或 `yida-canvas-custom-page`(Code Canvas 链路)之后执行。
31
46
 
32
47
  ## 触发条件
33
48
 
34
49
  **正向触发**:
35
50
  - "发布页面"、"上线页面"、"部署页面"
51
+ - "优化这个页面 URL"、"修改现有页面后重新发布"
36
52
  - `yida-custom-page` 或 `yida-canvas-custom-page` 代码编写完成后的下一步
37
53
  - "编译发布"、"把代码发布到宜搭"
38
54
 
@@ -70,6 +86,13 @@ openyida list-forms <appType> --keyword <页面名>
70
86
 
71
87
  只选择 `formType=display` 的 `formUuid` 作为发布目标。源码里用于 `this.utils.yida` 读写数据的普通表单常量(如 `FORM_SKILL`、`FORM_DATA`、`FORM_TABLE`)通常是数据底表,不能作为 `openyida publish` 的第三个参数。
72
88
 
89
+ ## Final 证据契约
90
+
91
+ - final 中“页面已更新 / 已重新发布 / 已上线”的依据只能是成功的 `openyida publish <source> <appType> <displayPageFormUuid>` 命令结果,最好同时带发布输出中的 URL、`formUuid`、`success:true` 或 health-check 摘要。
92
+ - `<source>` 必须是本轮实际 Write/Edit/Create 过的页面源码;`<displayPageFormUuid>` 必须是已解析的 display 自定义页面。发布了其他文件或其他目标页面,不满足本轮源码修改的 doneWhen。
93
+ - 若 publish 没执行、执行失败、目标不明、登录态/组织不一致或用户要求先暂停,final 只能说“源码已修改,尚未发布”,并给出下一步需要执行的 publish 命令或阻塞原因。
94
+ - 普通自定义页面的 `check-page` / `compile`、Code Canvas 的 `compileCanvasLocal` 或 `generate-page --compile` 都是发布前 guard,不是远端完成证据。
95
+
73
96
  ## 数据源保留
74
97
 
75
98
  `openyida publish` 默认是非破坏式发布:保存新 JSX Schema 前会调用 `getFormSchema` 读取目标自定义页面已有 Schema,提取 Page 组件上的 `dataSource`,再与发布脚本内置的 `urlParams`、`timestamp` 数据源合并。用户在宜搭设计器里手工创建的 HTTP / VALUE / URI 等页面级数据源会随新源码一起保留。
@@ -116,8 +139,8 @@ body { background-color: #f2f3f5; }
116
139
 
117
140
  ## 注意事项
118
141
 
119
- - 发布目标地址由当前环境配置和 token session 中的 `base_url` 决定
120
- - 碰到组织 corpId 不匹配时,询问用户是否创建新应用发布
142
+ - 发布目标地址由当前环境配置和 auth context(默认 token session;`YIDA_AUTH_ENABLED=true` 时为宿主注入 token)中的 `base_url` 决定
143
+ - 碰到组织 corpId 不匹配时,询问用户是重新登录到目标组织,还是确认在当前组织继续发布到已解析页面;不要通过新建应用规避不匹配
121
144
  - **编写源码前必须先加载对应页面子技能**:普通自定义页面 JSX/Jsx 组件链路调用 `use_skill("yida-custom-page", "编写宜搭普通自定义页面 JSX")`;Code Canvas 链路调用 `use_skill("yida-canvas-custom-page", "编写 Code Canvas 自定义页面")`。旧式 `renderJsx` 写法不要使用 Hooks,现代普通自定义页面 authoring 写法必须走 `.oyd.jsx` 兼容编译;Canvas 源码写成 `.canvas.jsx`
122
145
 
123
146
  ## 异常处理
@@ -147,3 +170,22 @@ body { background-color: #f2f3f5; }
147
170
  | corpId 不匹配 | 停止执行,询问用户是否切换组织或创建新应用 |
148
171
  | 网络超时 | 重试 1 次,仍失败则停止并提示用户检查网络 |
149
172
  | 未知错误 | 停止执行,完整展示错误信息,建议用户反馈问题 |
173
+
174
+ ## 与其他技能配合
175
+
176
+ 本技能在完整开发流程中的位置:
177
+
178
+ ```
179
+ resolve existing page or create missing page → yida-custom-page / yida-canvas-custom-page → [本技能] yida-publish-page
180
+
181
+ 编写 JSX 代码
182
+ ```
183
+
184
+ | 相关技能 | 关系说明 |
185
+ |---------|----------|
186
+ | `yida-create-page` | 可选前置技能,仅在目标 display page 缺失且允许新增时创建页面容器,获取 formUuid |
187
+ | `yida-custom-page` | native 前置技能,编写 `.oyd.jsx` / `.jsx` 源码 |
188
+ | `yida-canvas-custom-page` | Code Canvas 前置技能,编写 `.canvas.jsx` 源码 |
189
+ | `yida-create-form-page` | 无关,用于创建表单页面,不需要本技能发布 |
190
+ | `yida-page-config` | 后续技能,发布后可配置页面公开访问/分享 |
191
+ | `yida-ppt-slider` | 特殊场景,PPT 幻灯片页面也使用本技能发布 |
@@ -1,10 +1,16 @@
1
1
  ---
2
2
  name: yida-report
3
- description: "宜搭原生报表创建,支持 16 种图表/表格/筛选器组件。普通「报表」「统计」需求默认使用本技能。触发词:「报表」「统计」「图表」「数据汇总」。"
3
+ description: "Standalone 创建宜搭原生报表;如果请求来自 Schema-as-Code manifest/state,停止,不降级直写。"
4
4
  ---
5
5
 
6
6
  # 宜搭原生报表技能
7
7
 
8
+ ## 适用范围:standalone 资源
9
+
10
+ - SAC Phase 1 下,本技能只处理明确 standalone 的原生报表。用户提供 Schema-as-Code manifest、要求 schema validate/plan/apply,或报表身份来自 Schema-as-Code state 时,不执行创建、追加或发布,稳定停止为 unsupported。
11
+ - 不得把 SAC unsupported/conflict/uncertain 降级为 `create-report` 等 legacy 写入,不得按标题、组件类型或数组位置 adopt、猜 report/chart/filter ID。
12
+ - 只有报表明确 standalone/unmanaged,或用户明确要求 standalone legacy 报表命令时,以下示例、stdout/stderr 和返回行为才按原契约使用;所有权不明确时零远端写。
13
+
8
14
  ## 严格禁止 (NEVER DO)
9
15
 
10
16
  - 不要在前端直接聚合表单数据,必须通过宜搭原生报表的 `getDataAsync.json` 或 `getCacheData.json` 接口获取聚合数据
@@ -151,241 +157,9 @@ POST /alibaba/web/{appType}/visual/visualizationDataRpc/getDataAsync.json
151
157
  | `YoushuTimeFilter` | 时间筛选器 | `buildSchema.timeFilter()` | 筛选 |
152
158
  | `YoushuInputFilter` | 区间筛选器 | `buildSchema.inputFilter()` | 筛选 |
153
159
 
154
- ### 核心工具函数
155
-
156
- Schema 构建脚本提供以下核心函数,使用前需先引入:
157
-
158
- ```javascript
159
- const {
160
- buildSchema, // 各组件 Schema 构建器
161
- buildDataSetEntry, // 构建数据集配置
162
- buildFieldDefinition, // 构建字段定义
163
- buildFilterItem, // 构建过滤条件
164
- buildOrderByItem, // 构建排序项
165
- generateComponentId, // 生成唯一组件 ID
166
- } = require('./build-yida-report-schema');
167
- ```
168
-
169
- ### 数据集配置(dataSetModelMap)
170
-
171
- 所有报表组件通过 `dataSetModelMap` 配置数据源,每个数据集由 `buildDataSetEntry` 构建:
172
-
173
- ```javascript
174
- buildDataSetEntry({
175
- cubeCode: 'your_cube_code', // 数据集 cubeCode(必填)
176
- fieldDefinitionList: [ // 字段定义列表
177
- buildFieldDefinition({
178
- alias: 'date', // 字段别名(fieldKey)
179
- aliasName: '日期', // 字段显示名称
180
- isDim: true, // true=维度,false=度量
181
- dataType: 'DATE', // STRING | NUMBER | DATE | BOOLEAN | ARRAY
182
- aggregateType: 'NONE', // NONE | SUM | AVG | COUNT | MAX | MIN | COUNT_DISTINCT
183
- timeGranularityType: 'DAY', // YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | null
184
- }),
185
- buildFieldDefinition({
186
- alias: 'sales',
187
- aliasName: '销售额',
188
- isDim: false,
189
- dataType: 'NUMBER',
190
- aggregateType: 'SUM',
191
- }),
192
- ],
193
- fieldList: ['date', 'sales'], // 查询字段别名列表
194
- filterList: [], // 过滤条件列表
195
- orderByList: [ // 排序列表
196
- buildOrderByItem('date', 'ASC'), // ASC | DESC
197
- ],
198
- limit: 1000, // 数据条数限制
199
- // 以下为筛选器专用参数
200
- cubeCodes: ['your_cube_code'], // cubeCode 数组(筛选器使用)
201
- valueField: ['field_alias'], // 值字段数组(筛选器使用)
202
- labelField: ['field_alias'], // 显示字段数组(筛选器使用)
203
- })
204
- ```
205
-
206
- ### 常用组件 Schema 构建示例
207
-
208
- #### 指标卡
209
-
210
- ```javascript
211
- buildSchema.simpleIndicatorCard({
212
- dataSetModelMap: {
213
- kpi_dataset: buildDataSetEntry({
214
- cubeCode: 'your_cube_code',
215
- fieldDefinitionList: [
216
- buildFieldDefinition({ alias: 'total_sales', aliasName: '总销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
217
- buildFieldDefinition({ alias: 'order_count', aliasName: '订单数', isDim: false, dataType: 'NUMBER', aggregateType: 'COUNT' }),
218
- ],
219
- fieldList: ['total_sales', 'order_count'],
220
- })
221
- },
222
- settings: { columnCount: 4, columnCountForH5: 2 }
223
- })
224
- ```
225
-
226
- #### 折线图
227
-
228
- ```javascript
229
- buildSchema.lineChart({
230
- dataSetModelMap: {
231
- line_dataset: buildDataSetEntry({
232
- cubeCode: 'your_cube_code',
233
- fieldDefinitionList: [
234
- buildFieldDefinition({ alias: 'date', aliasName: '日期', isDim: true, dataType: 'DATE', timeGranularityType: 'DAY' }),
235
- buildFieldDefinition({ alias: 'sales', aliasName: '销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
236
- ],
237
- fieldList: ['date', 'sales'],
238
- orderByList: [buildOrderByItem('date', 'ASC')],
239
- })
240
- },
241
- settings: {
242
- titleConfig: { label: '销售趋势' },
243
- height: 400,
244
- smooth: true,
245
- drillDown: false,
246
- }
247
- })
248
- ```
249
-
250
- #### 饼图(环形图)
251
-
252
- ```javascript
253
- buildSchema.pieChart({
254
- dataSetModelMap: {
255
- pie_dataset: buildDataSetEntry({
256
- cubeCode: 'your_cube_code',
257
- fieldDefinitionList: [
258
- buildFieldDefinition({ alias: 'category', aliasName: '类别', isDim: true, dataType: 'STRING' }),
259
- buildFieldDefinition({ alias: 'amount', aliasName: '金额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
260
- ],
261
- fieldList: ['category', 'amount'],
262
- })
263
- },
264
- settings: {
265
- titleConfig: { label: '销售占比' },
266
- innerRadius: 0.6, // >0 为环形图
267
- }
268
- })
269
- ```
270
-
271
- #### 基础表格(明细表)
272
-
273
- ```javascript
274
- buildSchema.table({
275
- dataSetModelMap: {
276
- table: buildDataSetEntry({
277
- cubeCode: 'your_cube_code',
278
- fieldDefinitionList: [
279
- buildFieldDefinition({ alias: 'name', aliasName: '姓名', isDim: true, dataType: 'STRING' }),
280
- buildFieldDefinition({ alias: 'dept', aliasName: '部门', isDim: true, dataType: 'STRING' }),
281
- buildFieldDefinition({ alias: 'sales', aliasName: '销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
282
- ],
283
- fieldList: ['name', 'dept', 'sales'],
284
- orderByList: [buildOrderByItem('sales', 'DESC')],
285
- })
286
- },
287
- settings: {
288
- fixedHeader: true,
289
- theme: 'border',
290
- maxBodyHeight: 500,
291
- pagination: {
292
- pageSize: 20,
293
- showPageSelect: true,
294
- pageSizeList: [10, 20, 50, 100],
295
- }
296
- }
297
- })
298
- ```
299
-
300
- #### 筛选器(下拉 + 时间 + 区间)
301
-
302
- ```javascript
303
- // 下拉筛选器
304
- buildSchema.selectFilter({
305
- dataSetModelMap: {
306
- selectFilter: buildDataSetEntry({
307
- cubeCode: 'your_cube_code',
308
- cubeCodes: ['your_cube_code'],
309
- fieldDefinitionList: [
310
- buildFieldDefinition({ alias: 'dept_id', aliasName: '部门ID', isDim: true, dataType: 'STRING' }),
311
- buildFieldDefinition({ alias: 'dept_name', aliasName: '部门名称', isDim: true, dataType: 'STRING' }),
312
- ],
313
- fieldList: ['dept_id', 'dept_name'],
314
- valueField: ['dept_id'],
315
- labelField: ['dept_name'],
316
- })
317
- },
318
- settings: { labelConfig: { label: '部门' }, mode: 'multiple', showLabel: true }
319
- })
320
-
321
- // 时间筛选器
322
- buildSchema.timeFilter({
323
- dataSetModelMap: {
324
- filterData: buildDataSetEntry({
325
- cubeCode: 'your_cube_code',
326
- cubeCodes: ['your_cube_code'],
327
- fieldDefinitionList: [
328
- buildFieldDefinition({ alias: 'create_date', aliasName: '创建日期', isDim: true, dataType: 'DATE', timeGranularityType: 'DAY' }),
329
- ],
330
- fieldList: ['create_date'],
331
- valueField: ['create_date'],
332
- })
333
- },
334
- settings: { labelConfig: { label: '日期范围' }, mode: 'range', dataConfig: { queryType: 'Between' } }
335
- })
336
- ```
337
-
338
- ### 完整报表页面 Schema 构建示例
339
-
340
- 以下示例展示如何组合多个组件构建一个完整的报表页面:
341
-
342
- ```javascript
343
- const {
344
- buildSchema, buildDataSetEntry, buildFieldDefinition, buildOrderByItem,
345
- } = require('./build-yida-report-schema');
346
-
347
- const CUBE_CODE = 'your_cube_code_here';
348
-
349
- const reportPageSchema = buildSchema.pageHeader({
350
- titleContent: '销售数据看板',
351
- titleTip: '数据每日 08:00 更新',
352
- children: [
353
- buildSchema.topFilterContainer({
354
- showTag: true,
355
- children: [
356
- buildSchema.timeFilter({ /* 时间筛选器配置 */ }),
357
- buildSchema.selectFilter({ /* 下拉筛选器配置 */ }),
358
- ],
359
- }),
360
- buildSchema.simpleIndicatorCard({ /* 指标卡配置 */ }),
361
- buildSchema.lineChart({ /* 折线图配置 */ }),
362
- buildSchema.table({ /* 明细表格配置 */ }),
363
- ],
364
- });
365
-
366
- console.log(JSON.stringify(reportPageSchema, null, 2));
367
- ```
160
+ ### Schema 构建细节参考
368
161
 
369
- ### 通用 settings 配置参考
370
-
371
- | 字段 | 类型 | 说明 |
372
- |------|------|------|
373
- | `titleConfig.label` | `string` | 组件标题 |
374
- | `height` | `number` | 组件高度(默认 300) |
375
- | `colorType` | `string` | 颜色类型,`default` 或 `CUSTOM_COLOR` |
376
- | `customColor` | `string` | 自定义颜色,逗号分隔 |
377
- | `drillDown` | `boolean` | 是否开启下钻(默认 false) |
378
- | `limit` | `number` | 数据条数限制(默认 1000) |
379
-
380
- ### 各图表组件特有配置
381
-
382
- | 组件 | 特有配置 | 说明 |
383
- |------|---------|------|
384
- | **折线图** | `smooth`, `isStack`, `isPercent` | 平滑曲线、堆叠、百分比堆叠 |
385
- | **饼图** | `innerRadius` | 内半径(>0 为环形图) |
386
- | **条形图** | `isStack`, `isPercent` | 堆叠、百分比堆叠 |
387
- | **仪表盘** | `min`, `max`, `range` | 最小值、最大值、区间配置 |
388
- | **基础表格** | `fixedHeader`, `theme`, `pagination` | 固定表头、风格、分页 |
162
+ 普通报表创建优先使用 `openyida create-report <appType> "<报表名称>" <配置JSON文件路径>`,由 CLI 内部构建并发布 Schema。需要查看构建函数、组件示例、settings 字段或完整页面组合示例时,再读取 [references/schema-builder-details.md](references/schema-builder-details.md)。
389
163
 
390
164
  ---
391
165
 
@@ -0,0 +1,239 @@
1
+ # 报表 Schema 构建细节
2
+
3
+ > 从 yida-report 主技能迁出。只有需要理解底层 schema 结构、组件示例或 settings 字段时读取;普通创建报表优先使用 `openyida create-report` 的结构化配置。
4
+
5
+ ### 核心工具函数
6
+
7
+ Schema 构建脚本提供以下核心函数,使用前需先引入:
8
+
9
+ ```javascript
10
+ const {
11
+ buildSchema, // 各组件 Schema 构建器
12
+ buildDataSetEntry, // 构建数据集配置
13
+ buildFieldDefinition, // 构建字段定义
14
+ buildFilterItem, // 构建过滤条件
15
+ buildOrderByItem, // 构建排序项
16
+ generateComponentId, // 生成唯一组件 ID
17
+ } = require('./build-yida-report-schema');
18
+ ```
19
+
20
+ ### 数据集配置(dataSetModelMap)
21
+
22
+ 所有报表组件通过 `dataSetModelMap` 配置数据源,每个数据集由 `buildDataSetEntry` 构建:
23
+
24
+ ```javascript
25
+ buildDataSetEntry({
26
+ cubeCode: 'your_cube_code', // 数据集 cubeCode(必填)
27
+ fieldDefinitionList: [ // 字段定义列表
28
+ buildFieldDefinition({
29
+ alias: 'date', // 字段别名(fieldKey)
30
+ aliasName: '日期', // 字段显示名称
31
+ isDim: true, // true=维度,false=度量
32
+ dataType: 'DATE', // STRING | NUMBER | DATE | BOOLEAN | ARRAY
33
+ aggregateType: 'NONE', // NONE | SUM | AVG | COUNT | MAX | MIN | COUNT_DISTINCT
34
+ timeGranularityType: 'DAY', // YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | null
35
+ }),
36
+ buildFieldDefinition({
37
+ alias: 'sales',
38
+ aliasName: '销售额',
39
+ isDim: false,
40
+ dataType: 'NUMBER',
41
+ aggregateType: 'SUM',
42
+ }),
43
+ ],
44
+ fieldList: ['date', 'sales'], // 查询字段别名列表
45
+ filterList: [], // 过滤条件列表
46
+ orderByList: [ // 排序列表
47
+ buildOrderByItem('date', 'ASC'), // ASC | DESC
48
+ ],
49
+ limit: 1000, // 数据条数限制
50
+ // 以下为筛选器专用参数
51
+ cubeCodes: ['your_cube_code'], // cubeCode 数组(筛选器使用)
52
+ valueField: ['field_alias'], // 值字段数组(筛选器使用)
53
+ labelField: ['field_alias'], // 显示字段数组(筛选器使用)
54
+ })
55
+ ```
56
+
57
+ ### 常用组件 Schema 构建示例
58
+
59
+ #### 指标卡
60
+
61
+ ```javascript
62
+ buildSchema.simpleIndicatorCard({
63
+ dataSetModelMap: {
64
+ kpi_dataset: buildDataSetEntry({
65
+ cubeCode: 'your_cube_code',
66
+ fieldDefinitionList: [
67
+ buildFieldDefinition({ alias: 'total_sales', aliasName: '总销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
68
+ buildFieldDefinition({ alias: 'order_count', aliasName: '订单数', isDim: false, dataType: 'NUMBER', aggregateType: 'COUNT' }),
69
+ ],
70
+ fieldList: ['total_sales', 'order_count'],
71
+ })
72
+ },
73
+ settings: { columnCount: 4, columnCountForH5: 2 }
74
+ })
75
+ ```
76
+
77
+ #### 折线图
78
+
79
+ ```javascript
80
+ buildSchema.lineChart({
81
+ dataSetModelMap: {
82
+ line_dataset: buildDataSetEntry({
83
+ cubeCode: 'your_cube_code',
84
+ fieldDefinitionList: [
85
+ buildFieldDefinition({ alias: 'date', aliasName: '日期', isDim: true, dataType: 'DATE', timeGranularityType: 'DAY' }),
86
+ buildFieldDefinition({ alias: 'sales', aliasName: '销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
87
+ ],
88
+ fieldList: ['date', 'sales'],
89
+ orderByList: [buildOrderByItem('date', 'ASC')],
90
+ })
91
+ },
92
+ settings: {
93
+ titleConfig: { label: '销售趋势' },
94
+ height: 400,
95
+ smooth: true,
96
+ drillDown: false,
97
+ }
98
+ })
99
+ ```
100
+
101
+ #### 饼图(环形图)
102
+
103
+ ```javascript
104
+ buildSchema.pieChart({
105
+ dataSetModelMap: {
106
+ pie_dataset: buildDataSetEntry({
107
+ cubeCode: 'your_cube_code',
108
+ fieldDefinitionList: [
109
+ buildFieldDefinition({ alias: 'category', aliasName: '类别', isDim: true, dataType: 'STRING' }),
110
+ buildFieldDefinition({ alias: 'amount', aliasName: '金额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
111
+ ],
112
+ fieldList: ['category', 'amount'],
113
+ })
114
+ },
115
+ settings: {
116
+ titleConfig: { label: '销售占比' },
117
+ innerRadius: 0.6, // >0 为环形图
118
+ }
119
+ })
120
+ ```
121
+
122
+ #### 基础表格(明细表)
123
+
124
+ ```javascript
125
+ buildSchema.table({
126
+ dataSetModelMap: {
127
+ table: buildDataSetEntry({
128
+ cubeCode: 'your_cube_code',
129
+ fieldDefinitionList: [
130
+ buildFieldDefinition({ alias: 'name', aliasName: '姓名', isDim: true, dataType: 'STRING' }),
131
+ buildFieldDefinition({ alias: 'dept', aliasName: '部门', isDim: true, dataType: 'STRING' }),
132
+ buildFieldDefinition({ alias: 'sales', aliasName: '销售额', isDim: false, dataType: 'NUMBER', aggregateType: 'SUM' }),
133
+ ],
134
+ fieldList: ['name', 'dept', 'sales'],
135
+ orderByList: [buildOrderByItem('sales', 'DESC')],
136
+ })
137
+ },
138
+ settings: {
139
+ fixedHeader: true,
140
+ theme: 'border',
141
+ maxBodyHeight: 500,
142
+ pagination: {
143
+ pageSize: 20,
144
+ showPageSelect: true,
145
+ pageSizeList: [10, 20, 50, 100],
146
+ }
147
+ }
148
+ })
149
+ ```
150
+
151
+ #### 筛选器(下拉 + 时间 + 区间)
152
+
153
+ ```javascript
154
+ // 下拉筛选器
155
+ buildSchema.selectFilter({
156
+ dataSetModelMap: {
157
+ selectFilter: buildDataSetEntry({
158
+ cubeCode: 'your_cube_code',
159
+ cubeCodes: ['your_cube_code'],
160
+ fieldDefinitionList: [
161
+ buildFieldDefinition({ alias: 'dept_id', aliasName: '部门ID', isDim: true, dataType: 'STRING' }),
162
+ buildFieldDefinition({ alias: 'dept_name', aliasName: '部门名称', isDim: true, dataType: 'STRING' }),
163
+ ],
164
+ fieldList: ['dept_id', 'dept_name'],
165
+ valueField: ['dept_id'],
166
+ labelField: ['dept_name'],
167
+ })
168
+ },
169
+ settings: { labelConfig: { label: '部门' }, mode: 'multiple', showLabel: true }
170
+ })
171
+
172
+ // 时间筛选器
173
+ buildSchema.timeFilter({
174
+ dataSetModelMap: {
175
+ filterData: buildDataSetEntry({
176
+ cubeCode: 'your_cube_code',
177
+ cubeCodes: ['your_cube_code'],
178
+ fieldDefinitionList: [
179
+ buildFieldDefinition({ alias: 'create_date', aliasName: '创建日期', isDim: true, dataType: 'DATE', timeGranularityType: 'DAY' }),
180
+ ],
181
+ fieldList: ['create_date'],
182
+ valueField: ['create_date'],
183
+ })
184
+ },
185
+ settings: { labelConfig: { label: '日期范围' }, mode: 'range', dataConfig: { queryType: 'Between' } }
186
+ })
187
+ ```
188
+
189
+ ### 完整报表页面 Schema 构建示例
190
+
191
+ 以下示例展示如何组合多个组件构建一个完整的报表页面:
192
+
193
+ ```javascript
194
+ const {
195
+ buildSchema, buildDataSetEntry, buildFieldDefinition, buildOrderByItem,
196
+ } = require('./build-yida-report-schema');
197
+
198
+ const CUBE_CODE = 'your_cube_code_here';
199
+
200
+ const reportPageSchema = buildSchema.pageHeader({
201
+ titleContent: '销售数据看板',
202
+ titleTip: '数据每日 08:00 更新',
203
+ children: [
204
+ buildSchema.topFilterContainer({
205
+ showTag: true,
206
+ children: [
207
+ buildSchema.timeFilter({ /* 时间筛选器配置 */ }),
208
+ buildSchema.selectFilter({ /* 下拉筛选器配置 */ }),
209
+ ],
210
+ }),
211
+ buildSchema.simpleIndicatorCard({ /* 指标卡配置 */ }),
212
+ buildSchema.lineChart({ /* 折线图配置 */ }),
213
+ buildSchema.table({ /* 明细表格配置 */ }),
214
+ ],
215
+ });
216
+
217
+ console.log(JSON.stringify(reportPageSchema, null, 2));
218
+ ```
219
+
220
+ ### 通用 settings 配置参考
221
+
222
+ | 字段 | 类型 | 说明 |
223
+ |------|------|------|
224
+ | `titleConfig.label` | `string` | 组件标题 |
225
+ | `height` | `number` | 组件高度(默认 300) |
226
+ | `colorType` | `string` | 颜色类型,`default` 或 `CUSTOM_COLOR` |
227
+ | `customColor` | `string` | 自定义颜色,逗号分隔 |
228
+ | `drillDown` | `boolean` | 是否开启下钻(默认 false) |
229
+ | `limit` | `number` | 数据条数限制(默认 1000) |
230
+
231
+ ### 各图表组件特有配置
232
+
233
+ | 组件 | 特有配置 | 说明 |
234
+ |------|---------|------|
235
+ | **折线图** | `smooth`, `isStack`, `isPercent` | 平滑曲线、堆叠、百分比堆叠 |
236
+ | **饼图** | `innerRadius` | 内半径(>0 为环形图) |
237
+ | **条形图** | `isStack`, `isPercent` | 堆叠、百分比堆叠 |
238
+ | **仪表盘** | `min`, `max`, `range` | 最小值、最大值、区间配置 |
239
+ | **基础表格** | `fixedHeader`, `theme`, `pagination` | 固定表头、风格、分页 |