weaver-e10-builder 1.6.10 → 1.6.12

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 (289) hide show
  1. package/dist/commands/form-browser-definition.d.ts.map +1 -1
  2. package/dist/commands/form-browser-definition.js +108 -7
  3. package/dist/commands/form-browser-definition.js.map +1 -1
  4. package/dist/commands/form-browser-scope-rules.d.ts +27 -0
  5. package/dist/commands/form-browser-scope-rules.d.ts.map +1 -0
  6. package/dist/commands/form-browser-scope-rules.js +141 -0
  7. package/dist/commands/form-browser-scope-rules.js.map +1 -0
  8. package/dist/commands/form-browser-scope-tree.d.ts +14 -0
  9. package/dist/commands/form-browser-scope-tree.d.ts.map +1 -0
  10. package/dist/commands/form-browser-scope-tree.js +115 -0
  11. package/dist/commands/form-browser-scope-tree.js.map +1 -0
  12. package/dist/commands/matrix-maintainer.d.ts +3 -0
  13. package/dist/commands/matrix-maintainer.d.ts.map +1 -0
  14. package/dist/commands/matrix-maintainer.js +117 -0
  15. package/dist/commands/matrix-maintainer.js.map +1 -0
  16. package/dist/commands/matrix.d.ts.map +1 -1
  17. package/dist/commands/matrix.js +2 -0
  18. package/dist/commands/matrix.js.map +1 -1
  19. package/dist/commands/report-admin.d.ts.map +1 -1
  20. package/dist/commands/report-admin.js +378 -2
  21. package/dist/commands/report-admin.js.map +1 -1
  22. package/dist/commands/report-validate.d.ts.map +1 -1
  23. package/dist/commands/report-validate.js +1102 -3
  24. package/dist/commands/report-validate.js.map +1 -1
  25. package/dist/commands/report.d.ts.map +1 -1
  26. package/dist/commands/report.js +341 -3
  27. package/dist/commands/report.js.map +1 -1
  28. package/dist/commands/role.d.ts.map +1 -1
  29. package/dist/commands/role.js +354 -0
  30. package/dist/commands/role.js.map +1 -1
  31. package/dist/commands/special.d.ts.map +1 -1
  32. package/dist/commands/special.js +67 -31
  33. package/dist/commands/special.js.map +1 -1
  34. package/dist/commands/wf-form.d.ts.map +1 -1
  35. package/dist/commands/wf-form.js +1 -121
  36. package/dist/commands/wf-form.js.map +1 -1
  37. package/dist/commands/workflow-after-submit-comment.d.ts +3 -0
  38. package/dist/commands/workflow-after-submit-comment.d.ts.map +1 -0
  39. package/dist/commands/workflow-after-submit-comment.js +56 -0
  40. package/dist/commands/workflow-after-submit-comment.js.map +1 -0
  41. package/dist/commands/workflow-layout-components.d.ts +3 -0
  42. package/dist/commands/workflow-layout-components.d.ts.map +1 -0
  43. package/dist/commands/workflow-layout-components.js +36 -0
  44. package/dist/commands/workflow-layout-components.js.map +1 -0
  45. package/dist/commands/workflow-node-batch.d.ts +3 -0
  46. package/dist/commands/workflow-node-batch.d.ts.map +1 -0
  47. package/dist/commands/workflow-node-batch.js +136 -0
  48. package/dist/commands/workflow-node-batch.js.map +1 -0
  49. package/dist/commands/workflow-node-opinion.d.ts +3 -0
  50. package/dist/commands/workflow-node-opinion.d.ts.map +1 -0
  51. package/dist/commands/workflow-node-opinion.js +51 -0
  52. package/dist/commands/workflow-node-opinion.js.map +1 -0
  53. package/dist/commands/workflow-node-reject.js +1 -1
  54. package/dist/commands/workflow-node-reject.js.map +1 -1
  55. package/dist/commands/workflow-node.d.ts.map +1 -1
  56. package/dist/commands/workflow-node.js +4 -3
  57. package/dist/commands/workflow-node.js.map +1 -1
  58. package/dist/commands/workflow-setting.d.ts.map +1 -1
  59. package/dist/commands/workflow-setting.js +2 -67
  60. package/dist/commands/workflow-setting.js.map +1 -1
  61. package/dist/index.js +6 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/send_message.js +8 -3
  65. package/dist/services/actionflow/components/send_message.js.map +1 -1
  66. package/dist/services/actionflow/context_preflight.js +1 -1
  67. package/dist/services/actionflow/context_preflight.js.map +1 -1
  68. package/dist/services/actionflow/formula_service.d.ts +1 -0
  69. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  70. package/dist/services/actionflow/formula_service.js +107 -31
  71. package/dist/services/actionflow/formula_service.js.map +1 -1
  72. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  73. package/dist/services/actionflow/preflight_service.js +4 -1
  74. package/dist/services/actionflow/preflight_service.js.map +1 -1
  75. package/dist/services/form-layout-describe.d.ts.map +1 -1
  76. package/dist/services/form-layout-describe.js +3 -2
  77. package/dist/services/form-layout-describe.js.map +1 -1
  78. package/dist/services/form-layout-document.d.ts.map +1 -1
  79. package/dist/services/form-layout-document.js +2 -1
  80. package/dist/services/form-layout-document.js.map +1 -1
  81. package/dist/services/matrix-maintainer.d.ts +27 -0
  82. package/dist/services/matrix-maintainer.d.ts.map +1 -0
  83. package/dist/services/matrix-maintainer.js +142 -0
  84. package/dist/services/matrix-maintainer.js.map +1 -0
  85. package/dist/services/report/blueprint.d.ts +109 -0
  86. package/dist/services/report/blueprint.d.ts.map +1 -0
  87. package/dist/services/report/blueprint.js +322 -0
  88. package/dist/services/report/blueprint.js.map +1 -0
  89. package/dist/services/report/build.d.ts.map +1 -1
  90. package/dist/services/report/build.js +8 -3
  91. package/dist/services/report/build.js.map +1 -1
  92. package/dist/services/report/card.d.ts +65 -0
  93. package/dist/services/report/card.d.ts.map +1 -0
  94. package/dist/services/report/card.js +151 -0
  95. package/dist/services/report/card.js.map +1 -0
  96. package/dist/services/report/copy-health.d.ts +31 -0
  97. package/dist/services/report/copy-health.d.ts.map +1 -0
  98. package/dist/services/report/copy-health.js +87 -0
  99. package/dist/services/report/copy-health.js.map +1 -0
  100. package/dist/services/report/dataset-heal.d.ts +64 -0
  101. package/dist/services/report/dataset-heal.d.ts.map +1 -0
  102. package/dist/services/report/dataset-heal.js +89 -0
  103. package/dist/services/report/dataset-heal.js.map +1 -0
  104. package/dist/services/report/dataset-ids.d.ts +70 -0
  105. package/dist/services/report/dataset-ids.d.ts.map +1 -0
  106. package/dist/services/report/dataset-ids.js +149 -0
  107. package/dist/services/report/dataset-ids.js.map +1 -0
  108. package/dist/services/report/dataset.d.ts.map +1 -1
  109. package/dist/services/report/dataset.js +3 -1
  110. package/dist/services/report/dataset.js.map +1 -1
  111. package/dist/services/report/drill.d.ts +74 -0
  112. package/dist/services/report/drill.d.ts.map +1 -0
  113. package/dist/services/report/drill.js +259 -0
  114. package/dist/services/report/drill.js.map +1 -0
  115. package/dist/services/report/empty-dataset.d.ts +51 -0
  116. package/dist/services/report/empty-dataset.d.ts.map +1 -0
  117. package/dist/services/report/empty-dataset.js +213 -0
  118. package/dist/services/report/empty-dataset.js.map +1 -0
  119. package/dist/services/report/field-binding.d.ts +75 -0
  120. package/dist/services/report/field-binding.d.ts.map +1 -0
  121. package/dist/services/report/field-binding.js +160 -0
  122. package/dist/services/report/field-binding.js.map +1 -0
  123. package/dist/services/report/forms.d.ts +32 -0
  124. package/dist/services/report/forms.d.ts.map +1 -1
  125. package/dist/services/report/forms.js +90 -0
  126. package/dist/services/report/forms.js.map +1 -1
  127. package/dist/services/report/formula-parent.d.ts +25 -0
  128. package/dist/services/report/formula-parent.d.ts.map +1 -0
  129. package/dist/services/report/formula-parent.js +116 -0
  130. package/dist/services/report/formula-parent.js.map +1 -0
  131. package/dist/services/report/locate.d.ts +40 -0
  132. package/dist/services/report/locate.d.ts.map +1 -0
  133. package/dist/services/report/locate.js +122 -0
  134. package/dist/services/report/locate.js.map +1 -0
  135. package/dist/services/report/reports.d.ts +4 -0
  136. package/dist/services/report/reports.d.ts.map +1 -1
  137. package/dist/services/report/reports.js +4 -2
  138. package/dist/services/report/reports.js.map +1 -1
  139. package/dist/services/report/scene.d.ts +22 -0
  140. package/dist/services/report/scene.d.ts.map +1 -0
  141. package/dist/services/report/scene.js +145 -0
  142. package/dist/services/report/scene.js.map +1 -0
  143. package/dist/services/report/types.d.ts +28 -0
  144. package/dist/services/report/types.d.ts.map +1 -1
  145. package/dist/services/report/verify.d.ts +24 -0
  146. package/dist/services/report/verify.d.ts.map +1 -1
  147. package/dist/services/report/verify.js +115 -2
  148. package/dist/services/report/verify.js.map +1 -1
  149. package/dist/services/report/workbook.d.ts +12 -1
  150. package/dist/services/report/workbook.d.ts.map +1 -1
  151. package/dist/services/report/workbook.js +107 -8
  152. package/dist/services/report/workbook.js.map +1 -1
  153. package/dist/services/role-function-permission.d.ts +12 -0
  154. package/dist/services/role-function-permission.d.ts.map +1 -0
  155. package/dist/services/role-function-permission.js +46 -0
  156. package/dist/services/role-function-permission.js.map +1 -0
  157. package/dist/services/special-layout.d.ts +113 -0
  158. package/dist/services/special-layout.d.ts.map +1 -0
  159. package/dist/services/special-layout.js +178 -0
  160. package/dist/services/special-layout.js.map +1 -0
  161. package/dist/services/workflow-after-submit-comment.d.ts +20 -0
  162. package/dist/services/workflow-after-submit-comment.d.ts.map +1 -0
  163. package/dist/services/workflow-after-submit-comment.js +81 -0
  164. package/dist/services/workflow-after-submit-comment.js.map +1 -0
  165. package/dist/services/workflow-base-settings.d.ts +1 -10
  166. package/dist/services/workflow-base-settings.d.ts.map +1 -1
  167. package/dist/services/workflow-field-permission-route.d.ts +15 -41
  168. package/dist/services/workflow-field-permission-route.d.ts.map +1 -1
  169. package/dist/services/workflow-field-permission-route.js +23 -8
  170. package/dist/services/workflow-field-permission-route.js.map +1 -1
  171. package/dist/services/workflow-layout-components.d.ts +52 -0
  172. package/dist/services/workflow-layout-components.d.ts.map +1 -0
  173. package/dist/services/workflow-layout-components.js +66 -0
  174. package/dist/services/workflow-layout-components.js.map +1 -0
  175. package/dist/services/workflow-layout-draft.d.ts +49 -0
  176. package/dist/services/workflow-layout-draft.d.ts.map +1 -0
  177. package/dist/services/workflow-layout-draft.js +98 -0
  178. package/dist/services/workflow-layout-draft.js.map +1 -0
  179. package/dist/services/workflow-node-batch-spec.d.ts +122 -0
  180. package/dist/services/workflow-node-batch-spec.d.ts.map +1 -0
  181. package/dist/services/workflow-node-batch-spec.js +496 -0
  182. package/dist/services/workflow-node-batch-spec.js.map +1 -0
  183. package/dist/services/workflow-node-batch.d.ts +73 -0
  184. package/dist/services/workflow-node-batch.d.ts.map +1 -0
  185. package/dist/services/workflow-node-batch.js +328 -0
  186. package/dist/services/workflow-node-batch.js.map +1 -0
  187. package/dist/services/workflow-node-opinion-description.d.ts +12 -0
  188. package/dist/services/workflow-node-opinion-description.d.ts.map +1 -0
  189. package/dist/services/workflow-node-opinion-description.js +52 -0
  190. package/dist/services/workflow-node-opinion-description.js.map +1 -0
  191. package/dist/services/workflow-node-opinion-layout.d.ts +22 -0
  192. package/dist/services/workflow-node-opinion-layout.d.ts.map +1 -0
  193. package/dist/services/workflow-node-opinion-layout.js +113 -0
  194. package/dist/services/workflow-node-opinion-layout.js.map +1 -0
  195. package/dist/services/workflow-node-opinion-range.d.ts +21 -0
  196. package/dist/services/workflow-node-opinion-range.d.ts.map +1 -0
  197. package/dist/services/workflow-node-opinion-range.js +74 -0
  198. package/dist/services/workflow-node-opinion-range.js.map +1 -0
  199. package/dist/services/workflow-node-opinion.d.ts +43 -0
  200. package/dist/services/workflow-node-opinion.d.ts.map +1 -0
  201. package/dist/services/workflow-node-opinion.js +198 -0
  202. package/dist/services/workflow-node-opinion.js.map +1 -0
  203. package/dist/services/workflow-opinion-settings.d.ts +14 -0
  204. package/dist/services/workflow-opinion-settings.d.ts.map +1 -1
  205. package/dist/services/workflow-opinion-settings.js +18 -2
  206. package/dist/services/workflow-opinion-settings.js.map +1 -1
  207. package/ecodecmd/src/build.js +36 -12
  208. package/package.json +1 -1
  209. package/skill-docs/SKILL.md +164 -162
  210. package/skill-docs/_catalog.md +13 -3
  211. package/skill-docs/actionflows/references/components/message/SendMessage.md +32 -30
  212. package/skill-docs/references/coding/guide-page-code.md +95 -0
  213. package/skill-docs/references/common/guide-plan-template.md +4 -1
  214. package/skill-docs/references/common/map.md +28 -4
  215. package/skill-docs/references/common/ref-cli-commands.md +14 -4
  216. package/skill-docs/references/components/ref-component-common.md +98 -0
  217. package/skill-docs/references/form/guide-browser-definition.md +2 -219
  218. package/skill-docs/references/form/guide-browser-scope.md +285 -0
  219. package/skill-docs/references/form/guide-create-form.md +1 -1
  220. package/skill-docs/references/hrm/guide-matrix.md +276 -245
  221. package/skill-docs/references/hrm/guide-role.md +77 -0
  222. package/skill-docs/references/report/add-dataset-registration-guide.md +44 -22
  223. package/skill-docs/references/report/advanced-crosstab-tree-guide.md +82 -0
  224. package/skill-docs/references/report/ai-report-workflow.md +100 -100
  225. package/skill-docs/references/report/api-auth-headers.md +129 -0
  226. package/skill-docs/references/report/api-report-build-fast-path.md +274 -275
  227. package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -230
  228. package/skill-docs/references/report/branch-scene-guide.md +293 -0
  229. package/skill-docs/references/report/build-resilience-guide.md +99 -0
  230. package/skill-docs/references/report/card-report-guide.md +110 -0
  231. package/skill-docs/references/report/cell-config-echo-guide.md +44 -9
  232. package/skill-docs/references/report/cell-transform-guide.md +9 -9
  233. package/skill-docs/references/report/column-split-report-guide.md +96 -0
  234. package/skill-docs/references/report/condition-format-guide.md +49 -24
  235. package/skill-docs/references/report/cross-dataset-filter-guide.md +180 -69
  236. package/skill-docs/references/report/crosstab-raw-workbook-guide.md +265 -0
  237. package/skill-docs/references/report/dataset-query-filter-guide.md +231 -235
  238. package/skill-docs/references/report/dataset-sidebar-ops-guide.md +75 -34
  239. package/skill-docs/references/report/dataset-table-field-contract-guide.md +196 -46
  240. package/skill-docs/references/report/datasource-metadata-guide.md +128 -119
  241. package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +183 -148
  242. package/skill-docs/references/report/date-range-query-reference.md +97 -102
  243. package/skill-docs/references/report/default-header-style-guide.md +8 -8
  244. package/skill-docs/references/report/designer-blank-prevention-guide.md +8 -8
  245. package/skill-docs/references/report/dossier-report-guide.md +69 -0
  246. package/skill-docs/references/report/drilldown-report-guide.md +75 -0
  247. package/skill-docs/references/report/event-hreflink-guide.md +55 -47
  248. package/skill-docs/references/report/expansion-block-parent-config-guide.md +208 -0
  249. package/skill-docs/references/report/failure-cleanup-and-nonblocking-guide.md +183 -0
  250. package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -208
  251. package/skill-docs/references/report/financial-stats-report-guide.md +89 -0
  252. package/skill-docs/references/report/formula-cell-api-guide.md +325 -258
  253. package/skill-docs/references/report/golden-case-summary-sheet.md +200 -0
  254. package/skill-docs/references/report/guide-report-build.md +6 -1
  255. package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +10 -10
  256. package/skill-docs/references/report/layout-showlocation-freeze-guide.md +39 -10
  257. package/skill-docs/references/report/multi-report-crosstab-casebook.md +263 -0
  258. package/skill-docs/references/report/paged-group-report-guide.md +68 -0
  259. package/skill-docs/references/report/preaggregate-auto-disable-guide.md +24 -13
  260. package/skill-docs/references/report/query-condition-api-guide.md +174 -125
  261. package/skill-docs/references/report/ref-report-commands.md +41 -3
  262. package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -117
  263. package/skill-docs/references/report/report-building-guide.md +52 -52
  264. package/skill-docs/references/report/report-case-prompts.md +104 -0
  265. package/skill-docs/references/report/report-config-schema.md +281 -281
  266. package/skill-docs/references/report/report-create-modes-guide.md +73 -35
  267. package/skill-docs/references/report/report-data-model.md +131 -131
  268. package/skill-docs/references/report/report-delivery-contract.md +23 -3
  269. package/skill-docs/references/report/report-designer-feature-map.md +30 -35
  270. package/skill-docs/references/report/report-help-guide.md +304 -0
  271. package/skill-docs/references/report/report-internal-error-guide.md +71 -0
  272. package/skill-docs/references/report/report-knowledge-base.md +27 -27
  273. package/skill-docs/references/report/report-lifecycle-api-guide.md +126 -94
  274. package/skill-docs/references/report/report-list-page-ops-guide.md +54 -8
  275. package/skill-docs/references/report/report-permission-guide.md +99 -102
  276. package/skill-docs/references/report/report-requirement-analysis-template.md +93 -29
  277. package/skill-docs/references/report/report-self-check-guide.md +164 -164
  278. package/skill-docs/references/report/report-verification-discipline-guide.md +203 -0
  279. package/skill-docs/references/report/safe-partial-save-guide.md +151 -151
  280. package/skill-docs/references/report/shard-freeze-report-guide.md +97 -0
  281. package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -84
  282. package/skill-docs/references/report/spec-build-schema.md +71 -71
  283. package/skill-docs/references/report/targeted-fix-guide.md +155 -97
  284. package/skill-docs/references/report/user-request-scope-only-guide.md +23 -4
  285. package/skill-docs/references/workflow/guide-after-submit-comment.md +58 -0
  286. package/skill-docs/references/workflow/guide-layout-components.md +26 -0
  287. package/skill-docs/references/workflow/guide-node-opinion.md +58 -0
  288. package/skill-docs/references/workflow/guide-workflow.md +49 -0
  289. package/skill-docs/references/form/guide-ebuilder-scope.md +0 -82
