weaver-e10-builder 1.6.9 → 1.6.11

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 (212) hide show
  1. package/dist/commands/form-data.d.ts.map +1 -1
  2. package/dist/commands/form-data.js +4 -1
  3. package/dist/commands/form-data.js.map +1 -1
  4. package/dist/commands/report-admin.d.ts.map +1 -1
  5. package/dist/commands/report-admin.js +378 -2
  6. package/dist/commands/report-admin.js.map +1 -1
  7. package/dist/commands/report-validate.d.ts.map +1 -1
  8. package/dist/commands/report-validate.js +1066 -3
  9. package/dist/commands/report-validate.js.map +1 -1
  10. package/dist/commands/report.d.ts.map +1 -1
  11. package/dist/commands/report.js +341 -3
  12. package/dist/commands/report.js.map +1 -1
  13. package/dist/commands/workflow-after-submit-comment.d.ts +3 -0
  14. package/dist/commands/workflow-after-submit-comment.d.ts.map +1 -0
  15. package/dist/commands/workflow-after-submit-comment.js +56 -0
  16. package/dist/commands/workflow-after-submit-comment.js.map +1 -0
  17. package/dist/commands/workflow-setting.d.ts.map +1 -1
  18. package/dist/commands/workflow-setting.js +2 -67
  19. package/dist/commands/workflow-setting.js.map +1 -1
  20. package/dist/services/action-detail.d.ts.map +1 -1
  21. package/dist/services/action-detail.js +1 -17
  22. package/dist/services/action-detail.js.map +1 -1
  23. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  24. package/dist/services/actionflow/components/action_eb_update_compiler.js +6 -2
  25. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  26. package/dist/services/actionflow/components/custom_trigger.js +1 -1
  27. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  28. package/dist/services/actionflow/components/dml_execute.js +1 -1
  29. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  30. package/dist/services/actionflow/components/document_actions.js +1 -2
  31. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  32. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  33. package/dist/services/actionflow/components/eb_get_data_by_id.js +2 -2
  34. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  35. package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
  36. package/dist/services/actionflow/components/form_data_builder.js +18 -10
  37. package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
  38. package/dist/services/actionflow/components/hrm_actions.js +0 -1
  39. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  40. package/dist/services/actionflow/components/webhook_trigger.js +3 -3
  41. package/dist/services/actionflow/components/webhook_trigger.js.map +1 -1
  42. package/dist/services/actionflow/components/workflow_actions.js +3 -2
  43. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  44. package/dist/services/actionflow/filter_rules.d.ts.map +1 -1
  45. package/dist/services/actionflow/filter_rules.js +15 -13
  46. package/dist/services/actionflow/filter_rules.js.map +1 -1
  47. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  48. package/dist/services/actionflow/form_source.js +59 -11
  49. package/dist/services/actionflow/form_source.js.map +1 -1
  50. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  51. package/dist/services/actionflow/formula_service.js +4 -1
  52. package/dist/services/actionflow/formula_service.js.map +1 -1
  53. package/dist/services/actionflow/option_field_types.d.ts +5 -0
  54. package/dist/services/actionflow/option_field_types.d.ts.map +1 -0
  55. package/dist/services/actionflow/option_field_types.js +20 -0
  56. package/dist/services/actionflow/option_field_types.js.map +1 -0
  57. package/dist/services/actionflow/param_group_dto.d.ts.map +1 -1
  58. package/dist/services/actionflow/param_group_dto.js +7 -3
  59. package/dist/services/actionflow/param_group_dto.js.map +1 -1
  60. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  61. package/dist/services/actionflow/preflight_service.js +42 -18
  62. package/dist/services/actionflow/preflight_service.js.map +1 -1
  63. package/dist/services/actionflow/webhook_source.d.ts.map +1 -1
  64. package/dist/services/actionflow/webhook_source.js +9 -4
  65. package/dist/services/actionflow/webhook_source.js.map +1 -1
  66. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  67. package/dist/services/actionflow/workflow_compiler.js +11 -8
  68. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  69. package/dist/services/report/blueprint.d.ts +109 -0
  70. package/dist/services/report/blueprint.d.ts.map +1 -0
  71. package/dist/services/report/blueprint.js +322 -0
  72. package/dist/services/report/blueprint.js.map +1 -0
  73. package/dist/services/report/build.d.ts.map +1 -1
  74. package/dist/services/report/build.js +8 -3
  75. package/dist/services/report/build.js.map +1 -1
  76. package/dist/services/report/card.d.ts +65 -0
  77. package/dist/services/report/card.d.ts.map +1 -0
  78. package/dist/services/report/card.js +151 -0
  79. package/dist/services/report/card.js.map +1 -0
  80. package/dist/services/report/copy-health.d.ts +31 -0
  81. package/dist/services/report/copy-health.d.ts.map +1 -0
  82. package/dist/services/report/copy-health.js +87 -0
  83. package/dist/services/report/copy-health.js.map +1 -0
  84. package/dist/services/report/dataset-heal.d.ts +64 -0
  85. package/dist/services/report/dataset-heal.d.ts.map +1 -0
  86. package/dist/services/report/dataset-heal.js +89 -0
  87. package/dist/services/report/dataset-heal.js.map +1 -0
  88. package/dist/services/report/dataset-ids.d.ts +70 -0
  89. package/dist/services/report/dataset-ids.d.ts.map +1 -0
  90. package/dist/services/report/dataset-ids.js +149 -0
  91. package/dist/services/report/dataset-ids.js.map +1 -0
  92. package/dist/services/report/dataset.d.ts.map +1 -1
  93. package/dist/services/report/dataset.js +3 -1
  94. package/dist/services/report/dataset.js.map +1 -1
  95. package/dist/services/report/empty-dataset.d.ts +51 -0
  96. package/dist/services/report/empty-dataset.d.ts.map +1 -0
  97. package/dist/services/report/empty-dataset.js +213 -0
  98. package/dist/services/report/empty-dataset.js.map +1 -0
  99. package/dist/services/report/field-binding.d.ts +75 -0
  100. package/dist/services/report/field-binding.d.ts.map +1 -0
  101. package/dist/services/report/field-binding.js +160 -0
  102. package/dist/services/report/field-binding.js.map +1 -0
  103. package/dist/services/report/forms.d.ts +32 -0
  104. package/dist/services/report/forms.d.ts.map +1 -1
  105. package/dist/services/report/forms.js +90 -0
  106. package/dist/services/report/forms.js.map +1 -1
  107. package/dist/services/report/formula-parent.d.ts +25 -0
  108. package/dist/services/report/formula-parent.d.ts.map +1 -0
  109. package/dist/services/report/formula-parent.js +116 -0
  110. package/dist/services/report/formula-parent.js.map +1 -0
  111. package/dist/services/report/locate.d.ts +40 -0
  112. package/dist/services/report/locate.d.ts.map +1 -0
  113. package/dist/services/report/locate.js +122 -0
  114. package/dist/services/report/locate.js.map +1 -0
  115. package/dist/services/report/reports.d.ts +4 -0
  116. package/dist/services/report/reports.d.ts.map +1 -1
  117. package/dist/services/report/reports.js +4 -2
  118. package/dist/services/report/reports.js.map +1 -1
  119. package/dist/services/report/scene.d.ts +22 -0
  120. package/dist/services/report/scene.d.ts.map +1 -0
  121. package/dist/services/report/scene.js +145 -0
  122. package/dist/services/report/scene.js.map +1 -0
  123. package/dist/services/report/types.d.ts +28 -0
  124. package/dist/services/report/types.d.ts.map +1 -1
  125. package/dist/services/report/verify.d.ts +24 -0
  126. package/dist/services/report/verify.d.ts.map +1 -1
  127. package/dist/services/report/verify.js +115 -2
  128. package/dist/services/report/verify.js.map +1 -1
  129. package/dist/services/report/workbook.d.ts +12 -1
  130. package/dist/services/report/workbook.d.ts.map +1 -1
  131. package/dist/services/report/workbook.js +107 -8
  132. package/dist/services/report/workbook.js.map +1 -1
  133. package/dist/services/workflow-after-submit-comment.d.ts +20 -0
  134. package/dist/services/workflow-after-submit-comment.d.ts.map +1 -0
  135. package/dist/services/workflow-after-submit-comment.js +81 -0
  136. package/dist/services/workflow-after-submit-comment.js.map +1 -0
  137. package/ecodecmd/src/build.js +36 -12
  138. package/package.json +1 -1
  139. package/skill-docs/SKILL.md +4 -4
  140. package/skill-docs/_catalog.md +10 -1
  141. package/skill-docs/actionflows/SKILL.md +1 -0
  142. package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +2 -2
  143. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +2 -0
  144. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +19 -1
  145. package/skill-docs/references/coding/guide-form-crud.md +2 -0
  146. package/skill-docs/references/coding/guide-page-code.md +108 -0
  147. package/skill-docs/references/components/ref-component-common.md +98 -0
  148. package/skill-docs/references/report/add-dataset-registration-guide.md +44 -22
  149. package/skill-docs/references/report/advanced-crosstab-tree-guide.md +82 -0
  150. package/skill-docs/references/report/ai-report-workflow.md +100 -100
  151. package/skill-docs/references/report/api-auth-headers.md +129 -0
  152. package/skill-docs/references/report/api-report-build-fast-path.md +274 -275
  153. package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -230
  154. package/skill-docs/references/report/branch-scene-guide.md +293 -0
  155. package/skill-docs/references/report/build-resilience-guide.md +99 -0
  156. package/skill-docs/references/report/card-report-guide.md +110 -0
  157. package/skill-docs/references/report/cell-config-echo-guide.md +44 -9
  158. package/skill-docs/references/report/cell-transform-guide.md +9 -9
  159. package/skill-docs/references/report/column-split-report-guide.md +96 -0
  160. package/skill-docs/references/report/condition-format-guide.md +49 -24
  161. package/skill-docs/references/report/cross-dataset-filter-guide.md +180 -69
  162. package/skill-docs/references/report/crosstab-raw-workbook-guide.md +265 -0
  163. package/skill-docs/references/report/dataset-query-filter-guide.md +231 -235
  164. package/skill-docs/references/report/dataset-sidebar-ops-guide.md +75 -34
  165. package/skill-docs/references/report/dataset-table-field-contract-guide.md +196 -46
  166. package/skill-docs/references/report/datasource-metadata-guide.md +128 -119
  167. package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +183 -148
  168. package/skill-docs/references/report/date-range-query-reference.md +97 -102
  169. package/skill-docs/references/report/default-header-style-guide.md +8 -8
  170. package/skill-docs/references/report/designer-blank-prevention-guide.md +8 -8
  171. package/skill-docs/references/report/dossier-report-guide.md +69 -0
  172. package/skill-docs/references/report/drilldown-report-guide.md +59 -0
  173. package/skill-docs/references/report/event-hreflink-guide.md +53 -47
  174. package/skill-docs/references/report/expansion-block-parent-config-guide.md +208 -0
  175. package/skill-docs/references/report/failure-cleanup-and-nonblocking-guide.md +183 -0
  176. package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -208
  177. package/skill-docs/references/report/financial-stats-report-guide.md +89 -0
  178. package/skill-docs/references/report/formula-cell-api-guide.md +325 -258
  179. package/skill-docs/references/report/golden-case-summary-sheet.md +200 -0
  180. package/skill-docs/references/report/guide-report-build.md +6 -1
  181. package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +10 -10
  182. package/skill-docs/references/report/layout-showlocation-freeze-guide.md +39 -10
  183. package/skill-docs/references/report/multi-report-crosstab-casebook.md +263 -0
  184. package/skill-docs/references/report/paged-group-report-guide.md +68 -0
  185. package/skill-docs/references/report/preaggregate-auto-disable-guide.md +24 -13
  186. package/skill-docs/references/report/query-condition-api-guide.md +145 -125
  187. package/skill-docs/references/report/ref-report-commands.md +41 -3
  188. package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -117
  189. package/skill-docs/references/report/report-building-guide.md +52 -52
  190. package/skill-docs/references/report/report-case-prompts.md +104 -0
  191. package/skill-docs/references/report/report-config-schema.md +281 -281
  192. package/skill-docs/references/report/report-create-modes-guide.md +73 -35
  193. package/skill-docs/references/report/report-data-model.md +131 -131
  194. package/skill-docs/references/report/report-delivery-contract.md +23 -3
  195. package/skill-docs/references/report/report-designer-feature-map.md +30 -35
  196. package/skill-docs/references/report/report-help-guide.md +304 -0
  197. package/skill-docs/references/report/report-internal-error-guide.md +71 -0
  198. package/skill-docs/references/report/report-knowledge-base.md +27 -27
  199. package/skill-docs/references/report/report-lifecycle-api-guide.md +126 -94
  200. package/skill-docs/references/report/report-list-page-ops-guide.md +54 -8
  201. package/skill-docs/references/report/report-permission-guide.md +99 -102
  202. package/skill-docs/references/report/report-requirement-analysis-template.md +93 -29
  203. package/skill-docs/references/report/report-self-check-guide.md +164 -164
  204. package/skill-docs/references/report/report-verification-discipline-guide.md +203 -0
  205. package/skill-docs/references/report/safe-partial-save-guide.md +151 -151
  206. package/skill-docs/references/report/shard-freeze-report-guide.md +97 -0
  207. package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -84
  208. package/skill-docs/references/report/spec-build-schema.md +71 -71
  209. package/skill-docs/references/report/targeted-fix-guide.md +155 -97
  210. package/skill-docs/references/report/user-request-scope-only-guide.md +23 -4
  211. package/skill-docs/references/workflow/guide-after-submit-comment.md +58 -0
  212. package/skill-docs/references/workflow/guide-workflow.md +6 -0
