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
@@ -0,0 +1,265 @@
1
+ # 交叉表原始 workbook 直构指南(月份横向扩展 × 多指标)
2
+
3
+ > 适用:build spec / buildWorkbook 只支持平铺表头(expandType 固定 NoExpand/Vertical),无法表达
4
+ > 「列维度横向扩展 + 月份下挂多指标 + 合计行」。此时直接构造原始 workbook,走与 build spec
5
+ > 相同的保存通道(`saveReportDevInfo` + `designKey:''` + gzip base64 workbook)。
6
+ > 2026-09-15 在「采招投标预算合同统计表」(reportId 1315344454775046144) 验证通过:
7
+ > 1.9s 落库,10 个 Formula 格全部存活,verify self 0 错 0 警。
8
+
9
+ ## 1. 何时用
10
+
11
+ - 效果图是交叉矩阵(行维度 × 时间横向扩展 × 每格多指标 + 合计行/合计列)
12
+ - 复用已有报表时:先 `getReportDevInfo` 取 `fields[]`(含 dataSetId/name/nameIndex/fieldId/tableName),按 text 匹配绑定字段,重写 workbook 后原 reportId 覆盖保存(数据集无需重挂)。
13
+ - ★ **重建一律调用 `e10-cli report build`**(`buildWorkbookFromFields(devData, {sheetConfig, setCells})`,构建态公式格保活、格数不符即拒绝输出)。禁止会话内临时手写重建脚本 —— 临时脚本会被清理,下次小改从零重写(PERF-6 / BUILD-23:单点小改曾拖到 12 分钟)。
14
+ - 定向小改优先走固化命令:关预聚合 `e10-cli report preagg disable --apply`;改父格/单元格键 `e10-cli report fix parent --set-parent ... --set-json ...`;只有结构级改动才整包重建。
15
+
16
+ ## 2. 坐标与父格(x=行, y=列, 0-based)
17
+
18
+ 效果图标准结构(行维度 A 列,月份自 B 列横向扩展,全年累计 3 列固定):
19
+
20
+ ```
21
+ x=0 A1 需求类型Const B1 日期Field(Horizontal/Group/yearmonth) E1 "全年累计"Const(colCount 3)
22
+ x=1 B2/C2/D2 预算|合同|节约率 Const(上父格→B1) E2/F2/G2 全年表头Const
23
+ x=2 A3 行维度Field(Vertical/Group) B3/C3 指标Field(sum, 左父格→A3, 上父格→B1)
24
+ D3 节约率公式(左父格→A3, 上父格→B1) E3 SUM(B3) F3 SUM(C3) G3 比率公式(左父格→A3)
25
+ x=3 A4 "合计"Const B4/C4 SUM公式(上父格→B1, 左父格无) E4/F4/G4 全年总计(无父格)
26
+ ```
27
+
28
+ 关键规则(report-knowledge-base §4.3 + LAYOUT-4):
29
+ - 列维度:`expandType:'Horizontal', displayType:'Group', groupType:'yearmonth'`,父格无,`isActiveParent:true`
30
+ - 行维度:`expandType:'Vertical', displayType:'Group'`,左父格 default
31
+ - 交叉指标格:`displayType:'Count', countType:'sum'`,**左父格 custom→行维度,上父格 custom→列维度**
32
+ - 月份下指标表头(Const):上父格 custom→列维度,不扩展 → 随月份横向复制
33
+ - 合计行公式:上父格 custom→列维度、左父格无 → 随月份扩展,每份 SUM 各自月份列
34
+ - 交叉后固定列:左父格 custom→行维度;公式 `SUM(B3)` 引用扩展格 = 对全部横向实例求和
35
+
36
+ ## 3. 公式格存活条件(血案新证)
37
+
38
+ fix table-name 的重建路径丢 Formula 格(13→11),但 **build spec 与本指南的直构路径 Formula 全存活**。
39
+ 差异:以构建态完整结构写入(typeName:'FormulaCellType' + editorType + subordination 等全键,
40
+ `formula` 键同步挂在 cell 上),designKey 传空串。改公式相关内容一律走 spec/直构重建,禁止 fix 定点。
41
+
42
+ ## 4. 样式与格式
43
+
44
+ - formatter 键白名单见 build_from_spec FORMATS:value/percent/huobi… `style.formatter` + `cellType.formatterType:[key]` + `tag.formatterType:[key]` 三处一致
45
+ - 条件色:`cellType.conditionRule.highlightDatas[]`(relation: highlight:greater/less,foreColor,bold)
46
+ - 表头深蓝白字:backColor #2E5E9E / foreColor #FFF / bold / hAlign 1;合计行 #DCE6F1 bold
47
+ - 冻结:`sheet.frozenRowCount/frozenColCount` + `sheet.tag.fixedCell:{x:数据首行,y:数据首列}`;首格 cell.tag.fixed=true
48
+ - 跨度:合并格写 `cell.rowCount/colCount` + `sheet.spans[]`(rowCount=行跨度, colCount=列跨度)
49
+ - sheet 禁写 gridline 族键(→500)
50
+
51
+ ## 4.1 表头合并(用户口径 · 2026-09-15 验证落库)
52
+
53
+ 效果图里表头必须成块合并,**合并写 `cell.rowCount/colCount`**,回读键名为 **`xCount`(行跨度)/`yCount`(列跨度)**:
54
+
55
+ | 位置 | 合并 | 写法 | 回读 |
56
+ |---|---|---|---|
57
+ | 左上角维度列头(覆盖表头两行) | A1:A2 纵向 | `constCell(..., { rowCount: 2 })` + span `{rowCount:2,colCount:1}` | xCount=2 |
58
+ | 月份列维度(下挂 3 个指标) | B1:D1 每实例跨 3 列 | 列维度格 `colCount: 3` + span `{rowCount:1,colCount:3}` | yCount=3 |
59
+ | 右侧固定块表头(全年累计) | E1:G1 | 同上一行 | yCount=3 |
60
+
61
+ - **只写一个块宽**(3 列),禁止照抄 Excel 展开后的总列数(LAYOUT-3)
62
+ - 列维度格合并 + `expandType: Horizontal` 可共存:每个月份实例都按 3 列合并
63
+ - 表头第 2 行的子表头(预算/合同/节约率)不合并,只设上父格→列维度
64
+
65
+ ## 4.2 合计/总计整行公式 —— 左父格必须自定义(用户口径 · ★★强制)
66
+
67
+ 整行计算(合计行、总计行、小计行)的公式格 **禁止用默认左父格**:
68
+
69
+ - **有参考字段**(挂在某分组下的小计)→ 左父格自定义指向该分组格
70
+ - **整体合计/总计(无参考字段)** → 左父格**统一自定义为最前面的自定义文本格**(如合计行首格「合计」A4)
71
+ - 合计行若同时要随列维度横向扩展 → 保留 `topParent`→列维度;两者并存:
72
+ `left: [3,0]`(指向 A4「合计」)+ `top: [0,1]`(指向列维度)
73
+
74
+ ## 4.3 横向日期扩展交叉区:双父格显式配置 + OFFSET 派生公式(全局规则 A0.21 · ★★强制 · 2026-10-29 基准样例)
75
+
76
+ > 触发条件 = 日期/年月维度**横向扩展**(`expandType:'Horizontal'` + `groupType:'yearmonth'`)+ 行维度纵向扩展
77
+ > 形成交叉扩展区 + 区域内含派生指标列(当月结存/当月期初/累计结存等)。**所有报表生成任务统一生效。**
78
+
79
+ **金标准**:物资收发存报表 `1331358433604124672`(设计器人工调优后落库配置,getReportDevInfo 验证)。
80
+ 布局:A=物资名称(纵向扩展根)、B1=单据日期(横向扩展根,`yCount:4` —— 每个月份横向展开为一组 4 列:
81
+ 入库/出库/当月结存/累计结存)。
82
+
83
+ ### 4.3.1 交叉区数据格:双父格必须「自定义」显式配置(禁默认 -1,-1)
84
+
85
+ 交叉扩展区(物资名称纵向 × 年月横向)内的**每一个**数据格——Field 指标格与 Formula 派生格 alike——统一:
86
+
87
+ | 配置 | 取值 | 含义 |
88
+ |---|---|---|
89
+ | `leftX/leftY` | **行维度扩展根坐标**(如 `2,0` = A3 物资名称) | 左父格:数据实例随物资纵向归属 |
90
+ | `topX/topY` | **日期横向扩展格坐标**(如 `0,1` = B1 单据日期) | 上父格:数据实例随月份横向归属 |
91
+ | `expandType` | `Vertical`(数据格自身随行维度扩展) | 纵向扩展 |
92
+ | `subordination` | 入库 Field 格保留跨数据集关联键 `["台账.物资id","明细.物资id"]`;Formula 格 `["",""]` | 绑定链不破坏 |
93
+
94
+ 父格留默认(-1,-1)→ 扩展后数据错位、串月串行(注意点 **BUILD-99**)。
95
+
96
+ ### 4.3.2 月组表头:公共上父格,左父格不设置(★★ 用户口径 · 2026-10-29 更正,推翻串链)
97
+
98
+ 横向扩展日期格的**子表头格**(月组内指标表头 Const 行)统一:
99
+
100
+ - **上父格 = 日期横向扩展格**(公共,如 `top:0,1`)——每个表头实例随月份归属;
101
+ - **左父格不设置**(`left:-1,-1`,设计器面板显示「无」)——**禁止 left 串链前格**(旧串链口径已废弃,用户验证以公共上父格为准)。
102
+
103
+ (2026-10-29 上午口径「首格 top 挂日期格、后续格 left 串链」作废——用户在设计器确认定案:表头格只认公共上父格,left 留空。)
104
+
105
+ ### 4.3.3 派生列公式:OFFSET 外层必须包 SUM + 禁静态混合引用(★★ 核心)
106
+
107
+ 横向扩展后**列位随月份平移**,静态列字母引用(含 `SUM($B3:B3)` 混合引用)不跟随 ⇒ 累计值只算首月或错乱。
108
+ **必须用 OFFSET(基准单元格,向下偏移行数,向右偏移列数,[高度],[宽度])按相对位置引用扩展出来的兄弟格**,
109
+ 且 **OFFSET 公式外层必须包一层 SUM**(`=SUM(OFFSET(Q3,0,-16),0)` 形态):
110
+
111
+ - **为什么包 SUM**:向左偏移跨月组时路径上存在**文本类型单元格**(如角格/物资名称列),裸 OFFSET/IFERROR 包裹会把文本传播进运算导致计算异常;
112
+ `SUM(...,0)` 把路径上的文本按 0 兜底,数值稳定(2026-10-29 用户验证定案)。
113
+ - 组间偏移量 = **月组列数 yCount**(示例表 16 列即 `-16`),随 yCount 推导、禁止按月份个数硬编码。
114
+
115
+ | 派生列 | 公式(月组列数 = yCount) | 说明 |
116
+ |---|---|---|
117
+ | 当月结存(月组内直引) | `IFERROR(B3-C3,"")` | 月组内偏移固定(B=入库/C=出库),可直引 |
118
+ | **累计结存(滚动)** | `SUM(OFFSET(E3,0,-1),OFFSET(E3,0,-4))` | 本月当月结存(左偏 1 列)+ 上月累计结存(左偏 yCount 列) |
119
+ | **跨月组取数(期初/上月值等)** | `SUM(OFFSET(Q3,0,-yCount),0)` | ★ 单 OFFSET 也必须 SUM 包裹 + `,0` 兜底 |
120
+ | 期末/其他跨组派生 | 同理按 `±yCount` 推导组间偏移 | **禁止硬编码月份个数** |
121
+
122
+ 构建期自动校验:`rebuild_from_fields.buildWorkbookFromFields` 在 workbook 含横向扩展格时,
123
+ 对 Formula 格的静态区间引用(`SUM($Xn:Xn)` 类带冒号区间)**exit 3 拒绝落库**(`assertOffsetCumulativeFormulas`,
124
+ `opts.enforceOffsetCumulative=false` 可关);`verify_self_check` 在线校验同步接入(error 级)。
125
+
126
+ ### 4.3.4 角格合并展示(美观规范 · 2026-10-29 用户口径)
127
+
128
+ 交叉扩展报表**左上角表头单元格**(如「物资名称/月份」「分行/品名 \ 单据年月」)**纵向合并覆盖表头两行**:
129
+
130
+ - 角格 `xCount: 2`(行跨度 2,回读 rowCount=2)+ span `{row:0, col:0, rowCount:2, colCount:1}`;
131
+ - 合并文案用 `\` 分隔行列维度名(如 `物资名称/月份`);
132
+ - 与 §4.1 一致:只写**一个块宽**的跨度,禁止照抄展开后的总列数。
133
+
134
+ ### 4.3.4 交叉区左父格筛选:每个跨源 Field 数据格各自配置(2026-10-29 用户实证 · ★★强制)
135
+
136
+ A0.21 双父格布局下,交叉区**每个** Field 数据格的 `leftX/leftY` 都直指**行维度扩展根**(如 A3 物资名称,异源)
137
+ —— 这与 A0.7「连续同源区域只配入口格」的**前提不同**(A0.7 要求后续格以入口格为父格,此处不是)。
138
+ 故按左父格筛选一般规则(`cross-dataset-filter-guide.md §2.1`:当前格数据集 ≠ 左父格数据集 ⇒ 必配):
139
+
140
+ - 交叉区内**每一个**绑定异源父格的 Field 数据格(入库、出库、…),**各自**配置
141
+ `subordination`([父格关联键, 本格数据集关联键])+ `leftFilterField`(Equals,`id` = `currentField`);
142
+ - 漏配症状:设计器右面板该格「左父格筛选 = 请选择」空白(用户截图实证 2026-10-29 物资收发存报表 (2,2));
143
+ - Formula 派生格不绑字段,`subordination:["",""]`、无筛选,不受此条约束。
144
+
145
+ ### 4.3.5 日期维度父格默认升序(2026-10-29 用户规则 A0.22 · ★★强制)
146
+
147
+ 凡按日期/年月维度统计的报表,日期作为父格(列维度横向格或行维度格)时,**默认**配
148
+ `orderType: 'asc'`(升序A-Z)——保证月份从早到晚展开;用户点名降序时才用 `'desc'`,其余维度格维持 `'no'`。
149
+
150
+ ## 5. 验证
151
+
152
+ 1. 保存后 `getReportDevInfo` 回读:cellTypes 计数、expandType=Horizontal 的格、formula 列表
153
+ 2. **合并与父格要单独回读核对**:`xCount/yCount`(跨度)、`leftX/leftY`、`topX/topY`
154
+ 3. `e10-cli report verify self <reportId> --app-id <appId>` 0 错 0 警
155
+ 4. ⚠️ **渲染接口口径(2026-09-15 验证)**:本环境 `/api/edc/report/view/analysis` 取回的 workbook 只含
156
+ 配置态网格(cell = `{value, style}`,网格尺寸 = 设计网格),**纯列表对照报表同样取不到展开数据**
157
+ → **不能**用渲染返回来判定「是否展开/是否有数据」,最终形态以设计器确认为准。
158
+ 5. 交设计器地址即停;「按年分签」(dynamicField) 尚无 API 写法,留设计器操作
159
+
160
+ ## 6. 数据集 id 隔离(跨报表复用蓝图 · ★★强制 · 2026-10-10)
161
+
162
+ > **铁律**:**当前报表 `addDataset` 返回的 datasetId 就是唯一合法 id。**
163
+ > 复用另一张报表的蓝图/结构时,**模板报表的 id 一律不得落进本报表**。
164
+
165
+ ### 6.1 症状 → 根因
166
+
167
+ 复用蓝图后,设计器里出现:
168
+
169
+ | 症状 | 根因(都在同一个病灶上) |
170
+ |------|--------------------------|
171
+ | 右侧「字段」下拉**空白**(选不出字段) | 格的 `fieldKey` 首段仍是**模板报表**的数据集 id(三段式 `datasetId.nameIndex.field`)→ 设计器按它解析数据集失败 |
172
+ | 左父格**筛选不回显** | `leftFilterField` 里 `currentField` / `parentField` 的**前缀**仍是模板报表的 id |
173
+ | 数据串源 / 整列为空 | 同上,跨源筛选链指向了不存在的数据集 |
174
+
175
+ 血案(2026-10-10 · chl测试1010 复用 chl测试002 蓝图):13 格里 **4 个 Field 格全中**。
176
+
177
+ ### 6.2 三处必须检查的键
178
+
179
+ | 键 | 形态 | 说明 |
180
+ |----|------|------|
181
+ | `dataSetId` | 纯雪花号 | 该格所属数据集 |
182
+ | `fieldKey` | `datasetId.nameIndex.fieldName` | **首段**必须 == 本格 `dataSetId`(自查判据) |
183
+ | `leftFilterField` / `topFilterField` / `customFilterField` / `dataFilterField` | JSON 数组字符串 | 每项的 `currentField` / `parentField` **首段**是数据集 id |
184
+
185
+ ### 6.3 两个经典错法(勿再犯)
186
+
187
+ 1. **重映射时拿「`id.` 带点整体」查映射表** —— 用 `^(\d+)\.` 取出 id 却把 `"123…."` 整段拿去 `map[key]` → 永远查不到 → **替换静默失效**(没有任何报错)。
188
+ 正解:剥出纯 id 再查,或直接用**数字边界正则** `(?<!\d)旧id(?!\d)` 全串替换。
189
+ 2. **`fieldKey` 只在「缺失」时才生成** —— 蓝图自带的旧 `fieldKey` 会被**原样复制**。正解:**一律**由本格 `dataSetId` 重算。
190
+
191
+ ### 6.4 正确做法(统一通道)
192
+
193
+ ```js
194
+ const { buildWorkbookFromFields, remapDatasetIds } = require('./rebuild_from_fields.js');
195
+
196
+ // ① 先重映射(旧 datasetId → 本报表 addDataset 返回的新 id)
197
+ const mapped = remapDatasetIds(templateDevData, { '旧id1': '新id1', '旧id2': '新id2' });
198
+ // ② 再构建:fieldKey 自动由本格 dataSetId 重算;allNeedFields 自动推导;
199
+ // 并跑 assertNoStaleDatasetIds 硬门禁(命中白名单外的 id 直接 throw,拒绝落库)
200
+ const { workbook, stats } = buildWorkbookFromFields(mapped.data, {
201
+ allowedDatasetIds: ['新id1', '新id2'], // 本报表真实数据集 id
202
+ });
203
+ ```
204
+
205
+ - **落库前硬门禁**:`assertNoStaleDatasetIds(workbook, allowedIds)` —— 扫出 workbook 内**所有** dataset-id 引用,
206
+ 凡不在白名单即 **throw**(默认),并列出「哪一行哪一列、哪个键、哪个外来 id」。
207
+ - **`allNeedFields`**:曾在重建白名单 `FIELD_KEYS` 里缺失 → 恒被丢弃;现已补入,且 `deriveAllNeedFields()`
208
+ 可按「本格字段 ∪ 该数据集被任何格筛选引用的关联键字段」自动推导(实证对齐 002:学院表 `sort,title` / 专业表 `dwh,zyh,zymc`)。
209
+
210
+ ### 6.5 蓝图重建入口
211
+
212
+ `e10-cli report rebuild from-blueprint --blueprint <file.json> [--apply] [--allow-ids <id,id>]`
213
+
214
+ - `dataset`(key=`default`)或 `datasets[]`(各配 `key`);多数据集时格上写 `datasetKey` 选择。
215
+ - `dataSetId` / `fieldKey` / 四个筛选键 / `tableName` / `allNeedFields` **绝不从 `styleSource` 模板格继承**。
216
+ - 落库前自动跑门禁;dry-run 就会打印「数据集 id 门禁:引用 N 处,全部 ∈ 白名单 ✅」。
217
+
218
+ ### 6.6 存量体检(只读)+ 存量修复
219
+
220
+ ```bash
221
+ # 先看(只读):权威白名单 = 该报表的 dataset/list
222
+ e10-cli report check-ids --report-id <rid> --app-id <appId> [--json]
223
+ # 别名:e10-cli report dataset id-check ...
224
+
225
+ # 后修(默认 dry-run):
226
+ e10-cli report fix dataset-id --report-id <rid> --app-id <appId> [--apply]
227
+ e10-cli report fix dataset-id --app-id <appId> [--apply] # 应用级批量
228
+ ```
229
+
230
+ `check-ids` 输出「外来 id 清单」+「Field 格 `fieldKey` 首段 ≠ `dataSetId`」,**exit 3** = 有外来 id。
231
+ 定位用 `--own-ids <id,id>`(替换白名单)/ `--dev-file <json>`(离线跑)。
232
+
233
+ **`fix dataset-id` 的机械修复原理(关键洞察)**:
234
+ 三段式 `fieldKey = datasetId.sourceId.field`,其中 **`sourceId` 跨报表不变**(同一张数据加工 SQL 视图 / 表单
235
+ 在各报表里的 sourceId 相同,datasetId 不同);而每格还带 top-level `nameIndex`(= sourceId)。于是:
236
+
237
+ ```
238
+ 外来 datasetId --(该引用自身的 sourceId,即三段式第 2 段)--> 本报表 dataset/list 里同 sourceId 的 id
239
+ ```
240
+
241
+ **确定性反查,无需人工提供映射表**。⚠️ 筛选项必须按**各自 token 的第 2 段**解析 ——
242
+ `leftFilterField` 里的 `parentField` 指向**别的数据集**(如专业名称格的 parentField 指学院表),
243
+ 若用「本格 nameIndex」会**错挂到本格数据集**上(本命令内置映射冲突检测,冲突即 exit 3 不落库)。
244
+
245
+ 细则:`pitfalls BUILD-42`;SKILL **A0.12**。
246
+
247
+ ---
248
+
249
+ ## 七、交叉报表父格两条铁律(场景 D · 2026-10-29 用户口径固化 · 2026-10-30 重建自 e10-cli report scene SCENES.D)
250
+
251
+ > 检测/修复命令:`e10-cli report scene check|apply --report-id <rid> --app-id <appId> --scene D [--keep-left] [--apply]`(幂等;识别不依赖业务关键词,见 `expandType=Horizontal` 即交叉结构)
252
+
253
+ ### 7.1 横向扩展字段:左父格保持默认
254
+
255
+ - 交叉表头行里的**横向扩展锚**(如「签订年份」):**无特殊场景(左侧不存在数据表字段)时不要设置左父格**,保持 `left=(-1,-1)`。
256
+
257
+ ### 7.2 交叉区后面的字段/公式格:上父格绑同列标题 Const
258
+
259
+ - **交叉区后面的字段 / 公式格**(如同列的「合计金额 / 合计数量」):上父格必须**自定义指向**该列的**标题自定义文本 Const**(交叉表头行里同列的那个非扩展 Const)。
260
+ - 交叉格本身(横向锚正下方)上父格**维持指向横向锚**不变。
261
+
262
+ ### 7.3 范围边界
263
+
264
+ - 锚列之前的维度列不管;交叉格 top 维持指横向锚;标题锚只取 y > min(锚列 y)。
265
+ - 与 §4.3(A0.21 横向日期扩展交叉区)的关系:§4.3 管**交叉扩展区内部**的数据格双父格与 OFFSET 公式;本节管**交叉区之后**的静态汇总列上父格。两者共用同一 `expandType=Horizontal` 识别入口(scene check --scene D)。