@@ -14,12 +14,18 @@
14
14
 
15
15
  | 形态 | 典型 `addDataset` | `dataset/list` 特征 | 业务字段 `fieldsKey.name` | `tableName` 后缀 | 何时用 |
16
16
  |------|-------------------|---------------------|---------------------------|------------------|--------|
17
- | **A. 设计器默认(LOGIC)** | `sourceType=LOGIC`(或 `logic`)+ `sourceGroup=weaver-ebuilder-form-service` + `appid=<appId>` | `type:"logic"`,`sourceGroup:"weaver-ebuilder-form-service"` | **`field_{雪花}`** | **`(业务模块)`** | **普通应用表单(默认强制)** |
17
+ | **A. 设计器默认(logic,小写)** | `sourceType=logic`(**必须小写**;大写 `LOGIC` 会让报表复制 500)+ `sourceGroup=weaver-ebuilder-form-service` + `appid=<appId>` | `type:"logic"`,`sourceGroup:"weaver-ebuilder-form-service"` | **`field_{雪花}`** | **`(业务模块)`** | **普通应用表单(默认强制)** |
18
18
  | **B. 共享表 / form 契约** | `sourceType=form` + `sourceGroup=<appId>` | `type:"form"`,`sourceGroup` 等于 appId | 常为**裸雪花** | **`(表单)`** | 仅「xxx-共享表」类应用且已验证必须用此契约时(见 MEMORY/共享表笔记) |