@@ -18,15 +18,41 @@
18
18
  服务端分支(**互斥,模板优先**):
19
19
 
20
20
  ```text
21
- modelId > 0 → 模版创建(copySheet)
21
+ modelId > 0 → 模版创建(copySheet)
22
22
  else quicklyParam 非空 → 快速构建-列表式
23
- else → 从空白创建(空 workbook + sheet)
23
+ else → 从空白创建(空 workbook + sheet)
24
24
  ```
25
25
 
26
26
  **禁止混淆**:Skill 自带的 `assets/template-*-report.json` 是 **Agent 布局脚手架**,**不是**平台「模版创建」的 `getReportModels` 模板池。
27
27
 
28
28
  ---
29
29
 
30
+ ## 〇.1 ★★ 建壳顺序(强制 · 注意点 BUILD-50)
31
+
32
+ `baseInfo` 只写 baseInfo 行;**`edc_report_dev` 记录由「设计器页首次加载」惰性创建**。故建壳后、
33
+ **addDataset 之前**,必须 GET 一次设计器页:
34
+
35
+ ```text
36
+ create blank → POST baseInfo → ★ GET /sp/edc/report/design/<id> → addDataset → (remap) → save
37
+ ```
38
+
39
+ | 步骤 | 说明 |
40
+ |------|------|
41
+ | `POST baseInfo` | 得到 `reportId` |
42
+ | **`GET /sp/edc/report/design/<reportId>?appId=<appId>`** | **初始化 dev 记录**(返回值是 HTML,可忽略)。构建层 / CLI 已内置 |
43
+ | `addDataset` | 见 `add-dataset-registration-guide.md` |
44
+ | `save` | 见 `report-internal-error-guide.md`(ENV-11 载荷矩阵 + R7/R8/R9 防御层) |
45
+
46
+ **后果**(缺这一步 / 顺序颠倒):
47
+ - 缺 GET → dev 记录没建起来 → 后续 `saveReportDevInfo` **落不进去**;
48
+ - **「先 save 后 addDataset」的壳会永久废掉** —— dev 与 baseInfo 状态不一致,无法修复,只能删表重建。
49
+
50
+ 已内置:`e10-cli report build`(`e10-cli report build spec`)在 `baseInfo` 之后自动调 `initReportDev`;
51
+ `e10-cli report create blank` 同样自动执行;`e10-cli report card build` 新建分支同样。可用 `EB_SKIP_INIT_DEV=1` 跳过(仅定位)。
52
+ 失败时**降级为告警不阻断**(环境差异兜底)。
53
+
54
+ ---
55
+
30
56
  ## 一、共享入口