19
+ | **C. 数据加工 SQL 视图** | `sourceType=eteams`(**必须小写**)+ `sourceGroup=sql` + `appid=<appId>` | `type:"eteams"`,`sourceGroup:"sql"` | 视图原字段名(如 `title`/`zymc`/`major_no`,**无 `field_` 前缀**) | **`(数据加工)`** | 数据集来自「数据加工」SQL 视图 |
19
20
 
20
21
  **禁止**:在普通应用里误用形态 B,再抱怨「没有 field_」——那是注册错了,不是 fieldsKey 坏了。
21
22
 
22
- > ⚠️ **`tableName` 后缀必须与注册形态一致**:形态 A → `(业务模块)`,形态 B → `(表单)`。
23
+ > ⚠️ **形态 C 大小写门禁(2026-10-09 实证 · 应用 `1323883777452843010`)**:
24
+ > `sourceType` **必须小写 `eteams`** + `sourceGroup=sql`,落库 `type="eteams"` → 面板/单元格显示 **`X(数据加工)`** ✅。
25
+ > 若传大写 `ETEAMS`(或 sourceGroup 用 `-98`)→ 落库 `type="ETEAMS"`/`sourceGroup:"-98"` → 被当成 **`X(业务模块)`** ❌。
26
+ > 同应用验证:`eteams`/`sql` 的 5 张表单元格全为 `X(数据加工)`;`ETEAMS`/`-98` 的 2 张表全为 `X(业务模块)`。
27
+
28
+ > ⚠️ **`tableName` 后缀必须与注册形态一致**:形态 A → `(业务模块)`,形态 B → `(表单)`,形态 C → `(数据加工)`。
23
29
  > 后缀缺失或写错会导致左侧数据源不显示模块类型。