31
57
 
32
58
  `POST /api/bs/edc/report/baseInfo`(`multipart/form-data`,`id=0` 新建)
@@ -70,6 +96,9 @@ e10-cli report create models
70
96
  e10-cli report create template --app-id <appId> --name "新报表" --model-id <模板ID>
71
97
  ```
72
98
 
99
+ > 建表前会自动**精确查重**:同名已存在 → `exit 3` 且**不创建**(返回已有 reportId / 设计器地址)。
100
+ > 确需同名再建(用户明确要求)才加 `--allow-duplicate`。见 §五。
101
+
73
102
  Python:
74
103
 
75
104
  ```python
@@ -89,39 +118,39 @@ rid, obj = client.create_from_model(name, model_id)
89
118
 
90
119
  ```json
91
120
  {
92
- "dataSetList": [
93
- {
94
- "id": "<临时UUID,与 showField[].dataSetId 一致>",
95
- "sourceType": "1",
96
- "sourceId": "<表单/数据源 ID>",
97
- "sourceName": "表单名",
98
- "sourceGroup": ""
99
- }
100
- ],
101
- "showField": [
102
- {
103
- "dataSetId": "<同上临时UUID>",
104
- "tableId": "...",
105
- "name": "fieldKey",
106
- "text": "显示名"
107
- }
108
- ],
109
- "fieldConfig": {
110
- "<dataSetId>.<tableId>.<name>": {
111
- "colName": "列标题",
112
- "colWidth": "170",
113
- "vAlign": "1",
114
- "hAlign": "1",
115
- "group": "0",
116
- "hideCol": "0",
117
- "lockCell": "0",
118
- "textWrap": "0"
119
- }
120
- },
121
- "theme": "-1",
122
- "sheetIndex": 0,
123
- "startRow": 0,
124
- "startCol": 0
121
+ "dataSetList": [
122
+ {
123
+ "id": "<临时UUID,与 showField[].dataSetId 一致>",
124
+ "sourceType": "1",
125
+ "sourceId": "<表单/数据源 ID>",
126
+ "sourceName": "表单名",
127
+ "sourceGroup": ""
128
+ }
129
+ ],
130
+ "showField": [
131
+ {
132
+ "dataSetId": "<同上临时UUID>",
133
+ "tableId": "...",
134
+ "name": "fieldKey",
135
+ "text": "显示名"
136
+ }
137
+ ],
138
+ "fieldConfig": {
139
+ "<dataSetId>.<tableId>.<name>": {
140
+ "colName": "列标题",
141
+ "colWidth": "170",
142
+ "vAlign": "1",
143
+ "hAlign": "1",
144
+ "group": "0",
145
+ "hideCol": "0",
146
+ "lockCell": "0",
147
+ "textWrap": "0"
148
+ }
149
+ },
150
+ "theme": "-1",
151
+ "sheetIndex": 0,
152
+ "startRow": 0,
153
+ "startCol": 0
125
154
  }
126
155
  ```