24
30
  > 详见 **`dataset-table-field-contract-guide.md`**(含 `FieldCellType` 必需字段全表 + 落库门禁)。
25
31
 
@@ -31,17 +37,33 @@
31
37
  POST /api/bs/edc/report/addDataset
32
38
  Content-Type: multipart/form-data
33
39
 
34
- reportId = {reportId}
35
- sourceType = LOGIC
36
- sourceIds = {sourceId} // 表单/数据源 ID
37
- sourceName = {显示名} // **回显名强制**:`{表单名}(业务模块)`,如 `轻资产信息(业务模块)`;禁止只传裸表单名
38
- appid = {appId} // 注意小写 appid(与设计器一致)
39
- sourceGroup = weaver-ebuilder-form-service
40
+ reportId = {reportId}
41
+ sourceType = logic // ★★ 必须小写!大写 LOGIC 会让报表「复制」500(见下方红框)
42
+ sourceIds = {sourceId} // 表单/数据源 ID
43
+ sourceName = {裸名} // ★ 传**裸名** `轻资产信息`(不带后缀)
44
+ // 面板显示名 = sourceName + (添加类型标签),标签由平台按添加类型自动拼
45
+ // 旧口径「必须传 {表单名}(业务模块)」已于 2026-09-16 推翻(注意点 BUILD-36)
46
+ appid = {appId} // 注意小写 appid(与设计器一致)
47
+ sourceGroup = weaver-ebuilder-form-service
40
48
  ```
41
- > **回显名(已验证)**:`sourceName` 写入 `edc_dataset_dev.name`,左侧回显应为 **`xxx(业务模块)`**。
42
- > 只传 `轻资产信息` 会缺后缀;源合并后的 `tableText` 可能仍是 `轻资产信息(uf_xxx)`,与回显名不是同一字段——**以 `name`=sourceName 为准**。
49
+ > ★★ **`sourceType` 必须小写 `logic`(2026-09-15 实证 · 注意点 BUILD-29)**
50
+ > 服务端会把入参**原样**写进 `edc_dataset_dev.type`:
51
+ > - `sourceType=logic` → `type="logic"`(= 设计器口径)→ 报表「复制」**200**
52
+ > - `sourceType=LOGIC` → `type="LOGIC"`(大写)→ 报表「复制」**500「报表内部错误」**(HTTP 仍 200)
53
+ >
54
+ > 决定性实验:同应用同表单两张空壳,唯一差别就是这里的大小写 → 200 / 500。
55
+ > CLI 侧已把默认值统一为小写(`dataset add --source-type` 默认 `logic`),**不要显式传大写**。
56
+ > 存量注意报表:`e10-cli report copy-health`(诊断)→ `e10-cli report dataset heal --purge --apply`(原地换型修复)。
57
+
58
+ > **回显名(2026-09-16 更正 · 注意点 BUILD-36)**:`sourceName` 写入 `edc_dataset_dev.name`,面板显示时为
59
+ > **`{sourceName} + (添加类型标签)`** —— 所以 `sourceName` 要传**裸名** `轻资产信息`,面板才会显示 `轻资产信息(业务模块)`。
60
+ > **旧说法「只传裸表单名会缺后缀、必须传 `轻资产信息(业务模块)`」已推翻**:那样写会让面板显示 **`轻资产信息(业务模块)(业务模块)`**。
61
+ > 决定性对照(报表 `1315265856934289408`,同 sourceId 两条):脚本建那条 `name="采购入库(业务模块)"` → 双后缀 ❌;
62
+ > 设计器「+」那条 `name="采购入库"` → `采购入库(业务模块)` ✅。
63
+ > 源合并后的 `tableText` 可能仍是 `轻资产信息(uf_xxx)`,与回显名不是同一字段——**以 `name` 为准**。
64
+ > 存量脏值清理:`e10-cli report fix dataset-name --report-id <rid> --app-id <appId> [--apply]`。
43
65
 
44
- 可选字段以设计器实际请求为准;**不得**把 `sourceGroup` 写成 appId,除非走 §一 形态 B。
66
+ 可选字段以设计器接口返回为准;**不得**把 `sourceGroup` 写成 appId,除非走 §一 形态 B。
45
67
 
46
68
  `addDataset` **不返回** datasetId → 短轮询:
47
69
 
@@ -53,7 +75,7 @@ GET /api/bs/edc/dataset/list?hasField=true&reportId={reportId}
53
75
 
54
76
  ### 2.1 同源只挂一次(**强制 · 2026-09-11 事故**)
55
77
 
56
- `spec_lib.resolveDataset()` 在 `addDataset` **之前**先查 `dataset/list`:
78
+ 构建层 在 `addDataset` **之前**先查 `dataset/list`:
57
79
 
58
80
  | 场景 | 行为 |
59
81
  |------|------|
@@ -74,18 +96,18 @@ GET /api/bs/edc/dataset/list?hasField=true&reportId={reportId}
74
96
 
75
97
  ```javascript
76
98
  const biz = fieldsKey.filter(
77
- (f) => /^\d{15,}$/.test(f.name) || /^field_\d{15,}$/.test(f.name)
99
+ (f) => /^\d{15,}$/.test(f.name) || /^field_\d{15,}$/.test(f.name)
78
100
  );
79
101
  const withPrefix = biz.filter((f) => String(f.name).startsWith('field_')).length;
80
102
  const bare = biz.filter((f) => /^\d{15,}$/.test(f.name)).length;
81
103
 
82
104
  // 普通应用(非共享表 form 契约):业务字段应多数带 field_
83
105
  if (!isSharedFormContract && biz.length > 0 && bare > withPrefix) {
84
- throw new Error(
85
- 'addDataset 注册错误:fieldsKey 业务字段为裸雪花(无 field_)。' +
86
- '应使用 sourceType=LOGIC + sourceGroup=weaver-ebuilder-form-service;' +
87
- 'delDataset 后重建,禁止在 Field 上凭记忆加 field_ 前缀凑数。'
88
- );
106
+ throw new Error(
107
+ 'addDataset 注册错误:fieldsKey 业务字段为裸雪花(无 field_)。' +
108
+ '应使用 sourceType=LOGIC + sourceGroup=weaver-ebuilder-form-service;' +
109
+ 'delDataset 后重建,禁止在 Field 上凭记忆加 field_ 前缀凑数。'
110
+ );
89
111
  }
90
112
  ```
91
113
 
@@ -98,9 +120,9 @@ if (!isSharedFormContract && biz.length > 0 && bare > withPrefix) {
98
120
  失败处理:
99
121
 
100
122
  1. `POST /api/bs/edc/report/delDataset` 删掉错误注册
101
- - form:`reportId=<报表ID>` · **`sourceIds=<datasetId>`**(参数名历史遗留,**不是**表单 sourceId)
102
- - 建议先 `GET /api/bs/edc/dataset/checkDataSetUsed?reportId=&datasetId=`;CLI:`e10-cli report dataset delete`
103
- - 完整侧栏操作见 `dataset-sidebar-ops-guide.md`
123
+ - form:`reportId=<报表ID>` · **`sourceIds=<datasetId>`**(参数名历史遗留,**不是**表单 sourceId)
124
+ - 建议先 `GET /api/bs/edc/dataset/checkDataSetUsed?reportId=&datasetId=`;CLI:`e10-cli report dataset delete`
125
+ - 完整侧栏操作见 `dataset-sidebar-ops-guide.md`
104
126
  2. 按 §二 重新 `addDataset`
105
127
  3. 再拉 `fieldsKey`,确认出现 `field_*`
106
128
  4. 再写 Field / `saveReportDevInfo`
@@ -124,7 +146,7 @@ if (!isSharedFormContract && biz.length > 0 && bare > withPrefix) {
124
146
  - [ ] `addDataset` 使用 `sourceType=LOGIC` + `sourceGroup=weaver-ebuilder-form-service`(除非共享表契约)
125
147
  - [ ] `dataset/list` 回读该条 `type/sourceGroup` 与设计器一致
126
148
  - [ ] `fieldsKey` 业务字段已出现 `field_*`(普通应用)
127
- - [ ] Field.`name` / fieldKey 末段 ∈ **该** dataset 的 fieldsKey(`verify_field_bind.js`)
149
+ - [ ] Field.`name` / fieldKey 末段 ∈ **该** dataset 的 fieldsKey(`e10-cli report verify bind`)
128
150
  - [ ] 同 sourceId 多实例时,未误绑到旧的 form+appId 裸雪花数据集
129
151
 
130
152
  ---
@@ -0,0 +1,82 @@
1
+ # 高阶交叉表与折叠树报表 · 场景 H / I(SKILL A0.18)
2
+
3
+ > 案例一「销售额等级分析」:多级行维度(一级品类→二级品类→品牌)× 多指标列组(销量对比/销售额/
4
+ > 销售额年别/无人区/违杀率…,组内 2014/2015/占比/合计多列)+ 每级小计行 + 环比涨跌红绿条件色。
5
+ > 案例二「江苏地区截止应收账款汇总表」:左侧折叠树(地区→区县→等级→分类,▶/▼ 可收起)+
6
+ > 多层列组(合同销售/产品费用/实施费用,组内小计/已上线/未上线 + 个数/金额子列)+ 底部合计行。
7
+
8
+ ---
9
+
10
+ ## 一、案例 H:高阶交叉表(多级行维度 × 多指标列组)
11
+
12
+ | # | 特性 | 机制 | 落点 |
13
+ |---|---|---|---|
14
+ | ① | 多级行维度(品类→子类→品牌,逐级缩进) | 每级一个 Field(`Vertical+Group`),**子级左父格自定义→上级格**(链式缩进);最末级左父格挂上一级 | rebuild 直构路径(crosstab guide §2),**build spec 单列平铺表达不了多级行维度** |
15
+ | ② | 每级小计行(计/合计) | 小计 Formula 行左父格自定义→**该级维度格**,上父格→列维度;整行公式禁默认左父格(crosstab guide §4.2 ★) | 同上 |
16
+ | ③ | 多指标列组(组内 年份/占比/合计) | 第一层列维度 `Horizontal+Group` 横向扩展;组内子表头 Const 上父格→列维度;占比/环比 = Formula(上父格→列维度,`SUM()` 引扩展格=对全部实例求和) | 知识库 §4.8 多横向维度交叉(两层横向维度的父格定案) |
17
+ | ④ | 环比涨跌红绿(▲绿 ▼红 百分比) | `conditionRule.highlightDatas[]`:greater→红 / less→绿(或反之),relation highlight | build spec `columns[].rule` / 直构 `cellType.conditionRule` |
18
+
19
+ **列组直构坐标模板**(列维度两组:年份组 + 无人区组):
20
+
21
+ ```
22
+ x=0 A1 行维度1(Vertical/Group) B1 列维度1(Horizontal/Group) F1 列维度2(Horizontal/Group)
23
+ x=1 B2..E2 子表头Const(上父→B1) F2..H2 子表头(上父→F1)
24
+ x=2 A3 二级行维度(左父→A1) B3.. 数值/占比(左父→A1/上级, 上父→B1/F1)
25
+ x=3 A4 「计」小计行(左父→A1) B4.. SUM公式(上父→B1/F1)
26
+ ```
27
+
28
+ ## 二、案例 I:折叠树报表(树形扩展)
29
+
30
+ | # | 特性 | 机制 | 落点 |
31
+ |---|---|---|---|
32
+ | ① | 左侧树形层级(▶/▼ 收起展开) | 树形字段:**左父格无、上父格无、纵向扩展、`displayType:'Tree'`**(枚举定案 `AnalysisDisplayType: Group/List/Count/Tree`,knowledge-base §2/§4.6) | **`build spec` 已内置**:`columns[].display:'tree'` → 自动 Tree + 左父格 [-1,-1] + isActiveParent |
33
+ | ② | 上下级从属关系 | 树形字段按**字段值上下级**(id 匹配上级)分叉;多数据集时配 `subordination`(VLOOKUP 映射) | 数据集单源自包含层级(如 组织表 pid)直接可树;跨表层级配 subordination |
34
+ | ③ | 默认收起 / 默认展开 | 默认收起;展开 = 设计器「页面 → 页面布局 → 数据展开 → 树形」(sheetConfig) | spec 落库默认收起;默认展开=设计器确认项(sheetConfig 键名待确认回填) |
35
+ | ④ | 多层列组(费用类型→状态→个数/金额) | 同案例 H ③:两层横向维度父格定案(知识库 §4.8) | rebuild 直构路径 |
36
+ | ⑤ | 底部合计行 | `COMB_GRAND_TOTAL` → `SUM(...)`;左父格挂合计标签格 | crosstab guide §4.2 |
37
+
38
+ **build spec 树形最小示例**:
39
+
40
+ ```json
41
+ {
42
+ "appId": "<appId>", "sourceId": "<sid>", "sourceName": "<组织/地区表>",
43
+ "reportName": "江苏地区应收汇总",
44
+ "columns": [
45
+ { "title": "公司/项目/形态", "field": "组织层级", "display": "tree" },
46
+ { "title": "合同销售-个数", "field": "合同个数", "format": "value" },
47
+ { "title": "合同销售-金额", "field": "合同金额", "format": "huobi" }
48
+ ],
49
+ "layout": { "title": "江苏地区截止应收账款汇总表", "showLocation": "left", "freezeRows": 1, "freezeCols": 1 }
50
+ }
51
+ ```
52
+
53
+ ## 三、能力边界(如实)
54
+
55
+ 1. **折叠按钮(▶/▼)由 `displayType=Tree` 引擎渲染**,API 侧只需树形字段+父格规则;`sheetConfig` 默认展开键名待确认回填。
56
+ 2. **多级行维度 / 多层列组**超出 build spec 表达力 → 走 rebuild 直构(`e10-cli report build` / `rebuild from-blueprint`),坐标模板见 §一。
57
+ 3. 树形列**必须**在数据源里有明确的上下级关系字段(自引用 pid 或 subordination 映射);纯平铺字段强上 Tree 无层级效果。
58
+ 4. 渲染展开形态设计器确认为准(渲染接口取不到展开数据,crosstab guide §5.4)。
59
+
60
+ ## 四、搭建提示语句
61
+
62
+ **案例 H(高阶交叉)**:
63
+
64
+ > 按高阶交叉格式搭一张销售额等级分析:行维度三级「一级品类→二级品类→品牌」逐级缩进,
65
+ > 每级带小计行,底部总计;列侧多指标组「销量对比/销售额/…」(组内 2014/2015/占比/合计);
66
+ > 环比列红绿条件色(`columns[].rule`);数据源 `<sid>`(appId `<appId>`);
67
+ > 多级行维度+多列组走 rebuild 直构路径(crosstab + 本指南 §一坐标模板),落库后回读验收父格拓扑与 Formula 存活。
68
+
69
+ **案例 I(折叠树)**:
70
+
71
+ > 按折叠树格式搭一张地区应收汇总:左侧「组织层级」树形列(可收起展开,`display:"tree"`),
72
+ > 列侧多层费用组(组内小计/已上线/未上线 → 个数/金额子列),底部合计行;
73
+ > 数据源 `<sid>`(自包含层级;跨表层级给 subordination 映射),appId `<appId>`;
74
+ > 冻结左 1 列+上方表头、居左;单源用 `build spec`、多源列组用 rebuild 直构,
75
+ > 落库后回读验收:树形格 displayType=Tree 且左父格 -1,-1、冻结锚点唯一、check-ids 干净。
76
+
77
+ ## 五、验证清单
78
+
79
+ 1. 树形列回读:`displayType === 'Tree'`、`leftX/leftY === -1`、`isActiveParent === true`、`expandType === 'Vertical'`
80
+ 2. 案例 H:小计行 Formula 左父格=该级维度格;多列组子表头 Const 上父格→列维度格
81
+ 3. 条件色:`conditionRule.highlightDatas[]` 关系/颜色逐条回读
82
+ 4. 树形折叠表现、默认展开 = 设计器确认;验证后回填 sheetConfig 键名
@@ -1,38 +1,38 @@
1
1
  # AI 报表生成工作流程
2
2
 
3
- > **冷启动禁止通读**:见 `cold-start-scan-guide.md`。纯搭表走 `api-report-build-fast-path.md`,勿开场读本文。
3
+ > **冷启动禁止通读**:见 `api-report-build-fast-path.md`。纯搭表走 `api-report-build-fast-path.md`,勿开场读本文。
4
4
 
5
5
  ## 一、整体流程概览
6
6
 
7
7
  ```