127
156
 
@@ -166,6 +195,15 @@ Python:`client.create_from_quickly_param(name, quickly_param_dict_or_str)`
166
195
 
167
196
  ## 五、禁令
168
197
 
198
+ - **★ 禁止重复建报表(强制 · 2026-10-09)**:建表前**必须精确查重**
199
+ (`spec_lib.findReportsByName(appId, name)` = `listAppReports` + 名称归一化比对);
200
+ 同名已存在 → **不建新表**,把已有 `reportId` / 设计器地址交回,**`exit 3`**。
201
+ `build spec` 与 `create blank|template|quick` 均已内置该门禁(默认拒绝同名);
202
+ 仅当用户**明确要求**才加 `--allow-duplicate`。
203
+ **禁止**为绕过查重而「先删旧表再建同名」(旧表可能已被使用 → 数据丢失风险)。注意点 **BUILD-40**。
204
+ - **★ 禁止空壳(强制)**:`blank` 只产出空报表 → 必须**同流程立刻填满**(`addDataset` → `saveReportDevInfo`),
205
+ 失败/中止即 `lifecycle delete` 回收;正式搭表走 `e10-cli report build spec`(一条命令出表)。
206
+ 自查:`e10-cli report cleanup shells --app-id <appId> --list`。
169
207
  - 禁止同时依赖 `reportModel>0` 与 `quicklyParam` 指望「都生效」——服务端 **模板优先**,快速构建被跳过。