8
8
  用户输入(文本描述 / 图片效果 / 需求文件)
9
- |
10
- v
11
- 1. 需求解析:理解报表类型、数据维度、指标、样式需求
12
- |
13
- v
14
- 2. 字段分类:将需求中的字段映射为三类
15
- - groupFields(分组/维度字段)
16
- - listFields(列表/展示字段)
17
- - targetFields(指标/度量字段)
18
- |
19
- v
20
- 3. 报表类型判定:根据字段组合判断报表类型
21
- - 简单列表(LIST)
22
- - 分组表(GROUP)
23
- - 交叉表/统计表(COUNT)
24
- |
25
- v
26
- 4. 布局规划:确定单元格位置、扩展方向、父格关系
27
- |
28
- v
29
- 5. 样式配置:主题选择、条件格式、字体样式
30
- |
31
- v
32
- 6. 高级配置:查询条件、分页、打印、解析优化
33
- |
34
- v
35
- 7. 输出配置:生成完整的 ReportProps JSON 配置
9
+ |
10
+ v
11
+ 1. 需求解析:理解报表类型、数据维度、指标、样式需求
12
+ |
13
+ v
14
+ 2. 字段分类:将需求中的字段映射为三类
15
+ - groupFields(分组/维度字段)
16
+ - listFields(列表/展示字段)
17
+ - targetFields(指标/度量字段)
18
+ |
19
+ v
20
+ 3. 报表类型判定:根据字段组合判断报表类型
21
+ - 简单列表(LIST)
22
+ - 分组表(GROUP)
23
+ - 交叉表/统计表(COUNT)
24
+ |
25
+ v
26
+ 4. 布局规划:确定单元格位置、扩展方向、父格关系
27
+ |
28
+ v
29
+ 5. 样式配置:主题选择、条件格式、字体样式
30
+ |
31
+ v
32
+ 6. 高级配置:查询条件、分页、打印、解析优化
33
+ |
34
+ v
35
+ 7. 输出配置:生成完整的 ReportProps JSON 配置
36
36
  ```
37
37
 
38
38
  ## 二、需求解析规则
@@ -78,8 +78,8 @@
78
78
  配置示例:
79
79
  ```json
80
80
  {
81
- "fieldName": "创建日期",
82
- "groupType": "yearmonth" // 按年月分组
81
+ "fieldName": "创建日期",
82
+ "groupType": "yearmonth" // 按年月分组
83
83
  }
84
84
  ```
85
85
 
@@ -100,8 +100,8 @@ groupType 中文到系统值映射:
100
100
  配置示例:
101
101
  ```json
102
102
  {
103
- "fieldName": "客户名称",
104
- "groupType": "none"
103
+ "fieldName": "客户名称",
104
+ "groupType": "none"
105
105
  }
106
106
  ```
107
107
 
@@ -115,8 +115,8 @@ groupType 中文到系统值映射:
115
115
  配置示例:
116
116
  ```json
117
117
  {
118
- "fieldName": "合同金额",
119
- "countType": "sum" // 求和
118
+ "fieldName": "合同金额",
119
+ "countType": "sum" // 求和
120
120
  }
121
121
  ```
122
122
 
@@ -144,7 +144,7 @@ countType 中文到系统值映射:
144
144
  **单元格布局示例**:
145
145
  ```
146
146
  A1: 标题行(常量)
147
- A2: 字段1(纵向扩展,排列) B2: 字段2(纵向扩展,排列) C2: 字段3(纵向扩展,排列)
147
+ A2: 字段1(纵向扩展,排列) B2: 字段2(纵向扩展,排列) C2: 字段3(纵向扩展,排列)
148
148
  ```
149
149
 
150
150
  ### 4.2 分组表(GROUP)
@@ -160,7 +160,7 @@ A2: 字段1(纵向扩展,排列) B2: 字段2(纵向扩展,排列) C2: 字段3(
160
160
  **单元格布局示例**:
161
161
  ```
162
162
  A1: 标题行(常量)
163
- A2: 分组字段(纵向扩展,分组) B2: 指标字段(纵向扩展,汇总,求和)
163
+ A2: 分组字段(纵向扩展,分组) B2: 指标字段(纵向扩展,汇总,求和)
164
164
  ```
165
165
 
166
166
  ### 4.3 交叉表/统计表(COUNT)
@@ -178,9 +178,9 @@ A2: 分组字段(纵向扩展,分组) B2: 指标字段(纵向扩展,汇总,求
178
178
  **单元格布局示例**(2个分组字段+1个指标):
179
179
  ```
180
180
  A1: 标题行(常量)
181
- A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组)
182
- B3: 指标字段(纵向扩展,汇总,求和)
183
- 左父格=自定义(A2), 上父格=自定义(B2)
181
+ A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组)
182
+ B3: 指标字段(纵向扩展,汇总,求和)
183
+ 左父格=自定义(A2), 上父格=自定义(B2)
184
184
  ```
185
185
 
186
186
  ### 4.4 交叉表父格筛选配置
@@ -192,22 +192,22 @@ A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组
192
192
 
193
193
  ```json
194
194
  {
195
- "subordination": [
196
- "1304979556231593994.1299763447342276611.field_1299763447342276617",
197
- "1304979560546713602.1299789221321891842.field_1299789221321891843"
198
- ],
199
- "leftFilterField": [{
200
- "parentField": "1304979556231593994.1299763447342276611.field_1299763447342276617",
201
- "currentField": "1304979560546713602.1299789221321891842.field_1299789221321891843",
202
- "type": "Equals",
203
- "id": "1304979560546713602.1299789221321891842.field_1299789221321891843"
204
- }],
205
- "customFilterField": [{
206
- "currentField": "1304979560546713602.1299789221321891842.field_1299789221321891844",
207
- "type": "NotContain",
208
- "value": "排除机构",
209
- "id": "1304979560546713602.1299789221321891842.field_1299789221321891844"
210
- }]
195
+ "subordination": [
196
+ "1304979556231593994.1299763447342276611.field_1299763447342276617",
197
+ "1304979560546713602.1299789221321891842.field_1299789221321891843"
198
+ ],
199
+ "leftFilterField": [{
200
+ "parentField": "1304979556231593994.1299763447342276611.field_1299763447342276617",
201
+ "currentField": "1304979560546713602.1299789221321891842.field_1299789221321891843",
202
+ "type": "Equals",
203
+ "id": "1304979560546713602.1299789221321891842.field_1299789221321891843"
204
+ }],
205
+ "customFilterField": [{
206
+ "currentField": "1304979560546713602.1299789221321891842.field_1299789221321891844",
207
+ "type": "NotContain",
208
+ "value": "排除机构",
209
+ "id": "1304979560546713602.1299789221321891842.field_1299789221321891844"
210
+ }]
211
211
  }
212
212
  ```
213
213
 
@@ -226,9 +226,9 @@ A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组
226
226
  - x = 行号(从0开始,向下递增)
227
227
  - y = 列号(从0开始,向右递增)
228
228
  - 父格坐标:[type, x, y]
229
- - `["default", 0, 0]` = 默认(依赖相邻单元格)
230
- - `["custom", x, y]` = 自定义(指向坐标 x,y 的单元格)
231
- - `["empty", 0, 0]` = 无父格
229
+ - `["default", 0, 0]` = 默认(依赖相邻单元格)
230
+ - `["custom", x, y]` = 自定义(指向坐标 x,y 的单元格)
231
+ - `["empty", 0, 0]` = 无父格
232
232
 
233
233
  ### 5.3 多数据集布局
234
234
 
@@ -257,12 +257,12 @@ A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组
257
257
 
258
258
  ```json
259
259
  {
260
- "cellType": "Formula",
261
- "cellText": "IF(J3=0,0,L3/J3)",
262
- "displayType": "Group",
263
- "countType": "count",
264
- "groupType": null,
265
- "expandType": "NoExpand"
260
+ "cellType": "Formula",
261
+ "cellText": "IF(J3=0,0,L3/J3)",
262
+ "displayType": "Group",
263
+ "countType": "count",
264
+ "groupType": null,
265
+ "expandType": "NoExpand"
266
266
  }
267
267
  ```
268
268
 
@@ -270,10 +270,10 @@ A2: 行维度字段(纵向扩展,分组) B2: 列维度字段(横向扩展,分组
270
270
 
271
271
  ```json
272
272
  {
273
- "cellType": "Formula",
274
- "cellText": "=IF(J3=0,0,L3/J3)",
275
- "displayType": "List",
276
- "countType": "none"
273
+ "cellType": "Formula",
274
+ "cellText": "=IF(J3=0,0,L3/J3)",
275
+ "displayType": "List",
276
+ "countType": "none"
277
277
  }
278
278
  ```
279
279
 
@@ -305,28 +305,28 @@ workbook `dataTable` 中 Formula 格需同时设置:
305
305
 
306
306
  1. 双保存:`saveReportWithCacheConfig` + `saveReportDevInfo`
307
307
  2. `getReportDevInfo` 回读:确认 `cellText` 不以 `=` 开头
308
- 3. 运行 `validate_report_config.py` 预检 Formula 格式
308
+ 3. 运行 `e10-cli report py validate` 预检 Formula 格式
309
309
 
310
310
  ## 七、高级功能配置
311
311
 
312
312
  ### 7.1 查询条件配置
313
313
 
314
- > **API/脚本写入完整规范**见 `query-condition-api-guide.md`(条件字段形态、asNameIndex、21 项日期选项、系统参数默认值)。以下为 ReportProps 摘要,**不可直接等同于 saveQueryItem payload**。
314
+ > **API/脚本写入完整规范**见 `query-condition-api-guide.md`(条件字段形态、asNameIndex、21 项日期选项、系统参数默认值)。以下为 ReportProps 摘要,**不可直接等同于 saveQueryItem payload**。
315
315
 
316
316
  ```json
317
317
  {
318
- "queryFields": [{
319
- "uuid": "query-1",
320
- "id": "field-001",
321
- "text": "日期范围",
322
- "displayType": "date",
323
- "conditions": [{
324
- "dataSetId": "ds-001",
325
- "fieldId": "createdate",
326
- "relation": "between"
327
- }],
328
- "showOrder": 1
329
- }]
318
+ "queryFields": [{
319
+ "uuid": "query-1",
320
+ "id": "field-001",
321
+ "text": "日期范围",
322
+ "displayType": "date",
323
+ "conditions": [{
324
+ "dataSetId": "ds-001",
325
+ "fieldId": "createdate",
326
+ "relation": "between"
327
+ }],
328
+ "showOrder": 1
329
+ }]
330
330
  }
331
331
  ```
332
332
 
@@ -334,10 +334,10 @@ workbook `dataTable` 中 Formula 格需同时设置:
334
334
 
335
335
  ```json
336
336
  {
337
- "pageNum": 1,
338
- "pageRowCount": 200, // 每页行数
339
- "dynamicField": "", // 动态Sheet页字段
340
- "scrollPage": false // 滚动分页
337
+ "pageNum": 1,
338
+ "pageRowCount": 200, // 每页行数
339
+ "dynamicField": "", // 动态Sheet页字段
340
+ "scrollPage": false // 滚动分页
341
341
  }
342
342
  ```
343
343
 
@@ -345,8 +345,8 @@ workbook `dataTable` 中 Formula 格需同时设置:
345
345
 
346
346
  ```json
347
347
  {
348
- "rowMode": false, // 行式加载(仅单数据集简单列表)
349
- "preAggregate": true // 数据预聚合(默认开启)
348
+ "rowMode": false, // 行式加载(仅单数据集简单列表)
349
+ "preAggregate": true // 数据预聚合(默认开启)
350
350
  }
351
351
  ```
352
352
 
@@ -354,18 +354,18 @@ workbook `dataTable` 中 Formula 格需同时设置:
354
354
 
355
355
  ```json
356
356
  {
357
- "printInfo": {
358
- "area": { "startRow": -1, "endRow": -1, "startCol": -1, "endCol": -1 },
359
- "repeatArea": { "startRow": -1, "endRow": -1, "startCol": -1, "endCol": -1 },
360
- "printGridLine": false,
361
- "printOuterBorder": false,
362
- "allRowsInOnePage": false,
363
- "allColsInOnePage": false,
364
- "printOrder": "auto"
365
- },
366
- "pageMargin": { "top": -1, "bottom": -1, "left": -1, "right": -1, "header": -1, "footer": -1 },
367
- "paperSize": "A4",
368
- "paperOrientation": "portrait"
357
+ "printInfo": {
358
+ "area": { "startRow": -1, "endRow": -1, "startCol": -1, "endCol": -1 },
359
+ "repeatArea": { "startRow": -1, "endRow": -1, "startCol": -1, "endCol": -1 },
360
+ "printGridLine": false,
361
+ "printOuterBorder": false,
362
+ "allRowsInOnePage": false,
363
+ "allColsInOnePage": false,
364
+ "printOrder": "auto"
365
+ },
366
+ "pageMargin": { "top": -1, "bottom": -1, "left": -1, "right": -1, "header": -1, "footer": -1 },
367
+ "paperSize": "A4",
368
+ "paperOrientation": "portrait"
369
369
  }