170
208
  - 禁止把 `assets/template-list-report.json` 当成平台 `getReportModels` 模板去传 `reportModel`。
171
209
  - 禁止未登录乱扫前端 bundle 猜参数;以本指南 + 源码 bean 为准。
@@ -1,6 +1,6 @@
1
1
  # E-Builder 报表数据模型参考
2
2
 
3
- > **冷启动禁止通读**:见 `cold-start-scan-guide.md`。仅生成整包 ReportProps / 深分析时再读。
3
+ > **冷启动禁止通读**:见 `api-report-build-fast-path.md`。仅生成整包 ReportProps / 深分析时再读。
4
4
 
5
5
  ## 一、核心枚举类型
6
6
 
@@ -100,16 +100,16 @@
100
100
 
101
101
  ```typescript
102
102
  interface ReportProps {
103
- config: {
104
- fields: CellProps[]; // 字段列表
105
- ds: SourceTableResult[]; // 数据源列表
106
- sheetProps?: { // 工作表属性
107
- rowHeights: Record<number, number>;
108
- colWidths: Record<number, number>;
109
- };
110
- };
111
- name: string; // 报表名称
112
- appId: string; // 应用ID
103
+ config: {
104
+ fields: CellProps[]; // 字段列表
105
+ ds: SourceTableResult[]; // 数据源列表
106
+ sheetProps?: { // 工作表属性
107
+ rowHeights: Record<number, number>;
108
+ colWidths: Record<number, number>;
109
+ };
110
+ };
111
+ name: string; // 报表名称
112
+ appId: string; // 应用ID
113
113
  }
114
114
  ```
115
115
 