370
370
  ```
371
371
 
@@ -0,0 +1,129 @@
1
+ # E10 API 鉴权请求头规范(硬约束)
2
+
3
+ > **适用范围**:本 Skill 内所有 EDC 报表 API、DataSetAction、Python 脚本 HTTP 请求。
4
+ > **与登录 Skill 关系**:鉴权参数**必须**来自 `e10-cli auth` 登录 Skill 的会话结果,禁止绕过登录 Skill 自行拼 token。
5
+
6
+ ---
7
+
8
+ ## 一、登录必须走 e10-cli auth Skill
9
+
10
+ | 允许 | 禁止 |
11
+ |------|------|
12
+ | `export EB_ETEAMSID=... EB_HOST=...`(凭证只走环境变量) | 在脚本/对话中硬编码 ETEAMSID;把凭证明文粘贴进对话;`e10-cli auth oidc` 兜底(部分环境 SSO 不返回授权码会一直卡住) |
13
+ | 引导用户在本机终端 `e10-cli auth login` / `export EB_ETEAMSID=...` | 把凭证作为命令行参数(如 `e10-cli auth set --eteamsid "PCACCOUNT_xxx"`)——会进 shell 历史与 `ps` 进程列表 |
14
+ | `e10-cli auth status` / `whoami --json` 确认会话 | 跳过 e10-cli auth,直接 curl 拼 Cookie |
15
+ | 从 profile 读取 | 裁剪/去重/改写 cookies.raw |
16
+
17
+ **Agent 执行顺序**:
18
+
19
+ 1. 加载 `weaver-e10-cli auth`
20
+ 2. 执行 `e10-cli auth status`(一次即结论);缺凭证 → **引导用户在本机终端自助登录**(`e10-cli auth login` 或 `export EB_ETEAMSID=...`),**禁止**引导用户把凭证明文粘贴进对话、**禁止**用 `--eteamsid "<值>"` 传参
21
+ 3. 通过 `e10-cli auth status` 或 `e10-cli report creds` 取得完整鉴权三元组
22
+ 4. 再调用报表 API / 运行搭建脚本
23
+
24
+ ---
25
+
26
+ ## 二、API 请求必须携带三项(缺一不可)
27
+
28
+ 每次 HTTP 请求**必须同时**包含以下三项,且均来自 e10-cli auth 返回的用户会话信息:
29
+
30
+ | # | 请求头 | 取值来源 | 硬约束 |
31
+ |---|--------|----------|--------|
32
+ | ① | `Cookie` | `auth.cookies.raw`(e10-cli auth profile) | **完整原始串**;禁止裁剪、去重、改写、重拼(如禁止自行拼 `ETEAMSID=xxx`) |
33
+ | ② | `eteamsid` | 与 Cookie 中 `ETEAMSID` 值一致 | 独立请求头,不可省略 |
34
+ | ③ | `User-Agent` | `auth.agentType` | 末尾必须为 `AgentType=<agentType>,IsAgent=true`(如 `AgentType=WorkBuddy,IsAgent=true`) |
35
+
36
+ ### 正确示例
37
+
38
+ ```http
39
+ Cookie: <完整 Cookie 原始串来自 e10-cli auth cookies.raw> ; ETEAMSID=<ETEAMSID 值>
40
+ eteamsid: <ETEAMSID 值>
41
+ User-Agent: Mozilla/5.0 ... Chrome/<browser-version> Safari/537.36 Edg/<browser-version> AgentType=WorkBuddy,IsAgent=true
42
+ ```
43
+
44
+ ### 错误示例(禁止)
45
+
46
+ ```http
47
+ # ❌ 仅裸 ETEAMSID,丢失 cookies.raw 其它键
48
+ Cookie: ETEAMSID=<不应手动拼写>
49
+
50
+ # ❌ 自行重拼 Cookie,非 e10-cli auth 原始串
51
+ Cookie: <不应手动拼写>; ETEAMSID=<不应手动拼写>
52
+
53
+ # ❌ User-Agent 占位符或未带 IsAgent
54
+ User-Agent: ... AgentType=<agentType>,IsAgent=true
55
+
56
+ # ❌ 缺少 eteamsid 请求头
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 三、Python 脚本实现
62
+
63
+ 本 Skill 统一通过 构造请求头:
64
+
65
+ ```python
66
+ from weaver_auth_headers import build_auth_headers
67
+
68
+ headers = build_auth_headers(
69
+ host=creds["host"],
70
+ eteamsid=creds["eteamsid"],
71
+ cookie=creds["cookie"], # cookies.raw 完整串
72
+ agent_type=creds["agent_type"], # 来自 e10-cli auth
73
+ ebbusinessid=creds["ebbusinessid"],
74
+ )
75
+ ```
76
+
77
+ ```json
78
+ {
79
+ "host": "weapp.xxx.cn",
80
+ "eteamsid": "PCACCOUNT_...",
81
+ "cookie": "<cookies.raw 完整原始串>",
82
+ "agent_type": "WorkBuddy",
83
+ "ebbusinessid": "...",
84
+ "app_id": "..."
85
+ }
86
+ ```
87
+
88
+ ---
89
+
90
+ ## 四、与脚本环境变量
91
+
92
+ - 推荐:`eval "$(e10-cli report env)"` 或 `e10-cli auth status` 后由脚本读 profile。
93
+ - 报表 API **仍须满足上述三项**;可从 `e10-cli auth status` 或 profile `auth` 取 `cookies.raw` / `agentType`。
94
+ - 本报表包 **不依赖、不扫描** e10-cli。
95
+
96
+ ---
97
+
98
+ ## 五、常见错误
99
+
100
+ | 现象 | 原因 | 处理 |
101
+ |------|------|------|
102
+ | `token为空或失效` | Cookie 被改写或只有裸 token | 请用户重新提供 ETEAMSID,再用 `cookies.raw` |
103
+ | `token empty or invalid`(**保存**接口) | 部分自建环境 `saveReportDevInfo` multipart **缺 `et` 表单字段** | 走 `saveReportDevInfoAuto`(载荷矩阵自动补 `et` = 当前 ETEAMSID)—— 注意点 **ENV-11** |
104
+ | 401 / 403 | 缺少 `eteamsid` 头或 User-Agent 无 IsAgent | 检查 `weaver_auth_headers.build_auth_headers` |
105
+ | Agent 环境被拒 | `agentType` 与登录时不一致 | 用 `e10-cli auth set` 重新写入(`agentType` 由 eb_auth 统一生成) |
106
+
107
+ ---
108
+
109
+ ## 六、ETEAMSID 的环境隔离与过期(硬规则 · 注意点 ENV-11)
110
+
111
+ | 规则 | 说明 |
112
+ |------|------|
113
+ | **按环境隔离** | ETEAMSID **绑定平台地址** —— **A 环境的凭证在 B 环境同样报 `token invalid`**;多个环境各自保存各自凭证,别混用 |
114
+ | **会过期** | 过期后报「**登录超时**」/`token 为空或失效` —— **失效时直接向用户索要新凭证,勿反复重试** |
115
+ | **沙箱 `spawn EBUSY`** | 无法 spawn 登录 CLI 时,统一走 **env 三件套**:`EB_HOST` + `EB_ETEAMSID` + `EB_AUTH_NO_CLI=1`(`eb_auth.js` 零 spawn 模式) |
116
+
117
+ ```bash
118
+ # 缺凭证 / 过期:先一次就绪探测,再向用户索要(勿刷重试)
119
+ e10-cli auth status
120
+ # 沙箱环境(spawn 被禁):
121
+ export EB_HOST='<平台地址>' EB_ETEAMSID='<浏览器 Cookie 里 ETEAMSID 的值>' EB_AUTH_NO_CLI=1
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 相关文档
127
+
128
+ - `weaver-e10-cli auth` — 登录命令与 profile 结构
129
+ - `references/`e10-cli auth` 文档 — 报表任务步骤 0 登录流程