@@ -117,24 +117,24 @@ interface ReportProps {
117
117
 
118
118
  ```typescript
119
119
  interface CellProps {
120
- cellType: CellTypeEnum; // 字段类型
121
- displayType: DisplayTypeEnum; // 显示方式
122
- expandType: ExpandTypeEnum; // 扩展方向
123
- dataSet: string; // 数据集主键
124
- field: string; // 字段主键
125
- leftParent: CellParentValueType; // 左父格 [类型, x, y]
126
- topParent: CellParentValueType; // 上父格 [类型, x, y]
127
- groupType: GroupTypeEnum; // 分组类型
128
- countType: CountTypeEnum; // 统计类型
129
- orderType: OrderTypeEnum; // 排序方式
130
- cellText: string; // 内容/显示文本
131
- x: number; // 行号
132
- y: number; // 列号
133
- rowCount: number; // 所占行数
134
- colCount: number; // 所占列数
135
- style?: SpreadJSCellStyle; // 单元格样式
136
- leftFilterField?: FilterFieldItem[]; // 左父格过滤
137
- topFilterField?: FilterFieldItem[]; // 上父格过滤
120
+ cellType: CellTypeEnum; // 字段类型
121
+ displayType: DisplayTypeEnum; // 显示方式
122
+ expandType: ExpandTypeEnum; // 扩展方向
123
+ dataSet: string; // 数据集主键
124
+ field: string; // 字段主键
125
+ leftParent: CellParentValueType; // 左父格 [类型, x, y]
126
+ topParent: CellParentValueType; // 上父格 [类型, x, y]
127
+ groupType: GroupTypeEnum; // 分组类型
128
+ countType: CountTypeEnum; // 统计类型
129
+ orderType: OrderTypeEnum; // 排序方式
130
+ cellText: string; // 内容/显示文本
131
+ x: number; // 行号
132
+ y: number; // 列号
133
+ rowCount: number; // 所占行数
134
+ colCount: number; // 所占列数
135
+ style?: SpreadJSCellStyle; // 单元格样式
136
+ leftFilterField?: FilterFieldItem[]; // 左父格过滤
137
+ topFilterField?: FilterFieldItem[]; // 上父格过滤
138
138
  }
139
139
  ```
140
140
 
@@ -142,19 +142,19 @@ interface CellProps {
142
142
 
143
143
  ```typescript
144
144
  interface SpreadJSCellStyle {
145
- backColor?: string; // 背景颜色
146
- foreColor?: string; // 字体颜色
147
- hAlign?: number; // 水平对齐 (0=左, 1=居中, 2=右)
148
- vAlign?: number; // 垂直对齐 (0=上, 1=居中, 2=下)
149
- font?: string; // 字体 (如 "12px Arial")
150
- formatter?: string; // 数字格式
151
- borderLeft?: { color: string; style: number };
152
- borderTop?: { color: string; style: number };
153
- borderRight?: { color: string; style: number };
154
- borderBottom?: { color: string; style: number };
155
- textIndent?: number; // 缩进
156
- wordWrap?: boolean; // 自动换行
157
- textDecoration?: number; // 文本装饰 (0=无, 1=下划线, 2=删除线)
145
+ backColor?: string; // 背景颜色
146
+ foreColor?: string; // 字体颜色
147
+ hAlign?: number; // 水平对齐 (0=左, 1=居中, 2=右)
148
+ vAlign?: number; // 垂直对齐 (0=上, 1=居中, 2=下)
149
+ font?: string; // 字体 (如 "12px Arial")
150
+ formatter?: string; // 数字格式
151
+ borderLeft?: { color: string; style: number };
152
+ borderTop?: { color: string; style: number };
153
+ borderRight?: { color: string; style: number };
154
+ borderBottom?: { color: string; style: number };
155
+ textIndent?: number; // 缩进
156
+ wordWrap?: boolean; // 自动换行
157
+ textDecoration?: number; // 文本装饰 (0=无, 1=下划线, 2=删除线)
158
158
  }
159
159
  ```
160
160
 
@@ -166,28 +166,28 @@ interface SpreadJSCellStyle {
166
166
 
167
167
  // 父格过滤(跨数据源关联)
168
168
  type ParentFilter = {
169
- parentField?: string; // 父格字段 fieldKey
170
- currentField?: string; // 当前字段 fieldKey
171
- type?: FilterOptionEnum; // 匹配关系(如 Equals)
172
- id?: string; // 必须等于 currentField(设计器回显)
169
+ parentField?: string; // 父格字段 fieldKey
170
+ currentField?: string; // 当前字段 fieldKey
171
+ type?: FilterOptionEnum; // 匹配关系(如 Equals)
172
+ id?: string; // 必须等于 currentField(设计器回显)
173
173
  }
174
174
 
175
175
  // 自定义过滤(单元格级)
176
176
  type CustomFilter = {
177
- currentField?: string; // fieldKey
178
- type?: FilterOptionEnum; // 平台枚举,禁止 eq/uncontains/empty/nempty
179
- value?: string;
180
- id?: string; // 必须等于 currentField
177
+ currentField?: string; // fieldKey
178
+ type?: FilterOptionEnum; // 平台枚举,禁止 eq/uncontains/empty/nempty
179
+ value?: string;
180
+ id?: string; // 必须等于 currentField
181
181
  }
182
182
 
183
183
  // 从属关系(VLOOKUP 映射,与 leftFilterField 配套)
184
- type Subordination = [string, string]; // [父格fieldKey, 当前fieldKey]
184
+ type Subordination = [string, string]; // [父格fieldKey, 当前fieldKey]
185
185
  ```
186
186
 
187
187
  // 数据行过滤
188
188
  type DataFilter = {
189
- currentField?: DataRowFilterType; // Before|Last|Odd|Even|Designates
190
- value?: string;
189
+ currentField?: DataRowFilterType; // Before|Last|Odd|Even|Designates
190
+ value?: string;
191
191
  }
192
192
  ```
193
193
 
@@ -218,17 +218,17 @@ type DataFilter = {
218
218
 
219
219
  ```java
220
220
  class ReportAIDto {
221
- Long appId; // 所属应用ID
222
- Long reportId; // 报表ID(更新时使用)
223
- String reportName; // 报表名称
224
- String formId; // 数据源表单ID
225
- String formName; // 数据源表单名称
226
- List<FieldAIDto> groupFields; // 分组字段(维度字段)
227
- List<FieldAIDto> listFields; // 列表字段(不分组只展示)
228
- List<FieldAIDto> targetFields; // 指标/度量字段(要聚合计算的字段)
229
- String theme; // 报表主题/样式
230
- List<FieldAIDto> queryFields; // 查询筛选字段
231
- String version; // 版本标识("v2"表示直接创建)
221
+ Long appId; // 所属应用ID
222
+ Long reportId; // 报表ID(更新时使用)
223
+ String reportName; // 报表名称
224
+ String formId; // 数据源表单ID
225
+ String formName; // 数据源表单名称
226
+ List<FieldAIDto> groupFields; // 分组字段(维度字段)
227
+ List<FieldAIDto> listFields; // 列表字段(不分组只展示)
228
+ List<FieldAIDto> targetFields; // 指标/度量字段(要聚合计算的字段)
229
+ String theme; // 报表主题/样式
230
+ List<FieldAIDto> queryFields; // 查询筛选字段
231
+ String version; // 版本标识("v2"表示直接创建)
232
232
  }
233
233
  ```
234
234
 
@@ -236,9 +236,9 @@ class ReportAIDto {
236
236
 
237
237
  ```java
238
238
  class FieldAIDto {
239
- String fieldName; // 字段显示名称(中文业务名)
240
- String groupType; // 分组时间粒度(仅分组字段使用)
241
- String countType; // 聚合计算类型(仅指标字段使用)
239
+ String fieldName; // 字段显示名称(中文业务名)
240
+ String groupType; // 分组时间粒度(仅分组字段使用)
241
+ String countType; // 聚合计算类型(仅指标字段使用)
242
242
  }
243
243
  ```
244
244
 
@@ -290,25 +290,25 @@ class FieldAIDto {
290
290
 
291
291
  ```typescript
292
292
  interface StyleConfig {
293
- custom: boolean; // 是否自定义
294
- theme: number | null; // 主题编号 (1-10)
295
- alternateMode: 'row' | 'col'; // 交替方式
296
- titleBg: string; // 标题背景色
297
- alternateBg1: string; // 交替背景色1
298
- alternateBg2: string; // 交替背景色2
299
- titleStyle: {
300
- fontSize: number;
301
- color: string;
302
- bold: boolean;
303
- italic: boolean;
304
- };
305
- bodyStyle: {
306
- fontSize: number;
307
- color: string;
308
- bold: boolean;
309
- italic: boolean;
310
- };
311
- area: { row: number; col: number; rowCount: number; colCount: number } | null;
293
+ custom: boolean; // 是否自定义
294
+ theme: number | null; // 主题编号 (1-10)
295
+ alternateMode: 'row' | 'col'; // 交替方式
296
+ titleBg: string; // 标题背景色
297
+ alternateBg1: string; // 交替背景色1
298
+ alternateBg2: string; // 交替背景色2
299
+ titleStyle: {
300
+ fontSize: number;
301
+ color: string;
302
+ bold: boolean;
303
+ italic: boolean;
304
+ };
305
+ bodyStyle: {
306
+ fontSize: number;
307
+ color: string;
308
+ bold: boolean;
309
+ italic: boolean;
310
+ };
311
+ area: { row: number; col: number; rowCount: number; colCount: number } | null;
312
312
  }
313
313
  ```
314
314
 
@@ -318,9 +318,9 @@ interface StyleConfig {
318
318
 
319
319
  ```typescript
320
320
  interface ConditionRuleType {
321
- highlightDatas?: HightlightRuleType[]; // 高亮规则
322
- lineDatas?: DataLineRuleType[]; // 数据条规则
323
- iconDatas?: DataIconRuleType[]; // 图标集规则
321
+ highlightDatas?: HightlightRuleType[]; // 高亮规则
322
+ lineDatas?: DataLineRuleType[]; // 数据条规则
323
+ iconDatas?: DataIconRuleType[]; // 图标集规则
324
324
  }
325
325
  ```
326
326
 
@@ -328,18 +328,18 @@ interface ConditionRuleType {
328
328
 
329
329
  ```typescript
330
330
  interface HightlightRuleType {
331
- index: number;
332
- conditionType?: 'currCell' | 'otherCell';
333
- relation?: HighlightRelationEnum; // equals/greater/less/interval/include/happenDate/sameValue 等
334
- value1?: any;
335
- value2?: any;
336
- fontFamily?: string;
337
- fontSize?: string;
338
- bold?: boolean;
339
- italic?: boolean;
340
- underline?: boolean;
341
- backColor?: string;
342
- foreColor?: string;
331
+ index: number;
332
+ conditionType?: 'currCell' | 'otherCell';
333
+ relation?: HighlightRelationEnum; // equals/greater/less/interval/include/happenDate/sameValue 等
334
+ value1?: any;
335
+ value2?: any;
336
+ fontFamily?: string;
337
+ fontSize?: string;
338
+ bold?: boolean;
339
+ italic?: boolean;
340
+ underline?: boolean;
341
+ backColor?: string;
342
+ foreColor?: string;
343
343
  }
344
344
  ```
345
345
 
@@ -347,14 +347,14 @@ interface HightlightRuleType {
347
347
 
348
348
  ```typescript
349
349
  interface DataLineRuleType {
350
- index: number;
351
- leftType: 'min' | 'custom';
352
- leftValue?: number;
353
- rightType: 'max' | 'custom';
354
- rightValue?: number;
355
- gradient?: 'gradient' | 'solid';
356
- color?: string;
357
- negativeFillColor?: string;
350
+ index: number;
351
+ leftType: 'min' | 'custom';
352
+ leftValue?: number;
353
+ rightType: 'max' | 'custom';
354
+ rightValue?: number;
355
+ gradient?: 'gradient' | 'solid';
356
+ color?: string;
357
+ negativeFillColor?: string;
358
358
  }
359
359
  ```
360
360
 
@@ -362,32 +362,32 @@ interface DataLineRuleType {
362
362
 
363
363
  ```typescript
364
364
  interface IReportConditionItemType {
365
- uuid: string;
366
- id: string;
367
- text: string; // 条件名称
368
- displayType: ReportConditionDisplayTypeEnum; // 显示类型
369
- selectOptions: any[];
370
- filterOptions: any[];
371
- defaultValue: [string, string];
372
- param: string;
373
- filterType: 'default' | 'sql';
374
- conditions: IReportConditionRel[]; // 条件关联
375
- showOrder: number;
376
- queryType?: 'filter' | 'advance';
365
+ uuid: string;
366
+ id: string;
367
+ text: string; // 条件名称
368
+ displayType: ReportConditionDisplayTypeEnum; // 显示类型
369
+ selectOptions: any[];
370
+ filterOptions: any[];
371
+ defaultValue: [string, string];
372
+ param: string;
373
+ filterType: 'default' | 'sql';
374
+ conditions: IReportConditionRel[]; // 条件关联
375
+ showOrder: number;
376
+ queryType?: 'filter' | 'advance';
377
377
  }
378
378
 
379
379
  // 查询条件显示类型
380
380
  enum ReportConditionDisplayTypeEnum {
381
- text = 'text', // 文本
382
- number = 'number', // 数字
383
- select = 'select', // 下拉选择
384
- cascader = 'cascader', // 级联
385
- date = 'date', // 日期范围
386
- singleDate = 'singleDate', // 单日期
387
- eBuilder = 'eBuilder', // e-builder组件
388
- browser = 'browser', // 浏览框
389
- custom = 'custom', // 自定义
390
- time = 'time' // 时间
381
+ text = 'text', // 文本
382
+ number = 'number', // 数字
383
+ select = 'select', // 下拉选择
384
+ cascader = 'cascader', // 级联
385
+ date = 'date', // 日期范围
386
+ singleDate = 'singleDate', // 单日期
387
+ eBuilder = 'eBuilder', // e-builder组件
388
+ browser = 'browser', // 浏览框
389
+ custom = 'custom', // 自定义
390
+ time = 'time' // 时间
391
391
  }
392
392
  ```
393
393
 
@@ -1,6 +1,6 @@
1
1
  # 报表搭建完成交付规范(强制)
2
2
 
3
- > **冷启动**:开场只读 `cold-start-scan-guide.md`;交链后禁止续跑(含 verify/HTML)。
3
+ > **冷启动**:开场只读 `api-report-build-fast-path.md`;交链后禁止续跑(含 verify/HTML)。
4
4
  > **适用范围**:凡通过本 Skill 完成「线上建表 / 布局落库」或「需求分析」的任务。
5
5
  > **优先级**:高于 Agent 默认收尾习惯。
6
6
 
@@ -38,6 +38,26 @@
38
38
 
39
39
  **禁止**为下列事项拖延或续跑:视觉比对、多轮 `getReportDevInfo`、SpreadJS 黑盒、HTML、verify、预聚合、需求分析、配置检测、「再确认一下」。
40
40
 
41
+ ### 地址格式(硬规则 · 2026-09-15 用户强调 · 2026-10-29 收口为三道防线)
42
+
43
+ - **必须纯文本**给出完整设计器地址:`https://<host>/sp/edc/report/designer/<reportId>`
44
+ - ★ **`designer/` vs `design/` 一词之差(DELIVERY-3)**:
45
+ - `/sp/edc/report/designer/<reportId>` = **设计器页面**(给人打开、交付唯一正确形态);
46
+ - `/sp/edc/report/design/<id>` = **dev 记录初始化接口**(BUILD-50 建壳用的 GET,机器用,用户打不开)。
47
+ - **唯一构造器**:`spec_lib.designerUrlOf(reportId)` —— 所有交付出口一律走它,**禁止手拼**(协议按部署自动取 http/https;兼容旧双参 `designerUrlOf(host, reportId)`)。曾因误写 `/design/` 被用户截图质问。
48
+ - **交付前硬校验**:`spec_lib.assertDesignerUrl(url, reportId)` —— 非 `/designer/<reportId>` 形态或 reportId 不匹配 ⇒ **throw,宁失败不交假链**。
49
+ - ⚠ **`/sp/edc/report/design/<id>`(含 `?appId=…&type=1&from=management` 变体)是 BUILD-50 初始化 dev 记录的接口端点**,不是设计器页面地址,**禁止交付**(注意点 DELIVERY-5;`doctor scripts` 的 `designurl` 项把守)。
50
+ - **禁止**把 reportId / 地址放进 markdown 加粗、反引号或其它修饰中 —— 用户端曾原样渲染出 `**`,
51
+ 被质疑「返回的报表id是个什么」。地址不可信 = 交付失败。
52
+ - reportId 与地址同段给出,不再单独罗列裸 ID 作为「地址」。
53
+
54
+ ### 预聚合(建表阶段必做 · 不属交付后动作)
55
+
56
+ - 用户硬规则(多次强调):**表单中存在不支持预聚合的字段 → 必须关闭 dataPreAgg**。
57
+ - 执行时点:`addDataset` 后、落库前(`e10-cli report preagg check|disable --apply`),属搭建流程的一部分。
58
+ - 关闭验证:回读 `sheetProps.sheetConfig` 含 `"dataPreAgg":false`。
59
+ - 交付后**不再**因预聚合续跑(见上文「搭完即停」)。
60
+
41
61
  ### 与门禁
42
62
 
43
63
  - **硬失败** → 不交假链;删空壳(`failure-cleanup-and-nonblocking-guide.md`)。
@@ -69,7 +89,7 @@
69
89
  仅用户明确要求时:
70
90
 
71
91
  ```bash
72
- python (未移植,需要时另议) --config <guide_config.json> --output <输出路径>.html
92
+ python --config <guide_config.json> --output <输出路径>.html
73
93
  ```
74
94
 
75
95
  建议:`outputs/<reportId>/《报表名称》·搭建配置指导.html`
@@ -96,6 +116,6 @@ python (未移植,需要时另议) --config <guide_config.json> --output <
96
116
  ## 五、相关文档
97
117
 
98
118
  - `api-report-build-fast-path.md`
99
- - `session-build-performance-guide.md`
119
+ - `api-report-build-fast-path.md`
100
120
  - `report-requirement-analysis-template.md`(仅分析意图)
101
121
  - `failure-cleanup-and-nonblocking-guide.md`